一、簡(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流程
將 ESP32 設(shè)置為 GATT Server 模式,然后它將發(fā)送帶有特定廣告數(shù)據(jù)的廣播。您可以根據(jù)需要自定義此廣播,這不是 BluFi 配置文件的一部分。
使用安裝在手機(jī)上的應(yīng)用程序搜索此特定廣播。確認(rèn)廣播后,手機(jī)將作為 GATT Client 連接到 ESP32。這部分使用的應(yīng)用程序由您決定。
GATT連接建立成功后,手機(jī)會(huì)向ESP32發(fā)送密鑰協(xié)商的數(shù)據(jù)幀(詳見(jiàn)BluFi中定義的幀格式部分)。
ESP32 收到密鑰協(xié)商的數(shù)據(jù)幀后,會(huì)根據(jù)用戶自定義的協(xié)商方式解析內(nèi)容。
手機(jī)配合ESP32使用DH、RSA或ECC等加密算法進(jìn)行密鑰協(xié)商。
協(xié)商完成后,手機(jī)會(huì)向ESP32發(fā)送安全模式設(shè)置的控制幀。
ESP32 收到此控制幀后,將能夠使用共享密鑰和安全配置對(duì)通信數(shù)據(jù)進(jìn)行加密和解密。
手機(jī)將BluFi中定義的幀格式部分定義的數(shù)據(jù)幀連同Wi-Fi配置信息發(fā)送到ESP32,包括SSID、密碼等。
手機(jī)向ESP32發(fā)送Wi-Fi連接請(qǐng)求的控制幀。ESP32 收到此控制幀后,會(huì)認(rèn)為基本信息的通信已完成,并準(zhǔn)備連接到 Wi-Fi。
連接到 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;
上一篇:ESP32學(xué)習(xí)筆記(37)——搭建ESP-ADF(樂(lè)鑫音頻開(kāi)發(fā)框架)
下一篇:ESP32學(xué)習(xí)筆記(35)——藍(lán)牙MAC地址
- 熱門資源推薦
- 熱門放大器推薦
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫(kù)的一些基本介紹
- arduino esp8266開(kāi)發(fā)板
- 【航順訓(xùn)練營(yíng)】基于航順HKF030的學(xué)習(xí)板設(shè)計(jì)
- DC1299A-B,用于 LTC6421CUD-20 雙路匹配 1.3GHz 差分放大器/ADC 驅(qū)動(dòng)器的演示板
- NCV7429V1GEVB:NCV7429 系統(tǒng)基礎(chǔ)芯片評(píng)估板
- 使用 Analog Devices 的 LT1184FCS 的參考設(shè)計(jì)
- NCV78M09BDTRKG 9V可調(diào)輸出穩(wěn)壓器的典型應(yīng)用
- 【吉醫(yī)iCAN大賽】燈光品質(zhì)檢測(cè)
- AM6TW-2407DH35Z ±7.2V 6 瓦單輸出 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- 555_BJT-1811571124
- RDR-648 - 使用 HiperPFS-4 和 HiperLCS 的 150 W 功率因數(shù)校正 LLC 電源
- 做大做優(yōu)做強(qiáng)科技產(chǎn)業(yè)鏈,海光信息、中科曙光公布重組預(yù)案
- 比亞迪攜手阿里云,智能座艙實(shí)現(xiàn)語(yǔ)音控制在線服務(wù)
- “眾鈉能源發(fā)布元鈉輕擎電池,鋰鈉融合技術(shù)明年上市”
- 從毫米波到UWB:加特蘭雙技術(shù)引擎驅(qū)動(dòng)汽車感知通信革命
- 福特汽車申請(qǐng)新專利 或?qū)⑴鋫洳降佬腥藱z測(cè)預(yù)警系統(tǒng)
- 伊迪斯科文大學(xué)開(kāi)發(fā)新系統(tǒng) 提升機(jī)器對(duì)人類面部表情的識(shí)別能力
- 全液晶儀表與HUD等逐漸滲透20萬(wàn)以內(nèi)市場(chǎng)
- 受大腦啟發(fā) 韓國(guó)研究團(tuán)隊(duì)開(kāi)發(fā)出新型視覺(jué)傳感器
- 沃爾沃汽車推出全球首款多功能自適應(yīng)安全帶
- 休斯頓大學(xué)研究人員取得新發(fā)現(xiàn) 鎂可提高固態(tài)電池的安全性和壽命