一. 声明

本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等

第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。

第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)

第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等

第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

------------------------------------------------------------------------------------------------------------------------------------------

CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

蓝牙交流扣扣群:970324688

Github代码:https://github.com/sj15712795029/bluetooth_stack

入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

------------------------------------------------------------------------------------------------------------------------------------------

二. 蓝牙Host(蓝牙协议栈)跟蓝牙Controller(蓝牙芯片)交互格式

蓝牙协议栈跟蓝牙芯片都是使用统一的数据来交互的,由SIG规定(备注:部分芯片有HCI vendor命令),一般交互的有以下几种类型(注意:如果没有特别声明,所有的数据)

1) HCI command,由蓝牙协议栈给蓝牙芯片发送命令,来控制芯片行为,分几个OGF(Groups)在后面小节讲HCI command的时候会介绍。

2)HCI event,由蓝牙芯片上报事件给蓝牙协议栈的事件

3)HCI acl数据,蓝牙协议栈跟蓝牙芯片双向交互的L2CAP以及上层数据

4)HCI sco,蓝牙协议栈跟蓝牙芯片交互的SCO音频是数据

5)HCI iso,蓝牙协议栈跟蓝牙芯片交互的BLE audio的数据(Core 5.2才增加)

三. HCI Command(HCI命令介绍)

HCI命令包用于从协议栈发送给芯片的命令。HCI命令包的格式如下图所示:

Opcode:每个命令被分配一个2字节的操作码(opcode),用来唯一地识别不同类型的命令,操作码(opcode)参数分为两个字段,称为操作码组字段(Opcode Group Field, OGF)和操作码命令字段(Opcode Command Field, OCF)。其中OGF占用高6bit字节,OCF占用低10bit字节。

一共有以下几组OGF:

1)Link Control commands, the OGF is defined as 0x01.

2)Link Policy commands, the OGF is defined as 0x02

3)HCI Control and Baseband commands, the OGF is defined as 0x03

4)Informational Parameters commands, the OGF is defined as 0x04

5)status parameters commands, the OGF is defined as 0x05

6)Testing commands, the OGF is defined as 0x06

7)LE Controller commands, the OGF code is defined as 0x08

8)vendor-specific debug commands,the OGF code is defined as 0x3F,此部分是vendor定义的,也就是芯片厂商为了扩展core文档的HCI command定义

OCF众多,在每个OGF下都有一堆的OCF定义,我们在下个小节进行详细介绍

Parameter Total Length后续参数的长度

Parameter:每个command的para不同,下个小节做说明

注意:HCI Command Packet的长度不能超过255(包括HCI Command包头)

下面我们来截图举例下,我们以HCI reset为例,在介绍前,我们先看下HCI reset的command,

这个命令是上电第一条发给芯片的command(bcsp,h5 transport除外)

HCI reset的OGF为3,OCF也为3,根据以上算法我们算下:

Opcode[0] = OCF & 0xff = 0x03

Opcode[1] = (OCF >> 8) | (OGF << 2) = 0x0c

也就是0x03 0x0c ,见截图

我们在组合封包的时候代码如下:

struct bt_pbuf_t *hci_cmd_ass(struct bt_pbuf_t *p, uint8_t ocf, uint8_t ogf, uint8_t len)
{((uint8_t *)p->payload)[0] = (ocf & 0xff); /* OCF & OGF */((uint8_t *)p->payload)[1] = (ocf >> 8)|(ogf << 2);((uint8_t *)p->payload)[2] = len-HCI_CMD_HDR_LEN; /* Param len = plen - cmd hdr  */if(pcb->numcmd != 0){--pcb->numcmd; /* Reduce number of cmd packets that the host controller can buffer */}return p;
}

四. HCI Event(HCI事件介绍)

HCI event是蓝牙芯片发送给协议栈的事件。HCI事件包的格式如下图所示:

Event code:唯一event编码,在后续的小节会介绍(是固定的)

Parameter Total Length:后续参数的长度

Parameter:event参数。

Event header结构体代码如下:

struct hci_event_hdr_t
{uint8_t code; /* Event code */uint8_t len;  /* Parameter total length */
} BT_PACK_END;

以一个event来做说明,event在后续的小节会介绍,在这里大概了解下就OK了

以HCI_Command_Complete格式为例,格式如下:

参数解释如下:

Btsnoop如下:

raw data分析:

0x0E -> command complete event code

0x04 -> para len,也就是后面参数的长度

0x01 -> num HCI command pacekets

0x03 0x0c -> HCI reset command opcode

0x00 -> status success

五.HCI acl(蓝牙芯片跟蓝牙协议栈交互的L2CAP以及上层数据)

HCI acl用于从协议栈跟蓝牙芯片双向交互上层协议的数据。HCI acl的格式如下图所示:

Handle:连接句柄,用于蓝牙连接后跟remote交互acl数据用

PB flag:此部分就是用于上层数据(L2CAP),是否是分隔数据,具体bit的定义如下

BC flag:此部分定义是是否为广播,每个bit定义如下:

Data total length:后续payload的长度。

举一个例子:

0x4c 0x20就是acl前两个byte,解析为connection handle:0x04c,pb_flag为2 BC flag是0x0

六.HCI sco(用于蓝牙协议栈跟蓝牙芯片的音频交互数据)

HCI sco用于从协议栈跟蓝牙芯片双向交户音频数据。HCI sco的格式如下图所示:

Handle:连接句柄,用于蓝牙连接后跟remote交互sco数据用

