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

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
简介: 使用 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

目录
相关文章
|
8月前
|
存储 物联网 数据管理
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(12)
现在到了使用Apache IoTDB进行IoT相关开发的架构设计与功能实现的最后一个环境,在本文中我将向大家介绍IoTDB的查询语言。IoTDB为咱们广大开发者提供了类似SQL的查询语言,用于与IoTDB进行交互,查询语言可以分为4个主要部分:架构语句、数据管理语句、数据库管理语句、功能。
137 0
|
8月前
|
关系型数据库 物联网 PostgreSQL
沉浸式学习PostgreSQL|PolarDB 11: 物联网(IoT)、监控系统、应用日志、用户行为记录等场景 - 时序数据高吞吐存取分析
物联网场景, 通常有大量的传感器(例如水质监控、气象监测、新能源汽车上的大量传感器)不断探测最新数据并上报到数据库. 监控系统, 通常也会有采集程序不断的读取被监控指标(例如CPU、网络数据包转发、磁盘的IOPS和BW占用情况、内存的使用率等等), 同时将监控数据上报到数据库. 应用日志、用户行为日志, 也就有同样的特征, 不断产生并上报到数据库. 以上数据具有时序特征, 对数据库的关键能力要求如下: 数据高速写入 高速按时间区间读取和分析, 目的是发现异常, 分析规律. 尽量节省存储空间
616 1
|
8月前
|
SQL 物联网 Apache
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(11)
目前,IoTDB中不存在冲突的权限,因此用户的真正权限是用户自身权限和用户角色权限的结合。也就是说,要确定用户是否可以执行操作,取决于用户自己的权限之一或用户角色的权限是否允许该操作。用户自己的特权和用户角色的特权可能会重叠,但这并不重要。
135 1
|
8月前
|
SQL 传感器 物联网
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(10)
物联网提供限制/限制条款和偏移/偏移子句,以使用户对查询结果有更多的控制权。使用 LIMIT 和 SLIMIT 子句允许用户控制查询结果的行数和列数,使用 OFFSET 和 SOFSET 子句允许用户设置结果的起始位置进行显示。
|
9天前
|
传感器 物联网 大数据
物联网(IoT)技术与应用:塑造未来的智能化生活
【5月更文挑战第1天】物联网(IoT)技术整合传感器、嵌入式系统、云计算与大数据,连接智能设备,重塑生活与工作方式。应用涵盖智能家居、工业自动化、农业、智能城市及医疗健康,提升效率与便利性。然而,数据安全、设备兼容性及网络基础设施仍是挑战。随着5G和AI进步,IoT将在更多领域发挥潜力,驱动社会智能化转型,需关注技术挑战并加强创新。
|
7月前
|
边缘计算 安全 物联网
开源在物联网(IoT)中的应用
开源在物联网(IoT)中的应用
140 0
|
8月前
|
小程序 JavaScript 物联网
搭建IoT小程序开发环境,创建一个应用
通过实验,了解阿里云IoT小程序应用的开发调试环境,以及如何创建新的应用并在PC模拟器上进行预览调试。
296 2
|
8月前
|
物联网 AliOS-Things
点亮AliOS Things IOT开发板上的的OLED全彩屏
点亮AliOS Things IOT开发板上的的OLED全彩屏
73 0
|
8月前
|
算法 物联网 AliOS-Things
AliOS Things IOT开发板初体验(基于STM32L496VGTx)
AliOS Things IOT开发板初体验(基于STM32L496VGTx)
375 0
|
8月前
|
SQL 物联网 Java
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(9)
GROUP BY 语句为用户提供了三种类型的指定参数: 参数1:时间轴上的显示窗口 参数2:划分时间轴的时间间隔(应为正) 参数3:时间滑动步长(可选,不应小于时间间隔,如果未设置,则默认等于时间间隔)
144 0
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(9)

热门文章

最新文章