吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用ESP32的一鍵配網(wǎng)

CHANBAEK ? 來源:編程圈子 ? 作者:編程圈子 ? 2023-03-26 17:15 ? 次閱讀

一、ESP32 配網(wǎng)簡(jiǎn)介

ESP32主要有以下配網(wǎng)方式:

1. SmartConfig

采用組播/廣播方式,將WIFI信息編碼到IEEE802.11底層通訊幀實(shí)現(xiàn)配網(wǎng)。

  • 優(yōu)點(diǎn):易于使用,用戶只需要通過 APP 將配置信息發(fā)送給設(shè)備即可。
  • 缺點(diǎn):需要額外的 APP,有一定的安全風(fēng)險(xiǎn),不支持 WPA3 安全協(xié)議。

2. SoftAp 配網(wǎng)

配網(wǎng)時(shí)將ESP32置于AP熱點(diǎn)模式,手機(jī)連接此熱點(diǎn)建立通訊,把WIFI賬號(hào)和密碼發(fā)給模塊。

3. AirKiss

微信提出的一種配網(wǎng)方式,支持通過微信小程序配網(wǎng)。

4. 藍(lán)牙配網(wǎng)

通過低功耗藍(lán)牙來傳輸WIFI賬號(hào)與密碼實(shí)現(xiàn)配網(wǎng)。

5. 其它配網(wǎng)方式

  • ESP32 Easy ConnectTM(DPP) 配網(wǎng):支持NFC等輔助配網(wǎng);
  • NFC輔助配網(wǎng):需要增加支持NFC的芯片
  • 直接配網(wǎng):通過SPI,UART,I2C,SDIO等接口傳輸配網(wǎng)信息;
  • WPS路由器配網(wǎng);
  • 零配網(wǎng):ZeroConfig,通過一臺(tái)已配網(wǎng)設(shè)備給另一臺(tái)設(shè)備配網(wǎng);
  • 手機(jī)AP配網(wǎng):手機(jī)啟動(dòng)AP熱點(diǎn),讓模塊連接此熱點(diǎn)實(shí)現(xiàn)配網(wǎng)。

二、使用ESP32的一鍵配網(wǎng)

ESP32的example有完整的SmartConfig demo,可以直接創(chuàng)建項(xiàng)目使用。

1. 流程分析

配網(wǎng)主要執(zhí)行以下流程:

(1)初始化網(wǎng)絡(luò)接口并為應(yīng)用程序創(chuàng)建事件組。

ESP_ERROR_CHECK(esp_netif_init());
    s_wifi_event_group = xEventGroupCreate();
    ESP_ERROR_CHECK(esp_event_loop_create_default());

(2)注冊(cè)事件處理函數(shù)

為 WIFI_EVENT、IP_EVENT 和 SC_EVENT 注冊(cè)事件處理函數(shù)。

ESP_ERROR_CHECK( esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL) );
    ESP_ERROR_CHECK( esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL) );
    ESP_ERROR_CHECK( esp_event_handler_register(SC_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL) );

(3)啟動(dòng) WiFi 站點(diǎn)模式

設(shè)置站點(diǎn)模式的事件處理函數(shù)。

(4)創(chuàng)建 smartconfig 任務(wù)

當(dāng)使用STA模式時(shí),連接到WiFi網(wǎng)絡(luò)時(shí)觸發(fā)事件 WIFI_EVENT_STA_START ,這時(shí)創(chuàng)建一個(gè)名為“smartconfig_example_task”的新任務(wù)。

(5)查找到信道事件

當(dāng) SC_EVENT_FOUND_CHANNEL 事件被觸發(fā)時(shí),表示 smartconfig 已經(jīng)找到一個(gè)信道。一鍵配網(wǎng)一般通過先找到信道、再通訊的方式以提高配網(wǎng)效率 。

(6)獲取到SSID和密碼事件

當(dāng) SC_EVENT_GOT_SSID_PSWD 事件被觸發(fā)時(shí),就可以從事件數(shù)據(jù)中獲取 SSID 和密碼,配置 WiFi 接口并連接到 AP。

這時(shí)要記錄 SSID 和密碼,如果 smartconfig 類型為 ESPTOUCH_V2,則獲取 RVD_DATA 并記錄它。

