在使用EN-Dongle捕获和解析广播包之前,我们先了解一下BLE报文的结构,之后,再对捕获的广播包进行分析。在学习BLE的时候,下面两个文档是极其重要的,这是SIG发布的蓝牙的核心协议和核心协议增补。?核心协议。?核心协议增补CSSv6。虽然这两个文档是蓝牙技术的根本,但是遗憾的是:通过这两个文档学习蓝牙并不是那么容易的,阅读和理解起来很费力。尤其是初学者在阅读这两个文档的时候,感觉无从下口。所以,本文在分析报文的过程中,会明确指出协议文档在什么地方定义了他们,让我们有目的的去查阅协议文档,做到知其然也知其所以然,这样,学习起来就会轻松很多。报文结构BLE报文结构如下,他由下图所示的各个域组成。因为有的域的长度超过了一个字节,所以在传输的过程中就涉及到多字节域中哪个字节先传输的问题,BLE报文传输时的字节序和比特序如下:?字节序:大多数多字节域是从低字节开始传输的。注意,并不是所有的多字节域都是从低字节开始传输的。?比特序:各个字节传输时,每个字节都是从低位开始。图1:BLE报文结构前导前导是一个8比特的交替序列。他不是01010101就是,取决于接入地址的第一个比特。?若接入地址的第一个比特为0:01010101?若接入地址的第一个比特为1:接收机可以根据前导的无线信号强度来配置自动增益控制。接入地址接入地址有两种类型:广播接入地址和数据接入地址。?广播接入地址:固定为0x8E89BED6,在广播、扫描、发起连接时使用。?数据接入地址:随机值,不同的连接有不同的值。在连接建立之后的两个设备间使用。对于数据信道,数据接入地址是一个随机值,但需要满足下面几点要求:1)数据接入地址不能超过6个连续的“0”或“1”。2)数据接入地址的值不能与广播接入地址相同。3)数据接入地址的4个字节的值必须互补相同。4)数据接入地址不能有超24次的比特翻转(比特0到1或1到0,称为1次比特翻转)。5)数据接入地址的最后6个比特需要至少两次的比特翻转。6)符合上面条件的有效随机数据接入地址大概有231个。报头广播报文报头报头的内容取决于该报文是广播报文还是数据报文。广播报文的报头如下图所示:图2:广播报文报头广播报文的报头包含4bit广播报文类型、2bit保留位、1bit发送地址类型和1bit接收地址类型。1)广播报文类型的2583页描述了广播报文类型,共有7种类型,如下图所示。图3:广播报文类型每种广播报文类型都具有不同的数据格式及行为。的2584页的节详细的描述了各个广播报文类型,大家可以阅读此章节进一步了解。2)发送地址类型和接收地址类型发送地址类型和接收地址类型指示了设备使用公共地址(PublicAddress)还是随机地址(RandomAddress)。公共地址和随机地址的长度一样,都包含6个字节共48位。BLE设备至少要拥有这两种地址类型中的一种,当然也可以同时拥有这两种地址类型。?公共地址(PublicAddress)公共地址由两部分组成,如下图。公共地址由制造商从IEEE申请,由IEEE注册机构为该制造商分配的机构唯一标识符OUI(OrganizationallyUniqueIdentifier)。这个地址是独一无二,不能修改的。的节描述了公共地址。图4:公共地址结构?随机地址随机地址有包含两种:静态地址(StaticDeviceAddress)和私有地址(PrivateDeviceAddress)。的节描述了静态地址。图5:静态地址格式静态地址有如下要求:a)静态地址的最高2位有效位必须是1。b)静态地址最高2位有效位之外的其余部分不能全为0。c)静态地址最高2位有效位之外的其余部分不能全为1。在私有地址的定义当中,又包含了两个子类:不可解析私有地址(Non-resolvablePrivateAddress)和可解析私有地址(ResolvablePrivateAddress,RPA)。nRF51822使用的是静态地址,芯片在出厂时已经设置好了48位地址,我们可以从下面两个寄存器读出地址类型和地址。a)DEVICEADDRTYPE寄存器。DEVICEADDR[n]寄存器:包含DEVICEADDR[0]和DEVICEADDR[1]两个寄存器。图6:地址类型寄存器图7:地址寄存器长度?广播报文:长度域包含6个比特,有效值的范围是6~37。?数据报文:长度域包含5个比特,有效值的范围是0~31。广播报文和和数据报文的长度域有所不同,主要原因是:广播报文除了最多31个字节的数据之外,还必须要...