esp8266 OTA远程无线升级

  1. 2 年前
    83
    2 年前,由 小助手 重新编辑

    第一步、编译生成.bin升级固件

    本教程需要用到 arduino IDE的esp8266开发环境,关于arduino IDE 的ESP8266环境配置可参考:环境配置: 点击跳转

    如果已安装好esp8266 开发环境,继续:

    使用arduino IDE软件,打开随便一个需要升级的程序,点击「项目」-「导出已编译的二进制文件」即可生成.bin固件,如下图。

    -image-

    生成的固件在程序所在文件夹中如下图所示:

    -image-

    第二步、上传.bin固件到巴法云

    在巴法云控制台 ,点击跳转 ,随便新建个主题,例如 主题 light002,如下图所示:

    -image-

    然后点击OTA,如下图所示:

    -image-

    进去后,点击上传固件,找到刚刚生成的固件上传即可,上传后复制固件链接,如下图:

    -image-

    第三步、远程升级

    唯一的要求:等待升级的esp8266有网就行。

    示例一:
    最简单测试版本:
    程序流程讲解:开机-->等待联网-->成功联网-->升级。
    如下:

    #include <ESP8266WiFi.h>
    #include <ESP8266httpUpdate.h>
    
    
    /******需要修改的地方****************/
    
    #define wifi_name       "newhtc"     //WIFI名称,区分大小写,不要写错
    #define wifi_password   "qq123456"   //WIFI密码
                                         //固件链接,在巴法云控制台复制、粘贴到这里即可
    String upUrl = "http://bin.bemfa.com/b/3BcN2Q1NGY4NWFmNDI5NzZlZTNjMjY5M2U2OTJhNmJiNTk=light002.bin";
    
    /**********************************/
    
    /**
     * 主函数
     */
    void setup() {
      Serial.begin(115200);                     //波特率115200
      WiFi.begin(wifi_name, wifi_password);     //连接wifi
      while (WiFi.status() != WL_CONNECTED) {   //等待连接wifi
        delay(500);
        Serial.print(".");
      }
     
      updateBin();                              //开始升级
    }
    
    /**
     * 循环函数
     */
    void loop() {
    
    }
    
    
    
    //当升级开始时,打印日志
    void update_started() {
      Serial.println("CALLBACK:  HTTP update process started");
    }
    
    //当升级结束时,打印日志
    void update_finished() {
      Serial.println("CALLBACK:  HTTP update process finished");
    }
    
    //当升级中,打印日志
    void update_progress(int cur, int total) {
      Serial.printf("CALLBACK:  HTTP update process at %d of %d bytes...\n", cur, total);
    }
    
    //当升级失败时,打印日志
    void update_error(int err) {
      Serial.printf("CALLBACK:  HTTP update fatal error code %d\n", err);
    }
    
    
    
    /**
     * 固件升级函数
     * 在需要升级的地方,加上这个函数即可,例如setup中加的updateBin(); 
     * 原理:通过http请求获取远程固件,实现升级
     */
    void updateBin(){
      Serial.println("start update");    
      WiFiClient UpdateClient;
    
      ESPhttpUpdate.onStart(update_started);//当升级开始时
      ESPhttpUpdate.onEnd(update_finished); //当升级结束时
      ESPhttpUpdate.onProgress(update_progress); //当升级中
      ESPhttpUpdate.onError(update_error); //当升级失败时
    
      t_httpUpdate_return ret = ESPhttpUpdate.update(UpdateClient, upUrl);
      switch(ret) {
        case HTTP_UPDATE_FAILED:      //当升级失败
            Serial.println("[update] Update failed.");
            break;
        case HTTP_UPDATE_NO_UPDATES:  //当无升级
            Serial.println("[update] Update no Update.");
            break;
        case HTTP_UPDATE_OK:         //当升级成功
            Serial.println("[update] Update ok.");
            break;
      }
    }

    示例二:
    采用远程指令控制是否升级,可先了解远程控制灯的程序,

    例如通过app控制esp8266开关灯:点击跳转

    app采用发送on、off的指令,当esp8266收到on,执行开灯,当esp8266收到off,执行关灯。如果开关灯没问题,我们当然也可以发生其他指令,我们可以随便假设个指令,让esp8266收到该指令,执行固件升级即可。

    例如收到指令update,执行升级函数

       if(getMsg  == "on"){       //如果收到指令on==打开灯
         turnOnLed();
       }else if(getMsg == "off"){ //如果收到指令off==关闭灯
          turnOffLed();
        }else if(getMsg == "update"){  //如果收到指令update
          updateBin();//执行升级函数
        }

    示例二完整程序下载:点击下载

    由于固件链接地址是不变的,所以就算重新上传了固件,也可以一直持续向上升级。

  2. 去年

    附:错误代码
    如果报错,错误代码可参考

    /// note we use HTTP client errors too so we start at 100
    //TODO - in v3.0.0 make this an enum
    constexpr int HTTP_UE_TOO_LESS_SPACE            = (-100);
    constexpr int HTTP_UE_SERVER_NOT_REPORT_SIZE    = (-101);
    constexpr int HTTP_UE_SERVER_FILE_NOT_FOUND     = (-102);
    constexpr int HTTP_UE_SERVER_FORBIDDEN          = (-103);
    constexpr int HTTP_UE_SERVER_WRONG_HTTP_CODE    = (-104);
    constexpr int HTTP_UE_SERVER_FAULTY_MD5         = (-105);
    constexpr int HTTP_UE_BIN_VERIFY_HEADER_FAILED  = (-106);
    constexpr int HTTP_UE_BIN_FOR_WRONG_FLASH       = (-107);
    constexpr int HTTP_UE_SERVER_UNAUTHORIZED       = (-108);

或者 后参与话题.