专栏首页腾讯云IoT【IoT迷你赛】设备联动小应用
原创

【IoT迷你赛】设备联动小应用

背景

在腾讯云 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,并集成了温湿度等传感器

P-NUCLEO-LRWAN3 LoRa开发板

另外,手头上还有一块 TencentOS tiny 定制开发板 EVB_MX+,配套有WiFi模组和传感器扩展板(包含小电机,灯等)

TencentOS tiny 定制开发板 EVB_MX+

两块开发板结合腾讯云的IoT Explorer 以及IoT Hub平台,刚好可以把腾讯云的IoT产品功能串联起来,并做一个简单的联动。联动逻辑在小程序端实现,顺便试用下小程序的云开发方式,体验下云开发和腾讯云IoT服务的结合。

数据流如下图所示

数据流

分为三个步骤实现

  1. 传感数据通过LoRa方式上云。LoRa节点作为传感单元,传感数据通过TencentOS tiny的LoraWAN SDK上报到LoRa网关。LoRa网关将传感数据上传到腾讯云Iot Explorer平台
  2. 执行设备通过MQTT接入云。控制指令通过MQTT协议下发,EVB_MX+开发板作为执行单元,通过TencentOS tiny的MQTT SDK和Iot Hub建立MQTT连接,并订阅下行指令主题
  3. 小程序应用使用云开发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网关实物操作

完成配置和硬件连接后,复位网关,串口输出以下内容

gw_console.png

其中:

LORAWAN SERVER: loragw.things.qcloud.com 

表示连接的网关服务器地址已经配置成 loragw.things.qcloud.com

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 节点实物操作点

有几个地方要注意修改下:

  • 修改\examples\LoRaWAN\lora_demo.c 入网节点的DevEUI和AppKey,可从 LoRa 节点开发板背面贴纸上获取tos_lora_module_join_otaa("8cf957200000f806", "8cf957200000f8061b39aaaaad204a72");
  • 修改\devices\rhf76_lora\RHF76.h,计划使用信道修改成80 - 87,使用默认的0-7信道会导致入网失败 Join Fail//#define RHF76_ATCMD_SET_CHANNEL "at+ch=num,0-7\r\n"

#define RHF76_ATCMD_SET_CHANNEL "at+ch=num,80-87\r\n"

当您看到串口打印如下日志,即说明 LoRa 节点已经通过网关成功入网

[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连接建立成功

--->Recv 152 bytes
--->SEND OK
tos_mqtt_connect success. sock_id  0 
AT CMD:
AT+CIPSEND=0,29
--->OK

订阅MQTT主题成功,接受下行指令

--->SEND OK
subscribe topic:U1BZWHF7F9/dev_01/data success
--->OK

通信逻辑

void executor_agent(void) {
    // 通过通信模组实现网络连接
    int ret = network_init();
    if (ret < 0) {
        printf("network_init fail\n");
        return;
    }

    // 建立到IoT hub的MQTT连接
    ret = mqtt_connect();
    if (ret < 0) {
        printf("mqtt_connect fail\n");
        return;
    }

    // 订阅设备主题,用于接收下行消息
    ret = mqtt_subscribe();
    if (ret < 0) {
        printf("mqtt_subscribe fail\n");
        return;
    }

    while(1) {
        // 接收下行控制消息
        receive_data();
        // 控制设备
        control_device();
        osDelay(1000);
    }
}

云端在线调试

物联网通信平台提供了设备在线调试页面,可以指定topic发送消息,测试下行通道。如果下发成功,则表明下行通信也是没有问题的。

3.小程序云开发

传感设备通过LoRa,执行设备通过MQTT,都已经和云端建立连接。接下来,要通过小程序完成一个简单的设备联动,比如:传感器温度大于门限值,执行设备打开小风扇

其实腾讯云物联网平台提供的规则引擎服务,可以方便的完成设备联动的功能,只需要采用类SQL的方式创建规则,并指定转发的设备Topic。腾讯云物联网平台规则引擎介绍

不过,为了更直观一点,想通过小程序把两者串联起来。因为功能比较简单,所以尝试用小程序云开发的方式完成

小程序和物联网平台通信方式

首先,小程序如何监控传感数据,研究了下腾讯云物联网平台接口文档,应该有三种方式:

  1. 小程序轮询 IoT Explorer 数据查询接口,最简单直接。参考获取设备属性数据
  2. IoT Explorer 数据同步(HTTP Post到第三方服务),因为准备使用云开发,是Serverless,所以放弃这种方式
  3. 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)
    });
  })
}

小程侧的业务逻辑

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

小程序长这个样子

lora_app_mp.jpg

最后是调试的视频(用手触摸温湿度传感器,模拟温度上升,触发设备联动)

视频内容

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试题64(有1千万条有重复的短信,以文本文件的形式保存,一行一条,也有重复。请用5 分钟时间找出重复出现最多的前10 条短信)

    1·有1千万条有重复的短信,以文本文件的形式保存,一行一条,也有重复。请用5 分钟时间找出重复出现最多的前10 条短信。? 正确解析如下... 解析: 对于本题...

    Java学习
  • Jupyter-Notebook 远程访

    记得当时在说设置默认工作路径的时候,提过配置文件https://www.cnblogs.com/dotnetcrazy/p/9261524.html

    py3study
  • EKT多链技术谈 | 跨越——从互联网协议到公链

    一个技术的兴起,往往伴随着巨大的幻想和狂热的泡沫。互联网的前互联网时代,从20世纪80年代到21世纪初,互联网服务建立在互联网社区控制的开放协议上。这意味着人们...

    风中凌乱的靓仔
  • 某大学渗透测试实战靶场报告-Part1

    这次应我们贝塔团队成员“蜗牛”老哥的邀请与团队成员共同参与了这次某大学渗透测试实战靶场打靶,正好最近闲着没事就当拿来练练手了。根据攻击A组群里给的两份Word文...

    贝塔安全实验室
  • 编程趣事:Windows系统中休眠和睡眠的区别

    其实Windows操作系统中很早就拥有“待机”“休眠”模式,而Windows 7中是新加入“睡眠”模式,利用这些模式,我们可以节约电力消耗,还可以用尽可能短的时...

    浩Coding
  • Linux磁盘查看命令之du,df

    df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。如果POSIXLY...

    AsiaYe
  • CSS3-实现单选框radio的小动画

    xing.org1^
  • CISO职场生存现状调查

    CISO的全称是“首席信息安全官”。随着国际上对于网络安全的重视程度逐渐增加,首席信息官逐渐受到众多企业的接受与认可。但是,他们虽然顶着“C”的头衔,但在决策权...

    FB客服
  • 币小秘为你戳破币圈骗局之“空气币”

    “空气币”就是一些不法分子打着区块链的幌子来进行诈骗的手段,许多初入币圈的投资者非常容易被其迷惑。

    区块链解说家
  • 池化技术到达有多牛?看了线程和线程池的对比吓我一跳!

    早些年间,某宝双“11”突然爆火,然后无数个男男女女疯狂“剁手”,然而最痛苦的并不是“剁手”之后吃“灰”的日子,而是漫长而又揪心的等待快递小哥的日子。

    Java中文社群_老王

扫码关注云+社区

领取腾讯云代金券