蓝牙分类
原文地址
https://note.youdao.com/s/WzgVsHTx
通常我们所说的蓝牙分为两种:
- 经典蓝牙模式(代码里经常看见br/edr)
- 低功耗模式(代码里le表示)
Bluetooth Profile
- Profile(翻译轮廓)这个是蓝牙的核心规范
- 描述了远程设备的接口,设备数据的状态,其它一些能力。
- Profile主要分为两种GATT(Genric Attribute Profile)和GAP(Generic Access Profile)
- GATT定义数据属性特征的规范
- GAP定义数据访问的规范
GATT
- GATT定义数据的规范,例如一个物体的形状 颜色,具有哪些操作等
- 这种规范通过(Service Characteristics and Descriptors)服务,特征值和描述符
服务特征值和描述符的关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qcFUevFE-1663402674358)(https://note.youdao.com/yws/res/19073/WEBRESOURCE8649d31b1b8a6868a5bf2ec30b8bd71f)]
-
服务包含特征值,描述符修饰特征值
-
特征值个人理解是一个管道,管道拥有权限,可读可写,通知权限。
-
两个蓝牙设备可以通过这个管道根据他们的权限进行传输数据。
-
特征值既然是两个设备之间传输的管道,那么两个蓝牙设备直接就有了关系客户端和服务端的关系
-
拥有服务和特征值的就是gatt server
-
查询访问特征值的就是gatt client
设备数据传输通道有了如何建立连接呢?tcp是通过ip和端口连接,蓝牙呢?
GAP
- Generic Access Profile,这个东西规定了蓝牙如何查找对方,如何连接对方。
- 他规定了你的蓝牙耳机不停的发送广播,告诉别人,我是谁
- 他还规定了你的手机不停的扫描设备,扫描到蓝牙耳机,去连接他
- 上面只是列举了通用的功能
根据GAP的规定,一个蓝牙设备可能扮演四种角色
- A peripheral Advertises:(周边广播设备)
他会不停的广播自己,并且接受中心设备的连接,我们所说的从机,蓝牙耳机就是扮演这个角色 - A Central Device,中心设备
他可以扫描周边的广播信息,并且由用户决定是否去连接这个设备,手机经常担任这个角色 - A Broadcaster 广播设备
他只广播,不接收任何的连接,他从在的目的就是为了广播信息(Bluetooth Beacon(iBecon EddyStone)就是广播设备) - A Observer 观察者设备
仅仅扫描处理广播包,不会去主动连接任何设备
一个设备既可以同时成为中心设备和从机设备,只要蓝牙协议栈支持两个模块
一个GAP Periphereal在被连接后,就扮演GATT Server的角色,GAP Central设备正在连接一个GAP Periphereal设备那么他就成为了一个GATT Client的角色。
需要理解一个点是,GAP Periphereal或者Central和GATT Client和Server,是两个独立的个体。一个GAP Central设备在连接了一个设备之后,他还可以承担GATT Server的角色
ATT
* The Atribute Protocol,是蓝牙协议栈的一个分层,允许GATT Client和GATT Server之间互相通信。发现远程服务的特征值,关闭打开notify
Linux蓝牙架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MNFcyjqd-1663402674359)(https://note.youdao.com/yws/res/19336/WEBRESOURCEd1dc17d29a174a386e16f681fc23724a)]
- GAP负责扫描广播和连接
- GATT负责提供访问接口,和访问接口的入口
- ATT提供GATT client和server通信的协议层
- BlueZ Linux蓝牙协议栈实现的仅仅是Host层,Controller控制器集成在芯片内部(蓝牙控制器又被称为适配器)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-joyGcm31-1663402674360)(https://note.youdao.com/yws/res/19348/WEBRESOURCEdaf38973aeed63f13404ea7710df27f9)]
- Linux蓝牙操作一般需要应用层通过D-Bus和Bluetoothd 守护进程进行通信
- Host层的Bluez和控制层的蓝牙协议栈进行通信,通常需要标准的接口
- 这个标准的接口就是Host Controller Interface,简称HCI
- HCI接口定义在蓝牙核心规范里。
参考:
(蓝牙参考资料,核心规范下载地址) https://www.bluetooth.com/develop-with-bluetooth/build/