實現樂鑫esp8266的無線OTA升級,實現遠程在線升級固件


代碼地址如下:
http://www.demodashi.com/demo/12994.html


一、前言;


寫了這么多的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.binesp_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_infoURL申請的內存大小,下面是 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升級,實現遠程在線升級固件。

代碼地址如下:
http://www.demodashi.com/demo/12994.html

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

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



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