Skip to content

Commit 288cd9d

Browse files
committed
feat:新增blufi配网协议
1 parent e8ed16b commit 288cd9d

File tree

8 files changed

+1188
-330
lines changed

8 files changed

+1188
-330
lines changed

main/CMakeLists.txt

Lines changed: 319 additions & 316 deletions
Large diffs are not rendered by default.

main/Kconfig.projbuild

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -648,19 +648,35 @@ config USE_AUDIO_DEBUGGER
648648
help
649649
Enable audio debugger, send audio data through UDP to the host machine
650650

651+
menu "WiFi Configuration Method"
652+
help
653+
WiFi Configuration Method Selection
654+
config USE_HOTSPOT_WIFI_PROVISIONING
655+
bool "Hotspot"
656+
default y
657+
help
658+
Use WiFi Hotspot to transmit WiFi configuration data
659+
config USE_ACOUSTIC_WIFI_PROVISIONING
660+
bool "Acoustic"
661+
help
662+
Use audio signal to transmit WiFi configuration data
663+
664+
config USE_ESP_BLUFI_WIFI_PROVISIONING
665+
bool "Esp Blufi"
666+
help
667+
Use esp blufi protocol to transmit WiFi configuration data
668+
select CONFIG_BT_ENABLED
669+
select CONFIG_BT_BLE_42_FEATURES_SUPPORTED
670+
select CONFIG_BT_BLE_BLUFI_ENABLE
671+
endmenu
672+
651673
config AUDIO_DEBUG_UDP_SERVER
652674
string "Audio Debug UDP Server Address"
653675
default "192.168.2.100:8000"
654676
depends on USE_AUDIO_DEBUGGER
655677
help
656678
UDP server address, format: IP:PORT, used to receive audio debugging data
657679

658-
config USE_ACOUSTIC_WIFI_PROVISIONING
659-
bool "Enable Acoustic WiFi Provisioning"
660-
default n
661-
help
662-
Enable acoustic WiFi provisioning, use audio signal to transmit WiFi configuration data
663-
664680
config RECEIVE_CUSTOM_MESSAGE
665681
bool "Enable Custom Message Reception"
666682
default n
@@ -691,11 +707,11 @@ menu "Camera Configuration"
691707
depends on !CAMERA_SENSOR_SWAP_PIXEL_BYTE_ORDER
692708
help
693709
This option treats the camera buffer as a uint16_t[] array and performs byte-swapping (endianness conversion) on each element.
694-
710+
695711
Should only be modified by development board integration engineers.
696-
712+
697713
**Incorrect usage may result in incorrect image colors!**
698-
714+
699715
ATTENTION: If the option CAMERA_SENSOR_SWAP_PIXEL_BYTE_ORDER is available for your sensor, please use that instead.
700716
endmenu
701717

main/boards/common/blufi.cpp

