全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件
阿里云物联网套件

设备固件升级

更新时间:2017-10-27 18:51:31

背景介绍:

  • OTA服务作为物联设备的基础服务,当物联设备固件发现重要bug或紧急安全漏洞时,设备端可以通过OTA服务进行固件升级,将bug及安全风险降至最低。

固件升级流程

以MQTT协议为例:device_upgrade_flow

固件升级topic

  1. 设备端上报固件版本给云端
  2. /ota/device/inform/${productKey}/${deviceName}
  3. 设备端订阅该topic接收云端固件升级通知
  4. /ota/device/upgrade/${productKey}/${deviceName}
  5. 设备端上报固件升级进度
  6. /ota/device/progress/${productKey}/${deviceName}
  7. 设备端请求是否固件升级
  8. /ota/device/request/${productKey}/${deviceName}

A.MQTT固件升级

  1. 首先设备连接OTA服务,必须上报版本号。
  • 设备端通过mqtt协议pub当前设备固件版本号到topic /ota/device/inform/${productKey}/${deviceName},内容格式如下:
  1. {
  2. "id": 1,
  3. "params": {
  4. "version":"xxxxxxxx"
  5. }
  6. }
  7. id:消息ID号,保留值。
  8. version:设备当前固件版本号。

2.用户在固件升级控制台上可以添加固件,此处需要注意的是:上传的固件类型必须是bin文件类型,否则上传不成功。

3.用户在控制台对指定版本号的设备进行升级,升级分为几种:验证固件、批量升级、再次升级,这些本质上都是对设备的一次升级操作,但是批量升级的前提是:该固件已通过验证,未验证的固件不可以进行批量升级

  • 验证固件:执行该功能后,控制台会返回此次验证的结果,选取的设备升级成功或者失败,升级记录可以在控制台的设备升级列表中查看。
  • 批量升级:执行批量升级后,可以在控制台上设备升级列表中查看升级结果。
  • 再次升级:该功能主要针对升级失败的设备进行操作,对于待升级,正在升级,升级成功的设备,是无效的,不可操作的。

4.触发升级操作之后,设备会收到OTA服务推送的固件的URL地址

  • 设备端订阅topic /ota/device/upgrade/${productKey}/${deviceName},控制台对设备发起固件升级请求后,设备端会通过该topic收到固件的URL,格式如下:
  1. {
  2. "code": "1000",
  3. "data": {
  4. "size": 432945,
  5. "version": "2.0.0",
  6. "url": "https://iotx-ota-pre.oss-cn-shanghai.aliyuncs.com/nopoll_0.4.4.tar.gz?Expires=1502955804&OSSAccessKeyId=XXXXXXXXXXXXXXXXXXXX&Signature=XfgJu7P6DWWejstKJgXJEH0qAKU%3D&security-token=CAISuQJ1q6Ft5B2yfSjIpK6MGsyN1Jx5jo6mVnfBglIPTvlvt5D50Tz2IHtIf3NpAusdsv03nWxT7v4flqFyTINVAEvYZJOPKGrGR0DzDbDasumZsJbo4f%2FMQBqEaXPS2MvVfJ%2BzLrf0ceusbFbpjzJ6xaCAGxypQ12iN%2B%2Fr6%2F5gdc9FcQSkL0B8ZrFsKxBltdUROFbIKP%2BpKWSKuGfLC1dysQcO1wEP4K%2BkkMqH8Uic3h%2Boy%2BgJt8H2PpHhd9NhXuV2WMzn2%2FdtJOiTknxR7ARasaBqhelc4zqA%2FPPlWgAKvkXba7aIoo01fV4jN5JXQfAU8KLO8tRjofHWmojNzBJAAPpYSSy3Rvr7m5efQrrybY1lLO6iZy%2BVio2VSZDxshI5Z3McKARWct06MWV9ABA2TTXXOi40BOxuq%2B3JGoABXC54TOlo7%2F1wTLTsCUqzzeIiXVOK8CfNOkfTucMGHkeYeCdFkm%2FkADhXAnrnGf5a4FbmKMQph2cKsr8y8UfWLC6IzvJsClXTnbJBMeuWIqo5zIynS1pm7gf%2F9N3hVc6%2BEeIk0xfl2tycsUpbL2FoaGk6BAF8hWSWYUXsv59d5Uk%3D",
  7. "md5": "93230c3bde425a9d7984a594ac55ea1e"
  8. },
  9. "id": 1507707025,
  10. "message": "success"
  11. }
  12. size:固件文件内容大小。
  13. md5:固件内容的MD5值,32位的hex String
  14. url:固件的URL,带有时效30分钟,超过这个时间后再下载,服务端拒绝访问。
  15. version:固件的目的版本号。

