ESP8266開發之旅 網絡篇⑧ SmartConfig——一鍵配網

授人以魚不如授人以漁,目的不是爲了教會你具體項目開發,而是學會學習的能力。但願你們分享給你周邊須要的朋友或者同窗,說不定大神成長之路有博哥的奠定石。。。git

QQ技術互動交流羣:ESP8266&32 物聯網開發 羣號622368884,不喜勿噴github

1、你若是想學基於Arduino的ESP8266開發技術

1、基礎篇web

  1. ESP8266開發之旅 基礎篇① 走進ESP8266的世界
  2. ESP8266開發之旅 基礎篇② 如何安裝ESP8266的Arduino開發環境
  3. ESP8266開發之旅 基礎篇③ ESP8266與Arduino的開發說明
  4. ESP8266開發之旅 基礎篇④ ESP8266與EEPROM
  5. ESP8266開發之旅 基礎篇⑤ ESP8266 SPI通訊和I2C通訊
  6. ESP8266開發之旅 基礎篇⑥ Ticker——ESP8266定時庫

2、網絡篇微信

  1. ESP8266開發之旅 網絡篇① 認識一下Arduino Core For ESP8266
  2. ESP8266開發之旅 網絡篇② ESP8266 工做模式與ESP8266WiFi庫
  3. ESP8266開發之旅 網絡篇③ Soft-AP——ESP8266WiFiAP庫的使用
  4. ESP8266開發之旅 網絡篇④ Station——ESP8266WiFiSTA庫的使用
  5. ESP8266開發之旅 網絡篇⑤ Scan WiFi——ESP8266WiFiScan庫的使用
  6. ESP8266開發之旅 網絡篇⑥ ESP8266WiFiGeneric——基礎庫
  7. ESP8266開發之旅 網絡篇⑦ TCP Server & TCP Client
  8. ESP8266開發之旅 網絡篇⑧ SmartConfig——一鍵配網
  9. ESP8266開發之旅 網絡篇⑨ HttpClient——ESP8266HTTPClient庫的使用
  10. ESP8266開發之旅 網絡篇⑩ UDP服務
  11. ESP8266開發之旅 網絡篇⑪ WebServer——ESP8266WebServer庫的使用
  12. ESP8266開發之旅 網絡篇⑫ 域名服務——ESP8266mDNS庫
  13. ESP8266開發之旅 網絡篇⑬ SPIFFS——ESP8266 Flash文件系統
  14. ESP8266開發之旅 網絡篇⑭ web配網
  15. ESP8266開發之旅 網絡篇⑮ 真正的域名服務——DNSServer
  16. ESP8266開發之旅 網絡篇⑯ 無線更新——OTA固件更新

3、應用篇網絡

  1. ESP8266開發之旅 應用篇① 局域網應用 ——炫酷RGB彩燈
  2. ESP8266開發之旅 應用篇② OLED顯示天氣屏
  3. ESP8266開發之旅 應用篇③ 簡易版WiFi小車

4、高級篇app

  1. ESP8266開發之旅 進階篇① 代碼優化 —— ESP8266內存管理
  2. ESP8266開發之旅 進階篇② 閒聊Arduino IDE For ESP8266配置
  3. ESP8266開發之旅 進階篇③ 閒聊 ESP8266 Flash
  4. ESP8266開發之旅 進階篇④ 常見問題 —— 解決困擾
  5. ESP8266開發之旅 進階篇⑤ 代碼規範 —— 像寫文章同樣優美
  6. ESP8266開發之旅 進階篇⑥ ESP-specific APIs說明

1. 前言

    前面的博文中,博主提供的實例源代碼一般都是固定了WiFi熱點的帳號密碼。可是,在實際產品開發中,這樣的限制是行不通的。
    當你拿到一塊WiFi模塊,若是須要連上網絡,則須要將SSID名稱、密碼設置到模塊當中。通常有幾種方式:ide

  • 一種就是經過串口接到輸入設備,經過串口輸入AT指令(SSID名稱和密碼),可是前提是該模塊自己燒入了AT固件,很明顯不符合Arduino core for ESP8266開發;
  • 一種就是設備提供一個AP熱點,手機連上這個熱點,而後經過手機把家裏的WiFi的SSID和密碼配置到設備上,最後手機再切換回家裏的WiFi(這裏就是博主後面會講到的Web配網),這種配網成功率能夠說是100%。
  • 經過SmartConfig技術配置,微信的AirKiss、ESP8266的esptouch(博主也把esptouch的代碼抽取了一個module,供Android Studio開發app的同窗直接引入),這是最智能的配網方式。可是缺點也很明顯,那就是配網成功率未達到100%,同時SmartConfig還得另外安裝一個app。SmartConfig最佳的應用場景就是你開發的產品須要搭配App來使用。

2. smartconfig

    8266核心庫提供了SmartConfig技術,那麼smartconfig究竟是什麼呢?函數