(7)記錄WIFI已經(jīng)連接

在“smartconfig_example_task”函數(shù)中,將 smartconfig 類型設(shè)置為 SC_TYPE_ESPTOUCH,啟動(dòng) smartconfig,并等待事件組中的 CONNECTED_BIT 和 ESPTOUCH_DONE_BIT。

如果兩個(gè)位都設(shè)置了,則記錄一條消息,指示 WiFi 已連接并且 smartconfig 已結(jié)束。停止 smartconfig 并刪除任務(wù)。

(8)調(diào)用

在 app_main 函數(shù)中初始化 NVS 閃存并調(diào)用 initialize_wifi 函數(shù)。

2. 源碼

/* Esptouch example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/

#include 
#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_wpa2.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_netif.h"
#include "esp_smartconfig.h"

/* FreeRTOS event group to signal when we are connected & ready to make a request */
static EventGroupHandle_t s_wifi_event_group;

/* The event group allows multiple bits for each event,
   but we only care about one event - are we connected
   to the AP with an IP? */
static const int CONNECTED_BIT = BIT0;
static const int ESPTOUCH_DONE_BIT = BIT1;
static const char *TAG = "smartconfig_example";

static void smartconfig_example_task(void * parm);

static void event_handler(void* arg, esp_event_base_t event_base,
                                int32_t event_id, void* event_data)
{
    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
        xTaskCreate(smartconfig_example_task, "smartconfig_example_task", 4096, NULL, 3, NULL);
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
        esp_wifi_connect();
        xEventGroupClearBits(s_wifi_event_group, CONNECTED_BIT);
    } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
        xEventGroupSetBits(s_wifi_event_group, CONNECTED_BIT);
    } else if (event_base == SC_EVENT && event_id == SC_EVENT_SCAN_DONE) {
        ESP_LOGI(TAG, "Scan done");
    } else if (event_base == SC_EVENT && event_id == SC_EVENT_FOUND_CHANNEL) {
        ESP_LOGI(TAG, "Found channel");
    } else if (event_base == SC_EVENT && event_id == SC_EVENT_GOT_SSID_PSWD) {
        ESP_LOGI(TAG, "Got SSID and password");

        smartconfig_event_got_ssid_pswd_t *evt = (smartconfig_event_got_ssid_pswd_t *)event_data;
        wifi_config_t wifi_config;
        uint8_t ssid[33] = { 0 };
        uint8_t password[65] = { 0 };
        uint8_t rvd_data[33] = { 0 };

        bzero(&wifi_config, sizeof(wifi_config_t));
        memcpy(wifi_config.sta.ssid, evt->ssid, sizeof(wifi_config.sta.ssid));
        memcpy(wifi_config.sta.password, evt->password, sizeof(wifi_config.sta.password));
        wifi_config.sta.bssid_set = evt->bssid_set;
        if (wifi_config.sta.bssid_set == true) {
            memcpy(wifi_config.sta.bssid, evt->bssid, sizeof(wifi_config.sta.bssid));
        }

        memcpy(ssid, evt->ssid, sizeof(evt->ssid));
        memcpy(password, evt->password, sizeof(evt->password));
        ESP_LOGI(TAG, "SSID:%s", ssid);
        ESP_LOGI(TAG, "PASSWORD:%s", password);
        if (evt->type == SC_TYPE_ESPTOUCH_V2) {
            ESP_ERROR_CHECK( esp_smartconfig_get_rvd_data(rvd_data, sizeof(rvd_data)) );
            ESP_LOGI(TAG, "RVD_DATA:");
            for (int i=0; i<33; i++) {
                printf("%02x ", rvd_data[i]);
            }
            printf("\\n");
        }

        ESP_ERROR_CHECK( esp_wifi_disconnect() );
        ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
        esp_wifi_connect();
    } else if (event_base == SC_EVENT && event_id == SC_EVENT_SEND_ACK_DONE) {
        xEventGroupSetBits(s_wifi_event_group, ESPTOUCH_DONE_BIT);
    }
}

