1. 程式人生 > >樂鑫Esp32學習之旅⑥ smartConfig和微信airKiss在esp32的實現,一鍵配網輕鬆快捷連線路由器。(附帶Demo)

樂鑫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);

注意點②:在esp_event_loop_init()設定的回撥事件,是一個設定輪詢在回撥的方法,在其的方法回撥中,攔截了三個狀態:SYSTEM_EVENT_STA_START

SYSTEM_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當作那麼神祕!

這裡寫圖片描述

切記,使用官方的程式碼是沒有指定配網型別為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協議!

這裡寫圖片描述