前言
传统的物联网项目,需要嵌入式硬件、云平台。对于我们做嵌入式的来说,从零开始搭建一个物联网云平台几乎是不现实的。
这里涉及到许多前后端的知识。
通过阿里云物联网平台,我们可以在不懂前后端开发的基础上,半个小时候左右就可以搭建一个智慧农业的物联网云平台框架。
效果如下:
大数据面板:
设备管理:
设备地图分布:
支持视频监控:
多个组件图标功能:
8.1.1 物联网平台搭建
物联网平台搭建的话,我放在了bilibili这里:
https://www.bilibili.com/video/bv1DK4y1s7Pc
8.2.1 LinkDevelop平台使用
1.注册
打开LinkDevelop官网:https://iot.aliyun.com/products/linkdevelop。单击“立即使用”按钮,如图8.3所示。
图8.3 LinkDevelop官网
2.新建项目
单击左侧的“项目管理”按钮,随后再单击“新建项目”按钮,进入新建项目界面,如图8.4所示。
图8.4 项目管理界面
随后在弹出来的新建项目界面上,单击“新建空白项目”按钮,如图8.5所示。
图8.5 新建项目界面
弹出新建空白项目界面后,在“项目名称”中输入test,在“描述”中输入这是一个测试项目,单击“确认”按钮,如图8.6所示。
图8.6 新建空白项目界面
3.创建产品
单击左侧的“产品”按钮,在弹出的界面中,单击“创建产品”按钮,如图8.7所示。
图8.7 产品界面
在“产品名称”中输入“sensor”,如图8.8所示。
图8.8 创建产品
单击“请选择标准品类”下拉框,弹出“选择品类”选择框,阿里云物联网平台预置了许多产品类型,读者可以根据自己的需求选择对应,本书选择“地磁检测器”,如图8.9所示。
图8.9 选择产品种类
其他选项按默认值即可,单击“保存”按钮,如图8.10所示。
图8.10 创建产品
4.创建设备
页面左上角有个三角形下拉框,可以选择项目,选择我们刚才创建的test项目,再单击“设备”按钮,最后单击“新增设备”按钮,如图8.11所示。
图8.11 设备界面
在“产品”选择下拉框中,选择我们刚才创建的产品sensor,单击“提交”按钮,如图8.12所示。
图8.12 新增设备
在弹出的新界面中,单击“下载激活凭证”按钮,下载sheet.xlsx文件,如图8.13所示。保存sheet.xlsx文件,里面的内容后续会用到
。
图8.13 下载激活凭证
8.2.2 iotkit-embedded
iotkit-embedded是阿里云物联网平台提供的一套C语言编写的SDK包。通过该SDK包,我们可以使我们的嵌入式设备接入到阿里云物联网平台。
SDK使用MQTT/HTTP连接物联网平台,因此要求设备支持TCP/IP协议栈;对于Zigbee、ZWave之类的不支持TCP/IP协议栈的设备,需要通过网关接入物联网平台,这种情况下网关需要集成SDK。
iotkit-embedded下载地址:https://github.com/aliyun/iotkit-embedded 。
SDK提供了API供设备厂商调用,用于实现与阿里云IoT平台通信以及一些其他的辅助功能,例如WiFi配网、本地控制等。
另外,C语言版本的SDK被设计为可以在不同的操作系统上运行,例如Linux、FreeRTOS、Windows,因此SDK需要OS或者硬件支持的操作被定义为一些HAL函数,在使用SDK开发产品时需要将这些HAL函数进行实现。
产品的业务逻辑、SDK、HAL的关系如图8.15所示。
图8.15 SDK 框架
表8.1列出了SDK包的相关功能:
功能模块 | 功能点 |
设备连云 | MQTT连云,设备可通过MQTT与阿里云IoT物联网平台通信。 |
设备身份认证 | 一机一密。 |
物模型 | 使用属性、服务、事件对设备进行描述以及实现,包括: |
OTA | 设备固件升级。 |
远程配置 | 设备配置文件获取。 |
子设备管理 | 用于让网关设备添加、删除子设备,以及对子设备进行控制。 |
WiFi配网 | 将WiFi热点的SSID/密码传输给WiFi设备,包括: |
设备本地控制 | 局域网内,通过CoAP协议对设备进行控制,包括:ALCS Server,被控端实现ALCS Client,控制端实现,通常被希望通过本地控制设备的网关使用。 |
设备绑定支持 | 设备绑定token维护,设备通过WiFI、以太网接入,并且通过阿里云开放智能生活平台管理时使用。 |
设备影子 | 在云端存储设备指定信息供APP查询,避免总是从设备获取信息引入的延时。 |
Reset支持 | 当设备执行Factory Reset时,通知云端清除记录。例如清除设备与用户的绑定关系,清除网关与子设备的关联关系等。 |
时间获取 | 从阿里云物联网平台获取当前最新的时间。 |
文件上传 | 通过HTTP2上传文件。 |
1.简介
ali-iotkit是 RT-Thread 移植的用于连接阿里云 IoT 平台的软件包。基础 SDK是阿里提供的iotkit-embedded。
iotkit SDK 为了方便设备上云封装了丰富的连接协议,如 MQTT、CoAP、HTTP、TLS,并且对硬件平台进行了抽象,使其不受具体的硬件平台限制而更加灵活。在代码架构方面,iotkit SDK 分为三层,如图8.16所示:
图8.16 iotkit SDK框架
硬件平台抽象层:也简称HAL层(Hardware Abstract Layer),抽象不同的嵌入式目标板上,操作系统对SDK的支撑函数,包括网络收发、 TLS/DTLS 通道建立和读写, 内存申请是否和互斥量加锁解锁等。
中间层称为SDK内核实现层(IoT SDK Core Implements):物联网平台 C-SDK 的核心实现部分, 它基于 HAL 层接口完成了 MQTT/CoAP 通道等的功能封装, 包括 MQTT 的连接建立、 报文收发、CoAP 的连接建立、报文收发、 OTA 的固件状态查询和 OTA 的固件下载等。中间层的封装,使得用户无需关心内部实现逻辑,可以不经修改地应用。
最上层称为SDK接口声明层(IoT SDK Interface Layer):最上层是为应用提供 API 的,用户使用该层的 API 完成具体的业务逻辑。
2.配置
RT-Thread已经为我们集成了ali-iotkit软件,通过简单的menuconfig配置即可使用。配置项位于:RT-Thread online packages→ IoT - internet of things→ IoT Cloud,如图8.17所示。
图8.17 Ali-iotkit配置项
按空格键选中“Ali-iotkit”后,再按回车键进入详细配置项。
(1)version选择v2.0.3。
(2)Config Product Key (NEW)填写我们之前下载的激活凭证sheet.xlsx文件中的Productkey项的内容。
(3)Config Device Name (NEW)填写sheet.xlsx文件中的DeviceName项的内容。
(4)Config Device Secret (NEW)填写sheet.xlsx文件中的DeviceName项的内容。
其他配置项如图8.18所示。
图8.18 Ali-iotkit详细配置
阿里 TLS 认证过程中数据包较大,这里需要增加 TLS 帧大小,OTA 的时候至少需要 8K 大小,修改menuconfig配置项:RT-Thread online packages→security packages →mbedtls: An portable and flexible SSL/TLS library,把Maxium fragment length in bytes的数值改成8192,如图8.19所示。
图8.19 mbedtls配置
退出menuconfig,输入pkgs --update更新下载ali-iotkit软件包,下载软件包后,输入scons --target=mdk5重新生成工程文件。
需要注意的是,ali-iotkit自带mqtt相关功能,如果之前代码配置选择了Paho MQTT,需要把Paho MQTT软件包去掉,否则编译报错。
软件包位于Chapter8\rt-thread\bsp\stm32\stm32f407-atk-explorer\packages\ali-iotkit-v2.0.3软件包目录如图8.20所示。
图8.20 ali-iotkit软件包目录
其中各文件说明如下:
docs:软件包说明文档。
iotkit-embedded:阿里云物联网平台提供的SDK包。
ports:RT-Thread相关移植文件。
samples:RT-Thread提供的一个简单测试程序。
1.上传消息到云端
(1)打开Chapter8\rt-thread\bsp\stm32\stm32f407-atk-explorer\ project.uvprojx工程文件,其中SDK包相关的代码文件包含在ali-iotkit文件夹下,如图8.21所示。
图8.21 项目工程
(2)编译并下载程序到开发板,先确保开发板能ping通阿里云服务器。输入ping iot.aliyun.com并发送回车,有看到如下打印信息则代表网络正常。
msh />ping iot.aliyun.com
60 bytes from 42.120.219.14 icmp_seq=0 ttl=230 time=42 ms
60 bytes from 42.120.219.14 icmp_seq=1 ttl=230 time=41 ms
60 bytes from 42.120.219.14 icmp_seq=2 ttl=230 time=41 ms
60 bytes from 42.120.219.14 icmp_seq=3 ttl=230 time=41 ms
(3)打开LinkDevelop的设备管理界面,可以看到之前创建的设备的状态是“未激活”,如图8.22所示。
图8.22 设备列表
(4)打开串口工具,发送ali_mqtt_test start命令给开发板,可以看到开发板有如下打印信息:
msh />ali_mqtt_test start
[inf] iotx_device_info_init(40): device_info created successfully!
[dbg] iotx_device_info_set(50): start to set device info!
[dbg] iotx_device_info_set(64): device_info set successfully!
[dbg] guider_print_dev_guider_info(271): ....................................................
[dbg] guider_print_dev_guider_info(272): ProductKey : a1wUxrR2Xd4
[dbg] guider_print_dev_guider_info(273): DeviceName : 3mX9eDe8wt0FDt2hIRxf
[dbg] guider_print_dev_guider_info(274): DeviceID : a1wUxrR2Xd4.3mX9eDe8wt0FDt2hIRxf
host: a1wuxrr2xd4.iot-as-mqtt.cn-shanghai.aliyuncs.com
[inf] iotx_mc_init(1703): MQTT init success!
[inf] _ssl_client_init(175): Loading the CA root certificate ...
[inf] iotx_mc_connect(2035): mqtt connect success!
[dbg] iotx_mc_report_mid(2259): MID Report: started in MQTT
[dbg] iotx_mc_report_mid(2276): MID Report: json data = '{"id":"a1wUxrR2Xd4_3mX9eDe8wt0FDt2hIRxf_mid","params":{"_sys_device_mid":"example.demo.module-id","_sys_device_pid":"example.demo.partner-id"}}'
(5)有看到[inf] iotx_mc_connect(2035): mqtt connect success!则表示成功连接上LinkDevelop。重新查看LinkDevelop的设备管理界面,可以看到之前创建的设备的状态是“在线”,说明设备和LinkDevelop通信正常,如图8.23所示。
图8.23 设备列表
(6)输入ali_mqtt_test pub open并发送回车,开发板将会推送数据到云端,串口打印信息显示code值为200,则表示推送数据成功。
_demo_message_arrive|203 :: Payload: '{"code":200,"data":{"LightSwitch":"tsl parse: params not exist","RGBColor":"tsl parse: params not exist"},"id":"1","\0
(7)在设备列表中单击“查看”按钮,如图8.24所示:
图8.24设备列表
(8)在弹出来的设备详情页中,单击“日志服务”按钮,再单击“上行消息分析”按钮,可以看到开发板总共发送了2条消息,其中时间较早的消息是开发板登录时发送的,最新的信息是刚才的ali_mqtt_test pub open命令所发送得到消息。
图8.25 设备详情
(9)单击对应消息的MessageID,可以查看消息的具体内容,如图8.26所示。
图8.26 消息内容
2.云端发布消息
(1)单击左上角的小三角形,选择 test,然后单击“产品”按钮,单击“sensor”对应的“查看”按钮,如图8.27所示。
图8.27 产品列表
(3)单击“功能定义”按钮,随后单击“自定义功能”按钮,最后单击“添加自定义功能”按钮,如图8.28所示。
图8.28 功能定义
(4)功能名称选择“测试001”,其他选型默认即可,单击“确认”,如图8.29所示。
图8.29 自定义功能
(5)单击右上角的“发布”按钮,发布新功能,如图8.30所示。
图8.30 发布功能
(6)再弹出来的界面中,把所有的“请确认”按钮后面的
都选上,单击“发布”按钮,如图8.31所示。
图8.31 确认发布
(7)回到刚才的设备详情页,单击“在线调试”按钮,单击“调试真实设备” 按钮,单击“属性调试”按钮,调试功能选择“测试001(Test001)”,方法选择“设置”,如图8.32所示。
图8.32 在线调试
修改调试信息的内容为{ "Test001": "1"},如图8.33所示,单击“发送指令”按钮。
图8.33 发送指令
(8)可以看到开发板有如下打印信息:
'/sys/a1NegcqX690/AwpDLCcqeb7TSbNevNAr/thing/service/property/set' (Length: 64)
_demo_message_arrive|203 :: Payload: '{"method":"thing.service.property.set","id":"1302514310","params":{"Test001":"1"},"version":"1.0.0"}' (Length: 100)
_demo_message_arrive|207 :: ----
可以看到接收到LinkDevelop发送的{"Test001": "1"}消息,通信成功。