在使用 Nrf52832 开发蓝牙 Mesh 的时候,没有找到可以动态修改广播名称的办法。开发非 Mesh 的方案时,可以通过配置工具写入设备序列号后并记忆,再下次广播的时候更新广播名称,但是 Mesh 使用相同的方法却不行。由于项目时间紧张,没有过多的时间研究,所以采用其他方式实现该需求。
由于 APP 是自己开发的,如果 Mesh 设备在广播的时候携带设备的序列号信息,在 APP 收到广播信息后,将序列号与广播名称合并后现在设备列表中,那么就可以完成需求了。
这里使用的是 nRF5_SDK_for_mesh_V5.00 和 nRF5_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);
}