基于阿里云IoT平台和HAAS210云模组的OTA

最近开发了一款嵌入式物联网门锁, 用到了阿里云IoT平台的OTA能力, 设备端用了阿里云的HAAS210模组, 有些收获, 在此做个分享.

1.云平台的选型

作为一个小微企业, 自建云平台不现实, 因此一个靠谱的做法就是在诸多物联网平台之间做一个选择.

考虑到近年来相继多个小型物联网平台的停服的事件, 我们要选只能在头部几个大平台之间选择, 即阿里, 华为, 亚马逊, 微软等.

我们的产品需要用到OTA服务, 因此我们在各大平台的OTA服务之间做了一个对比. 我们需要支持多种推送方式, 包括主动推送/被动请求/单设备多模块等OTA能力, 同时在推送方面又希望有多种参数的配置, 比如超时时间/单批次推送个数设置等能力. 综合易用性和性价比, 我们选择阿里的物联网平台, 里面的免费的公共实例提供了入门级的服务, 方便我们这样的小微企业接入.

选择其他头部平台, 要实现这些功能理论上也是可行的, 但是需要我们自己再自购一些服务器和云资源, 招相应的后端开发人员, 加上开发调试的成本, 这个对于我们希望短平快交付的企业不是非常现实.

2.模组的选型

我们的设备简单, 是典型的MCU+WiFi模组架构. WiFi模组有多个选择, 包括乐鑫/汉枫/庆科/涂鸦/小米等.

涂鸦/小米等厂家的模组功能跟他们云平台深度绑定, 同时我们的场景中也用不上他们的移动端能力, 因此不在我们的考虑之列.

剩下的只有通用模组. 通用模组中, 功能每家都是大同小异, 主要分为下面两种情况:

  • 有些提供了通用的MQTT AT指令,我们需要根据阿里物联网平台的协议格式自己去组报文
  • 有些提供了专用于连接阿里云平台的MQTT基础指令, 省去了基础的身份认证和消息通信的报文的组装, 但是上层业务, 比如OTA/物模型/设备影子等功能, 需要自己组装报文.

有没有一个提供了阿里云平台高阶能力(包含OTA等能力)的AT指令的WiFi模组? 考虑到我们MCU的ROM空间的限制, 以及开发时间/人力的不足, 我们倾向于在市面上找这样一款模组.

在阿里云的物联网平台上浏览新功能, 看到了他们关于云模组HAAS210的介绍, 基本符合我们的预期.我们主要用到OTA/物模型/一型一密等功能都有封装好的AT指令, 配网的话他们也提供了AT命令直接配网/蓝牙配网/设备热点等能力. 经询价, 价格基本与主流的WiFi模组相当, 甚至略有优势.

3.开发实践

3.1 购买模组样品

通过阿里云官网的链接, 联系阿里云IoT解决方案的有关人员, 购买到几个样品, 按照他们官网资料, 连接起来, 如下图. 基于阿里云IoT平台和HAAS210云模组的OTA
其中上面的串口是AT口(波特率115200), 下面的串口是debug口(波特率2000000).

3.2 WiFi配网

我们用的配网方式很简单, 用AT命令直接传送ssid/passwd给设备端,
输入:AT+IWIFICONNECT=,,[save_to_flash]

AT+IWIFICONNECT=myssid,mypasswd,0

OK

配网成功后, AT口返回如下日志, 提示已经成功接入WiFi路由器

OK

+INETSTAT:4,192.**.**.101,B4:**:**:**:6a:7b

3.3 接入物联网平台

设备证书设置:

为了让工厂烧录设备身份的时候更加简单, 我们采用了一型一密(动态注册)的方式, 即让产品出厂的时候使用统一的产品秘钥, 设备连云的时候自己指定设备名称(比如填写mac地址), 平台根据建连信息自动为该设备创建身份信息, 并下发秘钥给设备.
设置认证方式: AT+IMQTTPARA=, 设置设备身份: AT+IDMAUTH=,,, 参考交互

AT+IMQTTPARA=AUTHMODE,2
//这里2表示设备首次连云的时候在云平台注册身份. 需要在控制台开启动态注册的选项.

OK
AT+IDMAUTH=c1***a1l,c1_***_dev,1**1*,dc****m
//四个参数都要输入, 由于选择了一型一密, 云端会在认证成功后下发真实的device_secret, 因此这里的device_secret可以暂时填写随机字符

OK

