0

我正在对我的 esp32 进行编程,以便能够宣传我的自定义服务/特性。我是 esp idf 的新手,我正在努力使用 nimBLE 编程蓝牙。在构建过程中,没有抛出错误,但是在监视时,我从 main 函数中收到以下错误:

I (391) heap_init: At 3FFB6388 len 00001C78 (7 KiB): DRAM
I (397) heap_init: At 3FFB9A20 len 00004108 (16 KiB): DRAM
I (403) heap_init: At 3FFC49F0 len 0001B610 (109 KiB): DRAM
I (409) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (415) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (422) heap_init: At 40096DB0 len 00009250 (36 KiB): IRAM
I (429) spi_flash: detected chip: generic
I (433) spi_flash: flash io: dio
I (438) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (484) BTDM_INIT: BT controller compile version [1342a48]
I (484) system_api: Base MAC address is not set
I (484) system_api: read default base MAC address from EFUSE
I (494) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07
ESP_ERROR_CHECK failed: esp_err_t 0x3 (ERROR) at 0x4008e6f4
0x4008e6f4: _esp_error_check_failed at C:/Users/Kanimba/Desktop/esp-idf/components/esp_common/src/esp_err.c:41

file: "../main/main.c" line 35
func: app_main
expression: gatt_svrs_init()

abort() was called at PC 0x4008e6f7 on core 0
0x4008e6f7: _esp_error_check_failed at C:/Users/Kanimba/Desktop/esp-idf/components/esp_common/src/esp_err.c:42


Backtrace:0x4008f64b:0x3ffbc340 0x4008fe1d:0x3ffbc360 0x400951f2:0x3ffbc380 0x4008e6f7:0x3ffbc3f0 0x400d5a86:0x3ffbc410 0x401205ed:0x3ffbc430 0x40092e45:0x3ffbc450
0x4008f64b: panic_abort at C:/Users/Kanimba/Desktop/esp-idf/components/esp_system/panic.c:356

0x4008fe1d: esp_system_abort at C:/Users/Kanimba/Desktop/esp-idf/components/esp_system/system_api.c:112

0x400951f2: abort at C:/Users/Kanimba/Desktop/esp-idf/components/newlib/abort.c:46

0x4008e6f7: _esp_error_check_failed at C:/Users/Kanimba/Desktop/esp-idf/components/esp_common/src/esp_err.c:42

0x400d5a86: app_main at C:\Users\Kanimba\Desktop\work_project\esp\embedded-test-ble\build/../main/main.c:35 (discriminator 1)

0x401205ed: main_task at C:/Users/Kanimba/Desktop/esp-idf/components/freertos/port/port_common.c:133 (discriminator 2)

0x40092e45: vPortTaskWrapper at C:/Users/Kanimba/Desktop/esp-idf/components/freertos/port/xtensa/port.c:168

从而调用 gatt_svrs_init() 来初始化以下内容;

int gatt_svrs_init(void) {
  int rc;

  ble_svc_gap_init();
  ble_svc_gatt_init();

  rc = ble_gatts_count_cfg(gatt_svsc);
  if (rc != 0) {
    return rc;
  }

  rc = ble_gatts_add_svcs(gatt_svsc);
  if (rc != 0) {
    return rc;
  }
  return 0;
}

我的 main,c 文件看起来像这样

#include "config.h"
#include "gatt_svr.h"

#include "esp_log.h"
#include "esp_nimble_hci.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs_flash.h"

void app_main() {

  int rc;
  /* initalise non-valatile storage 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);

  /* initialise nimble */
  ESP_ERROR_CHECK(esp_nimble_hci_and_controller_init());

  /* initialise apache port to nimble */
  nimble_port_init();

  /*Initialize the NimBLE host configuration */
  ble_hs_cfg.reset_cb = ble_on_reset;
  ble_hs_cfg.sync_cb = ble_on_sync;
  ble_hs_cfg.gatts_register_cb = gatt_svr_register_cb;
  ble_hs_cfg.store_status_cb =
      ble_store_util_status_rr; // said to not be useful, need to do more,

  ESP_ERROR_CHECK(gatt_svrs_init());
  // assert(rc == 0);

  /*set the default device name*/
  ESP_ERROR_CHECK(ble_svc_gap_device_name_set(DEVICE_NAME));

  // storing configuration "quite not sure how this function works"
  ble_store_config_init();

  nimble_port_freertos_init(host_task);
}

