Esp8266學習之旅⑥ 了解SmartConfig與Airkiss一鍵配網,給8266一鍵配網上雲端。(帶Demo)



一、前言


聽到 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

版權聲明:本文為博主半顆心臟一心一血敲出來的原創作品,未經博主允許不得轉載,多謝支持。 https://blog.csdn.net/xh870189248/article/details/78677952
個人分類: 8266
所屬專欄: 樂鑫esp8266學習之旅


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM