ESP32蓝牙组网之节点配网

在进行这篇文章之前,请确保你已经知道了一个蓝牙节点的组成。
APP链接(这个APP是安卓的):https://github.com/EspressifApp/EspBLEMeshForAndroid/releases/tag/v1.0.0
源码连接:https://github.com/espressif/espidf/tree/master/examples/bluetooth/esp_ble_mesh/ble_mesh_node/onoff_server
在源码里面main文件夹下面是蓝牙节点配网的主要代码。
ble_mesh_demo_init.c里面是蓝牙的初始化函数。
board.c里面是板子上的LED的初始化。
ble_mesh_demo_main.c里面是咱们本次讲解的重点。
剩下的那些.h文件就是对应的.C文件的一些函数声明。
ESP32官方已经有了对这个代码的讲解,不过是英语,链接:
https://github.com/espressif/espidf/tree/master/examples/bluetooth/esp_ble_mesh/ble_mesh_node/onoff_server/tutorial
首先从主函数开始分析:

void app_main(void)
{
    esp_err_t err;
    ESP_LOGI(TAG, "Initializing...");
    board_init();//板子上面的RGB灯的初始化
    err = nvs_flash_init();
    if (err == ESP_ERR_NVS_NO_FREE_PAGES) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        err = nvs_flash_init();
    }
    ESP_ERROR_CHECK(err);
    err = bluetooth_init();//蓝牙初始化
    if (err) {
        ESP_LOGE(TAG, "esp32_bluetooth_init failed (err %d)", err);
        return;
    }
    ble_mesh_get_dev_uuid(dev_uuid);
    /* Initialize the Bluetooth Mesh Subsystem */
    err = ble_mesh_init();//蓝牙组网初始化
    if (err) {
        ESP_LOGE(TAG, "Bluetooth mesh init failed (err %d)", err);
    }
}
//蓝牙组网初始化的具体实施
static esp_err_t ble_mesh_init(void)
{
    esp_err_t err;   
//注册配网的回调函数    esp_ble_mesh_register_prov_callback(example_ble_mesh_provisioning_cb);
   //注册服务配置回调函数esp_ble_mesh_register_config_server_callback(example_ble_mesh_config_server_cb);
//注册通用服务回调函数 就是用来操作LED的亮灭   esp_ble_mesh_register_generic_server_callback(example_ble_mesh_generic_server_cb);
   //在初始化之前,需要先把节点给构造好
    err = esp_ble_mesh_init(&provision, &composition);
    if (err) {
        ESP_LOGE(TAG, "Initializing mesh failed (err %d)", err);
        return err;
    }
    //使能节点广播,让手机能发现这个节点
    esp_ble_mesh_node_prov_enable(ESP_BLE_MESH_PROV_ADV |   	 ESP_BLE_MESH_PROV_GATT);
    ESP_LOGI(TAG, "BLE Mesh Node initialized");
    //初始化成功以后LED灯亮
   board_led_operation(LED_G, LED_ON);
    return err;
}
一个最简单的节点的组成位:
节点->元素->模型->状态
static esp_ble_mesh_comp_t composition = {
    .cid = CID_ESP,
    .elements = elements,//指向自己构造的一个元素
    .element_count = ARRAY_SIZE(elements),
};
//这些元素的生命都是通过宏定义来实现的
//0:存储主元素的地址 root_models:sig模型 
//ESP_BLE_MESH_MODEL_NONE :供应商模型
static esp_ble_mesh_elem_t elements[] = {
    ESP_BLE_MESH_ELEMENT(0, root_models,ESP_BLE_MESH_MODEL_NONE),
    ESP_BLE_MESH_ELEMENT(0, extend_model_0,ESP_BLE_MESH_MODEL_NONE),
    ESP_BLE_MESH_ELEMENT(0, extend_model_1,ESP_BLE_MESH_MODEL_NONE),
};
static esp_ble_mesh_model_t root_models[] = {

    ESP_BLE_MESH_MODEL_CFG_SRV(&config_server),
    //通用的开关模型
    ESP_BLE_MESH_MODEL_GEN_ONOFF_SRV(&onoff_pub_0, &onoff_server_0),
};
//第一个参数:上下文操作的名字:
//第二个参数:发布消息的长度
//第三个参数:在这个模型中的角色,可以是供应者,快速配网
ESP_BLE_MESH_MODEL_PUB_DEFINE(onoff_pub_0, 2 + 3, ROLE_NODE);
static esp_ble_mesh_gen_onoff_srv_t onoff_server_0 = {
//这两个参数的设置影响到这个esp_ble_mesh_register_generic_server_callback回调函数的时间触发,具体可以跳转到函数里面自行查看
    .rsp_ctrl.get_auto_rsp = ESP_BLE_MESH_SERVER_AUTO_RSP,
    .rsp_ctrl.set_auto_rsp = ESP_BLE_MESH_SERVER_AUTO_RSP,
};

这样的话,一个节点就已经配置完成了,可以通过APP进行配网,然后来控制LED灯的亮灭。这个例子是一个元素三个模型,分别控制三个LED的亮灭。

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是一个简单的ESP32-C3蓝牙组网程序,用于将多个ESP32-C3设备组成一个网络: ``` #include <BLEDevice.h> #include <BLEUtils.h> #include <BLEServer.h> // 定义一个服务UUID #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" // 定义一个特征UUID #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" BLECharacteristic *pCharacteristic; void setup() { Serial.begin(115200); BLEDevice::init("ESP32-C3"); BLEServer *pServer = BLEDevice::createServer(); BLEService *pService = pServer->createService(SERVICE_UUID); pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE ); pService->start(); BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); pAdvertising->addServiceUUID(SERVICE_UUID); pAdvertising->setScanResponse(true); pAdvertising->setMinPreferred(0x06); // 指定最小广告间隔时间(以0.625ms为单位) pAdvertising->setMinPreferred(0x12); // 指定最大广告间隔时间(以0.625ms为单位) BLEDevice::startAdvertising(); } void loop() { String value = pCharacteristic->getValue().c_str(); if (value == "CONNECT") { Serial.println("Device connected"); } else if (value == "DISCONNECT") { Serial.println("Device disconnected"); } delay(1000); } ``` 此程序将创建一个蓝牙服务和特征,可以通过读取和写入特征值来实现设备间的通信。当设备连接时,将会打印 "Device connected",当设备断开连接时,将会打印 "Device disconnected"。可以根据自己的需求修改程序来实现更复杂的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值