Bluetooth协议学习
蓝牙协议学习
背景知识
蓝牙(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协议学习相关推荐
- [转载]Bluetooth协议栈学习之SDP
原文地址:Bluetooth协议栈学习之SDP作者:BigSam78 作者: Sam (甄峰) sam_code@hotmail.com SDP(service discovery protocol: ...
- 苹果ANCS协议学习【转】
苹果ANCS协议学习 转自:http://www.cnblogs.com/alexcai/p/4321514.html 综述 苹果通知中心(Apple Notification Center Serv ...
- Android Bluetooth模块学习笔记
一.蓝牙基础知识 1.蓝牙( Bluetooth )是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.蓝牙基于设备低成本的收发器芯片,传输距离近.低功耗. 2.微波频段: ...
- Servlet和HTTP请求协议-学习笔记02【Servlet_体系结构与urlpartten配置、HTTP请求协议】
Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...
- Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】
Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...
- RTMP协议学习笔记
2019独角兽企业重金招聘Python工程师标准>>> RTMP协议学习总结 转载于:https://my.oschina.net/u/2374678/blog/746464
- 智能会议系统(9)---流媒体协议学习
流媒体协议学习 一.协议篇 1. rtsp协议详解(http://www.mikewootc.com/wiki/net/protocol/rtsp.html) 2. rtp与rtcp协议详解(http ...
- TCP/IP协议学习(五) 基于C# Socket的C/S模型
TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的:然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多.C#通过提供的Socket API ...
- POP3协议学习笔记
今日得闲,于是将POP3的学习笔记也整理出来! 互联网上的TCP/IP,POP3/SMTP等资料多如牛毛,这里只是自己一点点心得,另外对于各位网络方面的大牛请安静的路过,我可不喜欢在关公面前耍大刀.. ...
最新文章
- 重新开始 2011/11/25
- python colormap(颜色映射)
- 游戏服务器的架构演进
- AbstractReferenceCountedByteBuf源码分析
- mysql 8安装_mysql安装过程详解
- 二叉树打印叶子节点,非递归_使用递归打印链接列表中的备用节点
- Docker和容器如何改善eZ的软件开发
- 斯坦福 CS228 概率图模型中文讲义 三、实际应用
- 《计算机网络》第三章:数据链路层(The Data Link Layer)
- Qt linux双屏,qt5 多屏显示
- tf代码之tf.nn.conv2d_transpose
- 汇编语言程序设计 实验7 循环程序设计
- VS 反编译工具 ildasm
- ExDirectUI 5.0 项目重构正式启动
- Windows API ShowWindow和UpdateWindow
- linux无法更改屏幕亮度调节软件,在Deepin系统中安装闭源显卡驱动后屏幕亮度无法调节的解决...
- “新基建”投资背景下 安防企业如何把握发展机遇?
- Android 架构设计与挑选
- 装配一台计算机有哪些安全注意事项,挤出机注意事项
- 电力电子中的宽禁带器件