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的亮灭。

你可能感兴趣的:(ESP32蓝牙组网之节点配网)