-
本系列博客學習由非官方人員 半顆心臟 潛心所力所寫,僅僅做個人技術交流分享,不做任何商業用途。如有不對之處,請留言,本人及時更改。
一. 前言;
- 每一款嵌入式的
WI-Fi
芯片,配網功能都是必不可少的。樂鑫有smartConfig
,在esp32
上也不例外,但是官方已經提到支持了airKiss
,但是例程中是沒有提供的,信中回到並不是很詳細。既然樂鑫主打esp32
那么肯定是支持airKiss
的,這篇帶大家進坑到出坑走走官方的smartConfig
和airkiss
在esp32
的實現!
二. 編譯官方Demo
;
- 下圖的
smart_config
就是我們今天的主角!
- 一般我都是把這個工程文件隔離開我們的
IDF
倉庫的,因為拉取最新代碼時候,有可能會合並代碼,導致自己寫好的代碼不見了!- 命令符
make menuconfig
配置好SDK
文件,修改下我們要下載的端口號;- 導進我們的
eclipse
編譯器,配置好編譯環境,此步驟見我的前面的博文!
三. smartConfig
代碼分析以及實現;
-
對比
esp8266
的代碼,如果沒有freeRtos
的基礎,這個看不懂的!以個人水平理解如下:
①:
smartConfig
的模式開啟和是否連接AP成功的判斷,完全是異步進行的!
②:代碼運行線是創建一個事件組,管理我們的smartConfig
和獲取系統的IP
回調進行關聯,等待系統初始化完畢后,開始進行smartConfig
模式!
③:之后在smartConfig
的回調事件中發信息給另外一個任務,告訴它已經連接成功!
注意①:在
SC_STATUS_LINK_OVER
的回調下面,對比esp8266
,我們發現多了下行代碼,看見方法名字,字面理解就是向wifi_event_group
這個事件組,發送了ESPTOUCH_DONE_BIT
的消息,以表示通過smartConfig
連接成功了路由器!
xEventGroupSetBits(wifi_event_group, ESPTOUCH_DONE_BIT);
- 1
注意點②:在
esp_event_loop_init()
設置的回調事件,是一個設置輪詢在回調的方法,在其的方法回調中,攔截了三個狀態:SYSTEM_EVENT_STA_START
、SYSTEM_EVENT_STA_GOT_IP
和SYSTEM_EVENT_STA_DISCONNECTED
,后面的系統斷開連接回調,估計只是為了適配這個demo
!實際開發中,不需要攔截這個!
switch (event->event_id) { //系統初始化完成的回調 case SYSTEM_EVENT_STA_START: xTaskCreate(smartconfig_example_task, "smartconfig_example_task", 4096, NULL, 3, NULL); break; //系統獲取到AP分配的IP的回調 case SYSTEM_EVENT_STA_GOT_IP: xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); break; //系統斷開連接回調 case SYSTEM_EVENT_STA_DISCONNECTED: esp_wifi_connect(); xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); break; default: break; }
注意③:配網回調的函數,是樂鑫專門封裝的,和
esp8266
的一樣的,只是在連接成功后,並沒有立刻停止配置,而是通過異步方式通知任務去停止配置!
static void sc_callback(smartconfig_status_t status, void *pdata) { switch (status) { //連接未開始,請勿在此階段開始連接。 case SC_STATUS_WAIT: ESP_LOGI(TAG, "SC_STATUS_WAIT"); break; //發現WIfi信道 case SC_STATUS_FIND_CHANNEL: ESP_LOGI(TAG, "SC_STATUS_FINDING_CHANNEL"); break; //得到wifi名字和密碼 case SC_STATUS_GETTING_SSID_PSWD: ESP_LOGI(TAG, "SC_STATUS_GETTING_SSID_PSWD"); break; //已經獲取wifi名字與密碼在連接路由器 case SC_STATUS_LINK: 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; //成功獲取到IP,連接路由完成。 case SC_STATUS_LINK_OVER: ESP_LOGI(TAG, "SC_STATUS_LINK_OVER"); if (pdata != NULL) { uint8_t phone_ip[4] = { 0 }; memcpy(phone_ip, (uint8_t*) pdata, 4); ESP_LOGI(TAG, "Phone ip: %d.%d.%d.%d\n", phone_ip[0], phone_ip[1], phone_ip[2], phone_ip[3]); } //發送消息到另外一個任務,告訴它已經連接成功 xEventGroupSetBits(wifi_event_group, ESPTOUCH_DONE_BIT); break; default: break; } }
注意點⑤:在外面的主任務里面有個死循環,不斷等待輪詢標志位:
while (1) { uxBits = xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT | ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY); //如果獲取的標志位是成功獲取IP,則表示成功連接到了Wi-Fi if (uxBits & CONNECTED_BIT) { ESP_LOGI(TAG, "WiFi Connected to ap"); } //如果獲取的標志位是一鍵配置的回調表示成功連接到了Wi-Fi,則停止配置 if (uxBits & ESPTOUCH_DONE_BIT) { ESP_LOGI(TAG, "smartconfig over"); esp_smartconfig_stop(); vTaskDelete(NULL); } }
- 注意我們在設置配網方式觸發為:
esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS)
,支持smartConfig
和airKiss
就可以了,下圖是smartConfig
的手機APP
和串口打印數據!
四. airKiss
代碼分析以及實現;
- 說到
airKiss
,我不得不說下我們需要的工具,大家必須要有一個可以支持airKiss
的微信公眾號,樂鑫官方的或者是安信可也可以,這個接口是微信提供的,界面不得讓你修改!或者你使用我在微信下載用的安卓APK
來實驗配網也行的! - 這里貼下微信定義
airKiss
的說明鏈接:http://iot.weixin.qq.com/wiki/new/index.html?page=4-1-2
下圖是我總結的配網圖,大家也沒必要把
airKiss
當作那么神秘!
切記,使用官方的代碼是沒有指定配網類型為
airKiss
的,需要我們手動改如下:
esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);
- 1
- 最后截圖如下:
五. airKiss
的爬坑記錄,特記在此;
- 在今天2018/5/30為止,最新的代碼並沒有兼容到
airKiss
,可能是由於官方人員疏忽,在代碼合並時候,少合並了代碼,導致airKiss
配網不成功!所以,我這切換到分支release/v3.0
,再進行一次編譯即可!希望樂鑫可以修補下這個bug!!
六. 下載;
本硬件的代碼下載:https://download.csdn.net/download/xh870189248/10447731
esp32
匯總工程,歡迎star
,收到第一更新信息:https://github.com/xuhongv/StudyInEsp32