Packet_Status_Flag:The Host shall set the Packet_Status_Flag bits to 0b00. If the Erroneous_Data_Reporting parameter was set to disabled when the synchronous connection was created, the Controller shall set the Packet_Status_Flag bits to 0b00 and whether or not data is provided for cases when a valid (e)SCO packet was not received is unspecified.If the Erroneous_Data_Reporting parameter was set to enabled when the synchronous connection was created, the Controller shall set the Packet_Status_Flag according to the following table.

Data_Total_Length:SCO数据长度

我个人是没有做过SCO数据走UART的芯片,所以没有btsnoop的例子

另外,HCI ISO是BLE audio的,市面上现在还没有芯片,所以这部分略

蓝牙HCI command/event/acl/sco格式介绍相关推荐

  1. 蓝牙HCI剖析(一)

    关键字:bluetooth 蓝牙协议  HCI剖析 HCI概述 HCI笔记 LMP L2CAP SDP RFCOMM  作者:zhongjun 本着互相学习的目的,来分享此一系列的文章,欢迎转载,请注 ...

  2. 蓝牙HCI Dongle说明

    Chipsets 本项目主要实现了蓝牙Host协议栈,并没有包含Controller部分,如果需要实现蓝牙交互,按照Core Spec,需要通过HCI接口连接其他蓝牙芯片实现蓝牙功能. 由于HCI接口 ...

  3. 低功耗蓝牙搜索广播的实现流流程介绍 /BLE scan flow ----- 蓝牙低功耗协议栈

    零. 概述 主要介绍下蓝牙协议栈(bluetooth stack)低功耗蓝牙搜索广播的流程以及协议栈的实现流程,BLE scan flow btsnoop以及流程在资料中的......\STM32_U ...

  4. 蓝牙HCI剖析(三)

    HCI源码: bt_hci.h [cpp] view plain copy /* * This file is part of the HCI protocal. * Data  :20160506 ...

  5. Android 蓝牙抓包和分析 (1) 启用蓝牙HCI信息收集日志

    蓝牙通信其实和http通信有点类似,http通过接口交互抓取数据包也很方便,但是到了蓝牙就没那么方便了,本文就是介绍如何实现蓝牙数据包的抓取. 怎么抓包 另一种更为简便的抓包方式请阅读Android ...

  6. 蓝牙-HCI错误码列表

    错误码定义: 1 /* Success code */ 2 #define HCI_SUCCESS 0x00 3 /* Possible error codes */ 4 #define HCI_UN ...

  7. 蓝牙HCI剖析(二)

    一.概述: 此篇文章主要是总结下HCI command 和 event 二.command 三.event: 四.此command和event是参照之前的一本书截图的,对于最新的core 4.2有很多 ...

  8. linux源码acl,Linux自主访问控制机制模块详细分析之posix_acl.c核心代码注释与acl.c文件介绍...

    原标题:Linux自主访问控制机制模块详细分析之posix_acl.c核心代码注释与acl.c文件介绍 2.4.4.6 核心代码注释 1 posix_acl_permission() int(stru ...

  9. Android O HIDL的使用例子 -- 蓝牙HCI 服务进程

    1.1.Treble 计划概览 Android O 引入" Treble" 计划,目标是通过重构 Android OS 的 framework,使 Android 设备制造商能更快 ...

最新文章

  1. 一种注册表沙箱的思路、实现——Hook Nt函数
  2. html动画效果开源代码,8款强大的CSS3/HTML5动画及应用源码
  3. IntelliJ IDEA 2020.2.1 发布,Lombok插件可能被官方支持
  4. html5实现圆圈里带一个三角形,CSS制作箭头图标代码(圆,三角形,椭圆)c
  5. WebAssembly 技术汇总
  6. 第123天:移动web开发中的常见问题
  7. Linux 内核修复5个高危漏洞
  8. React antD 使用Select 进阶功能 远程搜索,防抖控制,加载状态
  9. android RelativeLayout 动态添加子View
  10. 克隆的虚拟机一直重复出现登录界面_QQ空间里的装扮怎样才能克隆到自己空间?...
  11. python语言程序设计实践教程答案实验二_20184313 实验二《Python程序设计》实验报告...
  12. Matlab中fspecial的用法
  13. 计算机中丢失storm.d,win10 64位电脑缺少storm.dll怎么办_win10玩暗黑破坏神2缺少storm.dll文件修复方法...
  14. php 输入表格数据,怎样将导出数据输入Excel 表格-php 怎么把数据导出到excel表格...
  15. 这是一篇来源于阿里内部技术论坛的文章
  16. 无需公网IP,免费内网穿透【cpolar】访问内网服务
  17. 华为云:修炼防控内力,竖起游戏文娱行业安全之盾
  18. 地统计插值学习心得(三)ArcGIS Pro与ArcMap软件中地统计分析的区别
  19. Windows环境下编译Airsim
  20. php怎么弄三角形,css中怎么设置三角形

热门文章

  1. inputstream流乱码_Java FileInputStream读中文乱码问题解决方案
  2. 英语语法——句子分类
  3. compileflow流程引擎使用
  4. 如何在iPhone手机上安装ipa(应用安装包)
  5. 计算机教子好考吗,考进985的孩子:父母都是这样教育孩子,这些方法比刷题管用...
  6. 高中数学必修一函数知识点总结
  7. html遮罩层动画制作,flash简单制作遮罩动画效果
  8. 响应式极简新闻发布系统模板 v4.88
  9. 四川一度智信:如何做好店铺数据运营?
  10. 1-丁基-3-甲基咪唑醋酸盐[Bmim][Ac]|离子液体1,1,3,3,-四甲基胍乳酸盐TMGL