2.1 smartconfig工做原理

    所謂SmartConfig就是手機App端發送包含WIFI用戶名以及密碼的UDP廣播包,智能終端(開啓了sniffer混雜模式)的WIFI芯片能夠接收到該UDP包,只要知道UDP包的組織形式,就能夠經過接收到的UDP包解密出WIFI用戶名密碼,而後智能硬件配置收到的用戶名密碼到指定的WIFI AP上。
    直接看一個概念圖:
imageoop

    簡單操做步驟以下:學習

  1. 8266 端做爲station,進入smartconfig, 等待手機端發出的用戶名和密碼。
  2. 手機端把填寫當前網絡的密碼經過UDP廣播;
  3. 8266 獲取到信息以後推出smartconfig配置,鏈接網絡;

2.2 smartconfig支持庫

    還記得,博主其實在 ESP8266開發之旅 網絡篇④ Station——ESP8266WiFiSTA庫的使用 有稍微涉及到smartconfig。並且,請讀者放心,smartconfig配置很是簡單,方法就三個:

  • beginSmartConfig
  • stopSmartConfig
  • smartConfigDone

2.2.1 beginSmartConfig —— 啓動配網模式

函數說明:

/**
 * 啓動配網模式
 * @return bool 是否啓動配網模式成功
 */
bool beginSmartConfig();

看看 beginSmartConfig 源碼:

/**
 * 啓動 SmartConfig
 */
bool ESP8266WiFiSTAClass::beginSmartConfig() {
    //SmartConfig已經開啓了
    if(_smartConfigStarted) {
        return false;
    }
    //開啓STA模式
    if(!WiFi.enableSTA(true)) {
        // enable STA failed
        return false;
    }
    //調用真正的smartconfig_start,並設置了_smartConfigCallback 回調函數
    if(smartconfig_start(reinterpret_cast<sc_callback_t>(&ESP8266WiFiSTAClass::_smartConfigCallback), 1)) {
        _smartConfigStarted = true;
        _smartConfigDone = false;
        return true;
    }
    return false;
}

注意點:

  • SmartConfig須要處於STA工做模式;

咱們看看 _smartConfigCallback 會作什麼?源碼:

/**
 * _smartConfigCallback
 * @param st
 * @param result
 */
void ESP8266WiFiSTAClass::_smartConfigCallback(uint32_t st, void* result) {
    sc_status status = (sc_status) st;
    if(status == SC_STATUS_LINK) {
        //獲取到配網信息(帳號密碼)
        station_config* sta_conf = reinterpret_cast<station_config*>(result);
        //把配置寫到flash
        wifi_station_set_config(sta_conf);
        //斷開鏈接
        wifi_station_disconnect();
        //從新鏈接
        wifi_station_connect();
        //標記配網完成
        _smartConfigDone = true;
    } else if(status == SC_STATUS_LINK_OVER) {
       //中止配網
        WiFi.stopSmartConfig();
    }
}

2.2.2 stopSmartConfig —— 中止Smartconfig

函數說明:

/**
 * 中止Smartconfig
 * @return bool 是否中止配網模式成功
 */
bool stopSmartConfig();

源碼:

/**
 *  Stop SmartConfig
 */
bool ESP8266WiFiSTAClass::stopSmartConfig() {
    if(!_smartConfigStarted) {
        return true;
    }
    //調用中止函數
    if(smartconfig_stop()) {
        _smartConfigStarted = false;
        return true;
    }
    return false;
}

2.2.3 smartConfigDone —— 是否完成配網

函數說明:

/**
 * 查找狀態看是否配網完成
 * @return bool 是否啓動配網模式成功
 */
bool smartConfigDone();

源碼:

/**
 * Query SmartConfig status, to decide when stop config
 * @return smartConfig Done
 */
bool ESP8266WiFiSTAClass::smartConfigDone() {
    if(!_smartConfigStarted) {
        return false;
    }
    //返回狀態 _smartConfigCallback 會改變狀態
    return _smartConfigDone;
}

3. 實例

  1. 請往8266WiFi模塊先燒入如下代碼:
#include <ESP8266WiFi.h>
 
void smartConfig()
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig");
  delay(2000);
  // 等待配網
  WiFi.beginSmartConfig();
 
 while (1)
  {
    Serial.print(".");
    delay(500);
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      WiFi.setAutoConnect(true);  // 設置自動鏈接
      break;
    }
  }
 
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
 
void setup()
{
  Serial.begin(115200);
  smartConfig();
}
 
void loop()
{
  delay(100);
  Serial.println("loop");
}
  1. 而後使用ESP8266提供的App ESPTouch 或者仍是使用博主後面寫的App SmartConfigAPP
    固然,有興趣的讀者也能夠獲取到源碼,請看 傳輸門,麻煩star。
    博主app配置以下:

image

image

注意點:

  • 若是沒有配置成功,通常都是沒有進入到SmartConfig中,最好重啓一下吧。

測試結果:
image

4. 總結

本篇很是簡單,三個方法,簡單步驟,一鍵配置網絡,值得擁有。

相關文章
相關標籤/搜索