esp32 蓝牙广播包能够发送的最大字节为37个,但是其中Mac占用了6个字节,最后供用户使用的只有31字节。这个31字节需按照蓝牙广播包中的ad格式:len + type 。
其中esp32有两种方式设置广播包:一种是通过esp_ble_adv_data_t结构体,使用接口api,设置广播数据;另一种是通过uint8_t的数据流写进入广播包,但是两者都不能超过31字节。
如果用户自定义广播包需要超过31字节,就需要进行广播分包设置。
esp32广播包分包设置支持:通过先发送第一个广播消息包(例如:原始数据raw_adv_data),然后通过被扫描再次发送扫描响应数据(例如:saoraw_scan_rsp_data),实现发送2个广播包。
*广播数据用于向周围的设备发送广播消息,而扫描响应数据是在其他设备请求扫描响应时发送的数据。
BLE设备可以使用扫描响应数据来提供更多信息,例如设备名称、服务UUID等。当其他设备执行扫描操作时,它们会收到广播数据和扫描响应数据,从而获取设备的相关信息。*
通过设置扫描响应数据,其他设备在扫描的过程中可以获得更多关于你的设备的信息。
请注意,扫描响应数据是可选的,你可以根据需要决定是否需要设置扫描响应数据。
下面是esp32中gatts 回调中的相关广播包数据设置代码
包含了:自定义广播包方式和使用结构体配置方式
static void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param)
{
switch (event) {
case ESP_GATTS_REG_EVT:{
esp_err_t set_dev_name_ret = esp_ble_gap_set_device_name(SAMPLE_DEVICE_NAME);
if (set_dev_name_ret){
ESP_LOGE(GATTS_TABLE_TAG, "set device name failed, error code = %x", set_dev_name_ret);
}
#ifdef CONFIG_SET_RAW_ADV_DATA
esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(raw_adv_data, sizeof(raw_adv_data));
if (raw_adv_ret){
ESP_LOGE(GATTS_TABLE_TAG, "config raw adv data failed, error code = %x ", raw_adv_ret);
}
adv_config_done |= ADV_CONFIG_FLAG;
esp_err_t raw_scan_ret = esp_ble_gap_config_scan_rsp_data_raw(raw_scan_rsp_data, sizeof(raw_scan_rsp_data));
if (raw_scan_ret){
ESP_LOGE(GATTS_TABLE_TAG, "config raw scan rsp data failed, error code = %x", raw_scan_ret);
}
adv_config_done |= SCAN_RSP_CONFIG_FLAG;
#else
//config adv data
esp_err_t ret = esp_ble_gap_config_adv_data(&adv_data);
if (ret){
ESP_LOGE(GATTS_TABLE_TAG, "config adv data failed, error code = %x", ret);
}
adv_config_done |= ADV_CONFIG_FLAG;
//config scan response data
ret = esp_ble_gap_config_adv_data(&scan_rsp_data);
if (ret){
ESP_LOGE(GATTS_TABLE_TAG, "config scan response data failed, error code = %x", ret);
}
adv_config_done |= SCAN_RSP_CONFIG_FLAG;
#endif
esp_err_t create_attr_ret = esp_ble_gatts_create_attr_tab(gatt_db, gatts_if, HRS_IDX_NB, SVC_INST_ID);
if (create_attr_ret){
ESP_LOGE(GATTS_TABLE_TAG, "create attr table failed, error code = %x", create_attr_ret);
}
}
break;
}