蓝牙协议学习

背景知识

蓝牙(Bluetooth)是一个短距离无线传输的技术,工作在免证的ISM频段。最初名字为Wibree,在90年代由Nokia设计开发,随后转交给蓝牙特别兴趣小组(SIG)专门维护。

蓝牙标准经过了数十年不愠不火的发展,核心版本从1.0迭代了到目前的5.2,其中在2010年推出的蓝牙4.0版本标准中引进了Bluetooth Smart或者Buletooth Low Energy(BLE)。由于在功耗上有了极大改善,加上智能手机和智能设备的发展,BLE的应用也进入了爆发期。

4.0之前蓝牙通常称为经典蓝牙(Classic Bluetooth),包括1.0提出的BR(Basic Rate,基础速率) 以及2.0提出的EDR(Enhanced Data Rate,增强数据速率),两者往往放在一起表示与低功耗蓝牙相对的传统蓝牙。BR/EDR常用于相对短距离无线的连续连接,比如耳机的音频传输。

为了进一步提高蓝牙传输速率,在3.0中又提出了基于802.11的**AMP(Alternate MAC and PHY layer extension)**拓展,这是和BR/EDR不并存的一种传输模式

两种蓝牙技术:Basic Rate(BR)和 Low Energy(LE)简介

蓝牙协议包括两种技术:Basic Rate(简称BR)和Low Energy(简称LE)。这两种技术,都包括搜索(discovery)管理、连接(connection)管理等机制,但它们是不能互通的!

BR/EDR和BLE虽然都称为蓝牙,但它们在实现上大相径庭。前者主要侧重于点对点的通信,连接性和传输速率是考虑的重点;
而BLE则侧重于低功耗的设计,在射频层和基带层上优化了多播和广播的支持。
传统上Controller芯片只支持一种射频模式,但越来越多设备中也同时支持两种系统,以覆盖尽量多的使用场景。

蓝牙的核心系统架构包含一个Host和一个或多个Controller,Host可以理解为主核或者主板,运行主流的富操作系统;而Controller可以看做是蓝牙芯片,运行的是裸机程序或者RTOS,主要功能是对射频信号进行编解码。Host和Controller之间通过HCI接口(Host Controller Interface)进行通信,可通过UART、USB等物理接口进行传输。核心系统中包含的组件和之间的关系如下图所示:

Host部分主要是基于L2CAP抽象出的逻辑信道实现应用层的协议和功能,涉及的关键组件和协议有:

• Channel Manager:负责创建、管理和释放L2CAP channel。• L2CAP Resource Manager:负责管理PDU数据的顺序、调度、分片、重组等功能,是L2CAP核心功能的一部分。• SMP:Security Manager Protocol,实现BLE系统中的点对点安全认证功能,包括秘钥生成和认证等;BR/EDR系统的对应功能则在Controller的Link Manager中实现。• ATT:Atrribute Protocol,应用层attribute client和server之间的协议。• GATT:Generic Attribute Profile,表示ATT server或者client的功能,profile描述了服务和属性的层级结构,主要用于LE profile服务发现中。• GAP:Generic Access Profile,表示所有蓝牙设备通用的基础功能,比如传输层、协议、应用所使用的模式或流程等。GAP服务包括设备和服务发现、连接模式、安全认证和关联模型等。

Controller部分中更多是逻辑链路和物理链路的管理,包括:

• Device Manager:基带(baseband)中控制设备行为的模块,主要负责不与传输直接相关的部分,比如查询周围蓝牙设备,连接蓝牙设备,切换蓝牙设备的状态(discoverable/connectable),以及修改蓝牙名称、属性等。
• Link Manager:负责创建、修改和释放逻辑链路(logical links)以及对应的逻辑传输(logical transports),并更新设备之间对应物理链路(physical links)的相关参数。在BR/EDR系统中,与对端的Link Manager通过LMP协议(Link Manager Protocol)进行通信;在BLE系统中则使用的是LL协议(Link Layer Protocol)。
• Link Controller:负责对指定物理信道(逻辑链路和逻辑传输)的蓝牙数据进行编解码。

常见协议:

HCI

在前面的介绍中我们已经多次提到,主机系统称为Host,蓝牙射频芯片的系统称为Controller,它们之间的通信接口称为HCI(Host Controller Interface),同时这也是其传输协议的名字。

HCI是Host端所能接触的最底层协议,通过内核的HCI驱动进行操作,基于HCI逐步往上封装和实现了一系列高级协议。HCI协议是HCI接口最底层的协议,可根据传输层的介质分为不同类型。

HCI数据包分为command、event和data三种类型。command表示Host发送给Controller的命令,event为Controller发送给Host的事件,data通常是实际的蓝牙传输数据

