• 5.BLE---报文


    1.报文种类

    有两类报文:广播报文和数据报文

    广播报文:发现连接其他设备。

    数据报文:建立连接后开始使用数据报文。

    2.报文通用数据包格式

    无论是广播报文还是数据报文,链路层只使用一种数据包格式。

    2.1 Preamble 前导

    报文最开始的 8bits 是 01010101 或者 10101010 序列。
    接收机可以用·它来配置自动增益控制,以及确定"0" 、 "1" 比特所使用的频率。

    2.2 广播报文之Access Address
    广播报文接入地址为: 0x8E89BED6

    2.3 PDU 报文

    PDU报文分为两种,广播报文与数据报文。(本章第3节,第4节 有详细介绍)。

    2.4 CRC 校验

    • PDU被加密,然后在执行PDU加密之后计算CRC。
    • 24 位 CRC 校验可以检测所有奇数位错误,以及 2 位或 4 位错误。

    生成多项式如下:

    CRC=x24+x10+x9+x6+x4+x3+x1+x0

    3.PDU 报文—广播报文

    3.1 广播报文结构(PDU)

    Header 结构:

    3.2 广播报文之PDU Type

               

    PDU类型

    PDU格式(payload)

    说明

    Advertising

    ADV_IND

    AdvA(6 octets)
    AdvData(0~31 octets)

    connectable undirected advertising event,用于常规的广播,可携带不超过31bytes的广播数据,可被连接,可被扫描
    AdvA,6bytes的广播者地址,并由PDU Header的TxAdd bit决定地址的类型(0 public,1 random);
    AdvData,广播数据。

            

    ADV_DIRECT_IND

    AdvA(6 octets)
    InitA(6 octets)

    connectable directed advertising event,专门用于点对点连接,且已经知道双方的蓝牙地址不可携带广播数据,可被指定的设备连接,不可被扫描
    AdvA,6bytes的广播者地址,并由PDU Header的TxAdd bit决定地址的类型(0 public,1 random);
    InitA,6bytes的接收者(也是连接发起者)地址,并由PDU Header的RxAdd bit决定地址的类型(0 public,1 random)。

            

    ADV_NONCONN_IND

    AdvA(6 octets)
    AdvData(0~31 octets)

    和ADV_IND类似,但不可以被连接,不可以被扫描。

            

    ADV_SCAN_IND

    AdvA(6 octets)
    AdvData(0~31 octets)

    和ADV_IND类似,但不可以被连接,可以被扫描

    Scanning

    SCAN_REQ

    ScanA(6 octets)
    AdvA(6 octets)

    当接收到ADV_IND或者ADV_SCAN_IND类型的广播数据的时候,可以通过该PDU,请求广播者广播更多的信息
    ScanA,6bytes的本机地址,并由PDU Header的TxAdd bit决定地址的类型(0 public,1 random);
    AdvA,6b 地址,并由PDU Header的RxAdd bit决定地址的类型(0 public,1 random)。

            

    SCAN_RSP

    AdvA(6 octets)
    ScanRspData(0~31 octets)

    广播者收到SCAN_REQ请求后,通过该PDU响应,把更多的数据传送给接受者
    AdvA,6bytes的广播者地址,并由PDU Header的TxAdd bit决定地址的类型(0 public,1 random);
    ScanRspData,scan的应答数据。

    Initiating

    CONNECT_REQ

    InitA (6 octets)
    AdvA (6 octets)
    LLData (22 octets)

    当接收到ADV_IND或者ADV_DIRECT_IND类型的广播数据的时候,可以通过该PDU,请求和对方建立连接:
    InitA,6bytes的本机地址,并由PDU Header的TxAdd bit决定地址的类型(0 public,1 random);
    AdvA,6bytes的广播者地址,并由PDU Header的RxAdd bit决定地址的类型(0 public,1 random);
    LLData,BLE连接有关的参数信息,具体请参考本文第5小节。

                 

    4.PDU 报文—数据报文

    4.1 数据报文结构

    对于 Data PDU 而言,其 Length 取值范围为 0~255(单位 byte), Data 部分的结构与 Header字段( Advertising PDU Type)相关,如下图所示

         

    4.2 Data PDU Header

    Data PDU Header由以下 6 部分组成,

    • LLID2bit,指示了该 PDU 的类型,
    • NESN1bit, 指示 ACK/NACK 信息,详见 63.3小节
    • SN1 bit, 指示该 PDU 为新传还是重传,详见 第6章3.3小节
    • MD1 bit,指示发送 PDU BLE 终端是否还有数据需要发送
    • Rsv3 bit,保留位
    • Length8bit,指示 PDU Data 部分的长度

    4.2.1 LLID

    Header中的LLID=01b时

    这种类型的PDU,要么是一个未传输完成L2CAP message(长度超过255,被拆包,此时不是第一个),要么是一个空包(Header中的Length为0)。

    Header中的LLID=10b时

    这种类型的PDU,要么是L2CAP message的第一个包,要么是不需要拆包的完整的L2CAP message,无论哪种情况,Header中的Length均不能为0。

    Header中的LLID=11b时

    表示这个数据包是用于控制、管理LL连接的LL control PDU。(详细介绍在本章第7小结)

               

    5. LLData

    当接收到ADV_IND或者ADV_DIRECT_IND类型的广播数据的时候,可以通过该PDU(包含LLData),请求和对方建立连接。LLData在本文3.2章节CONNECT_REQ类型介绍中被提及,主要包含BLE连接有关的参数信息。

               

    5.1 AA (4 octets)

    AA字段应包含链路层连接的访问地址。(详细介绍参考本文第6章节)

    5.2 CRCInit (3 octets)

    • CRCInit字段应包含链路层连接的CRC计算的初始化值, 它应该是由链路层生成的随机值。
    • 对于每个数据通道PDU,移位寄存器应预设为链路层连接设置的CRC初始化值。
    • 对于每个广告信道PDU,移位寄存器应预设为0x555555。
    • 数据发送时,从位置23发送到位置0。

    5.3 WinSize (1 octet)

    • 全称是transmitWindowSize和transmitWindowOffset,用于决定连接双方收发数据的时间窗口。
    • WinSize,即传输窗口信息,用于指示transmitWindowSize取值。
    • transmitWindowSize =WinSize * 1.25 ms
    • transmitWindowSize用途在第6章有详细介绍。

    5.4 WinOffset (2 octets)

    • 即 传 输 窗 口 偏 移 信 息 , 用 于 指 示 transmitWindowOffset 取 值 ,transmitWindowOffset = WinOffset*1.25ms
    • WinOffset用途在第6章有详细介绍。

    5.5 Interval (2 octets)

    1. 两个设备在切换信道后发送和接收数据称为一个连接事件。
    2. 尽管没有应用数据被发送和接收,两个设备仍旧会交换链路层数据(空包 EmptyPDU)来维持连接。
    3. 这个连接间隔就是指在一个连接事件(Connectionevents)的开始到下一个连接事件(Connectionevents)的开始的时间间隔。
    4. 连接间隔以1.25ms为单元,连接间隔的范围是6~3200既7.5ms~4s之间。
    • Interval,即 ConnInterval 信息, ConnInterval= Interval *1.25ms
    • ConnInterval 在第1章和第6章均有介绍
    1. Latency (2 octets)

    1. 允许Slave(从设备)在没有数据要发的情况下,跳过一定数目的连接事件(Connectionevents)
    2. 在这些连接事件(Connectionevents)中不必回复Master(主设备)的包,这样就能更加省电。
    3. 范围可以是0 ~ 499
    4. SlaveLatency=OFF也就是SlaveLatency为0时,Master发包,Slave必须回复,如果不回复,Master就会认为Slave那边接收不正常
    5. SlaveLatency=ON也就是SlaveLatency不为0的时候,图中SlaveLatency为3。Master发包,Slave没有数据要回复的时候,就会忽略3个连接事件,在第4个连接事件接收到Master发送的数据之后,回复Master。
    6. 如果Slave有数据要发送就会唤醒,也就是说即使SlaveLatency为3,但是在Master发第二包的时候Slave有数据要回复,这个时候就会立即回复Master而不是等到3个连接事件之后的第4个连接事件去回复。
    • Latency,即 connSlaveLatency 信息, connSlaveLatency = Latency
    • 在第1章和第6章均有介绍

    5.7 Timeout (2 octets)

    •  这个参数设定了一个超时时间,如果BLE在这个时间内没有发生通信的话,就会自动断开。
    • 单位是10ms,该变量的范围是10 ~ 3200,折算成时间范围是100ms ~ 32s。
    • SupervisionTimeout >(1+slaveLatency)*(connectionInterval)
    • 在第1章和有介绍

    5.8 ChM (5 octets)

    • ChM的全称是Channel map,用于标识当前使用和未使用的Physical Channel。Hop的全称是hopIncrement,它和ChM一起决定了数据传输过程中的跳频算法。
    • 建立连接后有哪些channel是可以被使用的,有哪些channel是不可用的。
    • 具体用法参考第7章跳频原理。

    5.9 Hop (5 bits)

    • hop表示跳数,表示跳频每次的跳频的间隔。
    • 具体用法参考第7章跳频原理。

    5.10 SCA (3 bits)

    • SCA,即 Master 的时钟精度信息 masterSCA,由 Master 自身时钟性能确定,取值范围 0~7
    • 具体用法参考第6章2.3 小结 误差的考虑。     

    6. Access Address

    6.1 设计目的

    避免同一频道下不同设备下的干扰。

    6.2 Access Address说明

    • Access Address放在封包中。用于识别该physical channel下向哪一个设备发packet,这样某时刻工作在同一physical channel的设备就不至于packet混乱。
    • 从封包的Link Layer info能够看到每一个封包的确都有一个Access Address,Adv_pkt有一个固定Access Address(详见本文2.2章节)。而intiator发con_req时会包括一个con_Access_Addr(包含在本章5.1 AA 中)。连接之后的data pkt都是用的这个新的Access Addr了。
    • 每次又一次断开建立连接,Access Address会不一样。

    6.3 con_Access_Addr

    • 任何两个设备间的con_Access_Addr都应该是不同的。
    • 该地址在设备启动状态下随机生成(32bit)。
    • 在con_req时第一次使用(包含在本章5.1 AA 中),之后所有的数据包都用这个地址。

    6.4 Access Address遵循规则

    数据报文接入地址为: 32bits 随机数

    数据报文规则:

    • 不能出现 6 个连续的"0" 或"1" ;
    • 不等于 0x8E89BED6;
    • 与"0x8E89BED6" 不能只有一位不同
    • 4 个字节不能相等;
    • 不能有超过 24次比特翻转;
    • 最后 6 比特至少有 2 次比特翻转。

    符合规则的大概有 231 个。

    7.LL control PDU

    7.1 LL control PDU简介

    Header中的LLID=11b时(见本章4.2.1),表示这个数据包是用于控制、管理LL连接的LL control PDU。LL control PDU的payload的格式如下:

    7.2 LL control PDU结构

    数据报文结构:

        Header中的LLID=11b时LL control PDU的payload的格式如下:

     

         

    7.3 控制帧类型列表

             

    操作码

    控制帧名称

    解释

    0x00 

    LL_CONNECTION_UPDATE_REQ 

    更新连接参数

    0x01 

    LL_CHANNEL_MAP_REQ 

    设置跳频范围(37、38、39保留)

    0x02 

    LL_TERMINATE_IND 

    指示连接中断的原因

    0x03 

    LL_ENC_REQ 

    加密请求

    0x04 

    LL_ENC_RSP 

    加密回复

    0x05 

    LL_START_ENC_REQ 

    加密请求

    0x06 

    LL_START_ENC_RSP 

    加密回复

    0x07 

    LL_UNKNOWN_RSP 

    未知操作码指示

    0x08 

    LL_FEATURE_REQ 

    请求支持的特性

    0x09 

    LL_FEATURE_RSP 

    回复支持的特性

    0x0A 

    LL_PAUSE_ENC_REQ 

    暂停加密请求

    0x0B 

    LL_PAUSE_ENC_RSP 

    暂停加密回复

    0x0C 

    LL_VERSION_IND

    指示controller版本和公司信息

    0x0D 

    LL_REJECT_IND 

    拒绝控制命令指示

    0x0E 

    LL_SLAVE_FEATURE_REQ 

    NA 

    0x0F 

    LL_CONNECTION_PARAM_REQ 

    连接参数请求

    0x10 

    LL_CONNECTION_PARAM_RSP 

    连接参数回复

    0x11 

    LL_REJECT_IND_EXT 

    扩展拒绝控制命令指示

    0x12 

    LL_PING_REQ 

    简单通讯,验证通讯

    0x13 

    LL_PING_RSP 

    简单通讯,验证通讯

    0x14 

    LL_LENGTH_REQ

    请求发送接收的字节和交互时间(27~251bytes、328~2120ms)

    0x15 

    LL_LENGTH_RSP 

    0x16 

    LL_PHY_REQ 

    指定发送接收方的PHY类型

    0x17 

    LL_PHY_RSP 

    指定发送接收方的PHY类型

    0x18 

    LL_PHY_UPDATE_IND 

    Master和slave的PHY类型

    0x19 

    LL_MIN_USED_CHANNELS_IND 

    设置使用的LE PHY类型和信道

    0x1A~FF 

    Reserved for Future Use 

    保留未来使用

    7.4 LL_CONNECTION_UPDATE_REQ 更新连接参数

     

    • 前5个参数说明参考本章5.2
    • Instant: 指示新参数生效的 connEventCount
    • Instant具体用法参考第6章3.2小结。

    7.5 LL_CHANNEL_MAP_REQ 设置跳频范围(37、38、39保留)

    • Chm 可用频道映射表,具体用法参考第7章跳频原理。
    • Instant: 指示新参数生效的 connEventCount。     
    • Instant具体用法参考第6章3.2小结。

    7.6 LL_TERMINATE_IND 指示连接中断的原因

    • 具体参考第八章

    7.7 LL_ENC_REQ 加密请求

    • Rand,由 Master Host 提供的随机数, Encryption 使用。
    • EDIVEDIV 值, Encryption 使用。
    • IVmMaster 使用的 IVm值, Encryption 使用
    • 在加密会话设置期间,主设备在配对期间将从设备分发的16位加密分集器值EDIV和64位随机数Rand发送到从设备。 主机的Host为链路层提供在设置加密会话时使用的长期密钥。 从机的Host接收EDIV和Rand值,并为从属链路层提供长期密钥,以便在设置加密链路时使用。 当两个设备都支持LE Secure Connections时,EDIV和Rand设置为零。 详细参考11章

    7.8 LL_ENC_RSP 加密回复

    • SKDsSlave 使用的 SKD 值, Encryption 使用
    • IVsSlave 使用的 IV 值, Encryption 使用

    7.9 LL_START_ENC_REQ/LL_START_ENC_RSP 加密请求/回复

    The LL_START_ENC_REQ PDU does not have a CtrData field.
    The LL_START_ENC_RSP PDU does not have a CtrData field

    7.10 LL_UNKNOWN_RSP未知操作码指示

     

     UnknownType应包含接收到的LL控制PDU的操作码字段值。

    7.11 LL_FEATURE_REQ/ LL_FEATURE_RSP 请求/回复支持的特性

     

     FeatureSet应包含主链路层支持的功能集。

    7.12 LL_PAUSE_ENC_REQ/ LL_PAUSE_ENC_RSP 暂停加密请求/回复

     The LL_PAUSE_ENC_REQ packet does not have a CtrData field

    7.13 LL_VERSION_IND 指示controller版本和公司信息

    • VerNr, Controller 对应的协议版本
    • CompId,制造该 BLE 终端的公司 ID
    • SubVersNr,该 BLE 终端的 Controller 版本号

    7.14 LL_REJECT_IND 拒绝控制命令指示

    7.15 LL_SLAVE_FEATURE_REQ 拒绝控制命令指示

    FeatureSet应包含从机链路层支持的功能集

    7.16 LL_CONNECTION_PARAM_REQ/ LL_CONNECTION_PARAM_RSP 连接参数请求/回复

    • Interval_Min:指示 connInterval 的最小值, connIntervalmin= Interval_Min*1.25ms
    • Interval_Max:指示 connInterval 的最大值, connIntervalmax= Interval_Max*1.25ms
    • PreferredPeriodicity : 指 示 期 望 的 connInterval 集 合 ,{connInterval}={ PreferredPeriodicity *k}
    • ReferenceConnEventCount:与 Offset0~5 一起指示新参数生效的时间点,取值范围 0~65535
    • Offset0~5:与 ReferenceConnEventCount 起指示新参数生效的时间点即可,单位为 1.25ms,从 Offset0 到 Offset5 优先级依次降低,取值范围 0~65535,取值 65535 表 示无效值
    • 其他字段:与 2.3.3.1 小节中的 LLData 一致。

       

    7.17 LL_REJECT_IND_EXT 扩展拒绝命令指示

    • RejectOpcode应包含被拒绝的LL控制PDU的操作码字段值。
    • 错误代码应包含LL控制PDU被拒绝的原因。
    • 仅当远程链路层支持扩展拒绝指示链路层功能时,才会发出此PDU。 否则,应发出LL_REJECT_IND PDU。

    7.18 LL_PING_REQ/ LL_PING_RSP

    • 支持时的LE Ping过程可以在链路层使用,以验证远程链路层的存在。
    • 该过程还可用于通过强制远程设备发送包含有效MIC的LE ACL数据包来验证LE ACL逻辑传输上的消息完整性。
    • 通过发送LL_PING_REQ PDU进入连接状态后,主链路层或从链路层可以随时启动此过程。
    • 响应的链路层以LL_PING_RSP PDU响应。
    • 发起链路层可以是主设备或从设备。

    7.19 LL_LENGTH_REQ / LL_LENGTH_RSP 发送接收的字节和交互时间

    • MaxRxOctets,发送该 PDU 的 BLE 终端支持的最大接收 PDU 长度,单位 byte
    • MaxRxTime,发送该 PDU 的 BLE 终端支持的最大接收 PDU 次数(初传和重传次 数总和)
    • MaxTxOctets,发送该 PDU 的 BLE 终端支持的最大发送 PDU 长度,单位 byte
    • MaxTxTime,发送该 PDU 的 BLE 终端支持的最大发送 PDU 次数(初传和重传次 数总和),单位 byte
    • 参数范围27~251bytes、328~2120ms

       

       

       

       

       

       

       

       

       

      

  • 相关阅读:
    并发编程 ~~~ 多进程~~~进程创建的两种方式, 进程pid, 验证进程之间的空间隔离, 进程对象join方法, 进程对象其他属性
    并发编程 ~~~ 多进程
    网络编程~~~~socketserver服务端
    网络编程~~~~粘包
    聊聊主流加密算法及该如何设计我们的用户密码
    Spring Boot Security 保护你的程序
    Spring Boot接口如何设计防篡改、防重放攻击
    Spring Boot 整合 Shiro实现认证及授权管理
    Spring Boot Quartz 分布式集群任务调度实现
    Spring Boot Redis 解析
  • 原文地址:https://www.cnblogs.com/yuqilihualuo/p/9549946.html
Copyright © 2020-2023  润新知