查看: 33206|回复: 2

[例程/教程] 云开发实现微信小程序实现读写OneNET的数据

[复制链接]

5

主题

59

帖子

205

积分

中级会员

Rank: 3Rank: 3

积分
205
发表于 2020-5-1 09:06:01 | 显示全部楼层 |阅读模式
本帖最后由 tx****@outlook.com 于 2020-5-1 14:46 编辑

云开发是 Serverless 云端一体化产品方案,通过云开发可以在无后端的情况下,进行微信小程序、Web 和 APP 应用的开发。在传统的物联网项目中,开发者往往需要考虑设备如何接入,应用如何开发,在开发物联网应用时需要部署复杂的后端环境,使用云开发,在无后端的情况下,实现安全、稳定的将微信小程序接入物联网平台。

很早之前,我写过一篇关于使用微信小程序调用 OneNET API 实现控制彩光灯的小程序,通过小程序直接请求 API,需要将产品 AK 存在小程序端,有安全风险。

通过云函数封装 OneNET API,更安全更高效,且无需后端部署服务器,近期需要做一个物联网项目,正好借这个机会重新熟悉一下 OneNET 的新能力,结合云开发,我将 OneNET 的 MQTTs 相关 API 进行了封装,供大家参考。

通过云开发,可以实现微信小程序、Web 应用、APP 读写 OneNET 物联网平台数据,实现更加友好的人机交互。

项目链接:Gist 云开发实现微信小程序接入 OneNET 物联网

云函数部署指南
以小程序云开发为例说明如何部署云函数。

  • 注册微信小程序
注册微信小程序,获取 APPID。
  • 创建微信小程序工程
使用微信开发者工具创建支持云开发的微信小程序,关键步骤是填入 APPID。
  • 配置云开发环境
点击云开发,开通环境并获取环境 ID。
20200501001657.png
修改 app.js,填入环境 ID。
20200501001550.png
  • 导入云函数
云函数封装我放到 gist 上了,链接 ===> 云开发实现微信小程序接入 OneNET 物联网
下载后拷贝到 cloudfunctions 文件夹中。
20200501001221.png

  • 部署云函数
如需本地调试,需要本地安装依赖,否则可直接在云端安装依赖。
20200501001339.png
调整自定义超时时间为 10s 以上。
20200501002208.png
  • 测试调用
用小程序发起调用,使用 MQTT.fx 模拟一个 MQTT 设备。
20200501002812.png
如图,设备收到了命令,因为是模拟设备为给平台回复确认信息,最终小程序应收到命令超时的错误信息。
20200501002629.png
模拟器显示的超时信息,实验成功。



20200501003041.png
云函数封装文档
概述
本节介绍云函数的封装,云函数的请求参数包含三部分,如下:
  • 鉴权部分(必要)

product_id 产品 ID
device_id 设备 ID
access_key 产品 AK
  • 函数名(必要)

option 所调用函数的函数名
  • 其他参数(非必要)

parameter 其他参数,一般需要参考 OneNET API 手册


注册设备
  • 为用户提供设备注册的方法,当 设备名称 已存在时,接口返回当前设备信息
  • option:registDevice
  • parameter

device_desc 设备描述
device_name 设备名称
  • 完整请求范例

  1. {
  2.   "product_id": "341427",
  3.   "device_id": "594507918",
  4.   "access_key": "wPDifcotSNLT2wd179+BjF/VUmc4JH2AJdvLuGahaZ8=",
  5.   "option": "registDevice",
  6.   "parameter": {
  7.     "device_desc": "c4tcb",
  8.     "device_name": "dev_tcb"
  9.   }
  10. }
复制代码



删除设备
  • 将设备从产品中删除

  • option:deleteDevice
  • 完整请求范例

  1. {
  2.   "product_id": "341427",
  3.   "device_id": "594799075",
  4.   "access_key": "wPDifcotSNLT2wd179+BjF/VUmc4JH2AJdvLuGahaZ8=",
  5.   "option": "deleteDevice"
  6. }
复制代码



更新设备 KEY
  • 为用户提供设备 key 的更新与自定义的方法
  • option:updateDeviceKey
  • parameter

force_offline 是否强制离线设备,默认为 true
  • 完整请求范例
默认无参数调用
  1. {
  2.   "product_id": "341427",
  3.   "device_id": "594770145",
  4.   "access_key": "wPDifcotSNLT2wd179+BjF/VUmc4JH2AJdvLuGahaZ8=",
  5.   "option": "updateDeviceKey"
  6. }
复制代码

有参数调用
  1. {
  2.   "product_id": "341427",
  3.   "device_id": "594770145",
  4.   "access_key": "wPDifcotSNLT2wd179+BjF/VUmc4JH2AJdvLuGahaZ8=",
  5.   "option": "updateDeviceKey",
  6.   "parameter": {
  7.     "force_offline": false
  8.   }
  9. }
