清泛IT社区

标题: BLE(二)信道&数据包&协议栈格式 [打印本页]

作者: App Inventor 2     时间: 2024-02-05 11:23
标题: BLE(二)信道&数据包&协议栈格式
文章源自:https://www.gandalf.site/2018/11/ble_23.html


参考低功耗蓝牙(BLE)安全初探
0x1 信道BLE的物理通道即“频道,分别是‘f=2402+k*2 MHz, k=0, … ,39’,带宽为2MHz”的40个RF Channel。
其中,有3个信道是advertising channel(广播通道),分别是37、38、39,用于发现设备(Scanning devices)、初始化连接(initiating a connection)和广播数据(broadcasting date);
剩下的37个信道为data channel(数据通道),用于两个连接的设备间的通讯。
0x2 BLE数据包格式在低功耗蓝牙规范中,分广播报文和数据报文这两种。设备利用广播报文发现、连接其它设备,而在连接建立之后,便开始使用数据报文。无论是广播报文还是数据报文,链路层只使用一种数据包格式,它由“前导码”(preamble)、“访问码”(access code)、”有效载荷“和”循环冗余校验“(Cyclical Redundancy Check,CRC)校验码组成。其中,”访问码“有时又称为”访问地址“(access address)


  • Preamble
    1个字节长度,接受中用于频率同步、数据速率同步、自动增益控制调整,固定为01010101或者10101010序列
  • Access Address
    4个字节长度,广播报文接入地址为:0x8E89BED6,数据报文接入地址为:32bits随机数
  • PDU
    • 广播报文(见协议BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] Part B 2.3)

      • PDU Type:有效载荷内容的类型,通过这一字段确定该数据包是一个”通告“还是”扫描请求“或”响应“等

      • RFU 保留位
      • TxAdd:发送地址字段
      • RxAdd:接收地址字段
      • Payload Length:用来表示”有效载荷数据“(payload data)的长度,不包括头部内容
    • 数据报文(见协议BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] Part B 2.4)






    • LLID(逻辑链路ID):0x01表示该数据包是一个帧的延续内容,或者这是一个空的“逻辑链路控制及适配协议”数据包;0x02表示一个“逻辑链路控制及适配协议”数据包的开始;0x03表示这是一个“逻辑链路控制”数据包的内容
    • NESN:下一个期望的序列号,用于对接收到的数据包进行确认
    • MD:更多数据字段,主要是为了说明发送方是否还有要发给接收者的数据
    • RFU 保留位
    • Payload Length:用以表示包含“信息完整性校验码”(Message Integrity Check,MIC)在内的“有效载荷数据”的长




CRC
3个字节长度,“循环冗余校验”(Cyclical Redundancy Check,CRC),可检查数据的正确性
0x3 BLE协议栈BLE协议栈的结构图如下所示:



各个结构简述:
0x31 Physical Layer任何一个通信系统,首先要确定的就是通信介质(物理通道,Physical Channel),BLE也不例外。在BLE协议中,“通信介质”的定义是由Physical Layer(其它通信协议也类似)负责。
Physical Layer是这样描述BLE的通信介质的:
由于BLE属于无线通信,则其通信介质是一定频率范围下的频带资源(Frequency Band);
BLE的市场定位是个体和民用,因此使用免费的ISM频段(频率范围是2.400-2.4835 GHz);
为了同时支持多个设备,将整个频带分为40份,每份的带宽为2MHz,称作RF Channel。
所以经过上面的定义之后,可以推测出BLE的物理通道,即“频道分别是‘f=2402+k*2 MHz, k=0, … ,39’,带宽为2MHz”的40个RF Channel。其中,有3个信道是advertising channel(广播通道),分别是37、38、39,用于发现设备(Scanning devices)、初始化连接(initiating a connection)和广播数据(broadcasting date);剩下的37个信道为data channel(数据通道),用于两个连接的设备间的通讯。


0x32 Link LayerLink Layer用于控制设备的射频状态,设备将处于Standby(待机)、Advertising(通告)、Scanning(扫描)、Initiating(初始化)、Connection(连接)这五种状态中的一种。



