
ble广播包详解.doc
21页word 在使用EN-Dongle捕获和解析广播包之前,我们先了解一下BLE报文的结构,之后,再对捕获的广播包进展分析在学习BLE的时候,下面两个文档是极其重要的,这是SIG发布的蓝牙的核心协议和核心协议增补· 核心协议Core_v4.2· 核心协议增补CSS v6 虽然这两个文档是蓝牙技术的根本,但是遗憾的是:通过这两个文档学习蓝牙并不是那么容易的,阅读和理解起来很费力尤其是初学者在阅读这两个文档的时候,感觉无从下口所以,本文在分析报文的过程中,会明确指出协议文档在什么地方定义了他们,让我们有目的的去查阅协议文档,做到知其然也知其所以然,这样,学习起来就会轻松很多1. BLE报文结构 BLE报文结构如下,他由如下图所示的各个域组成因为有的域的长度超过了一个字节,所以在传输的过程中就涉与到多字节域中哪个字节先传输的问题,BLE报文传输时的字节序和比特序如下:· 字节序:大多数多字节域是从低字节开始传输的注意,并不是所有的多字节域都是从低字节开始传输的· 比特序:各个字节传输时,每个字节都是从低位开始 图1:BLE报文结构1.1 前导 前导是一个8比特的交替序列。
他不是01010101就是10101010,取决于接入地址的第一个比特· 假如接入地址的第一个比特为0:01010101· 假如接入地址的第一个比特为1:10101010 接收机可以根据前导的无线信号强度来配置自动增益控制 接入地址 接入地址有两种类型:广播接入地址和数据接入地址· 广播接入地址:固定为0x8E89BED6,在广播、扫描、发起连接时使用· 数据接入地址:随机值,不同的连接有不同的值在连接建立之后的两个设备间使用 对于数据信道,数据接入地址是一个随机值,但需要满足下面几点要求: 1) 数据接入地址不能超过6个连续的“0〞或“1〞 2) 数据接入地址的值不能与广播接入地址一样 3) 数据接入地址的4个字节的值必须互补一样 4) 数据接入地址不能有超24次的比特翻转(比特0到1或1到0,称为1次比特翻转) 5) 数据接入地址的最后6个比特需要至少两次的比特翻转 6) 符合上面条件的有效随机数据接入地址大概有231个 报头1.3.1 广播报文报头 报头的内容取决于该报文是广播报文还是数据报文广播报文的报头如如下图所示: 图2:广播报文报头 广播报文的报头包含4bit广播报文类型、2bit保存位、1bit发送地址类型和1bit接收地址类型。
1) 广播报文类型页描述了广播报文类型,共有7种类型,如如下图所示 图3:广播报文类型 每种广播报文类型都具有不同的数据格式与行为大家可以阅读此章节进一步了解 2) 发送地址类型和接收地址类型 发送地址类型和接收地址类型指示了设备使用公共地址(Public Address)还是随机地址(Random Address)公共地址和随机地址的长度一样,都包含6个字节共48位BLE设备至少要拥有这两种地址类型中的一种,当然也可以同时拥有这两种地址类型· 公共地址(Public Address) 公共地址由两局部组成,如如下图公共地址由制造商从IEEE申请,由IEEE注册机构为该制造商分配的机构唯一标识符OUI(Organizationally Unique Identifier)这个地址是独一无二,不能修改的 图4:公共地址结构· 随机地址 随机地址有包含两种:静态地址〔Static Device Address〕和私有地址〔PrivateDevice Address〕。
Core_v4.2 P2577的1.3.2.1节描述了静态地址 图5:静态地址格式静态地址有如下要求: a) 静态地址的最高2位有效位必须是1 b) 静态地址最高2位有效位之外的其余局部不能全为0 c) 静态地址最高2位有效位之外的其余局部不能全为1 在私有地址的定义当中,又包含了两个子类:不可解析私有地址〔Non-resolvable Private Address〕和可解析私有地址(Resolvable Private Address,RPA)nRF51822使用的是静态地址,芯片在出厂时已经设置好了48位地址,我们可以从下面两个存放器读出地址类型和地址 a) DEVICEADDRTYPE存放器DEVICEADDR[n]存放器:包含DEVICEADDR[0]和DEVICEADDR[1]两个存放器 图6:地址类型存放器 图7:地址存放器 长度· 广播报文:长度域包含6个比特,有效值的X围是6~37。
· 数据报文:长度域包含5个比特,有效值的X围是0~31 广播报文和和数据报文的长度域有所不同,主要原因是:广播报文除了最多31个字节的数据之外,还必须要包含6个字节的广播设备地址6+31=37,所以需要6比特的长度域再次强调:广播时必须要包含6个字节的广播设备地址 数据(AdvData) 广播和扫面响应的数据格式如如下图所示,由有效数据局部和无效数据局部组成 图8:广播和扫描响应的数据格式 1) 有效数据局部:包含N个AD Structure,每个AD Structure由Length,AD Type和AD Data组成其中:· Length:AD Type和AD Data的长度· AD Type:指示AD Data数据的含义 问题来了,我们怎么知道有哪些AD Type?他们又表示什么意义?可以通过下面2种方式查看AD Type和他们表示的意义· 从官网查询,但是需要是会员才可以查询· 查看Nordic的SDK中的定义,AD type的定义在程序的“〞头文件中定义如下: 1#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */ 2#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */ 3#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_PLETE 0x03 /**< plete list of 16 bit service UUIDs. */ 4#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */ 5#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_PLETE 0x05 /**< plete list of 32 bit service UUIDs. */ 6#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */ 7#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_PLETE 0x07 /**< plete list of 128 bit service UUIDs. */ 8#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */ 9#define BLE_GAP_AD_TYPE_PLETE_LOCAL_NAME 0x09 /**< plete local device name. */10#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */11#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */12#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */13#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */14#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */15#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */16#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */17#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */18#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */19#define BLE_GAP_AD_TYPE_SERVICE_D。












