ESP8266 OTA之Arduino IDE更新

OTA - Over the air update of the firmware 即 空中固件更新。這是樂(lè)鑫SDK中極為之Cool的功能!

平時(shí)做Arduino 或者 ESP8266的開(kāi)發(fā)都要很苦逼地用USB插著板子枝冀,如果用ESP-01的話(huà)還得接FDTI232的轉(zhuǎn)換板,我是不知道是我的機(jī)器有問(wèn)題還是驅(qū)動(dòng)程序的問(wèn)題塞颁,經(jīng)常在iMac上插拔轉(zhuǎn)接線(xiàn)的話(huà)連接ESP8266的串口就會(huì)丟失过咬,不重新啟動(dòng)機(jī)器是沒(méi)有辦法再更新ESP8266的固件大渤,總之我很討厭那根USB的數(shù)據(jù)線(xiàn),無(wú)線(xiàn)總比有線(xiàn)的好掸绞!

上面這種只是在實(shí)驗(yàn)室環(huán)境下的情況泵三,還有另一種最實(shí)際的應(yīng)用:當(dāng)我們的將實(shí)驗(yàn)環(huán)境中的ESP8266做成產(chǎn)品并交付到客戶(hù)手上之時(shí)應(yīng)該如何來(lái)更新產(chǎn)品中的ESP8266的固件呢?難到要用戶(hù)拿到服務(wù)中心來(lái)更新衔掸?如果是這樣那這個(gè)產(chǎn)品一是失敗之作烫幕,而且也一定做不下去的,至少我們現(xiàn)在還沒(méi)有遇到過(guò)這么坑爹的產(chǎn)品吧敞映。這個(gè)時(shí)候OTA所能發(fā)揮的作用就非常大了较曼,通過(guò)無(wú)線(xiàn)網(wǎng)絡(luò)對(duì)固件進(jìn)行重新的分發(fā)與更新是WIFI智能產(chǎn)品的一個(gè)最基本也是最重要的功能。

如果使用NodeMCU Lua 的話(huà)是沒(méi)有這個(gè)功能的驱显,NodeMCU的GitHub上這個(gè)問(wèn)題被放在ISSUSE中很久了诗芜,至今還沒(méi)有辦法解決。但我曾找過(guò)一些相關(guān)的文獻(xiàn)資料但也并不是很完美: ESP8266 OTA LUA with WEB UI MANAGEMENT / Nodemcu firmware

但如果你是用Arduino Core For ESP8266 的話(huà)這就是小菜一碟了埃疫。首先我們得先從理論入手伏恐,了解一下OTA的本質(zhì)是什么它又是怎么樣工作的。我們都知道栓霜,當(dāng)使用串口線(xiàn)來(lái)更新ESP8266固件時(shí)是通過(guò)ESP8266中的SerialBootLoader來(lái)的進(jìn)行引導(dǎo)與寫(xiě)入的翠桦,這是一種默認(rèn)方式。OTA則是“繞過(guò)”了SerialBootLoader而通過(guò)WIFI向ESP8266中的"WIFI Boot Loader"進(jìn)行通信胳蛮,由WIFI Boot Loader 來(lái)引導(dǎo)無(wú)線(xiàn)固件寫(xiě)入更新销凑。當(dāng)然這個(gè)WIFI Boot Loader 就需要我們自已先通過(guò)串行線(xiàn)預(yù)先寫(xiě)入到的ESP8266中。換句話(huà)說(shuō)仅炊,我們得在代碼內(nèi)嵌入用于OTA的 WIFI Boot Loader 斗幼。

悻然,這個(gè)過(guò)程并不需要我們來(lái)寫(xiě)抚垄,因?yàn)锳rduino For ESP8266 已經(jīng)為我們配置一個(gè)系列極棒的示例代碼蜕窿,其中就有OTA的WIFI Boot Loader 代碼,只是它并不是叫這個(gè)名稱(chēng)而已呆馁。

好了理論很重要桐经,但不如實(shí)踐!我們直接動(dòng)手浙滤,先試試將ESP8266做成可以支持OTA阴挣。

打開(kāi)Arduino IDE 從示例菜單里面打開(kāi)一個(gè)叫"BasicOTA" 項(xiàng)(這個(gè)名稱(chēng)是不是很LOW)

BasicOTA