0x33 HCI主机控制接口层(Host Controller Interface,简写 HCI):定义Host(主机)和Controller(控制器)之间的通信协议,这一层可以是软件或者硬件接口,如UART、SPI、USB等。
0x34 Generic Access Profile(GAP)前面Link Layer虽然对连接建立的过程做了定义,但它并没有体现到Application(或者Profile)层面,而GAP则是直接与应用程序或配置文件通信的接口,它实现了如下功能:
0x35 Logical Link Control and Adaptation Protocol(L2CAP Protocol)逻辑链路控制及自适应协议层(Logical Link Control and Adaptation Protocol):为上层提供数据封装服务,允许逻辑上的点对点数据通信。
0x36 Security Manager(SM)Security Manager负责BLE通信中有关安全的内容,包括配对(pairing,)、认证(authentication)和加密(encryption)等过程。
0x37 Attribute protocol(ATT)在BLE协议栈中,Physical Layer负责提供一系列的Physical Channel;基于这些Physical Channel,Link Layer可在两个设备之间建立用于点对点通信的Logical Channel;而L2CAP则将这个Logical Channel换分为一个个的L2CAP Channel,以便提供应用程序级别的通道复用。到此之后,基本协议栈已经构建完毕,应用程序已经可以基于L2CAP欢快的run起来了。
谈起应用程序,就不得不说BLE的初衷——物联网。物联网中传输的数据和传统的互联网有什么区别呢?抛开其它不谈,物联网中最重要、最广泛的一类应用是:信息的采集。
这些信息往往都很简单,如温度、湿度、速度、位置信息、电量、水压、等等。
采集的过程也很简单,节点设备定时的向中心设备汇报信息数据,或者,中心设备在需要的时候主动查询。

基于信息采集的需求,BLE抽象出一个协议:Attribute protocol,该协议将这些“信息”以“Attribute(属性)”的形式抽象出来,并提供一些方法,供远端设备(remote device)读取、修改这些属性的值(Attribute value)。
Attribute Protocol的主要思路包括:
0x38 Generic Attribute profile( GATT)ATT之所以称作“protocol”,是因为它还比较抽象,仅仅定义了一套机制,允许client和server通过Attribute的形式共享信息。至于具体共享哪些信息,ATT并不关心,这是GATT(Generic Attribute Profile)的主场。GATT相对ATT只多了一个‘G‘,然含义却大不同,因为GATT是一个profile(更准确的说是profile framework)。



由上图可知,GATT中的三个要素Profile、Service、Characteristic以及他们的层级关系。值得注意的是,“Profile”是基于GATT所派生出的真正的Profile,乃SIG蓝牙技术联盟对一些同范畴内的Service打包后的集合,如电池、心率、血压等,可参照官方Profiles Overview,对分析并无大用。
Service和Characteristic则是比较重要的,Service可以理解为PHP中的“类”、功能对象的集合。Characteristic可以理解为PHP的“函数”,是GATT中具体的功能对象,每个Service都可以包含一个或多个Characteristic(特征)。Characteristic是GATT profile中最基本的数据单位,由一个Properties、一个Value、一个或者多个Descriptor组成。
以上除“Profile”外的每一个定义,Service、Characteristic、Characteristic Properties、Characteristic Value、Characteristic Descriptor等等,都是作为一个Attribute存在的,具备前面所描述的Attribute的所有特征:Attribute Handle、Attribute Types、Attribute Value和Attribute Permissions。
在理解了GATT后,就已经能够分析或是“黑掉”一些BLE设备了。这里拿小米手环做例子,当LightBlue连上小米手环后,可以看到一个名为FEE7的UUID,如下所示:


其中,FEE7是一个私有Service的UUID,里面的0xFE**则是私有Characteristic的UUID。下面的Immediate Alert 显示出了名称,代表其不是小米私有的Service,而是官方公开定义的Service。点击进入这个Characteristic,看到它的UUID为2A06。然后我们到蓝牙官网定义的列表Characteristics搜索2A06,进入Characteristic的详情页面。

于是,该Characteristic操作定义非常明确了。点击“Write new value”,可以写入新的值。若写入1或2,则可以引起手环的震动。







欢迎光临 清泛IT社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3