5.设备收到URL之后,通过HTTPS协议根据URL下载固件,注意URL是有时效限制的,目前限制时间是30分钟,超过这个时间后,会拒绝访问

  • 下载固件过程中,设备端必须pub升级进度到topic /ota/device/progress/${productKey}/${deviceName},内容格式如下:
  1. {
  2. "id": 1
  3. "params": {
  4. "step":"1",
  5. "desc":" xxxxxxxx "
  6. }
  7. }
  8. id:消息ID号,保留值。
  9. step:[1, 100] 下载进度比
  10. "-1" 代表升级失败,
  11. "-2" 代表下载失败,
  12. "-3" 代表校验失败,
  13. "-4" 代表烧写失败
  14. desc: 当前步骤的描述信息,如果发生异常可以用此字段承载错误信息

6.设备端完成固件升级后,需要pub最新的固件版本到topic/ota/device/inform/${productKey}/${deviceName},如果上报的版本与OTA服务要求的版本一致就认为升级成功,反之失败。

注意事项

  • 设备固件版本号只需要在系统启动过程中上报一次即可,不需要周期循环上报。
  • 服务端检测设备端OTA是否升级成功是根据版本号来判断的,例如:设备端初始的固件版本是1.0.0,要升级的固件版本是2.0.0,设备启动过程中pub固件版本1.0.0到topic /ota/device/inform/${productKey}/${deviceName},在设备端下载固件过程中不要上报任何版本给服务端,设备端下载完固件并且做完OTA升级后,pub固件版本2.0.0到服务端,这样服务端就认为整个升级流程成功。如果设备端下载固件过程中仍然上报固件版本1.0.0给服务端,服务端就判断上报的固件版本1.0.0和预期的固件版本2.0.0不匹配,就认为升级失败。
  • 从OTA服务端控制台发起批量升级,并不代表意味着升级开始(设备升级操作记录状态是待升级),实际升级的开始以OTA系统接收到设备上报的升级进度为准(设备升级操作记录状态是升级中)。
  • 设备离线时接收不到服务端推送的升级消息,当设备上线后,会主动通知服务端上线消息,OTA服务端收到设备上线消息,会先验证该设备是否需要升级,如果需要会再次推送升级消息给设备, 否则,不推送消息。

    常见下载固件错误

  • 签名错误,如果设备端获取的固件的url不全or手动修改了url内容就会出现如下错误sign_error

  • 访问拒绝,URL过期导致,目前过期时间为30分钟。access_deny

B.HTTPS固件升级

  • 用户在控制台触发升级操作
  • 设备主动向服务端推送升级验证消息(topic: /ota/device/request/${productkey}/${devicename}),服务端接收到该消息后,验证该设备在服务端是否存在于待升级列表中,如果存在,则设备获取服务端的固件信息。
  • 后期设备推送进度消息和设备当前版本号与MQTT连接方式的过程一样,此部分请参考MQTT接入的设备。

C.COAP固件升级

  • 用户在控制台触发升级操作
  • 设备主动向服务端推送升级验证消息(topic: /ota/device/request/${productkey}/${devicename}), 服务端接收到该消息后,验证该设备在服务端是否存在于待升级列表中,如果存在,则设备获取服务端的固件信息。
  • 后期设备推送进度消息和设备当前版本号与MQTT连接方式的过程一样,此部分请参考MQTT接入的设备。
本文导读目录