樂鑫Esp32學習之旅⑥ smartConfig和微信airKiss在esp32的實現,一鍵配網輕松快捷連接路由器。(附帶Demo)



一. 前言;


  • 每一款嵌入式的WI-Fi芯片,配網功能都是必不可少的。樂鑫有smartConfig,在esp32上也不例外,但是官方已經提到支持了airKiss,但是例程中是沒有提供的,信中回到並不是很詳細。既然樂鑫主打esp32那么肯定是支持airKiss的,這篇帶大家進坑到出坑走走官方的smartConfigairkissesp32的實現!

二. 編譯官方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_STARTSYSTEM_EVENT_STA_GOT_IPSYSTEM_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),支持smartConfigairKiss就可以了,下圖是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

版權聲明:本文為博主半顆心臟一心一血敲出來的原創作品,未經博主允許不得轉載,多謝支持。 https://blog.csdn.net/xh870189248/article/details/80430077


免責聲明!

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



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