BLE主机控制器接口层(HCI)数据结构

在这里插入图片描述

HCI上传输的5种数据:

  • HCI Command packet : Host层发送给Controller的命令,只能由Host发出。
  • HCI ACL Data packet: Controller上报给Host的事件,只能由Controller发出。
  • HCI Synchronous Data packet:双向的,Host和Controller都可以发出。
  • HCI Event packet: 发送给对端BLE的数据,双向的。Host和Controller都可以发出。
  • HCI ISO Data packet:双向的,Host和Controller都可以发出。

HCI层和LL层的关系

  1. 有些HCI Cmd只是用来设置本地Controller,不导致无线传输
  2. 有些HCI Cmd会导致LL层发出各类广播包,比如 LE Set Scan Enable Command 在主动扫描时会导致LL层发出SCAN_REQ广播包。比如LE Create Connection Command会导致LL层发出CONNECT_REQ广播包
  3. 有些HCI Cmd会导致LL层发出数据包,其中LLID==11b,表示是 LL Control PDU,比如LE Read Channel MapCommand就会导致LL层发数据包给对端,以便读取对端的信道图。
  4. ACL data必定会导致LL层发数据包给对端,这时的LL层数据有可能是起始包(LLID = 10b)、也可能是延迟包(LLID = 01b)、也可能是空包(LLID = 01b)

Host可以向Controller发送一系列的命令来控制Controller工作,比如广播命令,连接命令(Controller收到连接命令之后,LL层会发出一个CONNECT_REQ的广播包)

举例说明,Host向Controller发送扫描的命令。

  1. Host向Controller发送的命令 —— Cmd
    • 设置扫描参数,主动/被动扫描
    • 使能扫描
  2. Controller开始工作
    • 被动扫描,可以获得通用的广播包
    • 主动扫描,SCAN_REQ
    • 对端可以返回更详细的广播包,SCAN_RSP
  3. Controller将扫描到的数据返回给Host —— Event

一旦控制器与其他设备建立了连接,控制器的底层HCI接口就创建了一个HCI信道,我们使用一个连接句柄来标识这个HCI信道。连接句柄即用来标示主机交给控制器并准备发送给对端设备的数据,又用来标示控制器从对端设备收到的准备发送给主机的数据。

详见 蓝牙核心卷5.2, Vol 4 , Part E ,5

一 Command packet

命令包的格式如下:
image
命令包是Host层发送给Controller的。
Controller应能够接受最多 255 字节数据的 HCI 命令包,不包括 HCI 命令包头。 HCI 命令包头是包的前 3 个字节。
每个命令都分配了一个 2 字节的操作码(OpCode),用于唯一标识不同类型的命令。Opcode 参数分为两个字段,分别称为 OpCode Group Field (OGF) 和 OpCode Command Field (OCF)。 OGF 占据了 Opcode 的高 6 bit,而 OCF 占据了剩余的 10 bit。
0x3F 的 OGF 保留用于供应商特定的调试命令。操作码的组织允许在不完全解码整个操作码的情况下推断附加信息。

由全1组成的 OGF 已保留用于供应商特定的调试命令。这些命令是特定于供应商的,并在制造过程中用于更新固件的可能方法和调试。

在这里插入图片描述

  • header, HCI的命令头,3个字节
    • OpCode,操作码,2个字节
      • OGF,6bit
      • OCF,10bit
    • PTL,参数总长度,所有参数的长度,不是参数的个数
  • parameter, 参数,每个参数都有特定的大小。

具体的命令类型参看; 蓝牙核心卷5.2,Vol 4, Part E, 7.8

1 一个具体的命令,连接命令

