-
本系列博客學習由非官方人員 半顆心臟 潛心所力所寫,僅僅做個人技術交流分享,不做任何商業用途。如有不對之處,請留言,本人及時更改。
-
6 、Esp8266之 了解 SmartConfig與Airkiss一鍵配網,給8266配網上雲端。無需把wifi名字密碼寫在固件里。
-
9、 Esp8266進階之路第一篇: [小實戰上篇]Windows系統搭建8266的本地Mqtt服務器,局域網點亮一盞LED燈。
-
10、 Esp8266進階之路第二篇: [小實戰下篇]Windows系統搭建8266的本地Mqtt服務器,局域網點亮一盞LED燈。
-
11、 Esp8266進階之路第三篇: 8266接入阿里智能,點亮一盞LED燈,期待天貓精靈語音控制的不約而至!
-
12、 Esp8266進階之路第四篇: 圖文並茂學習阿里雲主機搭建8266MQTT服務器,實現移動網絡遠程控制一盞LED。
-
13、 Esp8266進階之路第五篇: 動手做個8266畢設小案例,smartConfig + MQTT協議輕松實現遠程控制一盞LED。
-
14、 Esp8266進階之路第六篇: esp8266的Rtos系統學習的正確姿勢 [上篇]—— 環境搭建、燒錄。
一、前言
聽到 SmartConfig這個單詞,字義上就是智能配置,但是我們電子發燒友都是稱之為一鍵配網,
聽到Airkiss這個單詞就有點意思了。飛吻,象征着速度飛一般的快。

本博文的配網截圖:

8266串口打印信息:

1.1、問題來了。
①、都不懂!SmartConfig和AirKiss是什么東東!
- 答:大家買智能設備時候都會出現以下界面提示您要輸入wifi賬號和密碼!然后下一步操作搜索,設備成功連接網絡成功就可以使用啦!這里就引出了, SmartConfig 和 AirKiss 就是給設備配網的方式,皆為無線操作給設備發wifi名字和密碼的方式。
①、既然方式一樣,二者有啥不同嗎!
- 答:其實原理都是一樣,手機發出廣播,這廣播里面有WIfi的名字 和密碼,也就是接下來設備要接收的廣播,以及去連接這個Wifi!,其然 ,Airkiss是微信專門為物聯網配網開發的,是對SmartConfig的進一步封裝。如果你沒有去集成微信開發環境去給設備配網,大不可去了解airkiss,只需要懂得用SmartConfig配網就好了!
二、原理。
這里我引用微信官網畫的一個通俗易懂一張圖片。圖下的智能插座是要配網的設備,而微信客戶端也就是我們的發送端:APP軟件 ;
-
步驟
-
在APP軟件輸入將要連接的WIfi的名字和密碼。
-
之后App會空中發網,帶有wifi的名字和密碼的信息暴露。
-
智能設備收到信息廣播之后,嘗試不斷去連接,一旦連接成功。就會返回信息給APP通知配網成功!
-

三、走進8266一鍵配網的SmartConfig。
1. 翻開8266的編程SDK手冊,看看有哪些已經封裝好的接口,如圖 :

2. 主要的函數方法,如圖 :


3. 為了更好展示主要方法,我做個表格,大家可以方便查閱,如下 :
| 函數名字 | 函數參數 | 返回值 | 備注 |
|---|---|---|---|
| smartconfig_start() | sc_callback_t cb:SmartConfig 狀態發⽣生改變時,進⼊入回調函數 | true:成功 ,false:失敗 | 開啟快連模式,快速連接 ESP8266 Station 到 AP |
| smartconfig_stop () | SC_TYPE_ESPTOUCH,SC_TYPE_AIRKISS,SC_TYPE_ESPTOUCH_AIRKISS | true:成功 ,false:失敗 | 關閉快連模式,釋放 smartconfig_start 占⽤用的內存。 |
三、電路圖與代碼分析。
3、1 電路圖。
僅僅只是一個按鍵觸發配網模式,這個按鍵接GPIO14與GND端。