HCI command的格式为:
16bit opcode | 8bit 参数长度 | 可变参数

其中opcode又分为两部分,高6位为OGF(Opcode Group Field),低10位为OCF(Opcode Command Field)。在Linux中我们常用的bluez框架也可以直接发送hci命令:

$ hcitool cmd --help
Usage:cmd <ogf> <ocf> [parameters]
Example:cmd 0x03 0x0013 0x41 0x42 0x43 0x44

HCI event的格式为:
8bit event code | 8bit 参数长度 | 可变参数

通常Host发送的command都会收到Controller的返回event,提示命令的执行结果。
例如,HCI命令0x200c表示LE Set Scan Enable,并通过参数控制开启和关闭BLE的扫描,Controller执行完毕后返回event code 0x0e,即Command Complete,并附带status作为参数表示结果是否成功。

除了command和event,HCI中还包括的一大载荷就是数据,比如前面提到的同步数据包SCO、ISO(isochronous)和无连接数据包ACL等。

L2CAP:

ACL只提供了一个数据传输协议,类比于网络协议栈中的IP协议,在其之上使用的L2CAP协议可以类比于TCP/UDP协议,一个介于应用程序(Profile、Application等)和Link Layer之间的protocol,实现了更为完善的数据传输功能,包括:

• 协议/信道(L2CAP channel)多路复用
• 分段(segmentation)和重组(reassembly)
• 基于L2CAP channel的流量控制机制
• 错误控制重传机制
• 支持流式传输(streaming)
• 分片(fragmentation)和重组(recombination)
• QoS(Quality of Service)

L2CAP channel表示两个设备之间的一条逻辑链路,使用channel id(CID)进行区分,并以此为基本单元在Controller逻辑链路上进行多路复用。
在基于连接的信道(connection-oriented channels)中,L2CAP PDU也称为B-Frame,其格式如下:

16bit length | 16bit CID | information payload

前32bit称为L2CAP header,length是除了header以外的payload长度。在不同的L2CAP模式中,information payload的内容也不尽相同,比如在Supervisor Frame(S-Frame)、Information Frame(I-Frame)。而对于无连接的L2CAP数据包,在payload之前还包含大于等于2字节的PSM(Protocol/Service Multiplexer),头部还是和B-Frame一致的。

在L2CAP之上,有着各种各样的应用层协议,比如服务发现协议SDP,蓝牙传输协议RFCOMM/OBEX,BLE的属性协议ATT,甚至是通用以太网协议BNEP以及其上的TCP/IP网络栈等。通过分层和抽象使得上层应用无需关心底层的细节,从而实现了整个蓝牙协议栈的普适性和拓展性。

GAP(Generic Access Profile)

GAP的主要功能,是定义BLE设备所具备的能力,以实现互联互通的功能。

对BEL基于连接的通信来说,GAP定义了4种连接有关的模式

• Non-connectable mode,不可被连接。
• Directed connectable mode,可以被“直连”(在知道对方蓝牙地址的情况下的快速连接)。
• Undirected connectable mode,可以被“盲连”(不知道对方蓝牙地址)。
• Auto connection establishment procedure,可以被自动连接(不需要host干预)。

相应地,GAP定义了5中和这些模式有关的过程

• General connection establishment procedure,通用的连接建立过程,搜索、发现、连接,都需要Host参与。
• Selective connection establishment procedure,有选择的连接建立过程,Host需要告诉Controller,自己只希望于特定的设备建立连接。
• Direct Connection Establishment Procedure,直接和某一个已知设备建立连接(对方也知道我们)。
• Connection Parameter Update Procedure,连接参数的更新过程。
• Terminate Connection Procedure,断开连接。

SDP (Service Discovery Protocol)

SDP是经典蓝牙中的高层协议,使用 C/S 架构。它定义了 client 如何发现 server 提供的服务:

上图中的关键点是,client 必须等待 server 响应当前的 request PDU 后,才能发送下一个 request PDU。Request PDU 会携带限制 response PDU 返回数据大小的字段,比如 MaximumAttributeByteCount

Bluetooth SDP Protocol

•   PDU: Service Search Attribute Request (0x06)
•   Transaction Id: 0x0000
•   Parameter Length: 15
•   Service Search Pattern: Public Browse Group
•   Maximum Attribute Byte Count: 65535
•   Attribute ID List
•   Continuation State: no (00)

Response PDU 也会携带相应的字段表示自己返回数据的长度,比如 AttributeListsByteCount:

Bluetooth SDP Protocol

•   PDU: Service Search Attribute Response (0x07)
•   Transaction Id: 0x0000
•   Parameter Length: 667
•   Attribute List Byte Count: 662
•   Data Fragment
•   Continuation State: yes (02 96)
•   Continuation State Length: 2
•   Continuation State Value

