娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

ESP32學(xué)習(xí)筆記(36)——BluFi(藍(lán)牙配網(wǎng))接口使用

發(fā)布者:RadiantGaze最新更新時(shí)間:2025-02-27 來(lái)源: jianshu關(guān)鍵字:ESP32 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

一、簡(jiǎn)介

ESP32 的 BluFi 是通過(guò)藍(lán)牙通道的 Wi-Fi 網(wǎng)絡(luò)配置功能。它提供了一個(gè)安全協(xié)議來(lái)將 Wi-Fi 配置和憑據(jù)傳遞給 ESP32。使用這些信息,ESP32 可以連接到一個(gè) AP 或建立一個(gè) SoftAP。

BluFi 層中的分片、數(shù)據(jù)加密、校驗(yàn)和驗(yàn)證是此過(guò)程的關(guān)鍵要素。

您可以自定義對(duì)稱加密、非對(duì)稱加密和校驗(yàn)和支持自定義。這里我們使用DH算法進(jìn)行密鑰協(xié)商,128-AES算法進(jìn)行數(shù)據(jù)加密,CRC16算法進(jìn)行校驗(yàn)和驗(yàn)證。


二、BluFi流程

  1. 將 ESP32 設(shè)置為 GATT Server 模式,然后它將發(fā)送帶有特定廣告數(shù)據(jù)的廣播。您可以根據(jù)需要自定義此廣播,這不是 BluFi 配置文件的一部分。

  2. 使用安裝在手機(jī)上的應(yīng)用程序搜索此特定廣播。確認(rèn)廣播后,手機(jī)將作為 GATT Client 連接到 ESP32。這部分使用的應(yīng)用程序由您決定。

  3. GATT連接建立成功后,手機(jī)會(huì)向ESP32發(fā)送密鑰協(xié)商的數(shù)據(jù)幀(詳見(jiàn)BluFi中定義的幀格式部分)。

  4. ESP32 收到密鑰協(xié)商的數(shù)據(jù)幀后,會(huì)根據(jù)用戶自定義的協(xié)商方式解析內(nèi)容。

  5. 手機(jī)配合ESP32使用DH、RSA或ECC等加密算法進(jìn)行密鑰協(xié)商。

  6. 協(xié)商完成后,手機(jī)會(huì)向ESP32發(fā)送安全模式設(shè)置的控制幀。

  7. ESP32 收到此控制幀后,將能夠使用共享密鑰和安全配置對(duì)通信數(shù)據(jù)進(jìn)行加密和解密。

  8. 手機(jī)將BluFi中定義的幀格式部分定義的數(shù)據(jù)幀連同Wi-Fi配置信息發(fā)送到ESP32,包括SSID、密碼等。

  9. 手機(jī)向ESP32發(fā)送Wi-Fi連接請(qǐng)求的控制幀。ESP32 收到此控制幀后,會(huì)認(rèn)為基本信息的通信已完成,并準(zhǔn)備連接到 Wi-Fi。

  10. 連接到 Wi-Fi 后,ESP32 會(huì)向手機(jī)發(fā)送 Wi-Fi 連接狀態(tài)報(bào)告控制幀,以報(bào)告連接狀態(tài)。至此,組網(wǎng)過(guò)程完成。

注意:

  • ESP32 收到安全模式配置的控制幀后,會(huì)按照定義的安全模式執(zhí)行操作。

  • 對(duì)稱加密/解密前后的數(shù)據(jù)長(zhǎng)度必須保持不變。它還支持就地加密和解密。

三、API說(shuō)明

以下 BluFi 接口位于 bt/common/api/include/api/esp_blufi_api.h

3.1 esp_blufi_register_callbacks

3.2 esp_blufi_profile_init

3.3 esp_blufi_send_wifi_conn_report

3.4 esp_blufi_send_wifi_list

3.5 esp_blufi_send_error_info

3.6 esp_blufi_send_custom_data

四、程序結(jié)構(gòu)

使用 esp-idfexamplesbluetoothbluedroidbleblufi 中的例程


4.1 四個(gè)事件處理

4.1.1 WIFI部分事件處理

主要負(fù)責(zé)WIFI的連接、斷開(kāi)重連、掃描