Lines changed: 258 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,258 @@
1+
2+
#include "Blufi.h"
3+
#include <ssid_manager.h>
4+
#include "board.h"
5+
#include "freertos/FreeRTOS.h"
6+
#include "freertos/task.h"
7+
#include "freertos/event_groups.h"
8+
#include "esp_mac.h"
9+
#include "esp_wifi.h"
10+
#include "esp_event.h"
11+
#include "esp_log.h"
12+
#include "nvs_flash.h"
13+
#include "wifi_board.h"
14+
#if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED
15+
#include "esp_bt.h"
16+
#endif
17+
18+
#include <blufi_local.h>
19+
#include "esp_blufi_api.h"
20+
#include "esp_blufi.h"
21+
22+
#if CONFIG_ESP_WIFI_AUTH_OPEN
23+
#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_OPEN
24+
#elif CONFIG_ESP_WIFI_AUTH_WEP
25+
#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WEP
26+
#elif CONFIG_ESP_WIFI_AUTH_WPA_PSK
27+
#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_PSK
28+
#elif CONFIG_ESP_WIFI_AUTH_WPA2_PSK
29+
#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_PSK
30+
#elif CONFIG_ESP_WIFI_AUTH_WPA_WPA2_PSK
31+
#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_WPA2_PSK
32+
#elif CONFIG_ESP_WIFI_AUTH_WPA3_PSK
33+
#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA3_PSK
34+
#elif CONFIG_ESP_WIFI_AUTH_WPA2_WPA3_PSK
35+
#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_WPA3_PSK
36+
#elif CONFIG_ESP_WIFI_AUTH_WAPI_PSK
37+
#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WAPI_PSK
38+
#endif
39+
40+
#define EXAMPLE_WIFI_CONNECTION_MAXIMUM_RETRY 5
41+
#define EXAMPLE_INVALID_REASON 255
42+
#define EXAMPLE_INVALID_RSSI (-128)
43+
44+
45+
#define WIFI_LIST_NUM 10
46+
47+
static wifi_config_t sta_config;
48+
static wifi_config_t ap_config;
49+
static esp_blufi_callbacks_t example_callbacks = {
50+
.event_cb = Blufi::event_callback,
51+
.negotiate_data_handler = blufi_dh_negotiate_data_handler,
52+
.encrypt_func = blufi_aes_encrypt,
53+
.decrypt_func = blufi_aes_decrypt,
54+
.checksum_func = blufi_crc_checksum,
55+
};
56+
57+
/* The event group allows multiple bits for each event,
58+
but we only care about one event - are we connected
59+
to the AP with an IP? */
60+
const int CONNECTED_BIT = BIT0;
61+
62+
63+
/* store the station info for send back to phone */
64+
static bool gl_sta_connected = false;
65+
static bool gl_sta_got_ip = false;
66+
static bool ble_is_connected = false;
67+
static uint8_t gl_sta_bssid[6];
68+
static uint8_t gl_sta_ssid[32];
69+
static int gl_sta_ssid_len;
70+
static wifi_sta_list_t gl_sta_list;
71+
static bool gl_sta_is_connecting = false;
72+
static esp_blufi_extra_info_t gl_sta_conn_info;
73+
74+
static int softap_get_current_connection_number(void) {
75+
esp_err_t ret;
76+
ret = esp_wifi_ap_get_sta_list(&gl_sta_list);
77+
if (ret == ESP_OK) {
78+
return gl_sta_list.num;
79+
}
80+
81+
return 0;
82+
}
83+
84+
void Blufi::event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param) {
85+
switch (event) {
86+
case ESP_BLUFI_EVENT_INIT_FINISH:
87+
BLUFI_INFO("BLUFI init finish\n");
88+
esp_blufi_adv_start();
89+
break;
90+
case ESP_BLUFI_EVENT_BLE_CONNECT:
91+
BLUFI_INFO("BLUFI ble connect\n");
92+
ble_is_connected = true;
93+
esp_blufi_adv_stop();
94+
blufi_security_init();
95+
break;
96+
case ESP_BLUFI_EVENT_BLE_DISCONNECT:
97+
BLUFI_INFO("BLUFI ble disconnect\n");
98+
ble_is_connected = false;
99+
blufi_security_deinit();
100+
esp_blufi_adv_start();
101+
break;
102+
case ESP_BLUFI_EVENT_SET_WIFI_OPMODE:
103+
BLUFI_INFO("BLUFI Set WIFI opmode %d\n", param->wifi_mode.op_mode);
104+
// TODO 实现此功能
105+
//ESP_ERROR_CHECK(esp_wifi_set_mode(param->wifi_mode.op_mode));
106+
break;
107+
case ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP: {
108+
BLUFI_INFO("BLUFI request wifi connect to AP\n");
109+
std::string *ssid__ = new std::string(reinterpret_cast<char *>(sta_config.sta.ssid));
110+
std::string *password__ =new std::string(reinterpret_cast<char *>(sta_config.sta.password));
111+
SsidManager::GetInstance().Clear();
112+
SsidManager::GetInstance().AddSsid(*ssid__, *password__);
113+
SsidManager::GetInstance().SetDefaultSsid(0);
114+
// TODO 连接至Wi-Fi测试能否连接成功
115+
esp_restart();
116+
break;
117+
}
118+
case ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP:
119+
BLUFI_INFO("BLUFI request wifi disconnect from AP\n");
120+
// TODO 完成断开连接逻辑
121+
break;
122+
case ESP_BLUFI_EVENT_REPORT_ERROR:
123+
BLUFI_ERROR("BLUFI report error, error code %d\n", param->report_error.state);
124+
esp_blufi_send_error_info(param->report_error.state);
125+
break;
126+
case ESP_BLUFI_EVENT_GET_WIFI_STATUS: {
127+
wifi_mode_t mode;
128+
esp_blufi_extra_info_t info;
129+
130+
esp_wifi_get_mode(&mode);
131+
132+
if (gl_sta_connected) {
133+
memset(&info, 0, sizeof(esp_blufi_extra_info_t));
134+
memcpy(info.sta_bssid, gl_sta_bssid, 6);
135+
info.sta_bssid_set = true;
136+
info.sta_ssid = gl_sta_ssid;
137+
info.sta_ssid_len = gl_sta_ssid_len;
138+
esp_blufi_send_wifi_conn_report(mode, gl_sta_got_ip ? ESP_BLUFI_STA_CONN_SUCCESS : ESP_BLUFI_STA_NO_IP,
139+
softap_get_current_connection_number(), &info);
140+
} else if (gl_sta_is_connecting) {
141+
esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONNECTING, softap_get_current_connection_number(),
142+
&gl_sta_conn_info);
143+
} else {
144+
esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_FAIL, softap_get_current_connection_number(),
145+
&gl_sta_conn_info);
146+
}
147+
BLUFI_INFO("BLUFI get wifi status from AP\n");
148+
149+
break;
150+
}
151+
case ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE:
152+
BLUFI_INFO("blufi close a gatt connection");
153+
esp_blufi_disconnect();
154+
break;
155+
case ESP_BLUFI_EVENT_RECV_STA_BSSID:
156+
memcpy(sta_config.sta.bssid, param->sta_bssid.bssid, 6);
157+
sta_config.sta.bssid_set = 1;
158+
BLUFI_INFO("Recv STA BSSID %s\n", sta_config.sta.bssid);
159+
break;
160+
case ESP_BLUFI_EVENT_RECV_STA_SSID:
161+
if (param->sta_ssid.ssid_len >= sizeof(sta_config.sta.ssid) / sizeof(sta_config.sta.ssid[0])) {
162+
esp_blufi_send_error_info(ESP_BLUFI_DATA_FORMAT_ERROR);
163+
BLUFI_INFO("Invalid STA SSID\n");
164+
break;
165+
}
166+
strncpy((char *) sta_config.sta.ssid, (char *) param->sta_ssid.ssid, param->sta_ssid.ssid_len);
167+
sta_config.sta.ssid[param->sta_ssid.ssid_len] = '\0';
168+
BLUFI_INFO("Recv STA SSID %s\n", sta_config.sta.ssid);
169+
break;
170+
case ESP_BLUFI_EVENT_RECV_STA_PASSWD:
171+
if (param->sta_passwd.passwd_len >= sizeof(sta_config.sta.password) / sizeof(sta_config.sta.password[0])) {
172+
esp_blufi_send_error_info(ESP_BLUFI_DATA_FORMAT_ERROR);
173+
BLUFI_INFO("Invalid STA PASSWORD\n");
174+
break;
175+
}
176+
strncpy((char *) sta_config.sta.password, (char *) param->sta_passwd.passwd, param->sta_passwd.passwd_len);
177+
sta_config.sta.password[param->sta_passwd.passwd_len] = '\0';
178+
sta_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK;
179+
BLUFI_INFO("Recv STA PASSWORD %s\n", sta_config.sta.password);
180+
break;
181+
case ESP_BLUFI_EVENT_RECV_SOFTAP_SSID:
182+
if (param->softap_ssid.ssid_len >= sizeof(ap_config.ap.ssid) / sizeof(ap_config.ap.ssid[0])) {
183+
esp_blufi_send_error_info(ESP_BLUFI_DATA_FORMAT_ERROR);
184+
BLUFI_INFO("Invalid SOFTAP SSID\n");
185+
break;
186+
}
187+
strncpy((char *) ap_config.ap.ssid, (char *) param->softap_ssid.ssid, param->softap_ssid.ssid_len);
188+
ap_config.ap.ssid[param->softap_ssid.ssid_len] = '\0';
189+
ap_config.ap.ssid_len = param->softap_ssid.ssid_len;
190+
BLUFI_INFO("Recv SOFTAP SSID %s, ssid len %d\n", ap_config.ap.ssid, ap_config.ap.ssid_len);
191+
break;
192+
case ESP_BLUFI_EVENT_RECV_SOFTAP_PASSWD:
193+
if (param->softap_passwd.passwd_len >= sizeof(ap_config.ap.password) / sizeof(ap_config.ap.password[0])) {
194+
esp_blufi_send_error_info(ESP_BLUFI_DATA_FORMAT_ERROR);
195+
BLUFI_INFO("Invalid SOFTAP PASSWD\n");
196+
break;
197+
}
198+
strncpy((char *) ap_config.ap.password, (char *) param->softap_passwd.passwd,
199+
param->softap_passwd.passwd_len);
200+
ap_config.ap.password[param->softap_passwd.passwd_len] = '\0';
201+
BLUFI_INFO("Recv SOFTAP PASSWORD %s len = %d\n", ap_config.ap.password, param->softap_passwd.passwd_len);
202+
break;
203+
case ESP_BLUFI_EVENT_RECV_SOFTAP_AUTH_MODE:
204+
if (param->softap_auth_mode.auth_mode >= WIFI_AUTH_MAX) {
205+
return;
206+
}
207+
ap_config.ap.authmode = param->softap_auth_mode.auth_mode;
208+
esp_wifi_set_config(WIFI_IF_AP, &ap_config);
209+
BLUFI_INFO("Recv SOFTAP AUTH MODE %d\n", ap_config.ap.authmode);
210+
break;
211+
case ESP_BLUFI_EVENT_RECV_SOFTAP_CHANNEL:
212+
if (param->softap_channel.channel > 13) {
213+
return;
214+
}
215+
ap_config.ap.channel = param->softap_channel.channel;
216+
esp_wifi_set_config(WIFI_IF_AP, &ap_config);
217+
BLUFI_INFO("Recv SOFTAP CHANNEL %d\n", ap_config.ap.channel);
218+
break;
219+
case ESP_BLUFI_EVENT_GET_WIFI_LIST: {
220+
wifi_scan_config_t scanConf = {
221+
.ssid = NULL,
222+
.bssid = NULL,
223+
.channel = 0,
224+
.show_hidden = false
225+
};
226+
esp_err_t ret = esp_wifi_scan_start(&scanConf, true);
227+
if (ret != ESP_OK) {
228+
esp_blufi_send_error_info(ESP_BLUFI_WIFI_SCAN_FAIL);
229+
}
230+
break;
231+
}
232+
case ESP_BLUFI_EVENT_RECV_CUSTOM_DATA:
233+
BLUFI_INFO("Recv Custom Data %" PRIu32 "\n", param->custom_data.data_len);
234+
ESP_LOG_BUFFER_HEX("Custom Data", param->custom_data.data, param->custom_data.data_len);
235+
break;
236+
default:
237+
break;
238+
}
239+
}
240+
241+
242+
void Blufi::init() {
243+
esp_err_t ret;
244+
#if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED
245+
ret = esp_blufi_controller_init();
246+
if (ret) {
247+
BLUFI_ERROR("%s BLUFI controller init failed: %s\n", __func__, esp_err_to_name(ret));
248+
return;
249+
}
250+
#endif
251+
ret = esp_blufi_host_and_cb_init(&example_callbacks);
252+
if (ret) {
253+
BLUFI_ERROR("%s initialise failed: %s\n", __func__, esp_err_to_name(ret));
254+
return;
255+
}
256+
BLUFI_INFO("BLUFI VERSION %04x\n", esp_blufi_get_version());
257+
}
258+

main/boards/common/blufi.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#pragma once
2+
#include <esp_blufi_api.h>
3+
4+
class Blufi {
5+
public:
6+
static Blufi GetInstance() { return Blufi(); }
7+
static void event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param);
8+
void init();
9+
};

0 commit comments

Comments
 (0)