除了上述通用的一型一密的认证方式外, 模组也支持其他认证方式, 比如一机一密(用户预先在控制台创建设备, 在模组中直接输入product_key, device_name, device_secret). 用户请参考模组AT手册.

设备接入物联网平台:

AT+IDMCONN=,

AT+IDMCONN=iot-05****al.mqtt.iothub.aliyuncs.com,1883

+IDMSTATE:1

OK

IDMSTATE返回1, 表示MQTT已经连接上

3.4 MQTT消息收发

发消息:

AT+IMQTTPUB=,,
参考上行: 上报helloworld

AT+IMQTTPUB=/ab8*****1U/t01_**_001/user/update,0,helloworld

+IMQTTPUB:0

OK

收消息:

云模组有免订阅能力, 对于阿里云物联网平台的系统级的topic, 不用订阅即可收到下行消息.
参考下行: 控制台设置设备影子后, 设备收到的下行报文

+IMQTTRCVPUB:/shadow/get/gb80***u1U/eng_**_005,258,{"method":"control","payload":{*****},"timestamp":1650447219,"version":1}

3.5 物模型的使用

物模型的协议是阿里云物联网平台自定义的一套数据格式, 用于标识设备的属性/事件/服务, 功能上类似于涂鸦的DP点.

属性上报:

格式如:
AT+IDMPP=
参考输入:

AT+IDMPP={"LightStatus":1}

+IDMPP:8

OK

属性下发:

格式如
+IDMPS:,,
OK
参考输出:

+IDMPS:238420054,17,{"LightStatus":1}

事件上报:

格式如:
AT+IDMEP=,
参考输入:

AT+IDMEP=OnSync,{"SyncTime":1}

+IDMEP:15

OK

3.6 OTA命令

云模组集成了阿里云LinkSDK中的OTA能力, 用户可以在控制台部署OTA任务, 为连接在云模组上的MCU下推升级固件. 交互步骤如下:

3.6.1 控制台部署OTA任务后, 模组收到了OTA消息, 告知MCU:
+IOTASTATE:,,
参考交互:

+IOTASTATE:0,2.0.1,521540

3.6.2 MCU收到上述消息后, 通知模组是否接受OTA升级:
AT+IOTASTART=
模组响应: OK
参考交互:

AT+IOTASTART=1

OK
+IOTASTATE:1

如果接受, 模组就开始下载固件.

3.6.3 模组下载完固件, 通知MCU去收取:
+IOTASTATE:,,
参考交互:

+IOTASTATE:2    //模组在校验固件
+IOTASTATE:5    //模组已经收完固件,通知MCU去分片读取

3.6.4 MCU查询固件的分片详情:
AT+IOTASHO
模组响应: +IOTASHO:, ,, ,,
参考交互:

AT+IOTASHO

+IOTASHO:2038,256,2.0.1,521540,0,fe52d2203d3406160f440a55fa7e6073

3.6.5 MCU获取其中某个分片:
AT+IOTASTX=
模组响应: +IOTASTX:,, ,

AT+IOTASTX=0

+IOTASTX:0,256,27069,**********************

MCU要持续请求(frame数值持续增加,直到total_frame-1), 取到的固件要存到MCU的flash里面.

3.6.6 升级结束, 上报新的固件版本号, 以确认固件升级成功:

AT+IOTAVER=2.0.0   //2.0.0表示新的固件版本号. 控制台收到后进行校验, 如果一致则更新任务状态

3.6.7 设备主动查询云端是否有OTA任务:

AT+IOTAQUERY  //如果服务端有部署OTA任务, 会收到3.6.1中提到的下行报文

4.总结

对于需要开发一些自定义功能的物联网厂家来说, 阿里云物联网平台提供了不错的原子化能力, 厂家可以基于这些能力快速实现自己的功能, 而使用他们的云模组可以快速实现端侧功能, 比通用的WiFi模组性价比要高.

本文章来源于互联网,如有侵权,请联系删除!原文地址:基于阿里云IoT平台和HAAS210云模组的OTA

相关推荐: 物联网概述

物联网 本片博文基于《物联网——嵌入式开发实战》和《物联网系统开发:从0到1构建IoT平台》编写,推荐想要学习IoT的老哥参考这两本书 物联网的核心技术与产业分类 物联网核心技术有以下几种: 传感器 组网技术 用于短距离和远程无线通讯,包括 短距离:NFC、蓝…