static void initialise_wifi(void)
{
    ESP_ERROR_CHECK(esp_netif_init());
    s_wifi_event_group = xEventGroupCreate();
    ESP_ERROR_CHECK(esp_event_loop_create_default());
    esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();
    assert(sta_netif);

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK( esp_wifi_init(&cfg) );

    ESP_ERROR_CHECK( esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL) );
    ESP_ERROR_CHECK( esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL) );
    ESP_ERROR_CHECK( esp_event_handler_register(SC_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL) );

    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
    ESP_ERROR_CHECK( esp_wifi_start() );
}

static void smartconfig_example_task(void * parm)
{
    EventBits_t uxBits;
    ESP_ERROR_CHECK( esp_smartconfig_set_type(SC_TYPE_ESPTOUCH) );
    smartconfig_start_config_t cfg = SMARTCONFIG_START_CONFIG_DEFAULT();
    ESP_ERROR_CHECK( esp_smartconfig_start(&cfg) );
    while (1) {
        uxBits = xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT | ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY);
        if(uxBits & CONNECTED_BIT) {
            ESP_LOGI(TAG, "WiFi Connected to ap");
        }
        if(uxBits & ESPTOUCH_DONE_BIT) {
            ESP_LOGI(TAG, "smartconfig over");
            esp_smartconfig_stop();
            vTaskDelete(NULL);
        }
    }
}

void app_main(void)
{
    ESP_ERROR_CHECK( nvs_flash_init() );
    initialise_wifi();
}

3. 執(zhí)行效果

三、安卓端

1. ESP32提供的測(cè)試APP

2. 使用SDK

從官方找到下載地址:

https://www.espressif.com.cn/zh-hans/support/download/apps

下載 aar文件集成到自己項(xiàng)目中使用,主要是以下幾步:

(1)添加Smart Config SDK庫

設(shè)置build.gradle

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

添加引用,esptouch:

implementation 'com.github.EspressifApp:lib-esptouch-android:1.1.1'

或 esptouch-v2

implementation 'com.github.EspressifApp:lib-esptouch-v2-android:2.2.1'

(2)添加權(quán)限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

(3)API

EspTouch v1

// 創(chuàng)建任務(wù)實(shí)例
Context context; // Set Applicatioin context
byte[] apSsid = {}; // Set AP's SSID
byte[] apBssid = {}; // Set AP's BSSID
byte[] apPassword = {}; // Set AP's password

EsptouchTask task = new EsptouchTask(apSsid, apBssid, apPassword, context);
task.setPackageBroadcast(true); // if true send broadcast packets, else send multicast packets
// 設(shè)置回調(diào)
task.setEsptouchListener(new IEsptouchListener() {
    @Override
    public void onEsptouchResultAdded(IEsptouchResult result) {
        // Result callback
    }
});
// 執(zhí)行任務(wù)
int expectResultCount = 1;
List

ESP touch v2

// 創(chuàng)建實(shí)例
Context context; // Set Application Context
EspProvisioner provisioner = new EspProvisioner(context);
// 設(shè)置監(jiān)聽 
EspSyncListener listener = new EspSyncListener() {
    @Override
    public void onStart() {
    }

    @Override
    public void onStop() {
    }

    @Override
    public void onError(Exception e) {
    }
};
// 發(fā)同步包
provisioner.startSync(listener); // listener is nullable

// 停止同步包
provisioner.stopSync();

// 開始
Context context; // Set Application Context
EspProvisioningRequest request = new EspProvisioningRequest.Builder(context)
                .setSSID(ssid) // AP's SSID, nullable
                .setBSSID(bssid) // AP's BSSID, nonnull
                .setPassword(password) // AP's password, nullable if the AP is open
                .setReservedData(customData) // User's custom data, nullable. If not null, the max length is 64
                .setAESKey(aesKey) // nullable, if not null, it must be 16 bytes. App developer should negotiate an AES key with Device developer first.
                .build();
EspProvisioningListener listener = new EspProvisioningListener() {
    @Override
    public void onStart() {
    }

    @Override
    public void onResponse(EspProvisionResult result) {
        // Result callback
    }

    @Override
    public void onStop() {
    }

    @Override
    public void onError(Exception e) {
    }
};
provisioner.startProvisioning(request, listener); // request is nonnull, listener is nullable