3、2 代碼分析。
第一步:按鍵初始化,這里我使用的是機智雲SOC方案提煉出來的按鍵中斷初始化 hal_key.h 和 hal_key.c 文件封裝。
第二步:按鍵觸發回調的函數 :如下,其中的smartconfig_done是方法回調函數,見第三步驟。
//短按按鍵函數回調 LOCAL void ICACHE_FLASH_ATTR keyShortPress(void) { //配置一鍵配網類型 smartconfig_set_type(SC_TYPE_ESPTOUCH); //開啟station模式 wifi_set_opmode(STATION_MODE); //開始一鍵配網等待 smartconfig_start(smartconfig_done); }
第三步: smartconfig_done函數 : 如下
void ICACHE_FLASH_ATTR smartconfig_done(sc_status status, void *pdata) { switch (status) { //連接未開始,請勿在此階段開始連接。 case SC_STATUS_WAIT: os_printf("SC_STATUS_WAIT\n"); break; //發現WIfi信道 case SC_STATUS_FIND_CHANNEL: os_printf("SC_STATUS_FIND_CHANNEL\n"); break; //得到wifi名字和密碼 case SC_STATUS_GETTING_SSID_PSWD: os_printf("SC_STATUS_GETTING_SSID_PSWD\n"); sc_type *type = pdata; if (*type == SC_TYPE_ESPTOUCH) { os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n"); } else { os_printf("SC_TYPE:SC_TYPE_AIRKISS\n"); } break; //已經獲取wifi名字與密碼在連接路由器 case SC_STATUS_LINK: os_printf("SC_STATUS_LINK\n"); struct station_config *sta_conf = pdata; wifi_station_set_config(sta_conf); wifi_station_disconnect(); wifi_station_connect(); break; //成功獲取到IP,連接路由完成。 case SC_STATUS_LINK_OVER: if (pdata != NULL) { uint8 phone_ip[4] = { 0 }; os_memcpy(phone_ip, (uint8*) pdata, 4); //打印發廣播過來的設備IP地址 os_printf("Phone ip: %d.%d.%d.%d\n", phone_ip[0], phone_ip[1], phone_ip[2], phone_ip[3]); } //停止配置 smartconfig_stop(); break; } }
四、完整代碼。
#include "../include/debug.h" #include "hal_key.h" #include "../include/uart.h" #include "ets_sys.h" #include "osapi.h" #include "ip_addr.h" #include "espconn.h" #include "mem.h" #include "user_interface.h" #include "smartconfig.h" #include "airkiss.h" //按鍵定義 #define GPIO_KEY_NUM 1 #define KEY_0_IO_MUX PERIPHS_IO_MUX_MTMS_U #define KEY_0_IO_NUM 14 #define KEY_0_IO_FUNC FUNC_GPIO14 LOCAL key_typedef_t * singleKey[GPIO_KEY_NUM]; LOCAL keys_typedef_t keys; LOCAL esp_udp ssdp_udp; LOCAL struct espconn pssdpudpconn; LOCAL os_timer_t ssdp_time_serv; uint8_t lan_buf[200]; uint16_t lan_buf_len; uint8 udp_sent_cnt = 0; void ICACHE_FLASH_ATTR smartconfig_done(sc_status status, void *pdata) { switch (status) { //連接未開始,請勿在此階段開始連接 case SC_STATUS_WAIT: os_printf("SC_STATUS_WAIT\n"); break; //發現信道 case SC_STATUS_FIND_CHANNEL: os_printf("SC_STATUS_FIND_CHANNEL\n"); break; //得到wifi名字和密碼 case SC_STATUS_GETTING_SSID_PSWD: os_printf("SC_STATUS_GETTING_SSID_PSWD\n"); sc_type *type = pdata; if (*type == SC_TYPE_ESPTOUCH) { os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n"); } else { os_printf("SC_TYPE:SC_TYPE_AIRKISS\n"); } break; case SC_STATUS_LINK: os_printf("SC_STATUS_LINK\n"); struct station_config *sta_conf = pdata; wifi_station_set_config(sta_conf); wifi_station_disconnect(); wifi_station_connect(); break; //成功獲取到IP,連接路由完成。 case SC_STATUS_LINK_OVER: os_printf("SC_STATUS_LINK_OVER \n\n"); if (pdata != NULL) { uint8 phone_ip[4] = { 0 }; os_memcpy(phone_ip, (uint8*) pdata, 4); os_printf("Phone ip: %d.%d.%d.%d\n", phone_ip[0], phone_ip[1], phone_ip[2], phone_ip[3]); } //停止配置 smartconfig_stop(); break; } } //用戶自定義 RF_CAL 參數存放在 Flash 的扇區號 uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void) { enum flash_size_map size_map = system_get_flash_size_map(); uint32 rf_cal_sec = 0; switch (size_map) { case FLASH_SIZE_4M_MAP_256_256: rf_cal_sec = 128 - 5; break; case FLASH_SIZE_8M_MAP_512_512: rf_cal_sec = 256 - 5; break; case FLASH_SIZE_16M_MAP_512_512: case FLASH_SIZE_16M_MAP_1024_1024: rf_cal_sec = 512 - 5; break; case FLASH_SIZE_32M_MAP_512_512: case FLASH_SIZE_32M_MAP_1024_1024: rf_cal_sec = 1024 - 5; break; default: rf_cal_sec = 0; break; } return rf_cal_sec; } void ICACHE_FLASH_ATTR user_rf_pre_init(void) { } //長按五秒按鍵回調 LOCAL void ICACHE_FLASH_ATTR keyLongPress(void) { } //短按按鍵回調 LOCAL void ICACHE_FLASH_ATTR keyShortPress(void) { os_printf("----------2 開始進去SmartConfig配網模式\n\n\n-----"); smartconfig_set_type(SC_TYPE_ESPTOUCH); wifi_set_opmode(STATION_MODE); smartconfig_start(smartconfig_done); } //按鍵初始化 LOCAL void ICACHE_FLASH_ATTR keyInit(void) { singleKey[0] = keyInitOne(KEY_0_IO_NUM, KEY_0_IO_MUX, KEY_0_IO_FUNC, keyLongPress, keyShortPress); keys.singleKey = singleKey; keyParaInit(&keys); } void ICACHE_FLASH_ATTR user_init(void) { uart_init(BIT_RATE_115200, BIT_RATE_115200); os_printf("SDK version:%s\n", system_get_sdk_version()); os_printf("----------BIT_RATE_115200\n\n\n-----"); keyInit(); }
附加:相關調試工具下載。
適配安卓7.0的中文版調試一鍵配網APK下載: http://download.csdn.net/download/xh870189248/10141647
本博文的8266代碼demo下載:http://download.csdn.net/download/xh870189248/10141671
8266教程系列的代碼匯總:https://github.com/xuhongv/StudyInEsp8266
