使用ESP32模组实现蓝牙配网的示例代码。我们将展示两种配网方式:一种是基于乐鑫官方的BluFi,另一种是自定义协议开发的实现方式

以下是使用四博智联ESP32模组实现蓝牙配网的示例代码。我们将展示两种配网方式:一种是基于乐鑫官方的BluFi,另一种是自定义协议开发的实现方式。

1. 基于BluFi的蓝牙配网

BluFi 是乐鑫官方提供的用于 ESP32 系列芯片的蓝牙配网方案。以下是一个简单的 BluFi 配网实现示例代码:

#include "esp_blufi_api.h"
#include "esp_wifi.h"
#include "esp_bt.h"
#include "esp_bt_main.h"

static void blufi_event_handler(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param)
{
    switch (event) {
    case ESP_BLUFI_EVENT_INIT_FINISH:
        ESP_LOGI("BluFi", "BluFi initialization finished");
        esp_blufi_adv_start();
        break;
    case ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE:
        ESP_LOGI("BluFi", "BluFi BLE disconnected");
        break;
    case ESP_BLUFI_EVENT_RECV_STA_BSSID:
        ESP_LOGI("BluFi", "Received STA BSSID");
        break;
    case ESP_BLUFI_EVENT_RECV_STA_SSID:
        ESP_LOGI("BluFi", "Received STA SSID: %s", param->sta_ssid.ssid);
        break;
    case ESP_BLUFI_EVENT_RECV_STA_PASSWD:
        ESP_LOGI("BluFi", "Received STA Password: %s", param->sta_passwd.passwd);
        break;
    default:
        break;
    }
}

void app_main(void)
{
    esp_err_t ret;

    // 初始化NVS
    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);

    // 初始化蓝牙
    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));
    ESP_ERROR_CHECK(esp_bluedroid_init());
    ESP_ERROR_CHECK(esp_bluedroid_enable());

    // 初始化BluFi
    esp_blufi_register_callbacks(&blufi_callbacks);
    ESP_ERROR_CHECK(esp_blufi_profile_init());

    // 初始化Wi-Fi
    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());
}

2. 自定义蓝牙配网协议实现

如果需要自定义蓝牙配网协议,可以根据产品需求设计配网流程。以下是一个简单的自定义蓝牙配网示例,使用GATT服务接收Wi-Fi SSID和密码:

#include "esp_bt.h"
#include "esp_bt_main.h"
#include "esp_gatts_api.h"
#include "esp_wifi.h"

#define GATTS_TAG "GATTS_DEMO"
#define PROFILE_NUM 1
#define PROFILE_APP_IDX 0
#define ESP_APP_ID 0x55

static uint8_t ssid[32] = {0};
static uint8_t password[64] = {0};

static void gatts_profile_event_handler(esp_gatts_cb_event_t event,
                                        esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param)
{
    if (event == ESP_GATTS_WRITE_EVT) {
        if (param->write.handle == ssid_handle) {
            memcpy(ssid, param->write.value, param->write.len);
        } else if (param->write.handle == password_handle) {
            memcpy(password, param->write.value, param->write.len);
            ESP_LOGI(GATTS_TAG, "Received SSID: %s, Password: %s", ssid, password);

            wifi_config_t wifi_config = {
                .sta = {
                    .ssid = "",
                    .password = "",
                },
            };
            memcpy(wifi_config.sta.ssid, ssid, sizeof(ssid));
            memcpy(wifi_config.sta.password, password, sizeof(password));
            ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
            ESP_ERROR_CHECK(esp_wifi_connect());
        }
    }
}

void app_main(void)
{
    esp_err_t ret;

    // 初始化NVS
    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);

    // 初始化蓝牙
    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));
    ESP_ERROR_CHECK(esp_bluedroid_init());
    ESP_ERROR_CHECK(esp_bluedroid_enable());

    // 初始化GATT服务器
    esp_ble_gatts_register_callback(gatts_profile_event_handler);
    esp_ble_gatts_app_register(ESP_APP_ID);

    // 初始化Wi-Fi
    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());
}

代码说明

  1. BluFi 方案:通过使用乐鑫官方提供的 BluFi 库,简化了蓝牙配网的实现。此方案非常适合那些想快速实现蓝牙配网功能的开发者。

  2. 自定义方案:开发者可以完全掌控配网流程,通过设计自定义 GATT 服务和特性,接收并处理Wi-Fi SSID和密码。这种方法提供了更高的灵活性,能够根据具体产品的需求进行深度优化。

无论选择哪种方案,四博智联的 ESP32 模组都提供了强大的支持,帮助开发者快速实现智能设备的蓝牙配网功能。如果需要进一步的优化或定制,可以结合具体应用场景对代码进行调整和扩展。

在这里插入图片描述四博模组规格书

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值