具體代碼如下所示:

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "..........";
const char* password = "..........";

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  // Port defaults to 8266
  // ArduinoOTA.setPort(8266);

  // Hostname defaults to esp8266-[ChipID]
  // ArduinoOTA.setHostname("myesp8266");

  // No authentication by default
  // ArduinoOTA.setPassword((const char *)"123");

  ArduinoOTA.onStart([]() {
    Serial.println("Start");
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
}

然后我們將SSPI和Password兩個(gè)變量設(shè)定為你現(xiàn)在所接連的WIFI名稱(chēng)與密碼:

const char* ssid = "你的WIFI連接名稱(chēng)";
const char* password = "你的WIFI密碼";

然后果決地寫(xiě)入到你的ESP8266中。寫(xiě)入成功后纺腊,打開(kāi)串口監(jiān)視器你會(huì)看到如下的內(nèi)容:

注意

  1. 你一定要打開(kāi)串口監(jiān)視器畔咧,否則下一步的內(nèi)容你將會(huì)啥也看不到茎芭。
  2. 關(guān)閉Arduino IDE 然后重新打開(kāi)。

然后在工具菜單的端口項(xiàng)中你會(huì)發(fā)現(xiàn)多了一個(gè) "esp8266-xxxxx 192.168.1.130" 的菜單項(xiàng)盒卸,選中它

然后骗爆,想看一下效果的話(huà)將Setup函數(shù)中的打印信息改一下次氨,改成 "Read for OTA"蔽介,拔掉串口線(xiàn),用外部電源接上ESP8266并啟動(dòng)它煮寡,等上20來(lái)秒后虹蓄,在Arduino IDE上點(diǎn)擊上傳,盯著你的ESP8266看就會(huì)發(fā)現(xiàn)它的內(nèi)置LED在燒寫(xiě)時(shí)狂閃幸撕,一切就大功告成了薇组!

現(xiàn)在我們對(duì)上述的OTA代碼進(jìn)行一下分析就會(huì)發(fā)現(xiàn)它的實(shí)現(xiàn)邏輯其實(shí)非常的簡(jiǎn)單,主要是以下這么幾步:

  1. 連接WIFI
  2. 配置 ArduinoOTA 對(duì)象的事件函數(shù)
  3. 啟動(dòng) ArduinoOTA 服務(wù) ArduinoOTA.begin()
  4. loop() 函數(shù)將處理權(quán)交由 ArduinoOTA.handle()

清楚這個(gè)代碼邏輯后坐儿,我們就可以按照實(shí)現(xiàn)的開(kāi)發(fā)需要對(duì)其進(jìn)行更改律胀。例如可以加入一個(gè)標(biāo)志位 flag,用于標(biāo)識(shí)當(dāng)前運(yùn)行狀態(tài)

  1. flag = 0 普通工作模式
  2. flag = 1 刷機(jī)模式

然后通過(guò)硬件(按鈕)或者軟件(如MQTT或其它通信協(xié)議)方式來(lái)控制這個(gè)標(biāo)志位以控制ESP8266的運(yùn)行模式:

void loop() {
  if (flag ==0 ) {
    // 正常工作狀態(tài)的代碼
  } else {
    ArduinoOTA.handle();
 }
}

這樣我們就可以隨時(shí)通過(guò)WIFI對(duì)ESP8266的固件進(jìn)行更新了貌矿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炭菌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逛漫,更是在濱河造成了極大的恐慌黑低,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酌毡,死亡現(xiàn)場(chǎng)離奇詭異克握,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)枷踏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)菩暗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人旭蠕,你說(shuō)我怎么就攤上這事停团。” “怎么了下梢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵客蹋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我孽江,道長(zhǎng)讶坯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任岗屏,我火速辦了婚禮辆琅,結(jié)果婚禮上漱办,老公的妹妹穿的比我還像新娘。我一直安慰自己婉烟,他們只是感情好娩井,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著似袁,像睡著了一般洞辣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昙衅,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天扬霜,我揣著相機(jī)與錄音,去河邊找鬼而涉。 笑死著瓶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啼县。 我是一名探鬼主播材原,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼季眷!你這毒婦竟也來(lái)了余蟹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘟裸,失蹤者是張志新(化名)和其女友劉穎客叉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體话告,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼搏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沙郭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佛呻。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖病线,靈堂內(nèi)的尸體忽然破棺而出吓著,到底是詐尸還是另有隱情,我是刑警寧澤送挑,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布绑莺,位于F島的核電站,受9級(jí)特大地震影響惕耕,放射性物質(zhì)發(fā)生泄漏纺裁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望欺缘。 院中可真熱鬧栋豫,春花似錦、人聲如沸谚殊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嫩絮。三九已至丛肢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間絮记,已是汗流浹背摔踱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怨愤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓蛹批,卻偏偏與公主長(zhǎng)得像撰洗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腐芍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容