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 等设备的话,欢迎 参考文档 进行开发体验~

目录
相关文章
|
6月前
|
SQL 监控 Java
Github Star 36.2K 的开源低代码平台推荐 —JeecgBoot
低代码的含义是少写代码并不是不写代码,面向的用户群体还是编程人员,传统的快速开发平台、在线开发平台、OA办公系统 都可以称为低代码平台,那他是怎么帮助你少写代码的呢,往下看!
311 0
|
存储 开发框架 安全
Atlassian FaaS 云开发平台 Forge 解析
虽然 Atlassian 工具开箱即用、功能强大,但是每个企业都有其独特的挑战,其中一些挑战需要定制化解决方案。目前在其市场上有超过 4000 个应用程序,超过 2.5 万开发者,包括为团队构建自定义应用程序的内部开发人员,以及在 Atlassian 市场发布应用程序的第三方开发人员。 为了更好地支持开发生态的发展,Atlassian 发布了云端开发平台 Forge,让开发者可以更安全地构建和运行整合 Altassian 服务的云端应用程序。
191 0
|
7月前
|
数据可视化 安全 数据管理
低代码PaaS平台源码 自定义软件开发平台
采用对象方式实现字段、API的字段类型,引入RPA实现表自动化建模;再使用选择方式对地段功能进行选择定义甚至可以插入代码进行自定义。
|
7月前
|
数据可视化 安全 数据库
低代码(Low code)开发平台源码
组件和模块库: 低代码平台通常附带了丰富的组件库和预构建模块,用于处理常见的任务和功能,如用户界面设计、数据库集成、用户认证、数据可视化等。开发者可以在应用中选择适当的组件和模块,然后通过配置来定义其行为。
|
9月前
|
Rust NoSQL 数据可视化
GitHub 上又一可视化低代码神器,诞生了!
项目源码地址:docs.qq.com/doc/DVHRQUVhKVkN2dUha
230 0
|
10月前
|
数据安全/隐私保护 容器
低代码开发平台魔笔测试
低代码开发平台魔笔测试
94 0
《低代码开发平台Mobi发布》电子版地址
《低代码开发平台Mobi发布》PPT
169 0
《低代码开发平台Mobi发布》电子版地址
|
SQL 搜索推荐 JavaScript
低代码开发平台的功能有哪些?低代码“功能清单”一览
基于大家对低代码的好奇,下面就给大家盘点3款低代码开发平台的功能清单。希望对大家有所帮助!
|
Cloud Native jenkins Java
【云原生】DevOps(二):Build工具|Operate工具|Integrate工具 介绍及使用方法
【云原生】DevOps(二):Build工具|Operate工具|Integrate工具 介绍及使用方法
215 0
|
前端开发 安全 搜索推荐
DingTalk「开发者说」- 酷应用开发之群扩展基础开发
本篇主要讲解钉钉酷应用在群内的功能,群内酷应用的接入、开发演示和最佳实践。
DingTalk「开发者说」- 酷应用开发之群扩展基础开发