<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
前面章節是單片機主動訪問升級,這節使用Android軟件控制遠程更新單片機程序!
請用戶從第一節開始看,前面說過的不再重復贅述!
升級流程如下:
APP/微信小程序/其它上位機控制STM32實現遠程升級協議: APP/微信小程序/其它上位機以下統稱為上位機軟件 1.上位機軟件首先通過MQTT發送詢問設備信息指令>> {"data":"updata","cmd":"DeviceInfo"} 2.設備收到以后回復型號和固件版本號(假設型號是:STM32APPESP8266BKAPP 固件版本是:0.0.0) {"data":"updata","DeviceModel":"STM32APPESP8266BK","FirmwareVersion":"0.0.0"} 4.上位機收到設備型號以后,根據設備型號,使用http/https訪問獲取對應的info.txt文件 假設info.txt文件信息如下: {"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32APPESP8266BKAPP/user_crc.bin","info":"1.解決了部分BUG 2.優化了部分程序"} 5.上位機對比版本號: 0.0.0 和 0.0.1 不一致,彈出選擇是否更新對話框. 注:對話框的提示信息為: 1.解決了部分BUG 2.優化了部分程序 注:如果版本號一致,則提示用戶版本是最新無需升級 6.如果用戶點擊了升級,通過MQTT發送以下信息給設備 {"data":"updata","size":15990,"url":"http://mnif.cn/ota/hardware/STM32APPESP8266BKAPP/user_crc.bin"} 7.設備接收正確解析以后回復 {"data":"updata","status":"start"} //設置為保留消息,上位機訂閱主題便可立即知道設備是不是在執行更新. 8.設備上線以后需要第一時間發送更新狀態(攜帶着更新狀態變量,版本號) {"data":"updata","UpdataValue":0-255,"FirmwareVersion":"0.0.1"} //設置為保留消息 9.上位機收到該消息以后提示更新完成!或者更新失敗,請重試! 其它: 設備在發送完更新狀態以后,緊接着發送一條上線信息 {"data":"status","status":"online"} //設置保留消息,用於沖掉上面保留的消息. 補充:升級進度(升級進度是使用MQTT發送,需要在BootLoader里面加上MQTT通信,小容量單片機和AT指令版本的暫不考慮) {"data":"updata","progress":"[0-100]"}
測試本節功能
1.單片機串口1作為日志打印口,串口2和模塊通信
(STM32)PA3 -- TX(WiFi)
(STM32)PA2 -- RX(WiFi)
2.下載BootLoader程序
3.下載用戶程序
注:需要用下載器
4.安裝手機APP
5.按照前面基本控制方案里面的APUConfig綁定WiFi
點擊設備進入控制頁面
6.點擊右上角菜單選擇固件升級
7.選擇確認
8.更新中
9.更新完成
10.再次點擊固件升級的時候將會顯示版本已是最新.
程序說明
1,前面的章節中是單片機主動訪問 info.txt文件里面的信息,
然后根據信息控制升級,這節只不過是手機APP去獲取這個信息,
然后對比下版本號,如果版本號不一致就把升級信息發給設備,控制設備升級.
2.打開APP源碼
當用戶點擊了 固件升級 以后
通過MQTT發送詢問設備信息指令 {"data":"updata","cmd":"DeviceInfo"}
3.設備收到消息以后回復 型號和版本號
4.APP根據設備型號獲取 info.txt文件
5.如果版本不一致,彈出提示框
6.如果用戶點擊了確認,就把info.txt里面的size字段和url字段的數據發給設備
7.設備接收到以后解析信息
8.解析完成以后,把size,url存入falsh,發送{"data":"updata","status":"start"} 給服務器
消息等級為1,確保發給了服務器.
設置需要服務器保留消息,其它上位機訂閱設備的主題便可立即獲取這條消息,知道設備是在執行更新.
9.發送完成以后執行重啟操作,在BootLoader里面執行更新
10.APP收到上面的指令以后,顯示進度條對話框,提示正在更新
11.設備更新完成以后執行用戶程序
連接上MQTT以后第一時間上報 設備的更新狀態變量和當前版本
12.APP顯示更新狀態
重要細節
1.發送{"data":"updata","status":"start"} 給服務器,消息等級設為了1,是為了確保發給了服務器.
2.我還設置了需要服務器保留這個消息
保留消息目的是,在設備更新的過程中,如果APP剛進入設備頁面,
只要訂閱這個設備發布的主題,APP便可獲取到
"{\"data\":\"updata\",\"status\":\"start\"}" 這條消息
然后直接彈出 正在更新的對話框.
3.在第一時間發送完設備的更新狀態變量和當前版本以后
下面還寫了一個發送上線信息(設置需要服務器保留消息)
服務器會默認保證最后一條讓服務器保留的消息
我只讓服務器保留上線消息.
升級程序和前面章節的區別
1.首先沒有大區別,服務器上面的該怎么弄還是怎么弄.
只不過本來是設備直來直去的訪問info.txt
現在是讓APP去訪問info.txt,然后對比版本號以后再把更新信息發給設備.
2.修改了一個小地方
我需要把更新狀態傳遞出去,所以修改了下這個函數
Android 程序細節
1.Android P 及其以上版本Google為了安全不能直接使用 http
如果想使用 可以在 AndroidManifest 增加 android:usesCleartextTraffic="true"
2.在HttpHelper 中為提供了一份http的和一份https的
https是忽略認證