一 HCI介绍

HCI (Host Controller interface), 为Host访问Controller提供一组标准的接口。

主要完成3个任务:

  • Host通过HCI发送命令给Controller
  • Controller通过HCI将事件发送给Host
  • 传递ACL Data(面向连接,在连接通道上进行数据传输)

这里所说的接口既包括两个设备之间的物理接口,也包括逻辑接口。逻辑接口定义了命令、事件和数据的封包格式。而物理接口定义了主机和控制器之前如何传输这些数据。蓝牙规范定义了4种物理接口,3线串口、4线串口、HID、SDIO。这里不做过多介绍。

二 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信道。连接句柄即用来标示主机交给控制器并准备发送给对端设备的数据,又用来标示控制器从对端设备收到的准备发送给主机的数据。

HCI 命令和事件中使用两种类型的标识符IDS和HANDLES。
ID由Host分配, 在两个对端设备之间使用的标识符,并在包含在PDU中,通过空中发送。 每种不同类型的 ID 都有一个单独的数字空间。
HANDLE由Host在命令中分配或由Controller在事件中分配的句柄,是在Host和Controller之间使用但不通过空中发送的标识符。 一些句柄共享相同的数字空间,而另一些则具有单独的数字空间。

三种类型的句柄用于标识Host和Controller之间的逻辑通道:连接句柄、逻辑链路句柄和物理句柄。

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

2.1 Command packet

命令包的格式如下:

命令包是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, 参数,每个参数都有特定的大小。

在低功耗蓝牙中一共有三种基本命令类型:

  • 配置控制器的状态
  • 请求执行特定的操作
  • 管理连接

1 配置控制器状态
我们可以将控制器视为一个大状态机,有一系列的参数可以进行配置。例如,将广播看成一个状态,那么我们可以通过如下命令进行配置:LE Set Advertising Parameters、LE Set Advertising Data、LE Set Scan Response Data和LE Set Advertising Enable。

在低功耗蓝牙中,如果状态机里的某个状态正在被使用,通常是不能对其进行调整的。就好像如果启动了广播就不能再改变广播参数。这个时候,我们需要先停止广播,修改广播参数,然后重新进行广播。

2 请求指定操作
一些命令可以请求控制器执行指定操作,但不会改变设备状态或者连接状态。例如,LE Encrypt命令想控制器输入密钥和文本并要求其生成加密数据。

3 管理连接
设备建立连接之后,可以通过发送命令来管理连接,比如用LE Read Channel Map命令来获取当前连接的自适应跳频信道图。注意,这类命令均包含连接句柄。

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

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

2.1.1.1 描述

HCI_LE_Create_Connection 命令用于创建一个 ACL 连接。

2.1.1.2 参数

1 LE_Scan_interval

扫描间隔

2 LE_Scan_Window

LE 扫描持续时间,大于或者等于扫描间隔。如果两者都设置为相同的值,则扫描应连续运行。

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 参数。

2.1.1.3 产生事件

当 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 事件指示此命令已完成。

2.2 ACL data

acl data的数据格式:

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

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

host层想用更少的位来表示Access Address,Controller用12位的Handle用来表示Access address,PB Flag(Packet Boundary,数据包边界标记) 表示这个包是起始包(00b)还是延续包(01b),BC Flag(Boardcast Flag,广播标记) 对于BLE该值永远为0,接下来是数据长度。需要注意一点,控制器传给主机的数据,PB Flag = 10表示开始包,01表示连续包

2.3 Event

事件的数据格式:

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

低功耗蓝牙主要有下列三种基本事件类型:

  • 通用命令完成事件
  • 通用命令状态事件
  • 特定命令完成事件

1 通用命令完成事件
当主机发送给控制器的命令执行完毕时,控制器立即返回一个通用命令完成事件。事件的参数包含了之前发送命令操作码和执行命令的返回参数。返回参数中的第一个参数是状态码,状态码用来表示命令执行成功与否。

例如,LE Rand用来命令控制器返回一个随机数。它有两个返回参数,一个是状态码,另一个是返回的随机数。

注意,每当控制器执行与无线传输无关的任务时,都将使用通用命令完成事件。例如,LE Encrypt命令不涉及链路层数据包传输,因此将返回一个通用命令完成事件。而LE Create Connection命令需要在连接建立之前至少发送一个链路层连接请求数据包(CONNECT_REQ),因此不会返回通用命令完成事件。

2 通用命令状态事件
上节提及的LE Create Connection等命令类型需要执行无线传输操作,通常返回的是通用命令状态事件;一段时间后才会返回特定命令完成事件。

3 特定命令完成事件
有些命令需要一段时间才能完成执行,他们都有对应的、并且唯一的特定命令完成事件。例如,LE Create Connection命令首先返回一个命令状态事件,随后等待连接建立完成或者失败,再返回LE Connection Complete事件。需要注意的是,命令是否执行完毕并不以收到特定命令完成事件作为标志。

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

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

2.2.1.1 描述

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