// 停止配網(wǎng)
provisioner.stopProvisioning();
// 關(guān)閉配網(wǎng)
provisioner.close()
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 藍(lán)牙
    +關(guān)注

    關(guān)注

    114

    文章

    5869

    瀏覽量

    171228
  • nfc
    nfc
    +關(guān)注

    關(guān)注

    59

    文章

    1632

    瀏覽量

    180971
  • WIFI
    +關(guān)注

    關(guān)注

    81

    文章

    5309

    瀏覽量

    204798
  • 配網(wǎng)
    +關(guān)注

    關(guān)注

    0

    文章

    155

    瀏覽量

    9108
  • ESP32
    +關(guān)注

    關(guān)注

    18

    文章

    978

    瀏覽量

    17531
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32+ESP8266連接騰訊IOT微信小程序一鍵網(wǎng)

    次我以智能鎖為產(chǎn)品模型,在騰訊物聯(lián)網(wǎng)平臺(tái)創(chuàng)建個(gè)設(shè)備,使用STM32F103系統(tǒng)板+ESP8266+LED燈完成智能鎖產(chǎn)品的模擬開發(fā);用戶設(shè)備端可以按下指定的按鍵進(jìn)入網(wǎng)模式,打開騰訊
    的頭像 發(fā)表于 03-18 09:20 ?1.4w次閱讀
    STM32+<b class='flag-5'>ESP</b>8266連接騰訊IOT微信小程序<b class='flag-5'>一鍵</b><b class='flag-5'>配</b><b class='flag-5'>網(wǎng)</b>

    ESP32C3 wifi網(wǎng)失敗的原因?

    1, 采用官方提供的at固件,固件版本V2.4.2; 2,發(fā)送AT+CWSTARTSMART進(jìn)入WiFi網(wǎng),啟動(dòng)app網(wǎng); 問題:在2.4G和5G雙頻路由器下,部分路由器不能Wi
    發(fā)表于 06-26 06:00

    esp8266網(wǎng)不能連接NETGEAR-WNDR3400v3路由器怎么解決?

    請(qǐng)問,esp8266不能使用一鍵網(wǎng) airkiss 連接NETGEAR-WNDR3400v3路由器,怎么解決?地點(diǎn)美國,已經(jīng)試了5天,上百次了,
    發(fā)表于 07-09 06:33

    RT-Thread的網(wǎng)助手小程序是否能用于esp32

    在論壇上看到rt-thread有個(gè)網(wǎng)助手的小程序,最近產(chǎn)品要上esp32這個(gè)模塊涉及到網(wǎng)這個(gè)問題? 情況
    發(fā)表于 08-16 11:31

    請(qǐng)問ESP32-C3是否支持matter協(xié)議了? 可以通過softap方式網(wǎng)嗎?

    ESP32-C3是否支持matter協(xié)議了? 可以通過softap方式網(wǎng)嗎?
    發(fā)表于 02-10 06:22

    ESP32-C3是否支持matter協(xié)議? 可以通過softap方式網(wǎng)嗎?

    ESP32-C3是否支持matter協(xié)議了? 可以通過softap方式網(wǎng)嗎?
    發(fā)表于 03-03 08:12

    請(qǐng)問ESP32 wifi網(wǎng)多頻合找不到設(shè)備是何原因?

    請(qǐng)問ESP32 wifi網(wǎng)多頻合找不到設(shè)備是何原因?
    發(fā)表于 03-03 06:45

    請(qǐng)問ESP32-C3是否支持matter協(xié)議了? 可以通過softap方式網(wǎng)嗎?

    ESP32-C3是否支持matter協(xié)議了? 可以通過softap方式網(wǎng)嗎?
    發(fā)表于 03-08 08:18

    ESP8266一鍵燒寫軟件下載

    ESP8266一鍵燒寫軟件下載
    發(fā)表于 11-22 17:00 ?31次下載

    ESP32模組的主要特性

    WT-ESP32-DevKitC V4是款基于ESP32的小型開發(fā)板,集WIFI+藍(lán)牙方案于體,板上模組絕大部分管腳均已引出,開發(fā)人員可根據(jù)實(shí)際需求,輕松通過跳線連接多種外圍器件,
    發(fā)表于 11-04 14:54 ?4140次閱讀

    ESP32音頻開發(fā)板可實(shí)現(xiàn)Wi-Fi一鍵網(wǎng)

    音頻設(shè)備,成為率先爆發(fā)的智能平臺(tái)入口。視頻內(nèi)容風(fēng)口加速智能音頻AI升級(jí)。 智能語音產(chǎn)品擴(kuò)展了傳統(tǒng)的使用場(chǎng)景,在會(huì)議、演講、采訪、直播場(chǎng)景中,這些功能的實(shí)現(xiàn)的核心,更需要顆專用MCU芯片。 ESP32具備卓越的性能和豐富的外設(shè),集Wi-
    的頭像 發(fā)表于 06-14 17:43 ?1784次閱讀

    ESP32藍(lán)牙網(wǎng)用戶指南

    電子發(fā)燒友網(wǎng)站提供《ESP32藍(lán)牙網(wǎng)用戶指南.pdf》資料免費(fèi)下載
    發(fā)表于 09-23 10:34 ?5次下載
    <b class='flag-5'>ESP32</b>藍(lán)牙<b class='flag-5'>配</b><b class='flag-5'>網(wǎng)</b>用戶指南

    鯤泓智能一鍵網(wǎng)小程序正式上線 用戶體驗(yàn)再升級(jí)

    為了滿足用戶的極致體驗(yàn),提升產(chǎn)品的服務(wù)質(zhì)量,鯤泓智能開發(fā)上線了一鍵網(wǎng)微信小程序,并于近日發(fā)布運(yùn)行。 小程序以其輕量化、便捷性等優(yōu)勢(shì)特點(diǎn),成為智慧家居、智慧康養(yǎng)領(lǐng)域與用戶交互的核心應(yīng)用載體。作為
    發(fā)表于 02-22 10:53 ?303次閱讀

    啟明云端分享|ESP32-S3 Smartconfig一鍵網(wǎng)教程

    啟明云端作為樂鑫代理,直都盡最大可能做完善的教程能幫助更多的開發(fā)小伙伴快速上手各種應(yīng)用;今天小明為大家?guī)?b class='flag-5'>ESP32-S3,Smartconfig一鍵
    的頭像 發(fā)表于 09-16 10:57 ?6641次閱讀
    啟明云端分享|<b class='flag-5'>ESP32</b>-S3 Smartconfig<b class='flag-5'>一鍵</b><b class='flag-5'>配</b><b class='flag-5'>網(wǎng)</b>教程

    樂鑫ESP32_藍(lán)牙網(wǎng)用戶指南

    樂鑫ESP32_藍(lán)牙網(wǎng)用戶指南ESP32將天線開關(guān)、RFbalun、功率放大器、接收低噪聲放大器、濾波器、電源管理模塊等功能集于體。
    發(fā)表于 10-19 16:13 ?10次下載
    必博网址| 大发888bet娱乐城| 最新百家乐官网的玩法技巧和规则 | 百家乐官网五种路单规| 万利娱乐城开户| 百家乐职业赌徒的解密| 三公百家乐官网在线哪里可以玩| 现金游戏平台| 百家乐社区| 百家乐正确的打法| 百家乐官网投注心得和技巧| bet365注册 jxhymp| 波胆网站| 皇马百家乐的玩法技巧和规则| 线上百家乐官网平玩法| 百家乐官网投注限额| 香港六合彩开奖历史记录| 帝王百家乐的玩法技巧和规则| 呼图壁县| 裕昌太阳城户型图| 波浪百家乐测试| 游艇会百家乐官网的玩法技巧和规则 | 网络投注| 至尊百家乐20| 百家乐平台出租家乐平台出租| 百家乐官网游戏厅| 百家乐官网节目视频| 大发888下注| 博九百家乐的玩法技巧和规则 | 大地百家乐官网的玩法技巧和规则| 游戏厅百家乐官网技巧| 澳门皇冠娱乐城| 威尼斯人娱乐城信誉好吗| 百家乐等投注网改单| 百家乐官网国际赌场娱乐网规则 | 百家乐官网娱乐城地址| 韦德娱乐| 大发888真人网| 免费百家乐倍投工具| 百家乐电投网站| 百家乐洗码全讯网|