学习资料:

1. 蓝牙协议core_v5.0.pdf 《Vol 2: Core System Package [BR/EDR Controller volume]》的“Part E: Host Controller Interface Functional Specification”

2. BTStack源码

对于被动扫描,周边的外设会给controller发送各种广播包,解析广播包,从而得到设备的信息。

对于主动扫描,除了被动的获得广播包外,controller还可以给某个设备发出扫描请求,设备就会返回一个扫描回应,将更多的信息给controller。

两个蓝牙设备互相通信,涉及两个Controller。Controller是具备一定智能的,它可以自行决定做什么事情:不需要Host决定它的每一个细节。比如说:要想让Controller发出扫描请求(SCAN REQ),Host只需要向Controller发出一个“scan enable”的命令即可,Controller就会根据预设的参数自动发出扫描请求(SCAN REQ)广播包。

Controller就是一个芯片,它封装了LL层、PHY层那些复杂的操作;Host不需要理解芯片内部复杂的操作,只需要遵守Controller的规范,向它提供command,从它获得event,与它交互acl data。

HCI层跟LL层的关系:

a. 有些HCI command只是用来设置本地Controller,不导致无线传输

b. 有些HCI command会导致LL层发出各类广播包,

比如“LE Set Scan Enable Command”在主动扫描时会导致LL层发出SCAN_REQ广播包,

比如“LE Create Connection Command”会导致LL层发出CONNECT_REQ广播包

c. 有些HCI command会导致LL层发出数据包,其中的LLID=11b,表示是“LL Control PDU”,

比如“LE Read Channel Map Command”就会导致LL层发数据给对端设备,以便读取对端设备的信道图。

d. ACL Data是必定导致LL层发数据给对端设备的,

这时的LL层数据,有可能是起始包,LLID=10b;

也可能是延续包,LLID=01b;

也可能是空包,LLID=01b

在上一篇博客里,在传递Command/Event/ACL Data这3类数据时:

1. 对于UART接口的Controller,会在数据前面加上1字节的头部用来分辨是哪一类数据

2. 对于USB接中里的Controller,每类数据对应一个Endpoint,数据会直接发给Endpoint

下面,介绍Command/Event/ACL Data这3类数据的格式。

一、Command格式:

Command前有2字节的头部OpCode,用来表示是哪一个Command。

OGF表示“OpCode Group Field”,即“哪一组命令”,它占据高6位。

OCF表示“OpCode Command Field”,即“这组里的哪一个命令”,它占据低10位。

在蓝牙协议里,每一个OGF用一节来描述,在这节里会描述该组(OGF)的所有命令(OCF),位置如下图:

BTStack示例:

btstack-master\src\hci_cmd.c

12211分别表示1个字节用来表示扫描类型、2个字节用来表示扫描间隔、2个字节用来表示scan_window、1个字节用来表示own_address_type、1个字节用来表示scanning_filter_policy。

以后发送命令的时候,就需要根据12211这个格式来组装这些参数。在代码中搜索hci_le_set_scan_parameters.

hci_send_cmd(&hci_le_set_scan_parameters, 1, 0x1e0, 0x30, hci_stack->le_own_addr_type, 0);

代码中和文档中OCF的值刚好对应,正好是B。

再来看一个例子:

它带有两个参数,每个参数占一个字节,即hci_stack->le_scanning_enabled占一个自己;0占一个字节

其他的命令也是类似的,具体需要查看蓝牙文档core_5.0

二、Event格式:

在官方协议中对于Event并没有明确的分类,按我的理解可以分为以下3类:

Event分类

说明

Command Status Event

命令状态事件,

表示控制器已经接收到命令并正在处理

Command Complete Event

命令完成事件,

表示命令已经处理完毕并返回结果

Advertising Report Event

广播上报事件,本Event是Controller主动上报的

而上述2个Event都是由command导致的

示例:

有些命令需要一定时间才能执行完,比如LE Create Connection命令。控制器接收到该命令后会首先返回一个“命令状态事件”,随后等待连接建议完成或者失败,再返回“命令完成事件”。

Event的格式:

三、ACL Data格式:

ACL Data是传递给对端设备的数据,在建立连接之后才可以传输ACL Data,格式如下:

Handle表示对端设备:主设备的Controller要与对端设备连接时,会生成一个32位的随机数,它被称为Access Address。在LL层的数据包中,Access Address被用来表示对端设备。但是Host程序并不想使用这个32位的数据,于是Controller又分配一个12位的Handle来表示这个Access Address、表示对端的设备。

Packet_Boundary_Flag:

PB Flag

描述

Host to Controller

Controller to Host

00b

L2CAP PDU起始包

P

01b

L2CAP PDU延续包

P

P

10b

L2CAP PDU起始包

P

Controller在传输ACL Data时,每次传输的字节数是有限制的,这可以通过“Read Buffer Size”命令读到这个值。

当要传输非常大的ACL Data时,需要把数据拆分来传输,这就要用到上面表格中的“PB Flag”来分辨起始包、延续包。

这些起始包、延续包由Host送到Controller后,会马上通过LL层重新编码、发给PHY层发给对端设备,对端设备的L2CAP层再把这些起始包、延续包组装起来。

注意,在LL层的数据包里有LLID域,10b表示起始包、01b表示延续包。

Broadcast_Flag在BLE协议中都是00b,表示“Point-to-point”。

四、示例:

Broadcast_Flag在BLE协议中都是00b,表示“Point-to-point”。

1. 扫描设备

a. Host向Controller发出“LE Set Scan Parameters Command”

b. Controller向Host发送“Command Complete Event”

c. Host向Controller发出“LE Set Scan Enable Command”

d. Controller向Host发送“Command Complete Event”

e. 如果扫描参数为“主动扫描”,对于新发现的设备会,LL层发出“SCAN REQ”广播包

f. Controller接收到各类广播包,比如ADV_IND、SCAN_RSP

LL层解析后,会通过HCI上报EVENT

2. 连接设备

a. Host向Controller发出“LE Create Connection Command”

b. 不需要对端设备回应数据,发起方就认为连接已经建立

c. Controller向Host发送“Command Status Event”

d. Controller向Host发送“Command Complete Event”

3. 写数据

a. Host向Controller发出ACL数据:Write Command, Handle….

b. Controller的LL层构造数据包(LLID=10b),通过PHY发出无线信号

c. Controller向Host发送“Number of Completed Packets”事件

4. 读数据

a. Host向Controller发出ACL数据:Read Request, Handle….

b. Controller的LL层构造数据包(LLID=10b),通过PHY发出无线信号

c. Controller向Host发送“Number of Completed Packets”事件

d. 对端设备的LL层通过PHY返回数据(LLID=10b)

e. Controller向Host发送ACL数据:Read Response

问题:右边抓取的空中数据包,在对端设备接收到读请求后,过了一会才回复一个无线信号给本地设备,中间有很多空包,这些空包是谁发起的呢?

是由master发给slave的,

这些空包起什么作用呢?

两个设备建立连接之后,本地设备要知道对端设备什么时候要断开,它是怎么判断对端设备有没有断开呢?

不断的发送空包给对端设备,对端设备收到空包后,要回复一个空包,这样本地设备才知道对端设备还没有断开。当然为了省电,对端设备没有必要每次收到空包都要回复,可以在收到几个空包后回复,但是一定要有回复。这些空包是是由controller自主发起的,与host层没有什么关系。

