wuyage

NXP BLE QN902x 之广播解析

1
阅读(4144) 评论(2)

本篇结合prj_broadcaster 例程,介绍BLE广播相关知识。

注意:SDK1.3.8的prj_broadcaster的原工程有问题,需要做一下改动:

#define CFG_MEM_RETENTION   (MEM_BLOCK1 | MEM_BLOCK6 | MEM_BLOCK7) 

改为:

#define CFG_MEM_RETENTION   (MEM_BLOCK1 | MEM_BLOCK2 | MEM_BLOCK6 | MEM_BLOCK7)


prj_broadcaster文件夹为广播例程,将生成的broadcaster.bin下载到板子里,QN9020 MINIKIT 开发板按一下SW1,这时QN902x就会发出广播信息。如果你手机里装了类似Nordic NRFMASTER的软件,那么就可以看到如下信息:

2b.JPG1B.JPG

我们同时使用TI和Nodic的抓包工具再看一下。

TI的抓包结果如下:

TI 抓包.jpg

使用Nordic EN-dongle 配合Wireshark 抓包结果如下:

Wireshark.jpg

(Nordic抓包工具具体使用步骤可以参考:http://www.cnblogs.com/aikm/p/5021220.html )

手机里显示的Raw data是:0x02,0x01,0x06,0x08,0x08,0x51, 0x55, 0x49, 0x4E, 0x54, 0x49, 0x43,0x05,0x12,0x06,0x00,0x80,0x0c

那么这一长串的十六进制数据,它的具体含义到底是什么呢?

在具体分析这些数据代表的含义之前,先补充一些基本的理论知识:

BLE的报文结构如下:

Untitled.jpg

先分析第一组数据:

从下图可以看到

xx1.jpg

首先是前导:1个字节,它为给固定的01010101 或者 10101010

接着是4字节固定的接入地址,为0x8e89bed6

再之后为1字节的报头,这里收到的是0x06,可知广播报文类型为ADV_SCAN_IND.

再之后为1字节的长度,这里为0x12,表示后面的数据有18字节。即6字节的广播地址+这12个字节的数据:0x02,0x01,0x06,0x08,0x08,0x51, 0x55, 0x49, 0x4E, 0x54, 0x49, 0x43 这一串12字节数据可以分为三个部分:1)0x02 0x01 0x06     2) 0x08 0x51 0x49 0x4E 0x54 0x49 0x43  

下面具体分析实际数据的含义。

0x02,0x01,0x06 是一小块数据

1) ADV_SCAN_IND 为可扫描指示。它 的Payload 结构如下:

ADV_SCAN_P.jpg

收到的具体广播数据如下:

xx1.jpg

这里的广播地址为蓝牙板子的地址。

ADV_SCAN_IND数据的实际组成如下:

xxxxx.jpg

Core_v4.2.pdf

关于AD Type以及他们的意义,可以参考:

CSS_v5.pdf

或者:

https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile 

比如Flags(AD Type为0x01)data含义如下:

Flgs6.jpg


0x08,0x08,0x51, 0x55, 0x49, 0x4E, 0x54, 0x49, 0x43 是另外一块数据。

第一个0x08表示长度,再之后的0x08表示类型,表示shortened local name。0x51, 0x55, 0x49, 0x4E, 0x54, 0x49, 0x43 为具体的数据,也就是字符串“QUINTIC”


2)我们再来分析SCAN_REQ 类型的广播数据,它是由dongle发出的广播数据

主动扫描请求.jpg

SCAN_REQ的Payload结构如下:

Scan_Payload.jpg

其中ScanA为扫描设备的地址(也就是我的手机蓝牙的地址),AdvA为广播者的地址

在本例中ScanA也就是3c:91:57:99:65:dc, AdvA为:08:7c:be:00:01


3)再看SCAN_RSP格式的广播数据,它的Payload如下,它是由QN9020 接收到dongle的扫描请求后发出的广播数据

SCAN_RSP.jpg

ScanRspData的格式如下:

xx.jpg

(注:此结构也适用于ADV_IND,ADV_NONCONN_IND,  ADV_SCAN_IND广播)

扫描相应.jpg

0x12 表示SLAVE CONNECTION INTERVAL RANGE


后面四字节:06 00 80 0c

对于SLAVE CONNECTION INTERVAL RANGE,其定义如下:

Format.jpg

各个AD Type的值在QN9020 SDK里也可以看到:

/// GAP Advertising Flags
enum
{
    /// Flag
    GAP_AD_TYPE_FLAGS                      = 0x01,
    /// Use of more than 16 bits UUID
    GAP_AD_TYPE_MORE_16_BIT_UUID,
    /// Complete list of 16 bit UUID
    GAP_AD_TYPE_COMPLETE_LIST_16_BIT_UUID,
    /// Use of more than 32 bit UUD
    GAP_AD_TYPE_MORE_32_BIT_UUID,
    /// Complete list of 32 bit UUID
    GAP_AD_TYPE_COMPLETE_LIST_32_BIT_UUID,
    /// Use of more than 128 bit UUID
    GAP_AD_TYPE_MORE_128_BIT_UUID,
    /// Complete list of 128 bit UUID
    GAP_AD_TYPE_COMPLETE_LIST_128_BIT_UUID,
    /// Shortened device name
    GAP_AD_TYPE_SHORTENED_NAME,
    /// Complete device name
    GAP_AD_TYPE_COMPLETE_NAME,
    /// Transmit power
    GAP_AD_TYPE_TRANSMIT_POWER,
    /// Class of device
    GAP_AD_TYPE_CLASS_OF_DEVICE            = 0x0D,
    /// Simple Pairing Hash C
    GAP_AD_TYPE_SP_HASH_C,
    /// Simple Pairing Randomizer
    GAP_AD_TYPE_SP_RANDOMIZER_R,
    /// Temporary key value
    GAP_AD_TYPE_TK_VALUE,
    /// Out of Band Flag
    GAP_AD_TYPE_OOB_FLAGS,
    /// Slave connection interval range
    GAP_AD_TYPE_SLAVE_CONN_INT_RANGE,
    /// Signed data
    GAP_AD_TYPE_SIGNED_DATA,
    /// Complete list of 16 bit service UUID
    GAP_AD_TYPE_CMPLT_LST_16_BIT_SVC_UUID,
    /// Require 128 bit service UUID
    GAP_AD_TYPE_RQRD_128_BIT_SVC_UUID,
    /// Service data
    GAP_AD_TYPE_SERVICE_DATA,
    /// Manufacturer specific data
    GAP_AD_TYPE_MANU_SPECIFIC_DATA         = 0xFF,
};























  1. @goodboyvi   

    请问,广播包中没有  mac地址信息,只知道这个地址是公共地址类型,那是怎么得出mac地址是 08 7c be  00 00 01???????

    广播包payload 的前六个字节就是MAC地址啊

  2. 请问,广播包中没有  mac地址信息,只知道这个地址是公共地址类型,那是怎么得出mac地址是 08 7c be  00 00 01???????