static void wifi_event_handler(void* arg, esp_event_base_t event_base,

                                int32_t event_id, void* event_data){

    wifi_event_sta_connected_t *event;

    wifi_mode_t mode;


    switch (event_id) {

    case WIFI_EVENT_STA_START:

        esp_wifi_connect();

        break;

    case WIFI_EVENT_STA_CONNECTED:

        gl_sta_connected = true;

        event = (wifi_event_sta_connected_t*) event_data;

        memcpy(gl_sta_bssid, event->bssid, 6);

        memcpy(gl_sta_ssid, event->ssid, event->ssid_len);

        gl_sta_ssid_len = event->ssid_len;

        break; 

    case WIFI_EVENT_STA_DISCONNECTED:

        /* This is a workaround as ESP32 WiFi libs don't currently

           auto-reassociate. */

        gl_sta_connected = false;

        memset(gl_sta_ssid, 0, 32);

        memset(gl_sta_bssid, 0, 6);

        gl_sta_ssid_len = 0;

        esp_wifi_connect();

        xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);

        break;

    case WIFI_EVENT_AP_START:

        esp_wifi_get_mode(&mode);


        /* TODO: get config or information of softap, then set to report extra_info */

        if (ble_is_connected == true) {

            if (gl_sta_connected) {  

                esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_SUCCESS, 0, NULL);

            } else {

                esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_FAIL, 0, NULL);

            }

        } else {

            BLUFI_INFO('BLUFI BLE is not connected yetn');

        }

        break;

    case WIFI_EVENT_SCAN_DONE: {

        uint16_t apCount = 0;

        esp_wifi_scan_get_ap_num(&apCount);

        if (apCount == 0) {

            BLUFI_INFO('Nothing AP found');

            break;

        }

        wifi_ap_record_t *ap_list = (wifi_ap_record_t *)malloc(sizeof(wifi_ap_record_t) * apCount);

        if (!ap_list) {

            BLUFI_ERROR('malloc error, ap_list is NULL');

            break;

        }

        ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&apCount, ap_list));

        esp_blufi_ap_record_t * blufi_ap_list = (esp_blufi_ap_record_t *)malloc(apCount * sizeof(esp_blufi_ap_record_t));

        if (!blufi_ap_list) {

            if (ap_list) {

                free(ap_list);

            }

            BLUFI_ERROR('malloc error, blufi_ap_list is NULL');

            break;

        }

        for (int i = 0; i < apCount; ++i)

        {

            blufi_ap_list[i].rssi = ap_list[i].rssi;

            memcpy(blufi_ap_list[i].ssid, ap_list[i].ssid, sizeof(ap_list[i].ssid));

        }

        

        if (ble_is_connected == true) {

            esp_blufi_send_wifi_list(apCount, blufi_ap_list);

        } else {

            BLUFI_INFO('BLUFI BLE is not connected yetn');

        }


        esp_wifi_scan_stop();

        free(ap_list);

        free(blufi_ap_list);

        break;

    }

    default:

        break;

    }

    return;}

4.1.2 NETIF部分事件處理

獲取網(wǎng)絡(luò)IP地址,完成IP接口搭建(默認(rèn)IO口);

更多netif功能介紹與使用參考鏈接:ESP-NETIF


static void ip_event_handler(void* arg, esp_event_base_t event_base,

                                int32_t event_id, void* event_data){

    wifi_mode_t mode;


    switch (event_id) {

    case IP_EVENT_STA_GOT_IP: {

        esp_blufi_extra_info_t info;


        xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);

        esp_wifi_get_mode(&mode);


        memset(&info, 0, sizeof(esp_blufi_extra_info_t));

        memcpy(info.sta_bssid, gl_sta_bssid, 6);

        info.sta_bssid_set = true;

        info.sta_ssid = gl_sta_ssid;

        info.sta_ssid_len = gl_sta_ssid_len;

        if (ble_is_connected == true) {

            esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_SUCCESS, 0, &info);

        } else {

            BLUFI_INFO('BLUFI BLE is not connected yetn');

        }

        break;

    }

    default:

        break;

    }

    return;}

4.1.3 BLUFI配網(wǎng)部分事件處理

此過(guò)程事件的處理均按照收到的請(qǐng)求作相應(yīng)的功能處理,可按照個(gè)人需求進(jìn)行修改


ESP_BLUFI_EVENT_INIT_FINISH:完成blufi功能初始化,設(shè)置設(shè)備名稱(Device Name) 并發(fā)送特定的 adv data 廣播;


ESP_BLUFI_EVENT_DEINIT_FINISH:處理deinit配置事件;


ESP_BLUFI_EVENT_BLE_CONNECT:連接Blufi Ble,并設(shè)備進(jìn)入安全模式;


ESP_BLUFI_EVENT_BLE_DISCONNECT:設(shè)置ble斷開(kāi)重連;


ESP_BLUFI_EVENT_SET_WIFI_OPMODE:設(shè)置WiFi進(jìn)入運(yùn)行模式——op_mode;


ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP:設(shè)置斷開(kāi)原有的WiFi連接,并連接指定WiFi;


ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP:斷開(kāi)當(dāng)前WiIFi連接到的AP;


