一、前言;
寫了這么多的8266博文,一直以滿意100%的心態去敲寫代碼固件燒錄,以致很少出現 bug , 目前呢?瀏覽了網上很多8266的OTA的demo,還特意在某寶上搜了一把,竟然賣的價格為“399”元一個8266的OTA升級方案!天吶!代碼這么值錢么?那我之前開源了那么多的工程源碼帶博文,豈不是無價之寶~~
其實開心就好,那么本文的話,就帶大家共睹8266的OTA的遠程升級的整個流程!
二、OTA的認識;
在Android開發領域里,有一種叫“熱修復”的功能,能夠不通過下載APK重新安裝它,即可實現修復了Bug。8266的OTA升級也是如此,官網稱之為FOTA ,對這個理念的東西,我也是不太懂!反正可以實現無線燒固件就可以啦!
- ①、8266的在線遠程升級的總體流程怎么樣的?
- ②、升級時候,內部運行是怎么樣的?
1.從官網提供的圖片可以看到,內存大小分為四塊,分別是 user1.bin、user2.bin、boot.bin 啟動、master_device.key 用戶數據 ,初始化系統參數的2個 blanck.bin和esp_init_data_default.bin和預留空間;
2.由下面的理解可知,8266要運行哪個固件,取決於 boot.bin文件的信息,每次升級前,都會查詢一次當前運行的是 user1.bin 還是 user2.bin ,進而從雲端拉取對應相反的那一個bin;
- ③、市面上那么對的8266模塊,應該怎么配置燒錄地址?
很簡單問題,只需要修改工程目錄下的
makefile
文件即可,翻開它在 25行左右,可以看到下面信息,這個是樂鑫沒有OTA在線升級的配置,可以看到BOOT?=none
,好!那么從這里開始修改!
BOOT?=none
APP?=0
SPI_SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP?=0
我這里詳細地說下這里包含了啥信息!
由下面可得,不同的8266模塊,其外部falsh大小決定了編譯時候的user.bin
路徑,所以大家在此OTA升級,必須要摸清楚你買的模塊是哪個falsh大小的,注意1M = 8Mbit
!!!安信可的 32Mbit 其實就是4M
的falsh,類似25Q32
這樣的存儲芯片。
|字段|數值|含義|備注|
|-------|-----|------|-----------|
|BOOT|none|表示不執行 boot.bin文件,即沒有boot.bin文件||
||new|表示執行 boot.bin文件,每次執行將要執行boot.bin文件||
|APP|1|表示生成 user1.bin文件|注意這個僅當上面的BOOT=new 才有效|
||2|表示生成 user2.bin文件|注意這個僅當上面的BOOT=new 才有效|
|SPI_SPEED|40|表示燒錄時候的頻率選擇,這里一般為40,對應燒錄工具默認值即可||
|SPI_MODE|QIO|這個主要看8266模塊制作商,比如現在常見的是安信可的8266-12F,就是QIO。||
|SPI_SIZE_MAP|1|flash=256,user1地址0x1000,user2地址0x41000|制作對應不同的falsh大小固件|
||2|flash=1024,user1地址0x1000,user2地址0x81000|制作對應不同的falsh大小固件|
||3|flash=2048,user1地址0x1000,user2地址0x81000|制作對應不同的falsh大小固件|
||4|flash=4096,user1地址0x1000,user2地址0x81000|制作對應不同的falsh大小固件|
||5|flash=2048,user1地址0x1000,user2地址0x101000|制作對應不同的falsh大小固件|
||6|flash=4096,user1地址0x1000,user2地址0x101000|制作對應不同的falsh大小固件|
||8|flash=8192,user1地址0x1000,user2地址0x101000|制作對應不同的falsh大小固件|
||9|flash=16384,user1地址0x1000,user2地址0x101000|制作對應不同的falsh大小固件|
||其它數值|flash=256,user1地址0x1000,user2地址0x41000 |制作對應不同的falsh大小固件|
綜合上面的表格,我們才有了官網給的下面的圖片說明!(注意看
blank.bin
和esp_init_data_default.bin
地址)
三、固件生成注意事項;
- ①:生成user1.bin文件:需要注意您的8266模塊大小(后面我會列出安信可的所有8266模塊的falsh大小),配置
SPI_SIZE_MAP?=6
,然后配置我們上述所說的makefile
文件配置!下面是我用安信可的8266-12F
的配置:
BOOT?=new
APP?=1 //此刻生成的是 user1.bin文件
SPI_SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP?=6
於是乎,上面的配置就生成如下(boot.bin文件版本支持1.4或以上):
- ② 生成user2.bin文件:修改您的bug之后,就修改
APP?=2
即可!
BOOT?=new
APP?=2 //此刻生成的是 user2.bin文件
SPI_SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP?=6
於是乎,上面的配置就生成如下,注意此刻的地址是與上面不同的:
四、本地局域網的服務器搭建;
- 我們必須要把user1.bin文件和user2.bin文件放在服務器,讓8266自己判斷當前運行的是哪個文件,然后自己去拉取! 這里我就用 tomcat 來搭建本地服務器,怎么搭建的看我之前寫的文章點我查看
確保以上步驟完畢之后,我在解壓后的目錄的
webapps
下新建一個xuhong
文件夾,再新建一個8266NewBin
文件夾,把2個bin文件(注意他們都在我們的工程目錄的bin/upgrade
下面,后綴名是 bin ,)放在這里!路徑注意不要帶中文字符!
- 我們放置好的文件在服務器了:
放好之后,我們在電腦測試下路徑是否有誤?打開 http://localhost:8080/xuhong/8266NewBin/user1.4096.new.6.bin ,發現瀏覽器會彈窗出現是否下載此文件!
同時,用同一個路由器連接的手機打開電腦的網關分配的局域網IP地址!這個見下圖了,同時確認電腦已經開啟了8080對外端口,否則無法訪問!),注意不要混亂!我這獲取的電腦IP是
192.168.1.105
,我們在手機打開http://192.168.1.105:8080/xuhong/8266NewBin/user1.4096.new.6.bin ,發現也提示下載文件了!恭喜!本地部署成功!
四、硬件代碼;
- 注意要修改 結構體的
upgrade_server_info
的URL申請的內存大小,下面是 4M * 1024 =4096 !
/**
* server_ip: 服務器地址
* port:服務器端口
* path:文件路徑
*/
void ICACHE_FLASH_ATTR ota_start_Upgrade(const char *server_ip, uint16_t port,const char *path) {
const char* file;
//獲取系統的目前加載的是哪個bin文件
uint8_t userBin = system_upgrade_userbin_check();
switch (userBin) {
//如果檢查當前的是處於user1的加載文件,那么拉取的就是user2.bin
case UPGRADE_FW_BIN1:
file = "user2.4096.new.6.bin";
break;
//如果檢查當前的是處於user2的加載文件,那么拉取的就是user1.bin
case UPGRADE_FW_BIN2:
file = "user1.4096.new.6.bin";
break;
//如果檢查都不是,可能此刻不是OTA的bin固件
default:
os_printf("Fail read system_upgrade_userbin_check! \n\n");
return;
}
struct upgrade_server_info* update =
(struct upgrade_server_info *) os_zalloc(
sizeof(struct upgrade_server_info));
update->pespconn = (struct espconn *) os_zalloc(sizeof(struct espconn));
//設置服務器地址
os_memcpy(update->ip, server_ip, 4);
//設置服務器端口
update->port = port;
//設置OTA回調函數
update->check_cb = ota_finished_callback;
//設置定時回調時間
update->check_times = 10000;
//從 4M *1024 =4096申請內存
update->url = (uint8 *)os_zalloc(4096);
//打印下請求地址
os_printf("Http Server Address:%d.%d.%d.%d ,port: %d,filePath: %s,fileName: %s \n",
IP2STR(update->ip), update->port, path, file);
//拼接完整的 URL去請求服務器
os_sprintf((char*) update->url, "GET /%s%s HTTP/1.1\r\n"
"Host: "IPSTR":%d\r\n"
"Connection: keep-alive\r\n"
"\r\n", path, file, IP2STR(update->ip), update->port);
if (system_upgrade_start(update) == false) {
os_printf(" Could not start upgrade\n");
//釋放資源
os_free(update->pespconn);
os_free(update->url);
os_free(update);
} else {
os_printf(" Upgrading...\n");
}
}
②、在回調函數我們寫如下,表示檢測是否已經升級完成,如果返回true
,則重啟復位模塊!
struct upgrade_server_info *update = arg;
if (update->upgrade_flag == true){
os_printf("OTA Success ! rebooting!\n");
system_upgrade_reboot();
}else{
os_printf("OTA failed!\n");
}
- 部分截圖分享:
- 升級完成:
⑤、后記;
此代碼參考了網上的許多文章,感謝各位的支持!特別是 gitHub上阿秀的開源!
代碼親測可用,我花了2小時特此寫了此博文,免得以后的小伙伴入坑,所以源碼下載的話給點賞金支持下!謝謝那個熱愛技術、知道敲代碼入坑的你!
- 工程截圖:
實現樂鑫esp8266的無線OTA升級,實現遠程在線升級固件。
注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權