色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用ESP32的一鍵配網

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

一、ESP32 配網簡介

ESP32主要有以下配網方式:

1. SmartConfig

采用組播/廣播方式,將WIFI信息編碼到IEEE802.11底層通訊幀實現配網。

  • 優點:易于使用,用戶只需要通過 APP 將配置信息發送給設備即可。
  • 缺點:需要額外的 APP,有一定的安全風險,不支持 WPA3 安全協議。

2. SoftAp 配網

配網時將ESP32置于AP熱點模式,手機連接此熱點建立通訊,把WIFI賬號和密碼發給模塊。

3. AirKiss

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

4. 藍牙配網

通過低功耗藍牙來傳輸WIFI賬號與密碼實現配網。

5. 其它配網方式

  • ESP32 Easy ConnectTM(DPP) 配網:支持NFC等輔助配網;
  • NFC輔助配網:需要增加支持NFC的芯片
  • 直接配網:通過SPI,UART,I2C,SDIO等接口傳輸配網信息;
  • WPS路由器配網;
  • 零配網:ZeroConfig,通過一臺已配網設備給另一臺設備配網;
  • 手機AP配網:手機啟動AP熱點,讓模塊連接此熱點實現配網。

二、使用ESP32的一鍵配網

ESP32的example有完整的SmartConfig demo,可以直接創建項目使用。

1. 流程分析

配網主要執行以下流程:

(1)初始化網絡接口并為應用程序創建事件組。

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

(2)注冊事件處理函數

為 WIFI_EVENT、IP_EVENT 和 SC_EVENT 注冊事件處理函數。

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)啟動 WiFi 站點模式

設置站點模式的事件處理函數。

(4)創建 smartconfig 任務

當使用STA模式時,連接到WiFi網絡時觸發事件 WIFI_EVENT_STA_START ,這時創建一個名為“smartconfig_example_task”的新任務。

(5)查找到信道事件

當 SC_EVENT_FOUND_CHANNEL 事件被觸發時,表示 smartconfig 已經找到一個信道。一鍵配網一般通過先找到信道、再通訊的方式以提高配網效率 。

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

當 SC_EVENT_GOT_SSID_PSWD 事件被觸發時,就可以從事件數據中獲取 SSID 和密碼,配置 WiFi 接口并連接到 AP。

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

(7)記錄WIFI已經連接

在“smartconfig_example_task”函數中,將 smartconfig 類型設置為 SC_TYPE_ESPTOUCH,啟動 smartconfig,并等待事件組中的 CONNECTED_BIT 和 ESPTOUCH_DONE_BIT。

如果兩個位都設置了,則記錄一條消息,指示 WiFi 已連接并且 smartconfig 已結束。停止 smartconfig 并刪除任務。

(8)調用

在 app_main 函數中初始化 NVS 閃存并調用 initialize_wifi 函數。

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. 執行效果

三、安卓端

1. ESP32提供的測試APP

2. 使用SDK

從官方找到下載地址:

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

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

(1)添加Smart Config SDK庫

設置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)添加權限

<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

// 創建任務實例
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
// 設置回調
task.setEsptouchListener(new IEsptouchListener() {
    @Override
    public void onEsptouchResultAdded(IEsptouchResult result) {
        // Result callback
    }
});
// 執行任務
int expectResultCount = 1;
List

ESP touch v2

// 創建實例
Context context; // Set Application Context
EspProvisioner provisioner = new EspProvisioner(context);
// 設置監聽 
EspSyncListener listener = new EspSyncListener() {
    @Override
    public void onStart() {
    }

    @Override
    public void onStop() {
    }

    @Override
    public void onError(Exception e) {
    }
};
// 發同步包
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

// 停止配網
provisioner.stopProvisioning();
// 關閉配網
provisioner.close()
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 藍牙
    +關注

    關注

    114

    文章

    5809

    瀏覽量

    170188
  • nfc
    nfc
    +關注

    關注

    59

    文章

    1621

    瀏覽量

    180515
  • WIFI
    +關注

    關注

    81

    文章

    5296

    瀏覽量

    203575
  • 配網
    +關注

    關注

    0

    文章

    155

    瀏覽量

    9050
  • ESP32
    +關注

    關注

    18

    文章

    971

    瀏覽量

    17201
