从主函数进去,可以看到app_main函数主要初始了nvs,ble协议栈,ble mesh协议栈,是非常简洁的一个demo.
void app_main(void)
{
esp_err_t err;
ESP_LOGI(TAG, "Initializing...");//初始化
err = nvs_flash_init();//nvs初始化
if (err == ESP_ERR_NVS_NO_FREE_PAGES) {
ESP_ERROR_CHECK(nvs_flash_erase());//nvs擦除
err = nvs_flash_init();//nvs初始化
}
ESP_ERROR_CHECK(err);
err = bluetooth_init();//ble协议栈初始化
if (err) {
ESP_LOGE(TAG, "esp32_bluetooth_init failed (err %d)", err);
return;
}
ble_mesh_get_dev_uuid(dev_uuid);//获取设备uuid
/* Initialize the Bluetooth Mesh Subsystem */
err = ble_mesh_init();//ble mesh协议栈初始化
if (err) {
ESP_LOGE(TAG, "Bluetooth mesh init failed (err %d)", err);
}
}
跳过 nvs_flash_init();和bluetooth_init();这两个函数,我们点进去到
ble_mesh_get_dev_uuid函数中,这个主要是把ble mac地址加进去到device uuid中去。
void ble_mesh_get_dev_uuid(uint8_t *dev_uuid)
{
if (dev_uuid == NULL) {
ESP_LOGE(TAG, "%s, Invalid device uuid", __func__);
return;
}
memcpy(dev_uuid + 2, addr_val, BD_ADDR_LEN);
}
重点来了,我们看一下这个ble_mesh_init()里干了什么,首先准备好appkey appkey_index netkey_index三个配网参数,并分别注册配网,配置客户端,通用客户端。
static esp_err_t ble_mesh_init(void)
{
uint8_t match[2] = {0xdd, 0xdd};
esp_err_t err = ESP_OK;
prov_key.net_idx = ESP_BLE_MESH_KEY_PRIMARY ;//netkey index
prov_key.app_idx = APP_KEY_IDX;//appkey index
memset(prov_key.app_key, APP_KEY_OCTET, sizeof(prov_key.app_key));//appkey 设置初始值
esp_ble_mesh_register_prov_callback(example_ble_mesh_provisioning_cb);//注册配网回调
esp_ble_mesh_register_config_client_callback(example_ble_mesh_config_client_cb);注册配置客户端回调
esp_ble_mesh_register_generic_client_callback(example_ble_mesh_generic_client_cb);//注册通用客户回调
err = esp_ble_mesh_init(&provision, &composition);//mesh配网初始化
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to initialize mesh stack (err %d)", err);
return err;
}
err = esp_ble_mesh_provisioner_set_dev_uuid_match(match, sizeof(match), 0x0, false);//设置device uuid
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to set matching device uuid (err %d)", err);
return err;
}
err = esp_ble_mesh_provisioner_prov_enable(ESP_BLE_MESH_PROV_ADV | ESP_BLE_MESH_PROV_GATT);//开启ADV和GATT两种方式
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to enable mesh provisioner (err %d)", err);
return err;
}
err = esp_ble_mesh_provisioner_add_local_app_key(prov_key.app_key, prov_key.net_idx, prov_key.app_idx);//添加appkey netkey_index,appkey_inde参数
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to add local AppKey (err %d)", err);
return err;
}
ESP_LOGI(TAG, "BLE Mesh Provisioner initialized");
return err;
}