ESA2GJK1DH1K升級篇: 測試STM32遠程乒乓升級,基於(Wi-Fi模塊AT指令TCP透傳方式),MQTT通信控制升級
- 2019 年 11 月 14 日
- 筆記
實現功能概要
前面的版本都是,定時訪問雲端的程序版本,如果版本不一致,然後下載最新的升級文件,實現升級.
這一節,在用戶程序裏面加入MQTT通信,執行用戶程序的時候,通過接收MQTT的升級命令實現升級
注意:BootLoader程序還是用以前的程序.
一開始設計這個升級篇的時候,我就規定好了大的框架
BootLoader只是負責升級,其它一概不管
用戶程序只是寫入升級標誌,然後重啟,所有的升級步驟全部交給BootLoader!
協議:
一,MQTT上位機通過MQTT發送獲取設備信息指令 {"data":"updata","cmd":"DeviceInfo"} //設備接收到回復 {"data":"updata","model":"STM32_AT8266","version":"1.0.2"}//假設現在的型號是STM32_AT8266,當前設備硬件版本是1.0.2 二,MQTT上位機根據型號使用http訪問雲端存放的記錄更新信息的文件 "型號" 列如:"http://47.92.31.46/hardware/"+STM32_AT8266+"/"+"updatainfo.txt" 假設updatainfo.txt文件信息是 {"version":"1.0.4","details":"1,優化了部分BUG;2,測試升級;3,支持升級STM32程序;4,修改XXXBUG"} 注:版本號最大設置為20位元組 三,MQTT上位機對比版本號,如果不一致,則發送以下指令 注:測試時可直接發送此指令 {"data":"updata","cmd":"start"} //設備接收到回復 {"data":"updata","status":"start"} 四,設備連接上MQTT發送的第一條消息為 "{"data":"status","status":"online","UpdataStatus":"UpdataSuccess","DeviceVersion":"1.0.4"}" UpdataSuccess 更新成功 RunAppErr 上次更新的程序沒有運行起來 NoUpdata 沒有更新 DataAddressError 更新的數據有錯誤 DataOverflow 數據溢出 DataDownloadTimeout 下載超時 MainTimeout 更新超時 FlashWriteErr 寫Flash失敗 FlashEraseErr 擦除Flash失敗 VersionLenErr 版本號長度 等於0 或者大於20 VersionAlike 版本號一致,是最新程序,無需更新 ---------------------------------------------------------------- 控制指令,查詢繼電器狀態 {"data":"switch","bit":"1","status":"-1"} 設備回復 {"data":"switch","bit":"1","status":"1"} 或者 {"data":"switch","bit":"1","status":"0"} 六,控制指令,控制繼電器吸合 {"data":"switch","bit":"1","status":"1"} 設備回復 {"data":"switch","bit":"1","status":"1"} 七,控制指令,控制繼電器斷開 {"data":"switch","bit":"1","status":"0"} 設備回復 {"data":"switch","bit":"1","status":"0"}
測試
製作完代碼,哈,
詳細的代碼製作步驟(這節代碼是如何來的)
拷貝使用Wi-Fi模塊定時升級的 BootLoader程序

修改BootLoader
為了和以前升級程序區別開來,取一個新名字 STM32_MQTT_AT8266
BootLoader程序只需要修改這個就可以,修改完了.

下面看用戶程序
由於在用戶程序裏面,MQTT處理程序是比較多的,升級處理程序就一點點
為了移植的方便快捷一點,咱呢,就在實現MQTT的程序上加上升級處理程序
一,拷貝基礎篇的Wi-Fi模塊使用AT指令實現MQTT通信的單片機程序源碼,到咱現在的目錄

拷貝定時訪問升級的用戶程序的IAP文件 stmflash文件到現在的用戶程序工程裏面

把文件添加進來

