Bluetooth 报文知识点

阅读目录

    一、 Bluetooth报文结构

   1、 BLE报文结构如下,由下图所示的各个域组成。因为有的域的长度超过了一个字节,所以在传输的过程中就涉及到多字节域中哪个字节先传输的问题,BLE报文传输时的字节序和比特序如下:

  •  字节序:大多数多字节域是从低字节开始传输的。注意,并不是所有的多字节域都是从低字节开始传输的。

  •  比特序:各个字节传输时,每个字节都是从低位开始。

       

      1.1 前导

  前导是一个8比特的交替序列。它不是01010101就是10101010,取决于接入地址的第一个比特。

  • 若接入地址的第一个比特为0:01010101
  • 若接入地址的第一个比特为1:10101010

  接收机可以根据前导的无线信号强度来配置自动增益控制。

       1.2 接入地址

  接入地址有两种类型:广播接入地址和数据接入地址。

  • 广播接入地址:固定为0x8E89BED6,在广播、扫描、发起连接时使用。

  • 数据接入地址:随机值,不同的连接有不同的值,在连接建立之后的两个设备间使用。

     对于数据信道,数据接入地址是一个随机值,但需要满足下面几点要求:

         1)  数据接入地址不能超过6个连续的“0”或“1”。

         2)  数据接入地址的值不能与广播接入地址相同。

         3)  数据接入地址的4个字节的值必须互补相同。

         4)  数据接入地址不能有超24次的比特翻转(比特0到1或1到0,称为1次比特翻转)。

         5)  数据接入地址的最后6个比特需要至少两次的比特翻转。

         6)  符合上面条件的有效随机数据接入地址大概有231个。

      1.3 报头

         1.3.1 广播报文报头

          报头的内容取决于该报文是广播报文还是数据报文。广播报文的报头如下图所示:

                    

                                                            图2:广播报文报头

 

         广播报文的报头包含4bit广播报文类型、2bit保留位、1bit发送地址类型和1bit接收地址类型。

        1) 广播报文类型

        Core_v4.2的2583页描述了广播报文类型,共有7种类型,如下图所示。

         

                                                               图3:广播报文类型

       2) 发送地址类型和接收地址类型

  发送地址类型和接收地址类型指示了设备使用公共地址(Public Address)还是随机地址(Random Address)。公共地址和随机地址的长度一样,都包含6个字节共48位。BLE设备至少要拥有这两种地址类型中的一种,当然也可以同时拥有这两种地址类型。

  •  公共地址(Public Address)

      公共地址由两部分组成,如下图。公共地址由制造商从IEEE申请,由IEEE注册机构为该制造商分配的机构唯一标识符OUI(Organizationally Unique Identifier)。这个地址是独一无二,不能修改的。Core_v4.2 P2576的1.3.1节描述了公共地址。

                         

                                                                                                           图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:地址寄存器

      1.4 长度

  •   广播报文:长度域包含6个比特,有效值的范围是6~37。
  •   数据报文:长度域包含5个比特,有效值的范围是0~31。

      广播报文和和数据报文的长度域有所不同,主要原因是:广播报文除了最多31个字节的数据之外,还必须要包含6个字节的广播设备地址。6+31=37,所以需要6比特的长度域。

      再次强调:广播时必须要包含6个字节的广播设备地址

 

     1.5 数据(AdvData)

      广播和扫面响应的数据格式如下图所示,由有效数据部分和无效数据部分组成。

         

                                                                               图8:广播和扫描响应的数据格式

     1)  有效数据部分:包含N个AD Structure,每个AD Structure由Length,AD Type和AD Data组成。其中:

  • Length:AD Type和AD Data的长度。
  • AD Type:指示AD Data数据的含义。

     1.6 校验 

      BLE采用的是24位CRC校验。CRC对报头、长度和数据进行计算。24位CRC的生成多项式如下:

      

 2.  广播包解析

     2.1 捕获广播包

         

                                                                                   图11:查看广播包传输的数据

     2.2 分析广播包

        为了方便分析,我们先取出这个广播包实际传输的数据,如图9中所示。心率计完整的广播报文如下:

  D6 BE 89 8E 40 21 60 BF 8A B9 CD C5 0B 09 4E 6F 72 64 69 63 5F 48 52 4D 03 19 41 03 02 01 06 07 03 0D 18 0F 18 0A 18 EF A6 F0

      2.2.1  接入地址

       D6 BE 89 8E:接入地址,对广播来说是固定值。注意一下这里的字节序,接入地址传输时是低字节在前的。

      2.2.2  PDU

            40:广播报文报头。

                    bit0~bit3是0000,说明广播类型是ADV_IND,即通用广播指示。

                    bit7(RxAdd)是0,bit7(TxAdd)是1,说明使用的是随机地址(random address)。Core_V4.2 P2584的2.3.1有详细的描述。

            21:长度,表示这个广播的长度是33个字节。

            9A 3F 20 FB 74 C5:设备地址,这里使用的是随机静态地址。

            接下来就是广播包最重要的部分了,称之为AdvData,前面我们说过AdvData是N个AD Structure组层成,每个AD Structure的格式都是Length |AD Type|AD Data组成。

             0B 09 4E 6F 72 64 69 63 5F 48 52 4D 03 19 41 03 02 01 06 07 03 0D 18 0F 18 0A 18

            第一个字节0B表示第一个AD Structure的长度是11个字节,即第一个AD Structure是由0B加上紧跟着0B后面的11个字节组成,因此,第一个AD Structure是:

            0B 09 4E 6F 72 64 69 63 5F 48 52 4D

                                                                                                                                         表1:第1个AD Structure的意义

