解析后的地址没有失效期,为避免丢失,请自行收藏网址!
后续也可以直接访问 代下牛 www.dxn666.cn 自助解析!

【Bluetooth蓝牙开发】六、BLE协议之传输层

img
个人主页:董哥聊技术
我是董哥,嵌入式领域新星创作者
创作理念:专注分享高质量嵌入式文章,让大家读有所得!
img

 
所有文章汇总
 

1、前言

ble_stack

上一节,我们了解了Link Layer层,我们接着往上看,链路层再往上就是传输层了。

传输层,正如其名,位于HostController层之间,提供一种无需知道详细数据内容便可传输数据的能力。

其主要通过硬件传输介质(如:UARTUSBSDIO等),传输Bluetooth上层数据。

下面是UART传输层的框图

image-20220616095944158

看完上面的图,我们大概就对传输层有了大概的了解了,下面详细分析一下。

HCI详细介绍,可查Core5.0 P670

img

2、HCI(Host Controller Interface)介绍

image-20220616112047915

上图,展示了两个设备之间的数据传输路径。Host通过HCI Driver驱动程序与Controller硬件上的HCI Firmware交换数据和命令,传输层就是提供了这样的能力。

 

传输层主要的作用

  • HCI提供了一种统一接口用来访问,控制Controller,传输层是透明的,独立于底层传输技术,并且无需关系Host传输给Controller的数据是什么内容.

  • HOSTController之间,以CommandEvent命令方式进行传输。Host发送Command信息到ControllerControllerCommand StatusParamsEvent的形式返回给Host,最后返回Command Complete Event表示连接完成。

更加直观一点,如下

image-20220725114046247

 

3、HCI 数据包类型

HCI有四种类型的包格式,分别是

image-20220616100206172

  • HCI Command Packet:由蓝牙协议栈发送给芯片的命令,即Host -> Controller
  • HCI Event Packet:由蓝牙芯片上报给蓝牙协议栈的事件,即Controller -> Host
  • HCI ACL Data Packet:蓝牙协议栈跟蓝牙芯片双向交互的普通数据。
  • HCI Synchronous Data Packet:蓝牙协议栈跟蓝牙芯片双向交互的普通数据。

详细见Core5.0.pdf P670

 

HostController之间,HCI的命令和事件类型如下:

详细见Core5.0.pdf P647

image-20220616113829611

 

4、HCI 数据包格式

上面我们已经了解了HCI通信包的类型有四种,下面我们来逐个分析:

 

4.1 HCI Command Packet

HCI Command Packet用于Host发送命令给Controller控制器。

包格式如下:

image-20220709164110808

 

OpCode字段

OpCode:占里两个字节,用于命令标识,分为两个域:OCF:OpCode Group FieldOGF OpCode Command Field

  • OGF:占据高6bit,对应不同类别的蓝牙命令
  • OCF:占据低10bit,对应某一类别下的唯一的蓝牙命令,其中0X3F为制造商的调试命令.

形象一点理解:OGF表示你在班级中是第几组的人,OCF表示你在组中是第几号,O(∩_∩)O

image-20220709165044464

 

Paramter_Total_Length字段

Paramter_Total_Length:包中所有参数的长度。

image-20220709165255001

 

Paramter字段

image-20220709165338177

这个Paramter,每一组命令要求的参数都不一样,所以根据实际情况来选择。

 

4.2 HCI Event Packet

每个Command命令发出之后,对返回的参数要求不同,根据不同的返回参数要求,返回指定的数据。

包格式如下:

image-20220709170234334

 

Event_Code字段

Event_Code:标识不同的事件类型。

image-20220726135028826

 

Parameter_Total_Length字段

Parameter_Total_Length:参数总长度

image-20220726135128164

 

Event_Parameter字段

Event_ParameteN:相关参数,与上文一样,每个命令有不同的参数返回。

image-20220726135231895

 

4.3 HCI ACL Data Packets

HCI ACL Data Packets规定了数据包的格式,用于HostController之间的数据交换。

 

数据包有两种类型

  • Automatically-Flushable:自动刷新

自动刷新包,其自动刷新的时间取决于设定的时间。

  • Non-Automatically-Flushable:非自动刷新

非自动刷新,则不会自动刷新数据包。

 

包格式如下:

image-20220711144423329

 

Handle字段

