BLE蓝牙配网全攻略:STA+SoftAP双模式实操!

STA+SoftAP双模式实操指南来了!本文特别分享蓝牙配网方案:

以Air8000核心板为例,实现“STA+SoftAP双模式BLE配网” 功能——手机通过BLE下发Wi-Fi账号/密码或热点参数,Air8000自动完成Station连接或SoftAP创建,并验证网络可用性。

一、蓝牙配网基础知识

简而言之,蓝牙配网是让Air8000工作在蓝牙配网模式下,手机APP通过蓝牙连接Air8000,通过APP界面实现配网功能。

1.1 蓝牙配网是什么

蓝牙配网——是一种利用蓝牙低功耗(BLE)链路,在未联网设备与手机之间建立本地安全通道,把Wi-Fi的SSID、密码及其他网络参数传递给设备,使其独立完成STA或SoftAP联网的技术方案。

1.2 蓝牙配网原理

设备在上电后进入配网模式,作为BLE Peripheral持续广播自定义的配网服务UUID;

手机APP作为Central扫描并建立GATT连接,随后通过加密特征值把网络参数下发给设备。

设备收到参数后,启用Wi-Fi并执行联网流程。

1.3 蓝牙配网流程

设备在上电后进入配网模式,作为BLE Peripheral持续广播自定义的配网服务UUID;

1)广播:

设备以固定间隔广播配网服务,等待手机连接。

2)连接:

手机APP扫描→选择目标设备→建立BLE连接。

3)选择配网方式:

在手机APP界面选择所需模式,两种模式主要区别如下:

Station模式:

设备直接作为Station连接路由器,应用中也常缩写为STA模式。

SoftAP模式:

设备通过4G开AP热点,用于其他设备连接。

二、蓝牙配网示例demo

Air8000应用示例持续更新中,此处仅展示部分代码要点,完整demo详见源码仓库最新文件。

最新源码/APP下载:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/config_wifi_network/ble_config_wifi

实操教程详见:https://docs.openluat.com/air8000/luatos/app/wifi/ble/

2.1 初始化蓝牙等相关功能

使用蓝牙配网,首先需要初始化蓝牙设备并启动espblufi配网功能。


2.2 定义espblufi回调函数

定义espblufi回调函数,用于处理不同类型的事件。

例如:

EVENT_STA_INFO、EVENT_SOFTAP_INFO等。


2.3 定义网络测试功能函数

用于接收: "STA_CONNED"、"STA_DISCONNED"、"AP_CONNED"等消息来进行对应的逻辑处理。


三、蓝牙配网实操要点

以下是Station模式和SoftAP模式的配网功能演示,新朋友可查看资料中心详细教程:

https://docs.openluat.com/air8000/luatos/app/wifi/ble/

 - Station模式配网 -  

1)首先使用LuaTools将固件和脚本烧录到核心板,开机运行查看日志:

2)此时打开手机APP端,可以看到已经扫描到我们的设备了(如果没有扫描到就重启一下设备,并下拉刷新APP)。

3)点击我们的设备,进入配网界面,点击连接,就可以进行配网的操作了:

4)点击配网,进行Station配网模式,选择需要连接的Wi-Fi,输入对应的密码,即可开始连接。

5)此时查看日志,即可看到STA已经连接成功,并且进行HTTP请求成功。


 - SoftAP模式配网 -  

1)首先参照上方Station模式的方式,烧录、开机、打开APP连接、进入配网界面:

2)此时,点击配网,选择SoftAP模式,配置AP热点:

3)在这里可以选择加密方式、信道号、最大连接数,根据自己的需求选填:

4)点击确定后,开始建立AP热点:

5)此时使用设备进行连接,连接成功即可正常使用。

今天的内容就分享到这里了~