在这里插入图片描述
描述
HCI_LE_Create_Connection 命令用于创建一个 ACL 连接。
参数

  1. LE_Scan_interval
    扫描间隔
    在这里插入图片描述

  2. LE_Scan_Window
    LE 扫描持续时间,大于或者等于扫描间隔。如果两者都设置为相同的值,则扫描应连续运行。
    在这里插入图片描述
    比如扫描间隔为100ms,扫描窗口为10ms,那么扫描的占空比为10%。理论上可以捕获到定向广播数据包的最低的占空比为0.4%,即每一秒钟扫描3.75ms。当然我们也可以把扫描间隔和扫描窗口设置成一样,这种情况就是满占空比,一直在扫描。比如扫描间隔和扫描窗口都是10ms,那么控制器将在10ms内一直扫描,并且每10ms切换一次广播通道。

  3. Initiator_Filter_Policy,
    决定是否使用白名单。如果不使用白名单,Peer_Address_Type 和 Peer_Address 参数指定要连接的广告设备的地址类型和地址。
    在这里插入图片描述

  4. Peer_Address_Type
    对端设备地址类型
    在这里插入图片描述

  5. Peer_Address
    对端设备地址
    在这里插入图片描述

  6. Own_Address_Type
    自己的地址类型
    在这里插入图片描述

  7. Connection_Interval_Min
    连接最小间隔
    在这里插入图片描述

  8. Connection_Interval_Max
    连接最大间隔
    在这里插入图片描述

  9. Connection_Latency
    可以忽略的连接事件个数
    在这里插入图片描述

  10. Supervision_Timeout
    超时时间
    在这里插入图片描述

  11. Min_CE_Length
    连接事件的最小长度
    在这里插入图片描述

  12. Max_CE_Length
    连接事件的最大长度,Min_CE_Length 和 Max_CE_Length 参数是信息性参数,为控制器提供连接事件的预期最小和最大长度。 Min_CE_Length 参数应小于或等于 Max_CE_Length 参数。
    在这里插入图片描述
    产生事件
    当 Controller 收到 HCI_LE_Create_Connection 命令时,Controller 会向 Host 发送 HCI_Command_Status 事件。当创建连接完成或取消连接,应生成 HCI_LE_Connection_Complete 或 HCI_LE_Enhanced_Connection_Complete 事件。如果创建了连接并且控制器支持 LE 通道选择算法#2 功能,则该事件应紧跟在 HCI_LE_Channel_Selection_Algorithm 事件之后。控制器不会发送 HCI_Command_Complete 事件来指示此命令已完成。 相反,HCI_LE_Connection_Complete 或 HCI_LE_Enhanced_Connection_Complete 事件指示此命令已完成。

二 ACL data

acl data的数据格式:
image
数据包是指主机和控制器之间传输的应用数据。控制器接收来自主机的数据包,将其传给对端设备。对端设备收到数据之后,将其从控制器发往主机。

数据包总是以连接句柄作为第一个字段(12位),如果主机没有收到LE Connection Complete事件,则不能发送任何数据给对端设备;只有收到了该事件,主机才可以启动数据发送或者接收对端设备发送过来的数据。

Handle是连接句柄的低12位,PB Flag表示这个包是起始包(00b)还是延续包(01b),BC Flag对于BLE该值永远为0,接下来是数据长度。
连接句柄和PB BC之间的算法con_handle | (packet_boundary << 12) | (0 << 14)

三 Event

事件的数据格式:
image
当有事件发送的时候Controller使用HCI Event通知Host。如果Controller发送一个 HCI 事件数据包,其中包含一个Host没有屏蔽并且不支持的事件代码或 LE 子事件代码,Host将忽略该数据包。主机应能够接受最多255字节数据的 HCI 事件数据包,不包括 HCI 事件数据包头。HCI数据包的前两个字节为包头。

在这里插入图片描述

具体的BLE事件类型参看; 蓝牙核心卷5.2,Vol 4, Part E, 7.7.65

1 一个具体的事件,连接完成事件

在这里插入图片描述
描述
HCI_LE_Connection_Complete 两端的Controller向各自的Host通知连接成功。在创建连接时,Controller应分配一个 Connection_Handle,并在此事件中传递给主机。如果连接创建失败,则应将此事件提供给发出 HCI_LE_Create_Connection 命令的主机。此事件向发出 HCI_LE_Create_Connection 命令并接收 HCI_Command_Status 事件的主机指示连接创建失败或成功。

参数

  1. Subevent_Code
    在这里插入图片描述

  2. Status
    在这里插入图片描述

  3. Connection_Handle
    在这里插入图片描述

  4. Role
    在这里插入图片描述

  5. Peer_Address_Type
    在这里插入图片描述

  6. Peer_Address
    在这里插入图片描述

  7. Connection_Interval
    在这里插入图片描述

  8. Connection_Latency
    在这里插入图片描述

  9. Supervision_Timeout
    在这里插入图片描述

  10. Master_Clock_Accuracy
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值