Handle逻辑链路的通道的标识,这里分为三类:Connection_Handles, Logical Link Handles, 和Physical Link Handles

Connection_Handles:被Primary Controller Handles分配,标识主机和主控制器之间的逻辑通道,当一个新的逻辑链路被建立的时候,Connection_Handles会被分配。

Handle主要被用在:Connection Complete, Synchronous Connection Complete, LE Connection Complete, or LE Enhanced Connection CompleteEvent事件中。

Host在第一次上电或者重启的时候,第一次发送HCI数据包,此时分配一个Connection_Handle。此后,使用该Handle去广播。

 

AMP Controllers包括两种:Logical Link Handles, 和Physical Link Handles

对于HostAMP Controller之间的 DataCommandEvent操作,如果Physical Link Handles被指定,则使用该Handle,如果未被指定,则在指定Connection_Handle的地方使用Logical Link Handles

在这里不对AMP作详细说明。

 

Flag 字段

Flag包括:PB FlagBC Flag,即Packet_Boundary_FlagBroadcast_Flag,取值如下:

image-20220711144932128

image-20220711145000500

 

4.4 HCI Synchronous Data Packets

该数据包,被用于在HostController之间交换同步数据。

 

包格式如下:

image-20220726140451177

 

Packet_Status_Flag字段

该字段与Erroneous_Data_Reporting参数有关:

  • 如果Erroneous_Data_Reporting参数设置为disable,则Packet_Status_Flag字段设置为00
  • 如果Erroneous_Data_Reporting参数设置为enable,则Packet_Status_Flag字段依据下面表格设置

image-20220726140725789

 

Data_Total_Length字段

image-20220726140801639

这一部分,只需要知道HCI包的四种类型即可,会对照抓出来的HCI包分析数据就OK啦!

 

5、HCI连接包示例

HCI连接命令流程:

1)蓝牙协议栈向芯片发送连接命令:HCI Connect command

2)蓝牙芯片上报命令状态到蓝牙协议栈:HCI Command Complete

3)连接成功后,蓝牙芯片上报蓝牙协议栈连接成功事件:HCI LE Connect complete

 

5.1 HCI Connect command

Core5.0 P774

该命令用于让Link Manager链路管理器去连接远程设备。

连接command封包格式如下:

img

  • OCF:这里可以看到OCF的值,那么OGF值为多少呢?

    打开Core5.0 P774,我们可以看到HCI_Create_Connection命令属于LINK CONTROL COMMANDS链路控制命令组,该组OGF为0x01。详见Core5.0 P766

    For the Link Control commands, the OGF is defined as 0x01.

  • BD_ADDR:要连接的remote设备的蓝牙地址,6个字节。

  • Packet_Type:支持的数据封包类型,2个字节。

image-20220711150027292

  • Page_Scan_Repetition_Mode:是否重复扫描

image-20220711150117317

  • Clock_Offset:主从设备之间的时钟偏移。

image-20220711150202500

  • Allow_Role_Switch:是否支持主从角色转换

image-20220711150249816

 

5.2 Command Complete Event

Controller接收到Create_Connection命令,会发送一个Command Complete 事件给Host

事件格式如下

image-20220727113217181

该事件被用于大多数命令发送后的状态返回。

  • Event Code:事件代码

  • Num_HCI_Command_Packets:设置Host可以发送给Controller的命令包的个数,如果不允许,则设置为0

image-20220727113524818

  • Command_Opcode:表示相应的命令代码

image-20220727113601519

  • Return_Parameters:返回命令指定的参数

image-20220727113823994

 

5.3 Connection Complete Event

该事件表明了HostController之间建立连接通道成功。

image-20220727113949568

  • Event Code:事件代码

  • Status:连接状态

image-20220727114027663

  • Connection_Handle:连接成功后,生成的Handle

image-20220727114101410

  • BD_ADDR:连接成功后的MAC地址

image-20220727114134224

  • Link_Type:连接类型

image-20220727114159950

  • Encryption_Enabled:是否加密

image-20220727114218179

这些参数也不是一定需要的,下面是抓到的HCI包,希望有所帮助。

image-20220929135721190

最后,看一下HCI在协议栈中的位置

image-20220929194654569

image-20220614110304885

好啦,上面就是蓝牙协议HCI接口的详细介绍,详细了解之后,我们就具备了分析HCI数据包的基础能力了!

img
img