最近开发了一款嵌入式物联网门锁, 用到了阿里云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解决方案的有关人员, 购买到几个样品, 按照他们官网资料, 连接起来, 如下图.
其中上面的串口是AT口(波特率115200), 下面的串口是debug口(波特率2000000).

3.2 WiFi配网

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

AT+IWIFICONNECT=myssid,mypasswd,0OK

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

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

3.3 接入物联网平台

设备证书设置:

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

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=< host>,< port>

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

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

3.4 MQTT消息收发

发消息:

AT+IMQTTPUB=< topic>,< qos>, < payload>
参考上行: 上报helloworld

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

收消息:

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

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

3.5 物模型的使用

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

属性上报:

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

AT+IDMPP={"LightStatus":1}+IDMPP:8OK

属性下发:

格式如
+IDMPS:<msg_id>,<msg_len>,
OK
参考输出:

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

事件上报:

格式如:
AT+IDMEP=<event_id>,<event_payload>
参考输入:

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

3.6 OTA命令

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

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

+IOTASTATE:0,2.0.1,521540

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

AT+IOTASTART=1OK
+IOTASTATE:1

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

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

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

3.6.4 MCU查询固件的分片详情:
AT+IOTASHO
模组响应: +IOTASHO:<total_frame>, <frame_size>,, <image_size>,<digest_method>, <expect_digest>
参考交互:

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

3.6.5 MCU获取其中某个分片:
AT+IOTASTX=< frame>
模组响应: +IOTASTX:< frame>,< data_size>, < crc16>,< data>

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相关推荐

  1. 基于阿里云IoT平台OTA进行APP确认升级的方案——业务架构类

    简介: 对于家居类及个人消费电子类的物联设备,基于用户体验的考虑,生产企业一般会为消费者提供通过手机APP进行确认升级的功能,典型的使用场景是通过手机APP对手环进行升级.本文主要介绍APP确认升级的 ...

  2. 如何使用华为云IoT平台实现远程控制无人机,资深物联网从业者手把书一步一步教你!

    我目前从事的行业是无人机应用开发,每天都是跟物联网打交道,所以看到了华为云推出的关于物联网相关的技术就来了兴趣.在我的研究领域中,物模型已经是一个非常基础.非常常见的模型了. 如果没有物模型,那么最直 ...

  3. 阿里IOT云平台(二)---10分钟物联网设备接入阿里云IoT平台

    本文转载自:https://www.geek-workshop.com/thread-37883-1-1.html.基于VS Code和Node.js 我替换了原文中的温度.湿度属性图(主要是修正了标 ...

  4. NodeMCU-ESP8266连接阿里云Iot平台进行数据监测

    简介 本教程中主要讲解使用阿里云Iot监测控制NodeMCU的方法. 设备从MQTT数据上传.监测.控制的全流程如下图所示,本教程仅仅讲解从设备与Aliyun平台之间的交互,业务服务器部分(App开发 ...

  5. 阿里云IoT平台CoAP接入 3 了解下物模型

    关于阿里云IoT平台CoAP接入,可见笔记阿里云IoT平台CoAP接入 小能手另外分享了NB-IoT的应用开发心得,先从模组端对几个常见模块进行试用分析,接着对更上层具体的CoAP协议进行研究,并且演 ...

  6. 10分钟虚拟设备接入阿里云IoT平台实战

    10分钟虚拟设备接入阿里云IoT平台实战 1. 准备工作 1.1 注册阿里云账号 使用个人淘宝账号或手机号,开通阿里云账号,并通过实名认证(可以用支付宝认证) 1.2 免费开通IoT物联网套件 产品官 ...

  7. 【ODYSSEY-STM32MP157C】上报数据到阿里云 IoT 平台

    我们在上一节<[ODYSSEY-STM32MP157C]驱动 UART 读取传感器数据> 已经成功读取到 PMS5003ST 传感器的数据,本节我们将学习如何将设备接入阿里云 IoT 平台 ...

  8. 电信NB-IoT设备对接阿里云IoT平台实战——实践类

    众所周知,中国电信的NB-IoT设备必须直连电信CTWing平台,无法直接在阿里云IoT,AWS IoT,腾讯云IoT 管理中国电信的NB-IoT设备. 今天我们就给大家介绍如何通过阿里云IoT企业物 ...

  9. 4G Modbus Json边缘网关接入阿里云IoT平台

    LTE-669P 4G边缘网关系列 阿里云平台连接教程 今天介绍物联设备 LTE-669P 4G边缘网关如何接入阿里云平台系列. LTE-669P是一款工业级4G JSON无线边缘解析网关,支持RS4 ...

最新文章

  1. 缓存击穿、缓存穿透、缓存雪崩
  2. epoch如何设置_使用TFRecordDataset时如何设置epoch计数器?
  3. ReadResolve方法与序列化
  4. Android内存优化(三)避免可控的内存泄漏
  5. glCullFace,GL_CULL_FACE
  6. 简便的chrome插件安装
  7. Steps to install Domino Server 8.5.1 on AIX 6
  8. 小积累-生成固定位数的随机数
  9. Netty工作笔记0011---Channel应用案例2
  10. 复杂多目录的Makefile模板及示例-转
  11. Vant中List组件immediate-check=false无效
  12. signature=111f58ddc27ff0fab1746b92b27414e9,DDCTF2019官方Write Up——MISC篇
  13. IDE工具(17) eclipse创建ftl文件具体步骤
  14. ShadowGun 的学习笔记 - GodRays
  15. JPA的cannot simultaneously fetch multiple bags异常的解决
  16. 毛笔书法艺术作品,能不能写简化字?
  17. 计算机专业考研的好学校排名2015,计算机类专业考研最好的学校排名
  18. 随笔记录——numpy4(伪随机数生成)
  19. 面向对象分析与设计--遛狗玩
  20. 学生实验室常见升压降压芯片电路介绍

热门文章

  1. python做电磁场计算_加速Python中的计算(模拟磁场中的粒子)
  2. 微信小程序中禁止当前页面的上下滑动处理
  3. BC高精确度函数使用。
  4. 朴素贝叶斯算法以及案例
  5. 无法为数据库 'xxx' 中的对象 'dbo.yyy'.'PK_yyy' 分配空间,因为 'PRIMARY' 文件组已满
  6. 三相逆变器双pi控制器参数如何调节_学术简报基于内模原理的并网逆变器双模PI控制...
  7. html中加入姓名学号的代码,让moodle增加学号(示例代码)
  8. Babel是如何读懂JS代码的
  9. Linux解决“未预期的符号“(“附近有语法错误”的问题方法
  10. N皇后问题 (c++)