使用 Ruff 开发板+ Link Develop 快速开发 IoT 应用(环境预配置版)

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
Lindorm AIGC体验服务,AIGC 体验服务
简介: 使用 Ruff 开发板+ Link Develop 快速开发 IoT 应用,从云到端,享受阿里云IoT平台的极速开发体验。

0. 成果


15278172153062

1. 前期准备

  1. 开通 Link Develop 账号:使用阿里云账号或者淘宝账号访问 https://linkdevelop.aliyun.com/,填写开发者入驻表单完成入驻。(即申请即通过
  2. 依赖安装:已预先配置完成。
  3. 项目文件创建与生成:已预先配置完成。

Ruff 硬件开发

一、上云

此步操作设备:电脑

  1. 登录阿里云账号,访问 https://linkdevelop.aliyun.com 创建一个新项目:
  2. 从项目控制台左侧的设备菜单项里找到“产品开发”,点击进入并点击“立即创建产品”。
  3. 按下图填写表单,所属分类选择“智能生活/电工照明/灯”,节点类型选择“设备”,通讯网络选择“Wi-Fi”,数据格式选择“Alink”,然后点“提交”后点击“进入开发”按钮。
    15278175580440
  4. 添加一个 RGB 调色的功能定义:点击标准功能一栏右
    侧的“新增”按钮。在弹出的“新增可选功能”对话框左侧列表中,找到 RGB 调色功能并单击进行选择,然后点击“确定”。

15278175847739

  1. 申请测试设备的激活凭证:从“功能定义”的 Tab 切换到“设备开发”的 Tab,点击“设备列表”一栏右侧的“新增测试设备”按钮,点击确定,获得激活凭证三元组:ProductKey、DeviceName 和 DeviceSecret不要关闭该页面!
    image

二. 设备端开发

此步使用设备:电脑

  1. 打开电脑终端,进入项目目录:cd ruff-linkdevelop-rgblight
  2. 编辑项目文件 /src/index.js,将 productKey、deviceName、deviceSecret 替换成前一步申请的设备激活凭证:
'use strict';

var aliyunIot = require('aliyun-iot-device-sdk');

// 设备连接到云端
var device = aliyunIot.device({
// 替换为生成的激活凭证三元组
  productKey: '<productKey>',
  deviceName: '<deviceName>',
  deviceSecret: '<deviceSecret>'
});

// 连接成功
device.on('connect', function() {
  console.log('connect successfully!');
  // 点亮
  $('#KY-016').setRGB(0xffffff);
  // 上报属性
  device.postProps({
    LightSwitch: 1,
    RGBColor: {
      Red: 255,
      Green: 255,
      Blue: 255
    }
  });
});

// ruff 初始化完毕
$.ready(function(error) {
  if (error) {
    console.log(error);
    return;
  }
  // 监听云端下行消息
  device.serve('property/set', function(params) {
    console.log('receive params:', params);
    var LightSwitch = params.LightSwitch;
    // 开灯
    if (LightSwitch === 1) {
      $('#KY-016').setRGB(0xffffff);
    }
    // 关灯
    if (LightSwitch === 0) {
      $('#KY-016').setRGB(0x000000);
    }
    // 调色
    var RGBColor = params.RGBColor;
    if (RGBColor) {
      var hexArr = [RGBColor.Red, RGBColor.Green, RGBColor.Blue].map(function(
        x
      ) {
        x = parseInt(x).toString(16);
        return x.length === 1 ? '0' + x : x;
      });
      var color = Number('0x' + hexArr.join(''));
      $('#KY-016').setRGB(color);
    }
    // 上报属性
    device.postProps(params);
  });
});

$.end(function() {
  console.log('disconnect');
  // 断开连接
  device.end();
});

保存退出,项目修改完成!


三、运行和调试

此步使用设备:开发板+电脑

  1. 将开发板通电,等待 1 分钟联网。
  2. 使用电脑打开刚刚的阿里云控制台页面,点击设备列表里的设备“调试”链接,在页面下方的调试功能里选择“RGB调色(RGBColor)”,方法选为“设置”,下方指令区输入

    {"RGBColor":{"Red":255,"Blue":255,"Green":0}}
  3. 点击“发送指令”按钮:
    image

小灯变紫——数据下发成功(动图)


