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

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

8.1 前言

img

Link Layer传输层再往上,就是传输层了。传输层,位于HostController层之间,提供一种无需知道详细数据内容便可传输数据的能力。其主要通过硬件传输介质(如:UARTUSBSDIO等),传输Bluetooth HCI的数据。

下面是UART传输层的框图:

image-20220616095944158

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

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

img

8.2 HCI(Host Controller Interface)介绍

image-20220616112047915

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

传输层主要的作用

  • 蓝牙协议栈向芯片发送连接的command
  • 蓝牙芯片上报给蓝牙协议栈command status with create connection opcode
  • 蓝牙芯片上报蓝牙协议栈connect complete

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

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

更加直观一点,如下:

image-20220725114046247

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

交互的数据格式为:

img

8.3 HCI 数据包格式

HCI提供了统一的命令格式来访问Controller,不同的命令也需要花费不同的时间。传输层以命令Command和事件Event的方式进行通信,下面我们主要看一下通信的数据包的格式。

8.3.1 Handles

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

8.3.1.1 Primary Controller Handles

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

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

8.3.1.1.1 Broadcast Connection_Handles

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

8.3.1.2 AMP Controller Handles

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

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

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

8.3.2 HCI Command Packet

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

包格式如下:

image-20220709164110808

  • OpCode字段

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

  • OGF:占据高6bit
  • OCF:占据低10bit,其中0X3F为制造商的调试命令.

image-20220709165044464

  • Paramter_Total_Length字段

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

image-20220709165255001

  • Paramter字段

image-20220709165338177

8.3.3 HCI Event Packet

每个Command命令发出之后,都会带一个Event返回命令执行后的状态。

包格式如下:

image-20220709170234334

  • Event_Code字段

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

image-20220726135028826

  • Parameter_Total_Length字段

Parameter_Total_Length:参数总长度

image-20220726135128164

  • Event_Parameter字段

Event_ParameteN:相关参数

image-20220726135231895

8.3.4 HCI ACL Data Packets

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

数据包有两种类型

  • Automatically-Flushable:自动刷新

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

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

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

包格式如下:

image-20220711144423329

  • Handle字段

Handle:正如上面所述,该字段有几种类型:

  • Connection_Handle:用于在主控制器上发送数据包或者段

  • Logical_Link_Handle:用于AMP控制器发送数据包

  • Physical Link Handles:用于AMP控制器发送数据包

  • Flag 字段

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

image-20220711144932128

image-20220711145000500

8.3.5 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

8.4 HCI连接包示例

HCI连接命令流程:

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

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

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

8.4.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

8.4.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

8.4.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-20220727114301690

image-20220614110304885

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

img

猜你喜欢

转载自blog.csdn.net/dong__ge/article/details/126026608
今日推荐