• 【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
  • 相关阅读:
    iOS基础 自定义转场控制器上的动画 UIPresentationController
    去除 Zotero + Obsidian 复制粘贴参考文献表时的多余空行(ctrl+shift+C)
    Java声明式事务实战!工作中用这几种就够了!
    已有wchar_t *类型的filepath,使用Qt打开该文件
    《古诗词里的快意人生》读后感
    Adaptive Graph Convolutional Recurrent Network for Traffic Forecasting 论文理解+机翻
    1.Django安装和项目创建
    图书管理系统|基于Springboot的图书管理系统设计与实现(源码+数据库+文档)​
    【详细学习SpringBoot自动装配原理分析之核心流程初解析-1】
    【无标题】
  • 原文地址:https://blog.csdn.net/dong__ge/article/details/126026608