前言
鑒於有些用戶直接想使用現成的物聯網平台實現 OTA 遠程升級
我就寫一寫這系列的文章
首先大家需要學習完這部分
https://www.cnblogs.com/yangfengwu/p/11828777.html
現在說一下具體流程
新增固件
一,選擇物聯網平台里面的
固件名稱: 隨意
所屬產品: 選擇自己創建的產品
版本號: 1.0
簽名算法:MD5
大家隨意上傳一個固件(文件),這節只是測試.
提示
一,提示
咱在基礎篇添加了一個產品,然后產品下添加了一個設備,然后得到的這台設備的信息
{
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "Mqtt",
"DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"
}
然后得到
IP地址: a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com
端口號: 1883
Client ID: 112233445566|securemode=3,signmethod=hmacsha1|
用戶名: Mqtt&a1m7er1nJbQ
密碼: 8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE
咱如果想升級呀,其實也是按照基礎篇介紹的那樣連接MQTT
只不過呢訂閱和發布的主題有區別
https://help.aliyun.com/document_detail/85700.html?spm=a2c4g.11186623.6.699.581b740dLmrTn8 說明文檔
二,請求固件
請求固件的主題:
/ota/device/inform/${YourProductKey}/${YourDeviceName}
對於上面的設備而言發布的主題就是: /ota/device/inform/a1m7er1nJbQ/Mqtt
設備發送的消息格式
{ "id": "123", "params": { "version": "1.0.1" } }
三,阿里雲回復:
/ota/device/upgrade/${YourProductKey}/${YourDeviceName}
對於上面的設備而言需要訂閱主題: /ota/device/upgrade/a1m7er1nJbQ/Mqtt
設備接收的消息格式:
{ "code": "1000", "data": { "size": 432945, "version": "2.0.0", "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", "md5": "93230c3bde425a9d7984a594ac55ea1e", "sign": "93230c3bde425a9d7984a594ac55ea1e", "signMethod": "Md5" }, "id": "1507707025", "message": "success" }
然后單片機提取 url 然后訪問,即可獲取到固件了.
四,升級過程中設備上報進度或者失敗
/ota/device/progress/${YourProductKey}/${YourDeviceName}
對於上面的設備而言發布的主題就是: /ota/device/progress/a1m7er1nJbQ/Mqtt
消息格式:
{ "id": "123", "params": { "step": "-1", "desc": "固件升級失敗,請求不到固件信息。" } }
五,設備升級完以后:
阿里雲規定升級完以后,和一開始一樣上報一下版本
/ota/device/inform/${YourProductKey}/${YourDeviceName}
對於上面的設備而言發布的主題就是: /ota/device/inform/a1m7er1nJbQ/Mqtt
{ "id": "123", "params": { "version": "1.0.1" } }
不過現在的版本 應該是上報的升級以后的版本號
然后就完成了升級
驗證固件
一, 有了上面的提示以后咱接着說具體的步驟
阿里雲規定,一開始先測試下固件好不好使,所以需要驗證固件
先不要點擊...
二, 咱需要先用一個設備上報一個與當前雲端固件不一樣的版本
咱用調試助手模擬這台設備 我設置我這個設備當前的版本號是 0.0
三, 點擊驗證固件
3.2 現在待升級里面的版本號就有了0.0
3.3 選擇咱剛才用調試助手模擬的設備
注: 以后咱肯定不止一台設備,阿里希望咱每次更新固件的時候,先拿一台設備做下測試
3.4 點擊確定
3.5 看一下調試助手
{"code":"1000","data":{"size":15824,"sign":"d91b82d73681f83eb57f1f791af61563","version":"1.0","url":"https://ota.iot-thing.cn-shanghai.aliyuncs.com/ota/5f0103cd96ad6ac7d12b5492a54b003c/ck4ibxt1000002m201sk6bmx1.bin?Expires=1577454705&OSSAccessKeyId=cS8uRRy54RszYWna&Signature=Xv%2B21YX%2Fy7eE2LKz31UeK%2B2YCIg%3D","signMethod":"Md5","md5":"d91b82d73681f83eb57f1f791af61563"},"id":1577368305108,"message":"success"}
如果咱是真實的設備,咱就應該提取url 去下載程序
https://ota.iot-thing.cn-shanghai.aliyuncs.com/ota/5f0103cd96ad6ac7d12b5492a54b003c/ck4ibxt1000002m201sk6bmx1.bin?Expires=1577454705&OSSAccessKeyId=cS8uRRy54RszYWna&Signature=Xv%2B21YX%2Fy7eE2LKz31UeK%2B2YCIg%3D"
3.6 咱用MQTT調試助手發送下最新的版本給阿里雲,告訴阿里雲我已經升級成功
3.7 點擊查看,
3.8 點擊返回
3.9 現在就可以正常的升級設備了
點擊批量升級
現在才是重點
一,你會發現第一項沒有東西可選
其實阿里呢是這個步驟:
假設我當前所有設備的版本號是 0.0
我重新在阿里雲OTA上傳了固件,設置了固件版本是 1.0
我現在想讓0.0版本的設備去升級新版本
你的設備必須通過MQTT上報當前的版本號,也就是0.0
然后才會出現需要升級的版本號
然后設置版本是0.0的設備的升級配置
這個地方測試的有點懵逼.......
測試下這個讓我懵逼的地方
一,再弄個新設備
二,這個新設備只要不上報自己的版本則不會收到服務器的任何東西
咱上報一下版本0.0
我現在的設備就是 "待升級" 狀態
三,假設現在設備不小心重啟了
雲端主動推送升級信息來了
不過感覺阿里應該再優化的地方-1
阿里的固件的校驗方式
我感覺這樣有點不好.
其實應該可以讓用戶自定義個參數
因為很多用戶已經實現了升級,而且都有自己的程序文件校驗方式.
這樣就給很多用戶增加了工作量....
不過感覺阿里應該再優化的地方-2
應該很多單片機的升級都是使用的 乒乓升級
就是說每次升級的時候兩塊內存區來回的切換升級
這就需要兩份文件.
列如我的升級篇使用的單片機分配情況
而阿里提供的是每次訪問的時候只能是一套......
那我們只能把原來的乒乓升級改一下
用其中一塊區域專門接收程序文件,然后對程序文件做校驗
保證了程序文件確實沒有問題以后
再把文件拷貝過去運行......
這樣有個問題是,,,萬一寫的程序有問題,就不能實現程序回滾了
感覺最好可以上傳兩套程序文件
然后自定義一個參數 可以訪問哪一套