和服务的结构:

static const struct ble_gatt_svc_def gatt_svsc[] = {
    {/* Device info service/ SIG */
     .type = BLE_GATT_SVC_TYPE_PRIMARY,
     .uuid = BLE_UUID16_DECLARE(DEVICE_INFO_SERVICE),
     .characteristics =
         (struct ble_gatt_chr_def[]){
             {/* manufacturer name characteristic */
              .uuid = BLE_UUID16_DECLARE(MANUFACTURER_NAME),
              .flags = BLE_GATT_CHR_F_READ,
              .access_cb = gatt_svr_access_device_info},
             {/*serial number characteristic */
              .uuid = BLE_UUID16_DECLARE(DEVICE_SERIAL_NUMBER),
              .flags = BLE_GATT_CHR_F_READ,
              .access_cb = gatt_svr_access_device_info},
             {/*software version characteristic */
              .uuid = BLE_UUID16_DECLARE(SOFTWARE_VERSION),
              .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_READ_ENC,
              .access_cb = gatt_svr_access_device_info},
             {0}}},
    {.type = BLE_GATT_SVC_TYPE_PRIMARY,
     .uuid = &DEVICE_STATE_SERVICE.u,
     .characteristics =
         (struct ble_gatt_chr_def[]){{
                                         /* manufacturer name characteristic
                                          */
                                         .uuid = &CURRENT_SPECTRUM.u,
                                         .flags = BLE_GATT_CHR_F_READ,
                                     },
                                     {
                                         /* manufacturer name characteristic
                                          */
                                         .uuid = &DEVICE_TEMPERATURE.u,
                                         .flags = BLE_GATT_CHR_F_READ,
                                     },
                                     {
                                         /* manufacturer name characteristic
                                          */
                                         .uuid = &CURRENT_INTESITY.u,
                                         .flags = BLE_GATT_CHR_F_READ,
                                     },
                                     {0}}},
    {.type = BLE_GATT_SVC_TYPE_PRIMARY,
     .uuid = &MANUAL_SERVICE.u,
     .characteristics =
         (struct ble_gatt_chr_def[]){{
                                         /* manula spectrum characteristic */
                                         .uuid = &MANUAL_SPECTRUM.u,
                                         .flags = BLE_GATT_CHR_F_READ,
                                     },
                                     {
                                         /* light intensity characteristic */
                                         .uuid = &LIGHT_INTESITY.u,
                                         .flags = BLE_GATT_CHR_F_READ,
                                     },
                                     {
                                         /* manual power characteristic */
                                         .uuid = &MANUAL_POWER.u,
                                         .flags = BLE_GATT_CHR_F_READ,
                                     },
                                     {0}}},
    {.type = BLE_GATT_SVC_TYPE_PRIMARY,
     .uuid = &SCHEDULER_SERVICE.u,
     .characteristics =
         (struct ble_gatt_chr_def[]){{
                                         /* Start_stage characteristic */
                                         .uuid = &STAGE_START.u,
                                         .flags = BLE_GATT_CHR_F_WRITE,
                                     },
                                     {
                                         /* start day hours characteristic */
                                         .uuid = &DAY_START_HOURS.u,
                                         .flags = BLE_GATT_CHR_F_WRITE,
                                     },
                                     {
                                         /* manufacturer name characteristic
                                          */
                                         .uuid = &DAY_END_HOURS.u,
                                         .flags = BLE_GATT_CHR_F_WRITE,
                                     },
                                     {
                                         /* Light intensity characteristic */
                                         .uuid = &LIGHT_INTESITY.u,
                                         .flags = BLE_GATT_CHR_F_WRITE,
                                     },
                                     {0}}},
    {0}};
4

1 回答 1

0

我认为应该有一个 access_cb 与具有 read 或 write 标志的特性相关联。您可以尝试使用 UUID SCHEDULER_SERVICE 、 MANUAL_SERVICE 和 DEVICE_STATE_SERVICE 将 access_cb 添加到特征中,看看是否有帮助。

于 2021-08-31T04:48:16.653 回答