Nordic nrf52832 蓝牙Mesh修改Gatt广播内容

2022-10-14 09:19:04 浏览数 (1)

在使用 Nrf52832 开发蓝牙 Mesh 的时候,没有找到可以动态修改广播名称的办法。开发非 Mesh 的方案时,可以通过配置工具写入设备序列号后并记忆,再下次广播的时候更新广播名称,但是 Mesh 使用相同的方法却不行。由于项目时间紧张,没有过多的时间研究,所以采用其他方式实现该需求。

由于 APP 是自己开发的,如果 Mesh 设备在广播的时候携带设备的序列号信息,在 APP 收到广播信息后,将序列号与广播名称合并后现在设备列表中,那么就可以完成需求了。

这里使用的是 nRF5_SDK_for_mesh_V5.00nRF5_SDK_17.0.2_d674dde 协议栈。 以 nRF5_SDK_for_mesh_V5.00exampleslight_switchserver 为例。

打开工程后,找到 mesh_adv.c 文件。定位到函数: void mesh_adv_data_set(uint16_t service_uuid, const uint8_t* p_service_data, uint8_t length) 这个函数是用来构造 Mesh 广播数据包的。

代码语言:javascript复制
......
 
/// 使用广播数据包中制造商信息的字段传输序列号。
/// 自定义制造商信息结构体;
ble_advdata_manuf_data_t _mInfo;

void mesh_adv_data_set(uint16_t service_uuid, const uint8_t* p_service_data, uint8_t length)
{
   memset(&m_gap_adv_data, 0, sizeof(m_gap_adv_data));
   m_gap_adv_data.adv_data.p_data      = m_advdata_raw[m_adv_set_index];
   m_gap_adv_data.scan_rsp_data.p_data = m_srdata_raw[m_adv_set_index];
   m_gap_adv_data.adv_data.len         = sizeof(m_advdata_raw[0]);
   m_gap_adv_data.scan_rsp_data.len    = sizeof(m_srdata_raw[m_adv_set_index]);
   m_adv_set_index                     = (m_adv_set_index   1) & 1;

   ble_advdata_t advdata;
   memset(&advdata, 0, sizeof(advdata));
   advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;

   ble_uuid_t uuids[]              = {{service_uuid, BLE_UUID_TYPE_BLE}};
   advdata.uuids_complete.uuid_cnt = ARRAY_SIZE(uuids);
   advdata.uuids_complete.p_uuids  = uuids;

   ble_advdata_service_data_t service_data;
   service_data.service_uuid = service_uuid;
   service_data.data.size    = length;
   service_data.data.p_data  = (uint8_t*)p_service_data;

   advdata.p_service_data_array = &service_data;
   advdata.service_data_count   = 1;

   /* The application may freely set anything into the scan response data. */
   ble_advdata_t srdata;
   memset(&srdata, 0, sizeof(srdata));
   srdata.name_type = BLE_ADVDATA_FULL_NAME;

   /// 自定义开始
   
   extern uint16_t UarteGetSerId(void);
   _mInfo.company_identifier    = UarteGetSerId();
   srdata.p_manuf_specific_data = &_mInfo;

   /// 这里还广播了发射功率;
   /// note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm,  3dBm and  4dBm.
   /// note The initiator will have the same transmit power as the scanner.
   int8_t _txPower = 4;
   srdata.p_tx_power_level = &_txPower;
   
   /// 自定义结束

   APP_ERROR_CHECK(ble_advdata_encode(&advdata, m_gap_adv_data.adv_data.p_data, &m_gap_adv_data.adv_data.len));
   APP_ERROR_CHECK(ble_advdata_encode(&srdata, m_gap_adv_data.scan_rsp_data.p_data, &m_gap_adv_data.scan_rsp_data.len));

#if NRF_SD_BLE_API_VERSION >= 6

   uint32_t err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_gap_adv_data, &m_adv_params);
   if (err_code == NRF_ERROR_INVALID_STATE) {
      err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_gap_adv_data, NULL);
   }
#else

   uint32_t err_code       = sd_ble_gap_adv_data_set(m_gap_adv_data.adv_data.p_data,
                                               m_gap_adv_data.adv_data.len,
                                               m_gap_adv_data.scan_rsp_data.p_data,
                                               m_gap_adv_data.scan_rsp_data.len);
#endif /* NRF_SD_BLE_API_VERSION >= 6 */
   APP_ERROR_CHECK(err_code);
}

0 人点赞