peripheral设备广播报文分析
试验条件:
- iar for arm开发平台
- 1块nRF52832开发板
- 应用程序开发版本:nRF5_SDK_15.0.0_a53641a
- 协议栈固件: s132_nrf52_6.0.0_softdevice.hex
- 2个基于Ble平台开发好的产品
central设备与peripheral设备的连接的前提,需要peripheral设备定时往外发送广播报文,而central设备进入扫描模式,接收所有广播报文。为了实现对peripheral设备广播报文的分析,一方面通过实例结合蓝牙核心协议来分析,一方面,在NRF52系列平台,通过peripheral设备的代码来分析广播内容。
通信试验搭建
1。 nRF52832开发板跑central设备程序来抓包,例程在
examples\ble_central\ble_app_uart_c
,同时配置RF_LOG信息打印到串口,并且在"sdk_config.h"
中,LOG信息输出等级为4,如下代码所示,
// <o> NRF_LOG_DEFAULT_LEVEL - Default Severity level
// <0=> Off
// <1=> Error
// <2=> Warning
// <3=> Info
// <4=> Debug
#ifndef NRF_LOG_DEFAULT_LEVEL
#define NRF_LOG_DEFAULT_LEVEL 4
#endif
2。central设备初始化完毕后,都会触发
BLE_GAP_EVT_ADV_REPORT
事件,该事件在函数static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
中处理。进入on_adv_report
,进入ble_advdata_uuid_find
,合适位置添加 代码如下, 这样在搜索到任一个peripheral设备广播报文,都会打印报文信息。
NRF_LOG_DEBUG("p_encoded_data,%d",data_len);
NRF_LOG_HEXDUMP_DEBUG(p_encoded_data, data_len);
使用nRF Connect工具对广播报文解析的内容¢ral设备抓包输出到串口的原始数据,使用两个实例,对比如下
[15:53:56.117]收←◆<debug> app: p_encoded_data,19
<debug> app: 02 01 06 0F 09 4B 65 65|.....Kee
<debug> app: 73 6F 6E 20 62 61 73 65|son base
<debug> app: 30 30 31 |001
<debug> app: p_encoded_data,4
<debug> app: 03 03 E0 FF |....
<debug> app: p_encoded_data,29
<debug> app: 02 01 06 05 02 F0 FF B0|........
<debug> app: FF 0A FF 00 00 FF FF FF|........
<debug> app: FF 64 00 FF 00 00 00 00|.d......
<debug> app: 00 00 00 00 00 |.....
<debug> app: p_encoded_data,27
<debug> app: 11 09 62 61 73 65 2D 69|..base-i
<debug> app: 34 2E 30 30 30 30 32 35|4.000025
<debug> app: 31 39 05 12 08 00 20 00|19.... .
<debug> app: 02 0A 04 |...
实例数据解析
蓝牙核心协议中,广播报文及扫描响应报文协议定义如下,
该蓝牙广播报文包含的信息个数是可以自定义的。每一个信息在协议中都是固定的“长度+类型+内容”组成,广播报文由一个个信息前后拼接而成。根据蓝牙补充协议,对应上述Keeson base001设备,解析如下:
02 01 06 :类型为“Flags”:设置了两个标志位GeneralDiscoverable,BrEdrNotSupported
0F 09 4B 65 65 73 6F 6E 20 62 61 73 65 30 30 31 03 03 E0 FF:类型为“Complete local name”:名称为Keeson base001
03 03 E0 FF:类型为 “Complete list of 16-bit Service UUIDs”:UUID为0xFFE0
总结来说,这段广播报文使用了3条信息,长度分别为02,0F,03,类型分别为01,09,03。
代码追溯
Nrf52蓝牙系列,peripheral设备定时往外发送广播报文,报文参数初始化如下所示,
/**@brief Function for initializing the Advertising functionality.
*/
static void advertising_init(void)
{
uint32_t err_code;
ble_advertising_init_t init;
memset(&init, 0, sizeof(init));
init.advdata.name_type = BLE_ADVDATA_FULL_NAME; //定义了名称显示类型
init.advdata.include_appearance = false;//是否包含设备外观
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;//标志显示
init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);//UUID显示
init.srdata.uuids_complete.p_uuids = m_adv_uuids;
init.config.ble_adv_fast_enabled = true;
init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
init.config.ble_adv_fast_timeout = APP_ADV_DURATION;
init.evt_handler = on_adv_evt;
err_code = ble_advertising_init(&m_advertising, &init);
APP_ERROR_CHECK(err_code);
ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}
广播报文信息支持的类型在“ble_gap.h”
/**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format
* @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm
* @{ */
#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 /**< Complete list of 16 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 /**< Complete list of 32 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 /**< Complete list of 128 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */
#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 /**< Complete local device name. */
#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */
#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */
#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 /**< Service Data - 16-bit UUID. */
#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 /**< Public Target Address. */
#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 /**< Random Target Address. */
#define BLE_GAP_AD_TYPE_APPEARANCE 0x19 /**< Appearance. */
#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A /**< Advertising Interval. */
#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B /**< LE Bluetooth Device Address. */
#define BLE_GAP_AD_TYPE_LE_ROLE 0x1C /**< LE Role. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D /**< Simple Pairing Hash C-256. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E /**< Simple Pairing Randomizer R-256. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 /**< Service Data - 32-bit UUID. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 /**< Service Data - 128-bit UUID. */
#define BLE_GAP_AD_TYPE_LESC_CONFIRMATION_VALUE 0x22 /**< LE Secure Connections Confirmation Value */
#define BLE_GAP_AD_TYPE_LESC_RANDOM_VALUE 0x23 /**< LE Secure Connections Random Value */
#define BLE_GAP_AD_TYPE_URI 0x24 /**< URI */
#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D /**< 3D Information Data. */
#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF /**< Manufacturer Specific Data. */