前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nordic nrf52832 蓝牙Mesh修改Gatt广播内容

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

原创
作者头像
土豆佩德罗
修改2022-10-14 09:19:04
8950
修改2022-10-14 09:19:04
举报
文章被收录于专栏:土豆佩德罗的专栏

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

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

这里使用的是 nRF5_SDK_for_mesh_V5.00nRF5_SDK_17.0.2_d674dde 协议栈。 以 nRF5_SDK_for_mesh_V5.00\examples\light_switch\server 为例。

打开工程后,找到 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);
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档