第12节-BLE协议HCI层的数据格式的更多相关文章

  1. 第11节-BLE协议HCI层的硬件接口

    本篇博客由韦东山视频整理所得 如何控制链路层让其发出广播包.数据包?通过HCI层向它发出命令,也可以通过ATT层.L2CAP层向LL层发出数据. 学习资料: 蓝牙协议core_v5.0.pdf < ...

  2. 第13节-BLE协议L2CAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...

  3. 第10节-BLE协议链路层(LL)

    本篇博客的学些要结合书籍<低功耗蓝牙开发权威指南,Robin Heydon著>第7章,实际上这书只是对蓝牙原版协议的简化.摘要. 回顾以前学过的<BLE协议各层的形象化理解>和 ...

  4. 第02节-BLE协议各层的形象化理解

    本篇博客根据韦大仙视频,整理所得. 先上框图: ATT层 从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义.类比的在BLE协议栈里面,A ...

  5. 第03节-BLE协议各层数据格式概述

    本篇博客根据韦大仙的视频,整理所得. 对于BLE系统,它分为上下两块.上面那一块,我们称为host主机.下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片. 对于host这一块,它运 ...

  6. 第15节_BLE协议GATT层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part G: Generic Attribute Profile (GATT) 这篇文章格式比较 ...

  7. 第16节_BLE协议GAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part C: Generic Access Profile 下面这个图是BLE协议各层跟医院的各 ...

  8. 第14节_BLE协议ATT层

    下面这个图是BLE协议各层跟医院的各个科室的类比图: 跟医院类比,ATT层就是化验室,通过它可以得到各种检查结果──属性.这些检查结果之间有什么联系,它们组合起来体现了什么,化验室是不知道的,这些得由 ...

  9. 第04节-BLE协议抓包演示

    在上几篇博客中,形象的讲解了BLE各个层的作用,各个层的数据结构.本篇博客将研究BLE协议抓包.在实际开发中,有一个中央设备(central)和一个外设(Peripheral).所谓中央设备就是指它可 ...

随机推荐

  1. [LeetCode] 659. Split Array into Consecutive Subsequences 将数组分割成连续子序列

    You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...

  2. convert decimal to binary

    public class Solution { public static void main(String[] args) { ; String str = ""; ) { ; ...

  3. 粘包和拆包及Netty解决方案

    在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使 ...

  4. 迁移历史sql数据

    --select * into Trade2018 from Aozzo_ODS..Trade t1 --where t1.Created<'2019-01-01' --创建索引 --creat ...

  5. 2019 年 Java 最新面试指南共 80 题,赶快收藏起来吧!

    2019 年 Java 最新面试指南共 80 题,赶快收藏起来吧! http://blog.zh66.club/index.php/archives/116/

  6. mysql truncate 引起的 system lock,导致其他进程等待

    1.现状:上线新项目,导致api服务延迟,cpu正常,内存正常,连接数正常,sql性能正常,sql进程正常(初步分析) 最后再次分析sql进程才发现 由于该 truncate table name ; ...

  7. windows下xshell连接虚拟机的CentOS 7

    1.虚拟机设置 2.虚拟机的“编辑”-“虚拟网络编辑器” 3.windows 中运行“cmd”,输入“ipconfig”查看ip,避免冲突 4.在虚拟机网络编辑器界面中,选择“VMnet8” 5.记住 ...

  8. GitHub的高级搜索功能

    1. 首先,提供Github高级搜索帮助页面https://help.github.com/categories/search/     2. 搜索语法https://help.github.com/ ...

  9. Sitecore性化 - 您需要了解的4件事

    Sitecore非常强大,是一个数字体验平台.它可以帮助您取悦并留住客户.它可以帮助您衡量和评估广告系列.它使你成为一个更好的营销人员.它可以帮助您获得结果! 它结合了易于使用的网站内容管理系统和数字 ...

  10. 插件油泼猴+脚本 for chrome 安装 - https://greasyfork.org/zh-CN

    http://chromecj.com/utilities/2018-09/1525.html 一.将 *.crx 改名为 *.zip 二.访问 chrome://flags/#extensions- ...