15 分钟上手 Link Develop 一站式开发平台

简介: 传统物联网开发流程长、技术栈要求高,而阿里云 IoT 平台产品 Link Develop(下称『LD』)可以大大降低传统企业进行物联网开发的成本,下面展示一个即时上手,通过线上虚拟设备模拟物联网开发全链路的小Demo。

传统物联网开发流程长、技术栈要求高,而阿里云 IoT 平台产品 Link Develop(下称『LD』)可以大大降低传统企业进行物联网开发的成本,下面展示一个即时上手,通过线上虚拟设备模拟物联网开发全链路的小Demo。

1. 创建产品

开通阿里云账号及 LD 平台服务。进入主控制台,立即创建产品。在本 Demo 中我们将虚拟一个 RGB 小灯,因此产品对应所属分类选择“智能生活/电工照明/灯”,节点类型选择“设备”,通讯网络选择“Wi-Fi”,数据格式选择“Alink”,然后点“提交”后点击“进入开发”按钮。

既然是 RGB 当然是五颜六色的,因此已有的开\关灯功能不能满足我们的需求,在标准功能一栏右侧找到 “新增”按钮 选择 『RGB 调色功能』然后点击“确定”。

2. 虚拟设备

产品已设好,设备线上找。现在我们打开浏览器跳转至 [设备虚拟页面]。
在页眉处,填写设备激活凭证(前段设备添加页面『激活凭证』可得)

选择『编程脚本』,修改为下列代码:

// 监听云端消息
device.serve('property/set', params => {
  console.log('receieve params:', params);
  // 原样上报
  console.log('post props:', params);
  device.postProps(params, err => {
    if (err) {
      return console.log('post error:', err);
    }
    console.log('post successfully!');
  });
});

3. 数据上云

点击运行,在右侧看到『连接成功』就表示你的虚拟小灯就正式上线了。回到 LD 控制台页面,点击平台设备列表里的设备“调试”链接,进入设备调试。在页面下方的调试功能里选择“RGB调色(RGBColor)”,方法选为“获取”。可以看到虚拟小灯的数据已经同步上传到云端。

同样我们也可以进行数据的下发,将“获取”更改为“设置”,填入以下JSON:{"RGBColor":{"Red":255,"Blue":255,"Green":0}},我们可以看到虚拟设备页面同样也接收到了云端数据的下发。

4. Web 开发

作为一站式的开发平台,仅仅是设备端到数据上云并不能满足需求,用户端的体验一样重要。同样我们可以利用 LD 平台的 bone 框架轻松进行前端的开发。

LD 平台中前端开发与设备端数据都使用加密后API进行联动,因此我们先回到 LD 项目控制台,选择“资源管理”——“添加官方服务”——“添加物的管理服务”。之后回到主页,选择左侧菜单进入“应用-Web 应用”,点击右上角的“新增应用”按钮,一路 Next,获取 AppKey 和 AppSecret。

线上的工作基本完成了,回归本地开发用机,按照 文档 安装好 Nodejs 和 Bone 框架,新建项目文件夹,进入后执行 bone init 初始化项目并安装项目依赖组件 bnpm i --save @bone/iot-gateway react-color,修改 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;
}

最后执行 bone start,运行 Web App,现在你可以在打开的页面任意控制你的虚拟小灯了~ 每一次操作在虚拟设备页面都会得到反馈。


仅仅是虚拟设备是不是还不够,如果你有树莓派、Developerkit 等设备的话,欢迎 参考文档 进行开发体验~

目录
相关文章
|
网络协议 Shell Linux
【Shell 命令集合 网络通讯 】Linux 提供SMB共享 smbd命令 使用指南
【Shell 命令集合 网络通讯 】Linux 提供SMB共享 smbd命令 使用指南
1156 0
|
机器学习/深度学习 存储 算法
时序数据特征工程浅析
内容摘要特征工程是指将原始数据标记处理为价值密度更高,更容易解释目标问题的工程化过程,在面向大量原始采集的数据集统计分析,尤其是对于高通量持续采集、且价值密度较低的时序数据更是如此。时序数据特征工程则是指利用有效方法,将原始时序数据转化为带有含义分类标签的序列数据片段或特征数值,例如,我们可以将指定时间窗口序列数据标识为特定异常关联数据,并保留平均、最大、最小值作为该序列的特征值。这样我们就可以围
4098 0
时序数据特征工程浅析
|
9月前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
828 79
|
7月前
|
API 监控 双11
淘宝/天猫获取商品历史价格信息 API 返回值的应用
本内容介绍了一款基于API的工具的核心功能,涵盖消费者决策支持、商家运营优化、市场趋势分析及数据服务拓展四大方面。消费者可借助历史价格曲线判断价格合理性、选择最佳购买时机;商家可通过竞品数据分析优化定价策略与促销活动;第三方平台能监测价格波动、跟踪竞品动态以洞察市场趋势。此外,工具还支持比价工具开发与价格预警服务,为用户和企业带来全方位的价格智能解决方案。
|
8月前
|
存储 安全 Nacos
阿里云 MSE Nacos 发布全新“安全防护”模块,简化安全配置,提升数据保护
阿里云在其微服务引擎(MSE)注册配置中心 Nacos 上正式推出全新“安全防护”功能模块,旨在帮助企业用户有效管理安全状态和降低开启安全相关功能的学习成本,提升微服务架构的安全性。
370 25
|
9月前
|
数据采集 Prometheus Cloud Native
架构革新:揭示卓越性能与高可扩展的共赢秘诀
为了构建现代化的可观测数据采集器LoongCollector,iLogtail启动架构通用化升级,旨在提供高可靠、高可扩展和高性能的实时数据采集和计算服务。然而,通用化的过程总会伴随性能劣化,本文重点介绍LoongCollector的性能优化之路,并对通用化和高性能之间的平衡给出见解。
架构革新:揭示卓越性能与高可扩展的共赢秘诀
|
小程序 定位技术 Python
分享46个微信小程序源码,总有一款适合您
分享46个微信小程序源码,总有一款适合您
1584 2
|
安全 物联网 API
AliOS Things组件功能介绍(三)
AliOS Things组件功能介绍(三)
442 21
|
芯片
关于JTAG的TRST信号的四则问题?
关于JTAG的TRST信号的四则问题?
887 0