<think>我们参考了用户提供的引用内容,其中引用[1]提到用户之前做过蓝牙的组件轮子,引用[2]的第19条提到微信小程序上ble蓝牙esp32(blufi)。因此,用户希望了解ESP32蓝牙(BluFi)的现方法或代码过程。 BluFi是乐鑫为ESP32设备提供的一种基于蓝牙的Wi-Fi协议。它允许用户通过手机APP(或微信小程序)将Wi-Fi置信息通过蓝牙传输给ESP32,然后ESP32使用这些信息连接到路由器。 ### ESP32蓝牙(BluFi)现步骤 1. **初始化蓝牙和BluFi组件**:首先需要初始化蓝牙控制器,并设置设备名称等参数,然后初始化BluFi组件。 2. **设置BluFi回调函数**:处理BluFi事件,例如接收Wi-Fi置信息、连接状态等。 3. **启动蓝牙和BluFi**:启动蓝牙控制器,并开始广播,等待手机连接。 4. **手机端连接并发送置**:用户通过手机APP(或支持BluFi的微信小程序)连接ESP32的蓝牙,并发送目标路由器的SSID和密码。 5. **处理置并连接Wi-Fi**:ESP32收到置信息后,尝试连接Wi-Fi,并将连接结果通过蓝牙反馈给手机。 6. **断开蓝牙连接**:完成后,可以关闭蓝牙以节省功耗。 ### 代码现(基于ESP-IDF框架) 以下是一个基于ESP-IDF的BluFi示例代码。注意:此代码需要ESP-IDF环境,并使用了`blufi`组件。 ```c #include <string.h> #include "esp_wifi.h" #include "esp_blufi.h" #include "esp_bt.h" #include "esp_bt_main.h" #include "esp_bt_device.h" #include "esp_gap_ble_api.h" #include "esp_blufi_api.h" #include "nvs_flash.h" static const char *TAG = "blufi"; // BluFi事件回调函数 static void blufi_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param, void *user_data) { switch (event) { case ESP_BLUFI_EVENT_INIT_FINISH: ESP_LOGI(TAG, "BluFi初始化完成"); break; case ESP_BLUFI_EVENT_DEINIT_FINISH: ESP_LOGI(TAG, "BluFi反初始化完成"); break; case ESP_BLUFI_EVENT_BLE_CONNECT: ESP_LOGI(TAG, "蓝牙连接"); break; case ESP_BLUFI_EVENT_BLE_DISCONNECT: ESP_LOGI(TAG, "蓝牙断开连接"); break; case ESP_BLUFI_EVENT_SET_WIFI_OPMODE: ESP_LOGI(TAG, "设置Wi-Fi模式"); break; case ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP: ESP_LOGI(TAG, "请求连接AP"); break; case ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP: ESP_LOGI(TAG, "请求断开AP"); break; case ESP_BLUFI_EVENT_GET_WIFI_STATUS: { wifi_mode_t mode; esp_wifi_get_mode(&mode); esp_blufi_extra_info_t info = {0}; if (mode == WIFI_MODE_STA) { wifi_ap_record_t ap_info; esp_wifi_sta_get_ap_info(&ap_info); if (ap_info.rssi) { info.sta_connected = true; memcpy(info.softap_ssid, ap_info.ssid, sizeof(ap_info.ssid)); ESP_LOGI(TAG, "Wi-Fi已连接,SSID: %s", info.softap_ssid); } else { info.sta_connected = false; ESP_LOGI(TAG, "Wi-Fi未连接"); } } esp_blufi_send_wifi_conn_report(&info); break; } case ESP_BLUFI_EVENT_RECV_STA_BSSID: { uint8_t *bssid = param->sta_bssid.bssid; ESP_LOGI(TAG, "接收BSSID: %02x:%02x:%02x:%02x:%02x:%02x", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]); esp_wifi_set_mac(WIFI_IF_STA, bssid); break; } case ESP_BLUFI_EVENT_RECV_STA_SSID: { char *ssid = (char *)param->sta_ssid.ssid; uint8_t ssid_len = param->sta_ssid.ssid_len; ESP_LOGI(TAG, "接收SSID: %.*s", ssid_len, ssid); break; } case ESP_BLUFI_EVENT_RECV_STA_PASSWD: { char *passwd = (char *)param->sta_passwd.passwd; uint8_t passwd_len = param->sta_passwd.passwd_len; ESP_LOGI(TAG, "接收密码: %.*s", passwd_len, passwd); // 这里可以保存SSID和密码,并尝试连接Wi-Fi break; } case ESP_BLUFI_EVENT_RECV_SOFTAP_SSID: case ESP_BLUFI_EVENT_RECV_SOFTAP_PASSWD: case ESP_BLUFI_EVENT_RECV_SOFTAP_MAX_CONN_NUM: case ESP_BLUFI_EVENT_RECV_SOFTAP_AUTH_MODE: case ESP_BLUFI_EVENT_RECV_SOFTAP_CHANNEL: case ESP_BLUFI_EVENT_RECV_USERNAME: case ESP_BLUFI_EVENT_RECV_CA_CERT: case ESP_BLUFI_EVENT_RECV_CLIENT_CERT: case ESP_BLUFI_EVENT_RECV_SERVER_CERT: case ESP_BLUFI_EVENT_RECV_CLIENT_PRIV_KEY: case ESP_BLUFI_EVENT_RECV_SERVER_PRIV_KEY: default: break; } } void app_main() { // 初始化NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); // 初始化WiFi wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_start()); // 初始化蓝牙控制器 ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT)); // 释放经典蓝牙内存 esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_bt_controller_init(&bt_cfg)); ESP_ERROR_CHECK(esp_bt_controller_enable(ESP_BT_MODE_BLE)); // 初始化Bluetooth堆栈 ESP_ERROR_CHECK(esp_bluedroid_init()); ESP_ERROR_CHECK(esp_bluedroid_enable()); // 设置设备名称 esp_ble_gap_set_device_name("ESP32-BluFi"); // 初始化BluFi esp_blufi_callbacks_t blufi_cb = { .event_cb = blufi_event_callback, .negotiate_data_handler = NULL, .encrypt_func = NULL, .decrypt_func = NULL, }; ESP_ERROR_CHECK(esp_blufi_register_callbacks(&blufi_cb)); ESP_ERROR_CHECK(esp_blufi_profile_init()); ESP_LOGI(TAG, "BluFi初始化完成,等待手机连接..."); } ``` ### 代码说明 1. **初始化流程**: - 初始化NVS(非易失性存储)用于保存Wi-Fi置(可选)。 - 初始化Wi-Fi为STA模式。 - 初始化蓝牙控制器,并启用BLE模式。 - 初始化Bluedroid蓝牙协议栈。 - 设置设备蓝牙名称。 - 初始化BluFi组件,并注册回调函数。 2. **回调函数处理**: - 在`blufi_event_callback`中,我们处理各种BluFi事件,特别是: - `ESP_BLUFI_EVENT_RECV_STA_SSID`:接收SSID。 - `ESP_BLUFI_EVENT_RECV_STA_PASSWD`:接收密码。 - 收到密码后,可以调用`esp_wifi_set_config`设置Wi-Fi置,并连接Wi-Fi。 3. **连接Wi-Fi**: 在接收到SSID和密码后,可以添加以下代码进行连接: ```c case ESP_BLUFI_EVENT_RECV_STA_PASSWD: { // ... 获取密码 // 置Wi-Fi wifi_config_t wifi_config = {0}; memcpy(wifi_config.sta.ssid, ssid, ssid_len); memcpy(wifi_config.sta.password, passwd, passwd_len); esp_wifi_set_config(WIFI_IF_STA, &wifi_config); esp_wifi_connect(); break; } ``` 4. **手机端作**: - 用户需要下载支持BluFi的APP(如乐鑫的ESP BluFi)或使用微信小程序(需要集成BluFi协议)。 - 手机搜索并连接名为“ESP32-BluFi”的设备。 - 在APP中输入目标Wi-Fi的SSID和密码,发送给ESP32。 ### 注意事项 - 此代码基于ESP-IDF框架,若使用Arduino平台,可能需要使用第三方库(如`BLEProvisioning`)或自行封装。 - BluFi协议细节可参考乐鑫官方文档:[BluFi 使用指南](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/blufi.html)。 - 为了安全,BluFi支持加密传输,但上述示例未启用加密。际应用中建议启用加密。 ### 相关问题 1. ESP32蓝牙过程中如何现加密传输? 2. 如何通过微信小程序现ESP32的蓝牙(BluFi)? 3. ESP32蓝牙失败常见原因及解决方法?</think>### ESP32 蓝牙(BluFi)现方法 ESP32 蓝牙(BluFi)是通过蓝牙低功耗(BLE)传输 Wi-Fi 凭证的技术,相比传统更安全高效。以下是完整现流程和代码示例(基于 ESP-IDF 框架): #### 现流程 1. **初始化蓝牙和 BluFi 组件** 2. **设置回调函数**:处理 Wi-Fi 置接收事件 3. **启动蓝牙广播**:等待手机连接 4. **接收 Wi-Fi 凭证**:通过 BluFi 协议传输 5. **连接 Wi-Fi 并保存置** 6. **断开蓝牙连接**(可选) ```c #include "esp_blufi.h" #include "esp_bt.h" #include "esp_bt_main.h" #include "esp_gap_ble_api.h" #include "nvs_flash.h" // 回调函数处理 BluFi 事件 static void blufi_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param, void *user_data) { switch (event) { case ESP_BLUFI_EVENT_RECV_STA_SSID: // 接收SSID printf("Received SSID: %.*s\n", param->sta_ssid.ssid_len, param->sta_ssid.ssid); break; case ESP_BLUFI_EVENT_RECV_STA_PASSWD: // 接收密码 printf("Received Password: %.*s\n", param->sta_passwd.passwd_len, param->sta_passwd.passwd); // 保存凭证并连接Wi-Fi wifi_config_t wifi_config = { .sta = { .ssid = "", .password = "" } }; memcpy(wifi_config.sta.ssid, param->sta_ssid.ssid, param->sta_ssid.ssid_len); memcpy(wifi_config.sta.password, param->sta_passwd.passwd, param->sta_passwd.passwd_len); esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config); esp_wifi_connect(); break; case ESP_BLUFI_EVENT_BLE_CONNECT: // 蓝牙连接建立 printf("Bluetooth client connected\n"); break; case ESP_BLUFI_EVENT_BLE_DISCONNECT: // 蓝牙断开 printf("Bluetooth client disconnected\n"); break; } } void app_main() { // 1. 初始化NVS存储 nvs_flash_init(); // 2. 初始化Wi-Fi wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&cfg); esp_wifi_set_mode(WIFI_MODE_STA); esp_wifi_start(); // 3. 初始化蓝牙控制器 esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); esp_bt_controller_init(&bt_cfg); esp_bt_controller_enable(ESP_BT_MODE_BLE); // 4. 初始化Bluedroid协议栈 esp_bluedroid_init(); esp_bluedroid_enable(); // 5. 设置设备名称 esp_ble_gap_set_device_name("ESP32_BluFi_Device"); // 6. 初始化BluFi并注册回调 esp_blufi_callbacks_t blufi_cb = { .event_cb = blufi_event_callback }; esp_blufi_register_callbacks(&blufi_cb); esp_blufi_profile_init(); printf("BluFi已启动,请使用手机连接\n"); } ``` #### 手机端合(Android 示例) 需使用支持 BluFi 协议的 App: 1. 扫描蓝牙设备 `ESP32_BluFi_Device` 2. 建立 GATT 连接 3. 通过 BluFi 服务发送 Wi-Fi 凭证: ```java // Android代码片段 BluetoothGattCharacteristic configChar = service.getCharacteristic( UUID.fromString("0000FF01-0000-1000-8000-00805F9B34FB")); byte[] ssidBytes = "YourWiFiSSID".getBytes(); byte[] pwdBytes = "YourPassword".getBytes(); // 构建BluFi协议数据包 byte[] packet = new byte[ssidBytes.length + pwdBytes.length + 2]; packet[0] = (byte) ssidBytes.length; System.arraycopy(ssidBytes, 0, packet, 1, ssidBytes.length); packet[ssidBytes.length + 1] = (byte) pwdBytes.length; System.arraycopy(pwdBytes, 0, packet, ssidBytes.length + 2, pwdBytes.length); configChar.setValue(packet); bluetoothGatt.writeCharacteristic(configChar); ``` #### 关键置说明 1. **BluFi 协议服务**: - 服务 UUID: `0000FFFF-0000-1000-8000-00805F9B34FB` - 写特征 UUID: `0000FF01-0000-1000-8000-00805F9B34FB` - 通知特征 UUID: `0000FF02-0000-1000-8000-00805F9B34FB` 2. **安全机制**(可选): ```c // 启用加密 esp_blufi_set_custom_encrypt("YourEncryptionKey", 16); ``` 3. **成功处理**: ```c case WIFI_EVENT_STA_CONNECTED: printf("Wi-Fi连接成功!\n"); // 保存凭证到NVS nvs_handle_t handle; nvs_open("wifi_config", NVS_READWRITE, &handle); nvs_set_blob(handle, "ssid", wifi_config.sta.ssid, 32); nvs_set_blob(handle, "password", wifi_config.sta.password, 64); nvs_commit(handle); nvs_close(handle); // 关闭蓝牙以省电 esp_blufi_profile_deinit(); esp_bluedroid_disable(); esp_bt_controller_disable(); break; ``` #### 优化建议 1. **添加超时机制**:5分钟无作自动关闭蓝牙 2. **错误处理**:Wi-Fi 连接失败时反馈给手机端 3. **多协议支持**:结合 Web 作为备选方案 4. **低功耗模式**:完成后禁用蓝牙 际项目中,乐鑫提供完整的 [BluFi 示例代码](https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/blufi),可直接集成使用。对于微信小程序,需使用微信的 BLE 接口并现 BluFi 协议[^2]。 --- ### 相关问题 1. ESP32 蓝牙如何现加密传输以提高安全性? 2. 如何通过微信小程序现 ESP32 的蓝牙(BluFi)? 3. ESP32 蓝牙失败常见原因及解决方法? 4. 如何同时支持蓝牙和传统 Web 双模式方案?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值