收藏 人收藏

    評論

    相關推薦

    STM32+ESP8266連接騰訊IOT微信小程序一鍵

    次我以智能鎖為產品模型,在騰訊物聯網平臺創建個設備,使用STM32F103系統板+ESP8266+LED燈完成智能鎖產品的模擬開發;用戶設備端可以按下指定的按鍵進入模式,打開騰訊
    的頭像 發表于 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'>網</b>

    ESP32C3 wifi失敗的原因?

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

    esp8266不能連接NETGEAR-WNDR3400v3路由器怎么解決?

    請問,esp8266不能使用一鍵 airkiss 連接NETGEAR-WNDR3400v3路由器,怎么解決?地點美國,已經試了5天,上百次了,
    發表于 07-09 06:33

    RT-Thread的助手小程序是否能用于esp32

    在論壇上看到rt-thread有個助手的小程序,最近產品要上esp32這個模塊涉及到這個問題? 情況
    發表于 08-16 11:31

    請問ESP32-C3是否支持matter協議了? 可以通過softap方式嗎?

    ESP32-C3是否支持matter協議了? 可以通過softap方式嗎?
    發表于 02-10 06:22

    ESP32-C3是否支持matter協議? 可以通過softap方式嗎?

    ESP32-C3是否支持matter協議了? 可以通過softap方式嗎?
    發表于 03-03 08:12

    請問ESP32 wifi多頻合找不到設備是何原因?

    請問ESP32 wifi多頻合找不到設備是何原因?
    發表于 03-03 06:45

    請問ESP32-C3是否支持matter協議了? 可以通過softap方式嗎?

    ESP32-C3是否支持matter協議了? 可以通過softap方式嗎?
    發表于 03-08 08:18

    ESP8266一鍵燒寫軟件下載

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

    ESP32模組的主要特性

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

    ESP32音頻開發板可實現Wi-Fi一鍵

    音頻設備,成為率先爆發的智能平臺入口。視頻內容風口加速智能音頻AI升級。 智能語音產品擴展了傳統的使用場景,在會議、演講、采訪、直播場景中,這些功能的實現的核心,更需要顆專用MCU芯片。 ESP32具備卓越的性能和豐富的外設,集Wi-
    的頭像 發表于 06-14 17:43 ?1740次閱讀

    ESP32藍牙用戶指南

    電子發燒友網站提供《ESP32藍牙用戶指南.pdf》資料免費下載
    發表于 09-23 10:34 ?5次下載
    <b class='flag-5'>ESP32</b>藍牙<b class='flag-5'>配</b><b class='flag-5'>網</b>用戶指南

    鯤泓智能一鍵小程序正式上線 用戶體驗再升級

    為了滿足用戶的極致體驗,提升產品的服務質量,鯤泓智能開發上線了一鍵微信小程序,并于近日發布運行。 小程序以其輕量化、便捷性等優勢特點,成為智慧家居、智慧康養領域與用戶交互的核心應用載體。作為
    發表于 02-22 10:53 ?282次閱讀

    啟明云端分享|ESP32-S3 Smartconfig一鍵教程

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

    樂鑫ESP32_藍牙用戶指南

    樂鑫ESP32_藍牙用戶指南ESP32將天線開關、RFbalun、功率放大器、接收低噪聲放大器、濾波器、電源管理模塊等功能集于體。
    發表于 10-19 16:13 ?10次下載
    主站蜘蛛池模板: 夜色资源站国产www在线视频| 偷窥欧美wc经典tv| 欧美日韩午夜群交多人轮换| 青柠高清在线观看完整版| 日本aaaa| 亚洲 欧美 制服 视频二区| 亚洲免费三区| 最新精品学生国产自在现拍| AV97最新无码喷水叫床| 儿子日母亲B好爽| 国产又湿又黄又硬又刺激视频| 久久国产免费观看精品1| 麻豆出品国产AV在线观看| 年轻的老师5理伦片| 日韩欧美一级| 亚洲精品成人A8198A片漫画| 中文字幕人妻无码系列第三区 | 影音先锋av色咪影院| 91蜜桃视频| 高h浪荡文辣文神奇宝贝| 国产亚洲国际精品福利| 久久无码AV亚洲精品色午夜| 青草久久影院| 亚洲国产高清在线观看视频| 最近免费中文字幕MV免费高清| 大香伊人久久精品一区二区| 国产亚洲视频在线播放香蕉| 老师机影院| 四虎永久精品视频在线| 最新国自产拍 高清完整版| 村妇偷人内射高潮迭起| 久久国产精品自线拍免费| 日本老妇一级特黄aa大片| 亚洲一区免费在线观看| beeg xxx日本老师| 好看的电影网站亚洲一区| 欧美午夜精品一区二区蜜桃 | 果冻传媒视频在线播放| 浓毛BWBWBWBWBW日本| 亚洲国产女人aaa毛片在线| A国产一区二区免费入口|