Web 应用开发

全程使用设备:电脑

一、创建应用

  1. 从项目控制台左侧菜单进入“应用-Web 应用”,点击右上角的“新增应用”按钮。
    image
  2. 如图所示填写表单,新建一个托管应用,点击提交进入下一步。
    image
  3. 在应用“创建成功”的页面上点击“进入开发”按钮,获取 AppKey 和 AppSecret,用于之后应用开发。(不要关闭此页面!!!
    image

二、开通官方物的管理服务

  1. 点击左上角的项目下拉列表,打开项目控制台的首页。
    image
  2. 点击项目控制台首页右上角的“资源管理”按钮。
    image
  3. 切换到“可用服务” Tab,点击右侧的“添加官方”服务,在对话框中勾选“物的管理服务”,然后点击“确定”。
    image

三、Web 应用编码

  1. 新建目录,进行项目初始化:

  2. linkdevelop-webapp-rgblight
  3. linkdevelop-webapp-rgblight
  4. init

image

  1. 安装 @bone/iot-gateway 和 react-color 颜色选择组件:bnpm i --save @bone/iot-gateway react-color
  2. 修改 app/pages/home/index.js 代码,内容如下:
import React, { Component } from 'react';
import { Button, Switch, Form, Grid, Input, Dialog } from '@bone/bone-web-ui';
import IotGateway from '@bone/iot-gateway';
import { HuePicker } from 'react-color';

const Row = Grid.Row;
const Col = Grid.Col;
const FormItem = Form.Item;
const formItemLayout = {
  labelCol: {
    fixedSpan: 12
  },
  wrapperCol: {
    span: 12
  }
};
const insetLayout = {
  labelCol: { fixedSpan: 4 }
};

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      switch: false,
      color: '',
      // 刷新页面不用重复输入
      productKey: localStorage.getItem('productKey') || '',
      deviceName: localStorage.getItem('deviceName') || ''
    };
    // 获取初始数据
    this.getProps(props => {
      this.setState({
        switch: props.LightSwitch === 1,
        color: rgbToHex(
          props.RGBColor.Red,
          props.RGBColor.Green,
          props.RGBColor.Blue
        )
      });
    });
  }
  getProps(cb) {
    IotGateway.post({
      url: 'https://api.link.aliyun.com/thing/device/status/query',
      apiVer: '1.0.1',
      params: {
        ProductKey: this.state.productKey,
        DeviceName: this.state.deviceName
      }
    }).then(res => {
      if (res.code !== 200) {
        throw new Error(res.localizedMsg || res.message);
      }
      let props = {};
      res.data.forEach(item => {
        props[item.attribute] = item.value;
      });
      if (cb) {
        cb(props);
      }
      console.log('get props successfully:', props);
    });
  }
  setProps(props) {
    IotGateway.post({
      url: 'https://api.link.aliyun.com/thing/device/properties/set',
      apiVer: '1.0.1',
      params: {
        ThingId: {
          productKey: this.state.productKey,
          deviceName: this.state.deviceName
        },
        Items: props
      }
    }).then(res => {
      if (res.code !== 200) {
        throw new Error(res.localizedMsg || res.message);
      }
      console.log(res);
    });
  }
  showValidationText() {
    Dialog.alert({
      title: '提示',
      content: '请输入设备的 productKey 和 deviceName 才能控制设备哦'
    });
  }
  onChange = checked => {
    if (!this.state.productKey || !this.state.deviceName) {
      this.showValidationText();
      return;
    }
    this.setState({
      switch: checked
    });
    this.setProps({
      LightSwitch: checked ? 1 : 0
    });
  };
  onInput = (field, value) => {
    this.state[field] = value;
    localStorage.setItem(field, value);
    this.setState({
      [field]: value
    });
  };
  onColorChange = color => {
    if (!this.state.productKey || !this.state.deviceName) {
      this.showValidationText();
      return;
    }
    this.setState({
      color: color.hex
    });
    this.setProps({
      RGBColor: hexToRgb(color.hex)
    });
  };
  render() {
    return (
      <div style={{ padding: '30px 0 0 30px' }}>
        <Form style={{ margin: '0 0 0 30px' }} {...formItemLayout}>
          <FormItem label="设备 id">
            <Row>
              <Col>
                <FormItem
                  label="productKey"
                  required={false}
                  labelAlign="inset"
                  {...insetLayout}
                >
                  <Input
                    placeholder="请输入"
                    value={this.state.productKey}
                    onChange={value => this.onInput('productKey', value)}
                  />
                </FormItem>
              </Col>
              <Col>
                <FormItem
                  label="deviceName"
                  required={false}
                  labelAlign="inset"
                  {...insetLayout}
                >
                  <Input
                    placeholder="请输入"
                    value={this.state.deviceName}
                    onChange={value => this.onInput('deviceName', value)}
                  />
                </FormItem>
              </Col>
            </Row>
          </FormItem>
          <FormItem label="开关">
            <Switch onChange={this.onChange} checked={this.state.switch} />
          </FormItem>
          <FormItem label="调色">
            <div style={{ padding: '7px 0 0 10px' }}>
              <HuePicker
                onChangeComplete={this.onColorChange}
                color={this.state.color}
              />
            </div>
          </FormItem>
        </Form>
      </div>
    );
  }
}

