背景
在腾讯云 IoT Explorer 和 TencentOS tiny 开放公测之后。腾讯云IoT产品矩阵再次集成了新的能力 – LoRa(名字来自于 Long Range ,远距离无线电),这是目前物联网领域内最炙手可热的无线技术。它最大特点就是在同样的功耗条件下比其他无线方式传播的距离更远,实现了低功耗和远距离的统一。
介绍下腾讯的IoT产品矩阵
- 腾讯云物联网通信(IoT Hub)提供一个安全、稳定、高效的连接平台,帮助开发者低成本、快速地实现“设备-设备”、“设备-用户应用”、“设备-云服务”之间可靠、高并发的数据通信
- 腾讯云物联网开发平台(IoT Explorer)提供便捷的开发工具与服务,助力更高效的完成设备接入,并提供应用开发及场景服务能力,帮助高效、低成本构建物联网应用
- 腾讯云 LPWA(Low Power Wide Area)物联网络是为传感终端提供用于通讯的基础网络。LPWA 物联网络支持 LoRaWAN/CLAA(China LoRa Application Alliance)标准协议
- 腾讯物联网终端操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率
这次物联网开发平台LoRa内测体验活动中,有幸拿到了 “套件一 LoRa开发板 P-NUCLEO-LRWAN3”,该开发板是由意法半导体设计的 LoRaWAN 开发套件,包含 LoRa 节点和网关,其中 LoRa 节点可运行 TencentOS Tiny,并集成了温湿度等传感器
另外,手头上还有一块 TencentOS tiny 定制开发板 EVB_MX ,配套有WiFi模组和传感器扩展板(包含小电机,灯等)
两块开发板结合腾讯云的IoT Explorer 以及IoT Hub平台,刚好可以把腾讯云的IoT产品功能串联起来,并做一个简单的联动。联动逻辑在小程序端实现,顺便试用下小程序的云开发方式,体验下云开发和腾讯云IoT服务的结合。
数据流如下图所示
分为三个步骤实现
- 传感数据通过LoRa方式上云。LoRa节点作为传感单元,传感数据通过TencentOS tiny的LoraWAN SDK上报到LoRa网关。LoRa网关将传感数据上传到腾讯云Iot Explorer平台
- 执行设备通过MQTT接入云。控制指令通过MQTT协议下发,EVB_MX 开发板作为执行单元,通过TencentOS tiny的MQTT SDK和Iot Hub建立MQTT连接,并订阅下行指令主题
- 小程序应用使用云开发serverless方式,通过云函数和IoT Hub/IoT Explorer通信,负责串联传感单元和执行单元,先实现一个简单的设备联动功能
1. 传感数据通过LoRa方式上云
首先了解下LoRa的组网方式,如下图所示,LoRa网络主要由节点、网关、网络服务器和应用服务器四部分组成。节点和网关之间通过LoRaWan协议交互,网关和云端(网络服务器)走TCP/IP协议。
传感器数据上云,关键是搭建好LoRa通信环境。总体来说分为网关入网和节点入网两个步骤,两个步骤都需要在云端和设备端配置。TencentOS tiny 开源仓库提供了非常详细的LoRaWan开发入门文档,参考文档就可以把环境搭建好。
基于 TencentOS tiny 的 LoRaWAN 开发入门指南
网关入网
云端配置
在腾讯云物联网开发平台控制台的LoRa 网关管理页面中,添加网关。
详细可参见:基于 TencentOS tiny 的 LoRaWAN 开发入门指南- 4.2 控制台操作 LoRa 网关
网关设备侧
关键是完成硬件连接(能够通过 DHCP 的方式连接以太网),并通过串口配置网关的服务器地址,频率计划等
详细可参见:基于 TencentOS tiny 的 LoRaWAN 开发入门指南 - 4.3 LoRa网关实物操作
完成配置和硬件连接后,复位网关,串口输出以下内容
其中:
代码语言:txt复制LORAWAN SERVER: loragw.things.zijiebao.com
表示连接的网关服务器地址已经配置成 loragw.things.zijiebao.com
代码语言:txt复制Downlink UDP Connected
Uplink UDP Connected
表明网关 DHCP 入网成功,网络连接正常
节点通过网关入网
云端配置
IoT设备在云端是物模型的体现,在接入之前,需要在物联网开发平台中完成创建产品-设备-定义数据模板等步骤。登录物联网开发平台控制台-新建项目-新建产品-创建数据模板-设备数据解析-创建测试设备
注意:在设备开发页面中,按需调整设备数据解析。由于 LoRa 类资源有限设备不适合直接传输 JSON 格式数据,使用“设备数据解析”可以将设备原始数据转化为产品JSON数据
详细可参见:基于 TencentOS tiny 的 LoRaWAN 开发入门指南 - 4.1 控制台操作 LoRa 节点
节点设备侧
ST Nucleo LoRa节点套件由LRWAN_NS1扩展板和ST Nucleo-L073底板组成。其中 LRWAN_NS1扩展板集成瑞兴恒方的 RHF0M003 LoRaWAN模组,RHF0M003 LoRaWAN模组通过AT指令完成通信。TencentOS tiny的AT框架已经适配了RHF0M003的AT指令,并提供了ST Nucleo-L073的开发板案例。
可以直接烧录 TencentOS tiny 提供的 LoRaWAN 案例:https://github.com/Tencent/TencentOS-tiny/tree/master/board/NUCLEO_STM32L073RZ/KEIL/lorawan
详细可参见:基于 TencentOS tiny 的 LoRaWAN 开发入门指南 - 4.4 LoRa 节点实物操作点
有几个地方要注意修改下:
- 修改examplesLoRaWANlora_demo.c 入网节点的DevEUI和AppKey,可从 LoRa 节点开发板背面贴纸上获取tos_lora_module_join_otaa("8cf957200000f806", "8cf957200000f8061b39aaaaad204a72");
- 修改devicesrhf76_loraRHF76.h,计划使用信道修改成80 - 87,使用默认的0-7信道会导致入网失败 Join Fail//#define RHF76_ATCMD_SET_CHANNEL "at ch=num,0-7rn"
#define RHF76_ATCMD_SET_CHANNEL "at ch=num,80-87rn"
当您看到串口打印如下日志,即说明 LoRa 节点已经通过网关成功入网
代码语言:txt复制[23:43:25.139]收←◆---> JOIN: Start
---> JOIN: NORMAL
[23:43:32.989]收←◆---> JOIN: Network joined
[23:43:33.029]收←◆---> JOIN: NetID 000035 DevAddr 6A:64:20:0A
物联网开发平台,设备调试页面看到设备日志,这时候传感数据上云的工作就完成了
3.执行设备通过MQTT接入云
执行设备使用 TencentOS tiny 定制开发板 EVB_MX ,配套WiFi模组和传感器扩展板E53-IA1(包含:小电机,LED灯等)
TencentOS tiny 定制开发板介绍
执行设备通过WiFi模组联网,通过MQTT协议和腾讯云IoT Hub交互
云端配置
云端首先在腾讯云物联网通信平台IoT Hub,创建产品和设备。相对于IoT explorer来说,IoT Hub更底层,关注连接而不关心业务形态,因此不需要配置数据模板。创建设备后,获取设备的密钥信息,需要在设备侧配置。
TencentOS tiny定制开发板EVB_MX 快速入门指南
设备侧
TencentOS tiny 已经适配 EVB_MX 开发板,而且有很多基于 EVB_MX 开发板的案例源码。
这里直接使用 EVB_MX E53-IAI 的案例扩展 EVB_MX E53-IAI案例工程目录
注意:需要修改源码WIFI配置的ssid和密码,以及用于mqtt接入的设备密钥信息
日志输出os_mqtt_connect success,表示MQTT连接建立成功
代码语言:txt复制--->Recv 152 bytes
--->SEND OK
tos_mqtt_connect success. sock_id 0
AT CMD:
AT CIPSEND=0,29
--->OK
订阅MQTT主题成功,接受下行指令
代码语言:txt复制--->SEND OK
subscribe topic:U1BZWHF7F9/dev_01/data success
--->OK
通信逻辑
代码语言:txt复制void executor_agent(void) {
// 通过通信模组实现网络连接
int ret = network_init();
if (ret < 0) {
printf("network_init failn");
return;
}
// 建立到IoT hub的MQTT连接
ret = mqtt_connect();
if (ret < 0) {
printf("mqtt_connect failn");
return;
}
// 订阅设备主题,用于接收下行消息
ret = mqtt_subscribe();
if (ret < 0) {
printf("mqtt_subscribe failn");
return;
}
while(1) {
// 接收下行控制消息
receive_data();
// 控制设备
control_device();
osDelay(1000);
}
}
云端在线调试
物联网通信平台提供了设备在线调试页面,可以指定topic发送消息,测试下行通道。如果下发成功,则表明下行通信也是没有问题的。
3.小程序云开发
传感设备通过LoRa,执行设备通过MQTT,都已经和云端建立连接。接下来,要通过小程序完成一个简单的设备联动,比如:传感器温度大于门限值,执行设备打开小风扇
其实腾讯云物联网平台提供的规则引擎服务,可以方便的完成设备联动的功能,只需要采用类SQL的方式创建规则,并指定转发的设备Topic。腾讯云物联网平台规则引擎介绍
不过,为了更直观一点,想通过小程序把两者串联起来。因为功能比较简单,所以尝试用小程序云开发的方式完成
小程序和物联网平台通信方式
首先,小程序如何监控传感数据,研究了下腾讯云物联网平台接口文档,应该有三种方式:
- 小程序轮询 IoT Explorer 数据查询接口,最简单直接。参考获取设备属性数据
- IoT Explorer 数据同步(HTTP Post到第三方服务),因为准备使用云开发,是Serverless,所以放弃这种方式
- IoT Explorer 提供了应用端API,包含了长连接通信(WSS),小程序可以通过wss注册设备监听,IoT Explorer实时推送设备上下线状态和属性数据。但应用端API是开发平台为了满足智能家居场景的服务,使用注册设备监听,还需要依赖用户管理,家庭管理,用户绑定设备等其它接口,适用于开发完整的智能家居场景。具体可参考物联网开发平台-应用端 API-长连接通信
最后还是选择了最简单的轮询IoT Explorer 数据查询接口的方式。
实现云函数
接下来就是通过云函数实现各种数据接口。在调试过程中,发现腾讯云提供了一个API 3.0 Explorer工具,除了用于在线调试接口外,还支持自动生成接口的SDK代码,而生成的Node.js接口代码可以直接复制到云函数里,稍作修改就可以使用。免去了繁琐的接口代码的编写。
- API 3.0 Explorer 获取设备属性(DescribeDeviceData)接口在线调用和自动生成的Node.js SDK代码
- 云函数(query 用于获取设备属性),直接把自动生成的SDK代码复制过来,稍微修改下就可以使用了
// 云函数入口文件
const cloud = require('wx-server-sdk')
const tencentcloud = require("tencentcloud-sdk-nodejs");
const IotexplorerClient = tencentcloud.iotexplorer.v20190423.Client;
const models = tencentcloud.iotexplorer.v20190423.Models;
const Credential = tencentcloud.common.Credential;
const ClientProfile = tencentcloud.common.ClientProfile;
const HttpProfile = tencentcloud.common.HttpProfile;
cloud.init()
// 云函数入口函数
exports.main = async(event, context) => {
console.log("event:", event);
let cred = new Credential(event.SecretId, event.SecretKey);
let httpProfile = new HttpProfile();
httpProfile.endpoint = "iotexplorer.tencentcloudapi.com";
let clientProfile = new ClientProfile();
clientProfile.httpProfile = httpProfile;
let client = new IotexplorerClient(cred, "ap-guangzhou", clientProfile);
let req = new models.DescribeDeviceDataRequest();
req.ProductId = event.ProductId;
req.DeviceName = event.DeviceName;
console.log("req:", req);
return new Promise((resolve, reject) => {
client.DescribeDeviceData(req, function(errMsg, response) {
if (errMsg) {
console.log(errMsg);
reject(errMsg);
}
console.log(response);
resolve(response)
});
})
}
小程侧的业务逻辑
代码语言:txt复制onLoad: async function(options) {
while (true) {
let sensor = await wx.cloud.callFunction({
name: 'query',
data: config.SensorDevice
})
this.renderChart(sensor.temperature.Value, sensor.humidity.Value)
if (sensor.temperature.Value >= this.data.tempHigh) {
wx.showModal({
title: '提示',
content: `温度达到门限(${this.data.tempHigh}),打开风扇和灯`,
showCancel: false,
})
await wx.cloud.callFunction({
name: 'iothub-publish',
data: {"light":1,"motor":1}
})
}
await util.delayMs(5000)
}
}
小程序源码已经上传到 TencentOS tiny 代码库中
https://github.com/Tencent/TencentOS-tiny/tree/master/tools/Mini_Program/qcloud_device_linkage_demo
小程序长这个样子
最后是调试的视频(用手触摸温湿度传感器,模拟温度上升,触发设备联动)