wuyage

NXP BLE QN902x 之广播解析

1
阅读(7327)

本篇结合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, };























Baidu
map