function rgbToHex(r, g, b) {
  return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}

function hexToRgb(hex) {
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result
    ? {
        Red: parseInt(result[1], 16),
        Green: parseInt(result[2], 16),
        Blue: parseInt(result[3], 16)
      }
    : null;
}

四、运行调试

  1. 启动项目: bone start
  2. 使用 Chrome 浏览器访问:http://localhost:8000/
  3. 填入『本章节第一步』获取的应用 appKey 和 appSecret:
    image

进入Web 控制页面

  1. 之后填入『第一章节上云』步骤中获取的测试设备激活凭证 productKey 以及 deviceName,点击“确认”按钮。

image

  1. 刷新页面,查看Chrome 浏览器控制台(按 F12 或者 Ctrl+Shift+i),正常情况下设备的属性已经能正常获取。
  2. 点击几下灯的开关,发现能够正常控制灯的开关了,再试一下颜色调色板,发现灯的颜色也可以正常控制了。

至此 RGB 全彩智能灯的 Web 应用已开发完毕。给自己一点掌声~


五、应用发布(附加)

  1. 回到 Link Develop 工作台,在 RGB 小灯的 Web 应用界面上点击“新增版本变更”按钮,完成项目版本创建。
    image
  2. 点击“构建部署”按钮。
    image
  3. 在 Web 项目下执行 bone pack 命令,进行打包。
    image
  4. 在界面上点击“上传构建包”按钮,上传上一步生成的 zip 包文件。
    image
  5. 等待构建完成后,就可以通过域名访问部署好的 Web 应用了。
    image

image