ESP_BLUFI_EVENT_REPORT_ERROR:上報(bào)錯(cuò)誤信息;


ESP_BLUFI_EVENT_GET_WIFI_STATUS:獲取WiFi狀態(tài)信息,包括:WiFi當(dāng)前模式、以及是否連接成功;


ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE:關(guān)閉blufi的gatt服務(wù)連接;


ESP_BLUFI_EVENT_RECV_STA_BSSID:設(shè)置進(jìn)入STA模式,獲取目標(biāo)AP的bssid;


ESP_BLUFI_EVENT_RECV_STA_SSID:設(shè)置進(jìn)入STA模式,獲取目標(biāo)AP的WiFi賬號(hào);


ESP_BLUFI_EVENT_RECV_STA_PASSWD:設(shè)置進(jìn)入STA模式,獲取目標(biāo)AP的WiFi密碼;


ESP_BLUFI_EVENT_RECV_SOFTAP_SSID:設(shè)置進(jìn)入Soft AP模式,獲取AP自定義賬號(hào);


ESP_BLUFI_EVENT_RECV_SOFTAP_PASSWD:設(shè)置進(jìn)入Soft AP模式,獲取AP自定義密碼;


ESP_BLUFI_EVENT_RECV_SOFTAP_MAX_CONN_NUM:設(shè)置Soft AP模式下最大可連接設(shè)備數(shù)量;


ESP_BLUFI_EVENT_RECV_SOFTAP_AUTH_MODE:設(shè)置Soft AP模式下進(jìn)入認(rèn)證模式;


ESP_BLUFI_EVENT_RECV_SOFTAP_CHANNEL:設(shè)置Soft AP模式下的通訊通道;


ESP_BLUFI_EVENT_GET_WIFI_LIST:獲取掃描到的空中WiFi賬號(hào)、通信通道以及站點(diǎn)MAC地址


ESP_BLUFI_EVENT_RECV_CUSTOM_DATA:將接收到的數(shù)據(jù)打印出來(lái);


static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param){

    /* actually, should post to blufi_task handle the procedure,

     * now, as a example, we do it more simply */

    switch (event) {

    case ESP_BLUFI_EVENT_INIT_FINISH:

        BLUFI_INFO('BLUFI init finishn');


        esp_ble_gap_set_device_name(BLUFI_DEVICE_NAME);

        esp_ble_gap_config_adv_data(&example_adv_data);

        break;

    case ESP_BLUFI_EVENT_DEINIT_FINISH:

        BLUFI_INFO('BLUFI deinit finishn');

        break;

    case ESP_BLUFI_EVENT_BLE_CONNECT:

        BLUFI_INFO('BLUFI ble connectn');

        ble_is_connected = true;

        server_if = param->connect.server_if;

        conn_id = param->connect.conn_id;

        esp_ble_gap_stop_advertising();

        blufi_security_init();

        break;

    case ESP_BLUFI_EVENT_BLE_DISCONNECT:

        BLUFI_INFO('BLUFI ble disconnectn');

        ble_is_connected = false;

        blufi_security_deinit();

        esp_ble_gap_start_advertising(&example_adv_params);

        break;

    case ESP_BLUFI_EVENT_SET_WIFI_OPMODE:

        BLUFI_INFO('BLUFI Set WIFI opmode %dn', param->wifi_mode.op_mode);

        ESP_ERROR_CHECK( esp_wifi_set_mode(param->wifi_mode.op_mode) );

        break;

[1] [2] [3]
關(guān)鍵字:ESP32 引用地址:ESP32學(xué)習(xí)筆記(36)——BluFi(藍(lán)牙配網(wǎng))接口使用

上一篇:ESP32學(xué)習(xí)筆記(37)——搭建ESP-ADF(樂(lè)鑫音頻開(kāi)發(fā)框架)
下一篇:ESP32學(xué)習(xí)筆記(35)——藍(lán)牙MAC地址

小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 井冈山市| 乌什县| 龙陵县| 靖远县| 乌审旗| 云安县| 厦门市| 赤水市| 麟游县| 平山县| 襄汾县| 北安市| 霍邱县| 九江市| 伊川县| 永修县| 昌图县| 浮山县| 沙田区| 临漳县| 星座| 海原县| 邢台县| 瑞丽市| 普兰县| 会泽县| 张家界市| 邵东县| 金门县| 牡丹江市| 奈曼旗| 阿克陶县| 贵州省| 沂南县| 阿巴嘎旗| 西乡县| 麻城市| 望奎县| 万山特区| 临邑县| 大厂|