Length

AD Type

AD Data

0B

09

4E 6F 72 64 69 63 5F 48 52 4D

11字节

AD type为“完整的本地名称”

程序中定义的为”Nordic_HRM”对应的十六进制就是4E 6F 72 64 69 63 5F 48 52 4D

              第2个AD Structure是:03 19 41 03

                                                                                                                                          表2:第2个AD Structure的意义

Length

AD Type

AD Data

03

19

41 03

3字节

AD type为“外观特性”

外观特性是一个16位的数值,由SIG定义,用来列举设备的外观样式,指示设备是普通手机,手环什么的。

             第3个AD Structure是:02 01 06

                                                                                                                                           表3:第3个AD Structure的意义

Length

AD Type

AD Data

02

01

06

2字节

AD type为“Flag”

flag说明了物理连接功能,比如有限发现模式,不支持经典蓝牙等。

        bit 0: LE 有限发现模式。

        bit 1: LE 普通发现模式。

        bit 2: 不支持 BR/EDR。

        bit 3: 对 Same Device Capable(Controller) 同时支持 BLE 和 BR/EDR。

        bit 4: 对 Same Device Capable(Host) 同时支持 BLE 和 BR/EDR。

bit 5..7: 预留。

            第4个AD Structure是:07 03 0D 18 0F 18 0A 18

                                                                                                                                          表4:第4个AD Structure的意义

Length

AD Type

AD Data

07

03

0D 18 0F 18 0A 18

7字节

AD type为“16bit Service uuid列表”

该设备支持的完整的16bit Service uuid列表。

      180D:Heart Rate service UUID(心率服务UUID)

      180F:Battery service UUID(电池服务UUID)

      180A:Device Information service UUID(设备信息服务UUID)

         16bit UUID:

        128位的UUID相当长,设备间为了识别数据的类型需要发送长达16字节的数据。为了提高传输效率,蓝牙技术联盟(SIG)定义了一个称为“UUID基数”的128位通用唯一识别码,结合一个较短的16位数使用。二者仍然遵循通用唯一识别码的分配规则,只不过在设备间传输常用的UUID时,只发送较短的16位版本,接收方收到后补上蓝牙UUID基数即可。

         蓝牙UUID基数如下:

          00000000 – 0000 – 1000 – 8000 – 008059B34FB

          如要发送的16位UUID为0x2A01,完整的128的UUID便是:

         00002A01 – 0000 – 1000 – 8000 – 008059B34FB

          低功耗蓝牙使用的那部分UUID被分为下列几组:

          0x1800 ~ 0x26FF:用作服务类通用唯一识别码。

          0x2700 ~ 0x27FF:用于标识计量单位。

          0x2800 ~ 0x28FF:用于区分属性类型。

          0x2900 ~ 0x29FF:用作特性描述。

          0x2A00 ~ 0x7FFF:用于区分特性类型。

 

      2.2.3 校验

    EF A6 F0:24位CRC。24位CRC的生成多项式如下,对CRC算法感兴趣的朋友可以研究一下:

   

 

posted @ 2018-05-22 17:34  kevinYN  阅读(2163)  评论(0编辑  收藏  举报