2.2.1.2 参数

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

三 蓝牙低功耗(BLE)协议栈 之 HCI层相关推荐

  1. 四 蓝牙低功耗(BLE)协议栈 之 L2CAP层

    一 介绍 L2CAP(逻辑链路控制和适配协议层)是一个复用层,可以让低功耗蓝牙复用三条不同的信道.它也支持数据的分割.数据重组.通道多路复用.通道流量控制和错误检测,使得较大的报文可以在底层无线电中传 ...

  2. 五 蓝牙低功耗(BLE)协议栈 之 ATT层

    一 介绍 ATT全称是Attribute protocol(数据交互协议),这一层的关键词是Attribute(属性).一个属性其实就是一条数据,属性是BLE数据提供单元,也是蓝牙空中传播数据的最上层 ...

  3. 蓝牙协议分析(3)_蓝牙低功耗(BLE)协议栈介绍

    原文链接:蓝牙协议分析(3)_蓝牙低功耗(BLE)协议栈介绍 系列索引:蓝牙协议分析(1)_基本概念 蓝牙协议分析(2)_协议架构 目录 1. 前言 2. Why 3. How和What 4. Phy ...

  4. 【Android应用开发】Android 蓝牙低功耗 (BLE) ( 第一篇 . 概述 . 蓝牙低功耗文档 翻译)

    转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50515359 参考 :  -- 官方文档 : https://develope ...

  5. c# 低功耗蓝牙_C#建立从笔记本电脑内部蓝牙4.0到蓝牙低功耗(BLE)外设的流

    我正在尝试编写一个连接到蓝牙低功耗设备(BLE)的程序,然后在更新或给定间隔内读取特征. 我的外设是德州仪器CC2540 BLE设备. 然而,这使用了加密狗,我的任务是使用内部蓝牙4.0调制解调器(稍 ...

  6. 蓝牙BLE(协议栈、OSAL、蓝牙APP工具)

    目录 蓝牙配对和绑定 蓝牙4.0 BLE 信道(RF Channel) BLE协议栈分层 PHY层(Physical layer 物理层) LL层(Link Layer 链路层) HCI层(Host ...

  7. TI低功耗蓝牙(BLE)介绍

    TI低功耗蓝牙(BLE)介绍 本文档翻译和修改自参考资料:CC2540Bluetooth Low Energy Software Developer's Guide (Rev. B),部分图片直接引用 ...

  8. win7 蓝牙4.0 ble驱动_初识物联网无线通信技术之蓝牙4.0BLE协议栈

    [本文属原创,转载请附上原文出处链接.] 一.需要的软件工具 1.BLE协议栈(BLE-CC254x-1.4.0) 2.IAR开发软件(IAR Embedded Workbench8.20.2) 注: ...

  9. 轻松易懂arduino低功耗BLE蓝牙通信

    今天我们介绍蓝牙通信的另一种方式--BLE(Bluetooth Low Energy,蓝牙低功耗).         什么是BLE         在<无线通信3:HC05/HC06经典蓝牙BT ...

最新文章

  1. 数据分析之pandas常见的数据处理(四)
  2. 类和对象——对象特性——this指针的用途
  3. Leetcode1690. 石子游戏 VII[C++题解]:带有博弈论的区间dp
  4. 2019 深度学习框架大盘点!看 PyTorch、TensorFlow 如何强势上榜?
  5. VTK:可视化之MultipleViewports
  6. Bootstrap3 屏幕阅读器和键盘导航
  7. win8 网络受限解决
  8. 前端制作动画的几种方式(css3,js)
  9. XCode中的Debug View Hierarchy功能
  10. Web前端开发实验(导航栏、购物页面)
  11. dirent struct_struct dirent中d_name长度问题
  12. wifi微信认证服务器架设,商业WiFi微信认证实现
  13. Skyscrapers (easy version)
  14. 《CSDN排行榜冲榜攻略》妙用Emoji表情符号读者提升阅读体验(编码表)
  15. 六年软件测试感悟 从博彦到VMware
  16. 为什么建议大家使用 Linux 开发?真的很很很优雅!
  17. kodbox(可道云)Windows部署教程
  18. XXE-什么是XXE
  19. 计算机文化基础第二次作业-简答题,中传2018年秋计算机文化基础第二次作业-简答题...
  20. 2019~ROS暑期学校~ROS Summer School in China~分享

热门文章

  1. 用devc++表白_【交大表白墙】表白ZRC,若臣小哥哥要开心啊,不开心的时候想一想你还有这么一个匿名小迷妹,心情会不会好一点呢...
  2. 周鸿祎(360):商业模式不是赚钱模式
  3. GLTFLoader
  4. 设置电话拦截返回音浅析
  5. Mysql 【索引】
  6. 如何提升产品用户体验?分享4个用户体验图表工具!
  7. 淦,服务器被人传了后门木马。。。
  8. mysql and和or的优先级
  9. 讯飞语音命令词识别的SDK配置与运用
  10. ObjectArx选择集