- Flags (0x01)
- 用于标识设备的可发现性模式。
- 数据长度:1 字节
- 示例:0x01 (LE General Discoverable Mode | BR/EDR Not Supported)
- Incomplete List of 16-bit Service Class UUIDs (0x02)
- 服务的不完整UUID列表。
- 数据长度:2*n 字节
- 示例:0x180D (Heart Rate Service)
- Complete List of 16-bit Service Class UUIDs (0x03)
- 服务的完整UUID列表。
- 数据长度:2*n 字节
- 示例:0x180D (Heart Rate Service), 0x180F (Battery Service)
- Incomplete List of 32-bit Service Class UUIDs (0x04)
- 部分32位UUID列表。
- 数据内容:一个或多个32位UUID。
- Complete List of 32-bit Service Class UUIDs (0x05)
- 完整的32位UUID列表。
- 数据内容:一个或多个32位UUID。
- Incomplete List of 128-bit Service Class UUIDs (0x06)
- 服务的不完整UUID列表。
- 数据长度:16*n 字节
- 示例:128-bit UUID
- Complete List of 128-bit Service Class UUIDs (0x07)
- 服务的完整UUID列表。
- 数据长度:16*n 字节
- 示例:128-bit UUID
- Shortened Local Name (0x08)
- 设备名称的简短版本。
- 数据长度:可变
- 示例:"Nordic"
- Complete Local Name (0x09)
- 设备的完整名称。
- 数据长度:可变
- 示例:"Nordic_HRM"
- Tx Power Level (0x0A)
- 发射功率级别。
- 数据长度:1 字节
- 示例:0x04 (4 dBm)
- Service Data (0x16)
- 包含服务UUID和与服务相关的数据。
- 数据长度:可变
- 示例:0x180D (Heart Rate Service) + Data
- Manufacturer Specific Data (0xFF)
- 制造商特定的数据。
- 数据长度:可变,包含公司标识符(2字节)和制造商数据。
- 示例:0x0059 (Nordic Semiconductor) + Data
然后在部分开发平台上面添加广播包数据不是简单的在对应数组中添加,可能是已经跟你分配了对应的结构体,比如nordic中的:
static void advertising_init(void)
{
uint32_t err_code;
ble_advdata_t advdata;
ble_advdata_t scanrsp;
uint8_t flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
ble_uuid_t adv_uuids[] = {{BLE_UUID_HEART_RATE_SERVICE, BLE_UUID_TYPE_BLE},
{BLE_UUID_BATTERY_SERVICE, BLE_UUID_TYPE_BLE},
{BLE_UUID_DEVICE_INFORMATION_SERVICE, BLE_UUID_TYPE_BLE}};
// Manufacturer specific data
uint8_t manufacturer_data[3] = {0x01, 0x02, 0x03};
ble_advdata_manuf_data_t manuf_specific_data;
manuf_specific_data.company_identifier = 0x0059; // Nordic Semiconductor's company ID
manuf_specific_data.data.p_data = manufacturer_data;
manuf_specific_data.data.size = sizeof(manufacturer_data);
// Service data
uint8_t service_data[4] = {0x04, 0x05, 0x06, 0x07};
ble_advdata_service_data_t service_data_array[1];
service_data_array[0].service_uuid = BLE_UUID_HEART_RATE_SERVICE;
service_data_array[0].data.p_data = service_data;
service_data_array[0].data.size = sizeof(service_data);
// Initialize advertising data
memset(&advdata, 0, sizeof(advdata));
advdata.name_type = BLE_ADVDATA_FULL_NAME;
advdata.include_appearance = true;
advdata.flags = flags;
advdata.p_manuf_specific_data = &manuf_specific_data;
advdata.p_service_data_array = service_data_array;
advdata.service_data_count = 1;
// Initialize scan response data
memset(&scanrsp, 0, sizeof(scanrsp));
scanrsp.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
scanrsp.uuids_complete.p_uuids = adv_uuids;
scanrsp.p_manuf_specific_data = &manuf_specific_data;
scanrsp.p_service_data_array = service_data_array;
scanrsp.service_data_count = 1;
// Encode advertising data
uint8_t adv_data[BLE_GAP_ADV_SET_DATA_SIZE_MAX];
uint16_t adv_data_len = sizeof(adv_data);
err_code = ble_advdata_encode(&advdata, adv_data, &adv_data_len);
APP_ERROR_CHECK(err_code);
// Encode scan response data
uint8_t scan_rsp_data[BLE_GAP_ADV_SET_DATA_SIZE_MAX];
uint16_t scan_rsp_data_len = sizeof(scan_rsp_data);
err_code = ble_advdata_encode(&scanrsp, scan_rsp_data, &scan_rsp_data_len);
APP_ERROR_CHECK(err_code);
// Set advertising parameters
ble_gap_adv_data_t adv_data_struct = {
.adv_data.p_data = adv_data,
.adv_data.len = adv_data_len,
.scan_rsp_data.p_data = scan_rsp_data,
.scan_rsp_data.len = scan_rsp_data_len,
};
ble_gap_adv_params_t adv_params;
memset(&adv_params,