家裏有智能家居的小夥伴應該都知道,給新買的玩具配網上線都是直接安裝教程掃描二維碼然後安裝個軟件輸入家裏路由器的賬號密碼或者直接到一個網頁輸入這種聯網方式,然而我們在玩8266還沒出新手村之前都是將WiFi的賬號密碼寫死在程序裏,開機直接上網的新手模式,這就很沒有使用價值了。
ESP8266-RTOS-SDK中提供了兩種(SmartConfig)智能配網的方案接口:
- 樂鑫提供的ESP-TOUCH
- AirKiss
ESP-TOUCH
樂鑫自主研發的 ESP-TOUCH 協議採用的是 Smart Config(智能配置)技術來幫助用戶將嵌入了 ESP8266EX 的設備連接至 Wi-Fi 網絡。用戶只需在手機上進行簡單操作即可實現智能配置。
樂鑫官方提供了ESP-TOUCH的APK源碼,見*樂鑫官方APK*, 通過手機APP實現智能配網,就不需要將WiFi寫入固件了。
AirKiss
AirKiss是微信硬件平臺提供的一種WIFI設備快速入網配置技術,要使用微信客戶端的方式配置設備入網,需要設備支持AirKiss技術。目前已經有越來越多的芯片和模塊廠商,提供了支持AirKiss技術的方案。
以智能插座爲例,下文將說明AirKiss技術的應用方案和交互流程。智能插座屬於物聯網智能控制類設備,它可用於家電(比如電燈、熱水器等)的智能化開關控制。智能插座的特點是小型化且低功耗,顯而易見,該設備並不適合於配置屏幕與鍵盤等輸入外設。在這種情況下,AirKiss技術能完美解決其SSID與密碼的傳輸、設置問題。
AirKiss技術對應用設備的硬件幾乎沒有額外的要求,配置時需要設備能夠進入AirKiss模式。在本例中,智能插座在按下了配置按鍵之後,指示燈閃爍進入AirKiss模式,成爲了AirKiss技術中信息的接收方。用戶則可以使用微信手機客戶端,成爲AirKiss技術中的信息發送方。
以上介紹轉自微信硬件平臺對AirKiss的介紹。
ESP8266使用智能配網
在SDK中,樂鑫有提供針對以上兩種的配網接口,使用方便。由於是智能配網,所以在代碼中不需要寫入WiFi的相關信息,所以像前幾篇博客中連接WiFi的函數可就更加簡單了,只需要打開WiFi功能即可,具體的WiFi信息在SmartConfig獲取後自動填入再連接具體的WiFi。
static void initialise_wifi(void)
{
tcpip_adapter_init();
wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
ESP_ERROR_CHECK( esp_wifi_start() );
}
針對SmartConfig的接口樂鑫官方集成度高,所以接口不多但是全:
頭文件
#include "esp_smartconfig.h"
const char *esp_smartconfig_get_version(void); //獲取SmartConfig的版本
esp_err_t esp_smartconfig_start(sc_callback_t cb, ...); //啓動SmartConfig,配置ESP設備來連接AP,接收通過手機廣播發出包含目標AP的SSID和密碼的特殊數據包。
esp_err_t esp_smartconfig_stop(void); //停止SmartConfig,釋放esp_smartconfig_start所佔用的緩衝區。
esp_err_t esp_esptouch_set_timeout(uint8_t time_s); //設置SmartConfig超時時間,計時從SC_STATUS_FIND_CHANNEL狀態開始。如果超時,SmartConfig將重新啓動。(時間範圍15s~255s,偏移:45s。)
esp_err_t esp_smartconfig_set_type(smartconfig_type_t type);//設置SmartConfig的協議類型。
esp_err_t esp_smartconfig_fast_mode(bool enable);//設置SmartConfig模式。默認的正常模式。
關鍵函數解析
設置智能配網整體流程分三步:
- 編寫SmartConfig的事件回調函數
- 設置SmartConfig的工作模式
- 啓動SmartConfig
SmartConfig事件
SmartConfig事件和wifi事件類似,事件有一下5種觸發事件,根據觸發事件編寫回調函數
typedef enum {
SC_STATUS_WAIT = 0, /**< 等待啓動連接 */
SC_STATUS_FIND_CHANNEL, /**< 找到了目標通道 */
SC_STATUS_GETTING_SSID_PSWD, /**< 獲取了目標AP的SSID和密碼 */
SC_STATUS_LINK, /**< 連接到目標AP */
SC_STATUS_LINK_OVER, /**< 成功連接到AP */
} smartconfig_status_t;
需要以回調函數作爲參數的函數是:
esp_err_t esp_smartconfig_start(sc_callback_t cb, ...);
**這裏特別要注意的是 sc_callback_t **
typedef void (*sc_callback_t)(smartconfig_status_t status, void *pdata);
說明我要傳遞給 esp_smartconfig_start 的回調函數必須要包含兩個參數,*smartconfig_status_t status, void pdata
SmartConfig回調函數編寫
前文提到,根據 smartconfig_status_t 編寫SmartConfig回調函數
switch (status) {
case SC_STATUS_WAIT: //等待啓動連接
ESP_LOGI(TAG, "SC_STATUS_WAIT");
break;
case SC_STATUS_FIND_CHANNEL: //找到了目標通道
ESP_LOGI(TAG, "SC_STATUS_FINDING_CHANNEL");
break;
case SC_STATUS_GETTING_SSID_PSWD://獲取SSID和PSWD
ESP_LOGI(TAG, "SC_STATUS_GETTING_SSID_PSWD");
break;
case SC_STATUS_LINK: //連接到目標AP
ESP_LOGI(TAG, "SC_STATUS_LINK");
wifi_config_t *wifi_config = pdata;
ESP_LOGI(TAG, "SSID:%s", wifi_config->sta.ssid);
ESP_LOGI(TAG, "PASSWORD:%s", wifi_config->sta.password);
ESP_ERROR_CHECK( esp_wifi_disconnect() );
ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, wifi_config) );
ESP_ERROR_CHECK( esp_wifi_connect() );
break;
case SC_STATUS_LINK_OVER: //成功連接到AP
ESP_LOGI(TAG, "SC_STATUS_LINK_OVER");
if (pdata != NULL) {
sc_callback_data_t *sc_callback_data = (sc_callback_data_t *)pdata;
switch (sc_callback_data->type) {
case SC_ACK_TYPE_ESPTOUCH:
ESP_LOGI(TAG, "Phone ip: %d.%d.%d.%d", sc_callback_data->ip[0], sc_callback_data->ip[1], sc_callback_data->ip[2], sc_callback_data->ip[3]);
ESP_LOGI(TAG, "TYPE: ESPTOUCH");
break;
case SC_ACK_TYPE_AIRKISS:
ESP_LOGI(TAG, "TYPE: AIRKISS");
break;
default:
ESP_LOGE(TAG, "TYPE: ERROR");
break;
}
}
xEventGroupSetBits(wifi_event_group, ESPTOUCH_DONE_BIT);
break;
default:
break;
}
SmartConfig工作模式設置
工作模式
esp_err_t esp_smartconfig_set_type(smartconfig_type_t type);
參數 | 解析 |
---|---|
type | SmartConfig工作模式 |
typedef enum {
SC_TYPE_ESPTOUCH = 0, /**< ESPTouch */
SC_TYPE_AIRKISS, /**< AirKiss */
SC_TYPE_ESPTOUCH_AIRKISS, /**< ESPTouch and AirKiss */
} smartconfig_type_t;
SmartConfig啓動
SmartConfig啓動
esp_err_t esp_smartconfig_start(sc_callback_t cb, ...);
參數 | 解析 |
---|---|
cb | SmartConfig回調函數 |
本文測試Demo:室內有害氣體檢測儀
簡述功能:爲了儘可能模擬正常智能家居產品,實現一個開機即檢測室內有害氣體濃度的設備,沒有上網也能將檢測到的有害氣體濃度顯示在OLED上,同時可以長按按鍵進去配網模式指示燈1開始閃爍,然後通過微信掃碼進行智能配網,配網成功後指示燈2常亮,實現數據上傳的功能,如果MQTT服務器在雲上,那麼就可以實現遠程監控了,MQTT在線掉線可視。
具體實現代碼已上傳待審覈,文件包含演示視頻,點擊下載