10-STM32+ESP8266+AIR202遠程升級方案-功能3-手機APP控制STM32遠程更新固件程序,基於ESP8266


<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.00.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是忽略認證

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM