导语:
伴随着数字化经济大潮的推进,物联网行业近些年发展非常迅猛,呈现出百花齐放的姿态,是产业互联网的排头兵。小米以产品矩阵的方式介入物联网,华为以芯片入局、芯云结合打造全链条的物联网,腾讯云则以云平台为中心,构建开放的物联网开发平台。本文以TencentOS物联网Iot迷你赛的机会,以开发者的视角深入探讨腾讯云物联网开发模式。
行业背景
物联网涉及三个大的领域,以嵌入式操作系统为核心的终端系统、以云为中心的物联网开放平台、以及客户端接入和管理系统。涉及的关键技术包括:
嵌入式操作系统:腾讯物联网终端操作系统TencentOS Tiny(类似华为的liteOS),主要实现轻量级的操作系统,实现对外设的控制和监控等,包括基本的任务调度系统、内存管理、中断管理等:详情参考这里https://cloud.tencent.com/document/product/1098/35684;
Iot协议栈:TencentOS tiny 提供 lwip、AT Adapter、SAL 层,支持不同的网络硬件,例如以太网、串口 Wi-Fi、GPRS、NB-IoT、4G等通信模块。TCP/IP 网络协议栈上提供常用的物联网协议栈,例如 COAP、MQTT,支撑终端业务快速接入腾讯云。
组件框架:TencentOS tiny 提供文件系统、KV 存储、自组网、JS 引擎、低功耗框架、设备框架、OTA、调试工具链等一系列组件,供用户根据业务场景选用。
云API:TencentOS tiny 将在协议中间件和框架层上提供开放 API 函数,方便用户调用中间件功能,使用户无需过多关心中间件具体实现,快速对接腾讯云,实现终端业务上云的需求,期望最大程度减少终端物联网产品开发周期,节省开发成本。
「实战环节」
整体方案设计
整体方案以官方智能灯示例入手,以红外感应传感器扩展终端的设备,以腾讯物联网开发平台构建产品属性,用微信小程序扩展客户端接入,实现完整的一体化物联网开发模式。
从功能效果上看,通过物联网开发平台,将家用红外传感设备监控到的数据进行实时监控管理,终端通过小程序接入腾讯云进行控制,能够具备简易的居家安防、儿童行为守护等功能。
云平台产品定义
首先进入物联网开发平台设计产品形态和数据定义,主要包括属性和事件两大类功能。属性表示设备的状态,如灯的颜色、亮度、开关状态等,事件包括低电告警、设备异常等通知。
开发红外监控过程中我定义了开门、关门类似的事件,不过并没有实际应用,因为有属性的变化基本也就够用。换个角度想,事件的变化也能抽象成属性的变化,所以感觉平台这里事件的定义复杂化了,倒是希望能有一个客户端和终端直接通信的通道。
当然大多数功能可以直接使用系统自带的标准模版的功能定义,比如智能灯设备等。
终端和传感器实现
终端开发板:
EVB_MX是腾讯物联网操作系统TencentOS tiny 团队联合设计的一款物联网评估板,用于TencentOS tiny 基础内核和 IoT 组件功能体验和评估;
智能灯控制:
用面包版简单实现多种LED灯的效果。
传感器选型:
传感器方面我选用一款全自动感应的红外人体感应器HC-SR505,如下图所示。人进入感应范围时输出高电平,离开感应范围时延时关闭高电平,输出低电平。这样通过设置GPIO为输入模式,检测GPIO端口,就能达到检测人体活动的效果。
GPIO控制程序:
TencentOS里面关于GPIO的接口不多,命名清晰,功能一目了然。主要包括初始化、读写等接口。
首先进行GPIO的初始化:有几个参数需要注意,这里重点说明一下。
GPIO_TypeDef: 有GPIOA~GPIOH可以选,这个对于不同的CPU的片选控制器地址,具体选择哪个,可用通过使用的GPIO引脚说明很方便的确认。比如使用GPIO4,对于的引脚说明是PA8,那这里的GPIO_TypeDef就是选用GPIOA;
GPIO_InitStruct.Pin:同上所述,指定对于的引脚,如GPIO4对应PA8,则选择GPIO_PIN_8;
GPIO_InitStruct.Mode :可以配置GPIO为输入或输出模式,输出一般用来做设备控制,如本例中的LED控制;输入一般用来做监控,如本例中的红外监控;当然也可以配其他模式,比如实现I2C等。
输出电平控制:
MQTT协议调试
官方demo的案例非常详细,通常根据自己产品的情况做出基本的改造就能运行了。这个时候需要调试确认终端和平台的通信是否正常,是否符合预期。可以通过物联网开发平台的控制台进行在线调试,当然也可以很方便的观察设备通信日志和上报的数据情况。
客户端小程序实现
通过物联网开发平台的控制台, 基本能完成对 终端设备的控制和监控了。但这远远不够,通常情况下我们需要方便的客户端程序进行操作,幸好物联网开发平台提供了丰富的HTTP API支持,这使得我们可以通过多种方式接入云平台。
【备注】可惜的是,这里面并没有针对微信小程序的SDK支持。最接近小程序的SDK是NodeJS版本,所以我针对NodeJS进行小程序的SDK移植,完成后的代码已回归TencentOS git。有兴趣用小程序接入的同学可以参考:https://git.code.oa.com/TencentOS_tiny/TencentOS_tiny/tree/master/tools/Mini_Program
这里针对几个关键的API进行说明:
设备远程控制接口(ControlDeviceData):
API说明:https://cloud.tencent.com/document/api/1081/34973。
小程序控制代码示例:
获取设备属性接口(DescribeDeviceData)
获取当前设备的属性,包括最后更新的时间等;
获取设备历史数据接口(DescribeDeviceDataHistory)
获取一段时间内的设备历史数据,这个接口实现的不是很合理,无效的数据被剔除但没有提示,导致有可能拉不到数据。比如亮度这个属性为0的数据并不返回,但会消耗Limit数量。如果有100条数据中前十条为0,那么用Limit 10去拉数据时,一条数据也没有。
获取设备当前在线状态(DescribeDevice)
这个接口还没有正式发布,所以官网找不到说明,但实际是可用状态。
最终效果展示
【视频展示】:https://share.weiyun.com/5TJNGpI
智能LED灯控制系统
人体红外传感监控系统