NRF5 SDK蓝牙开发——peripheral设备广播报文分析

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工具对广播报文解析的内容&central设备抓包输出到串口的原始数据,使用两个实例,对比如下

这里写图片描述

[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. */
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wayne2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值