复制代码


设备命令
  • 直接向设备下发单播指令,同步设计,当设备收到命令并进行应答时,返回设备应答内容
  • 特别说明:同步下发命令超时时间为 10s,云函数自定义超时时间应大于 10s
  • option:synccmds
  • parameter

cmds (必要)文本型命令
  • 完整请求范例

  1. {
  2.   "product_id": "341427",
  3.   "device_id": "594770145",
  4.   "access_key": "wPDifcotSNLT2wd179+BjF/VUmc4JH2AJdvLuGahaZ8=",
  5.   "option": "synccmds",
  6.   "parameter": {
  7.     "cmds": "TXISFINE"
  8.   }
  9. }
复制代码


查询设备镜像
  • 用于查询某个设备的设备镜像 json 文档
  • option:getDeviceImage
  • 完整请求范例

  1. {
  2.   "product_id": "341427",
  3.   "device_id": "594770145",
  4.   "access_key": "wPDifcotSNLT2wd179+BjF/VUmc4JH2AJdvLuGahaZ8=",
  5.   "option": "getDeviceImage"
  6. }
复制代码


更新设备镜像
  • option:updataDeviceImage
  • parameter
state (必要)
       desired 应用期望属性,与 reported 至少存在一项
       reported 设备上报属性,与 desired 至少存在一项
  • 返回值手册

  1. {
  2.   "product_id": "341427",
  3.   "device_id": "594770145",
  4.   "access_key": "wPDifcotSNLT2wd179+BjF/VUmc4JH2AJdvLuGahaZ8=",
  5.   "option": "updataDeviceImage",
  6.   "parameter": {
  7.     "state": {
  8.       "desired": {
  9.         "color": "green"
  10.       },
  11.       "reported": {
  12.         "color": "red"
  13.       }
  14.     }
  15.   }
  16. }
复制代码


查询设备数据点
  • option:getDataPoints
  • parameter
  • par_str 查询参数,可以为空,构造方法请参考手册
  • 完整请求范例

带查询参数请求:
  1. {
  2.   "product_id": "341427",
  3.   "device_id": "594770145",
  4.   "access_key": "wPDifcotSNLT2wd179+BjF/VUmc4JH2AJdvLuGahaZ8=",
  5.   "option": "getDataPoints",
  6.   "parameter": {
  7.     "par_str": "datastream_id=ds&start=2017-01-01T00:00:00&limit=100"
  8.   }
  9. }
复制代码

不带查询参数请求:
  1. {
  2.   "product_id": "341427",
  3.   "device_id": "594770145",
  4.   "access_key": "wPDifcotSNLT2wd179+BjF/VUmc4JH2AJdvLuGahaZ8=",
  5.   "option": "getDataPoints"
  6. }
复制代码


进阶操作
如何获取安全鉴权 Token
请参考 OneNET 开发者文档-Token 算法,目前云函数支持 PHP7.0 和 NodeJS8.9 两种运行时,对于安全鉴权 Token 获取我也进行了封装,https://open.iot.10086.cn/bbs/thread-37686-1-1.html

将产品 AK 保存在云函数中
取消对const access_key的注释,并填入产品 AK,注释var const access_key,并不在自定义参数中传入 access_key。
20200430235031.png

在微信小程序中调用
例如,在微信小程序中调用云函数实现向设备下发命令。
  1. synccmds() {
  2.     wx.showLoading({
  3.       title: "执行中"
  4.     })
  5.     var _this = this;
  6.     wx.cloud.callFunction({
  7.       name: "onenet",
  8.       data: {
  9.         product_id: "341427",
  10.         device_id: "594507918",
  11.         access_key: "wPDifcotSNLT2wd179+BjF/VUmc4JH2AJdvLuGahaZ8=",
  12.         option: "synccmds",
  13.         parameter: {
  14.             cmds: "TXISFINE"
  15.         }
  16.       },
  17.       success: function (res) {
  18.         var re = JSON.stringify(res.result);
  19.         // 函数返回值
  20.         _this.setData({
  21.           log: re
  22.         });
  23.         wx.hideLoading({
  24.           complete: (res) => {},
  25.         })
  26.       }
  27.     });
  28.   }
复制代码


问题反馈
留言 or 邮件
tocker#16iot.cn

-----------------
作者: 小谈谈
链接: https://www.txisfine.cn/archives/c572f209.html
来源: 弹霄博科
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

弹霄博科,你好物联网:https://www.txisfine.cn
回复

举报

95

主题

575

帖子

2201

积分

金牌会员

Rank: 5Rank: 5

积分
2201
发表于 2020-5-9 11:41:54 | 显示全部楼层
好东西!收藏了收藏了!
1、OneNET交流群6:887624121
该群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~

0

主题

2

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2020-5-15 22:01:13 | 显示全部楼层
有意思
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表