樂鑫Esp32學習之旅⑥ smartConfig和微信airKiss在esp32的實現,一鍵配網輕鬆快捷連線路由器。(附帶Demo)
阿新 • • 發佈:2019-02-12
本篇博文目錄:
一. 前言;
- 每一款嵌入式的
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);
注意點②:在
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
當作那麼神祕!
切記,使用官方的程式碼是沒有指定配網型別為
airKiss
的,需要我們手動改如下:
esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);
- 最後截圖如下:
五. airKiss
的爬坑記錄,特記在此;
- 在今天2018/5/30為止,最新的程式碼並沒有相容到
airKiss
,可能是由於官方人員疏忽,在程式碼合併時候,少合併了程式碼,導致airKiss
配網不成功!所以,我這切換到分支release/v3.0
,再進行一次編譯即可!希望樂鑫可以修補下這個bug!!
六. 下載;
- 如果您沒有關注帶
airKiss
的公眾號,可以掃描下面二維碼下載安卓版的APK,僅作除錯用!注意這個是airKiss
協議!
- 這個是我自己製作的
smartConfig
的安卓APK!注意這個是smartConfig
協議!