目录
相关文章
|
5月前
|
存储 边缘计算 安全
边缘计算的概念和在IoT中的应用
随着物联网(IoT)设备数量的激增,传统的云计算模式面临着数据传输延迟和带宽压力等问题。边缘计算作为一种新的计算模式,通过将计算资源和服务部署到靠近数据源的位置,解决了这些问题。
95 2
|
3月前
|
物联网 Linux C#
一键掌控未来!用 Uno Platform 打造跨平台 IoT 应用,轻松连接你的智能设备,让生活更智能!
微软的开源跨平台框架 Uno Platform 支持使用 C# 和 XAML 一次性编写代码并部署至多个平台,如 Windows、macOS、Linux、WebAssembly 及 iOS/Android,这使其成为 IoT 设备开发的理想选择。本文通过创建控制网络 LED 灯的应用,详细介绍了 Uno Platform 的环境搭建及 MQTT 客户端配置过程,实现了 LED 状态订阅与控制指令发送功能。该案例展示了 Uno Platform 在 IoT 领域的潜力及其跨平台优势,未来可扩展至更多设备类型,构建智能家居系统。
297 58
|
2月前
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
73 7
|
7月前
|
传感器 存储 机器学习/深度学习
物联网(IoT)简介:定义、技术与应用
【5月更文挑战第30天】物联网(IoT)是将物品通过嵌入式系统、传感器及通信技术连接至互联网,实现物物、物人交互和数据共享的技术。其关键包括传感器、通信、嵌入式系统、云计算和人工智能技术。物联网应用于智能家居、智慧城市、工业自动化、农业和健康医疗等领域,通过Arduino等平台可实现简单数据传输。随着技术发展,物联网将深远影响人们生活和工作方式。
518 3
|
28天前
|
SQL 监控 物联网
ClickHouse在物联网(IoT)中的应用:实时监控与分析
【10月更文挑战第27天】随着物联网(IoT)技术的快速发展,越来越多的设备被连接到互联网上,产生了海量的数据。这些数据不仅包含了设备的状态信息,还包括用户的使用习惯、环境参数等。如何高效地处理和分析这些数据,成为了一个重要的挑战。作为一位数据工程师,我在一个物联网项目中深入使用了ClickHouse,以下是我的经验和思考。
63 0
|
4月前
|
存储 分布式计算 物联网
Apache IoTDB进行IoT相关开发实践
当今社会,物联网技术的发展带来了许多繁琐的挑战,尤其是在数据库管理系统领域,比如实时整合海量数据、处理流中的事件以及处理数据的安全性。例如,应用于智能城市的基于物联网的交通传感器可以实时生成大量的交通数据。据估计,未来5年,物联网设备的数量将达数万亿。物联网产生大量的数据,包括流数据、时间序列数据、RFID数据、传感数据等。要有效地管理这些数据,就需要使用数据库。数据库在充分处理物联网数据方面扮演着非常重要的角色。因此,适当的数据库与适当的平台同等重要。由于物联网在世界上不同的环境中运行,选择合适的数据库变得非常重要。 原创文字,IoTDB 社区可进行使用与传播 一、什么是IoTDB 我
181 9
Apache IoTDB进行IoT相关开发实践
|
2月前
|
物联网 Linux Android开发
一键掌控未来!用 Uno Platform 打造跨平台 IoT 应用,轻松连接你的智能设备,让生活更智能!
本文通过具体案例介绍了如何使用微软的开源框架 Uno Platform 实现与 IoT 设备的集成。Uno Platform 支持一次编写、多平台部署,适用于 Windows、macOS、Linux、WebAssembly 及 iOS/Android。本例创建了一个控制网络 LED 灯的应用,详细说明了环境搭建、MQTT 客户端配置、主题订阅及控制指令发送等步骤。该案例展示了 Uno Platform 在 IoT 领域的潜力及其跨平台优势,未来可扩展至更多设备类型,构建智能家居系统。
75 0
|
3月前
|
存储 物联网 关系型数据库
PolarDB在物联网(IoT)数据存储中的应用探索
【9月更文挑战第6天】随着物联网技术的发展,海量设备数据对实时存储和处理提出了更高要求。传统数据库在扩展性、性能及实时性方面面临挑战。阿里云推出的PolarDB具备高性能、高可靠及高扩展性特点,能有效应对这些挑战。它采用分布式存储架构,支持多副本写入优化、并行查询等技术,确保数据实时写入与查询;多副本存储架构和数据持久化存储机制保证了数据安全;支持动态调整数据库规模,适应设备和数据增长。通过API或SDK接入IoT设备,实现数据实时写入、分布式存储与高效查询,展现出在IoT数据存储领域的巨大潜力。
70 1
|
4月前
|
存储 物联网 关系型数据库
PolarDB在物联网(IoT)数据存储中的应用探索
随着物联网技术的发展,海量设备数据对数据库提出实时高效存储处理的新要求。PolarDB作为阿里云的高性能云数据库,展现了其在IoT数据存储领域的潜力。面对IoT数据的规模、实时性和多样性挑战,PolarDB凭借分布式架构,实现了高性能、高可靠性和高扩展性,支持动态扩展和冷热数据分层存储,满足IoT数据实时写入、查询及管理需求,展现出广阔的应用前景。
138 1
|
4月前
|
消息中间件 传感器 物联网
Producer 在物联网 (IoT) 中的应用
【8月更文第29天】在物联网 (IoT) 领域,设备和传感器不断生成大量的数据。为了有效地收集、处理和分析这些数据,通常会采用消息队列技术。消息队列允许设备将数据发送给后端系统进行进一步处理。在这个过程中,消息生产者(Producer)扮演着关键角色,负责将数据从设备发送到消息队列。本文将详细介绍如何使用消息生产者来收集来自各种传感器和其他 IoT 设备的数据,并提供一个基于 Python 和 Kafka 的示例代码。
43 0