BNEP

BNEP(Bluetooth Network Encapsulation Protocol) 网络封装协议。为了使集成蓝牙技术的电脑、电话、PDA、家用电器等网络设备交换信息,需要在网络层统一数据分组。网络封装协议将来自不同网络的数据分组重新封装,通过 L2CAP 进行传输。BNEP 支持 Ipv4、Ipv6

在BNEP之上是PAN profile, 实现了网络层。

除了各种封装消息外,BNEP还支持BNEP控制消息。控制消息有助于建立PAN连接和各种流量控制功能

为了可以让多个控制信息在一个L2CAP报文里面,一个可选的Extension header可以加在BNEP header后面,如果将BNEP header中的”extension bit“置为1,则表示这个BNEP报文会包含extension header

未待完续…

参考:
https://mp.weixin.qq.com/s/Ojm3LSw8q8H5pAT-JxUyqA
http://www.wowotech.net/bluetooth/bt_protocol_arch.html
https://evilpan.com/2021/07/10/bluetooth-sec/#%E6%A0%B8%E5%BF%83%E7%B3%BB%E7%BB%9F

Bluetooth协议学习相关推荐

  1. [转载]Bluetooth协议栈学习之SDP

    原文地址:Bluetooth协议栈学习之SDP作者:BigSam78 作者: Sam (甄峰) sam_code@hotmail.com SDP(service discovery protocol: ...

  2. 苹果ANCS协议学习【转】

    苹果ANCS协议学习 转自:http://www.cnblogs.com/alexcai/p/4321514.html 综述 苹果通知中心(Apple Notification Center Serv ...

  3. Android Bluetooth模块学习笔记

    一.蓝牙基础知识 1.蓝牙( Bluetooth )是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.蓝牙基于设备低成本的收发器芯片,传输距离近.低功耗. 2.微波频段: ...

  4. Servlet和HTTP请求协议-学习笔记02【Servlet_体系结构与urlpartten配置、HTTP请求协议】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  5. Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  6. RTMP协议学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> RTMP协议学习总结 转载于:https://my.oschina.net/u/2374678/blog/746464

  7. 智能会议系统(9)---流媒体协议学习

    流媒体协议学习 一.协议篇 1. rtsp协议详解(http://www.mikewootc.com/wiki/net/protocol/rtsp.html) 2. rtp与rtcp协议详解(http ...

  8. TCP/IP协议学习(五) 基于C# Socket的C/S模型

    TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的:然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多.C#通过提供的Socket API ...

  9. POP3协议学习笔记

    今日得闲,于是将POP3的学习笔记也整理出来! 互联网上的TCP/IP,POP3/SMTP等资料多如牛毛,这里只是自己一点点心得,另外对于各位网络方面的大牛请安静的路过,我可不喜欢在关公面前耍大刀.. ...

最新文章

  1. 重新开始 2011/11/25
  2. python colormap(颜色映射)
  3. 游戏服务器的架构演进
  4. AbstractReferenceCountedByteBuf源码分析
  5. mysql 8安装_mysql安装过程详解
  6. 二叉树打印叶子节点,非递归_使用递归打印链接列表中的备用节点
  7. Docker和容器如何改善eZ的软件开发
  8. 斯坦福 CS228 概率图模型中文讲义 三、实际应用
  9. 《计算机网络》第三章:数据链路层(The Data Link Layer)
  10. Qt linux双屏,qt5 多屏显示
  11. tf代码之tf.nn.conv2d_transpose
  12. 汇编语言程序设计 实验7 循环程序设计
  13. VS 反编译工具 ildasm
  14. ExDirectUI 5.0 项目重构正式启动
  15. Windows API ShowWindow和UpdateWindow
  16. linux无法更改屏幕亮度调节软件,在Deepin系统中安装闭源显卡驱动后屏幕亮度无法调节的解决...
  17. “新基建”投资背景下 安防企业如何把握发展机遇?
  18. Android 架构设计与挑选
  19. 装配一台计算机有哪些安全注意事项,挤出机注意事项
  20. 电力电子中的宽禁带器件

热门文章

  1. 机器学习从蛋白序列预测蛋白分类(二)
  2. hive 各种 join (left outer join、join、full outer join)
  3. freeswitch语音识别一系列干货
  4. 你是否有疑问,软件是如何驱动硬件,代码又是如何对计算机进行控制的呢?
  5. 训练网络时,loss损失的问题
  6. (已完善)基于Python的TCP 协议实现人机聊天(程序具有服务端和客户端)
  7. 基于K-Means的文本聚类
  8. NGINX中如何根据客户端IP地址控制访问
  9. 手把手教你制作一目了然的可视化地图
  10. Flutter组件学习(13)层叠布局Stack、Positioned