一、蓝牙概述
蓝牙(Bluetooth)是一种无线通信技术,用于在短距离范围内传输数据和连接设备。它是由爱立信(Ericsson)公司于1994年提出并开发的,旨在取代传统的有线连接方式,提供更便捷的无线通信解决方案。其利用特定的频率的波段(2.4GHz~2.4835GHz),进行电磁波传输。蓝牙传输原理是主从关系,一个主设备可以与多个从设备配对。
其基本特性包含如下:
1、蓝牙配对与连接:蓝牙设备之间的配对和连接过程,包括身份验证、密钥交换和加密等。
2、蓝牙协议栈:从物理层到应用层的软件框架,用于管理和控制蓝牙设备之
间的通信。
3、蓝牙配置与设置:包括设置蓝牙设备的名称、可见性、配对模式,以及其他配置选项。
蓝牙数据传输:通过蓝牙进行数据传输的技术,包括传输速率、传输模式(如串口、音频、文件传输等)和数据编码。
4、蓝牙低功耗(BLE):蓝牙4.0以后引入的低功耗技术,用于满足对电池寿命要求较高的设备,如智能手表、健康追踪器等。
5、蓝牙网关与互联:将蓝牙设备连接到互联网,实现与云端服务和其他设备的通信。
6、蓝牙音频传输:支持蓝牙音频设备之间的无线音频传输,如蓝牙耳机、扬声器等。
7、蓝牙地理定位:利用蓝牙信号强度和位置信息进行设备的定位和跟踪。
8、蓝牙安全性:实施蓝牙通信的安全措施,如加密、身份验证和防止中间人攻击等。
9、蓝牙用户接口:提供用户友好的界面和交互方式,方便用户管理和控制蓝牙设备。
二、蓝牙发展历程
蓝牙版本 发布时间 最大传输速度
蓝牙1.0 1998 723.1Kbps
蓝牙1.1 2002 810Kbps
蓝牙1.2 2003 1Mbps
蓝牙2.0+EDR 2004 2.1Mbps
蓝牙2.1+EDR 2007 3Mbps
蓝牙3.0+HS 2009 24Mbps
蓝牙4.0 2010 24Mbps
蓝牙4.1 2013 24Mbps
蓝牙4.2 2014 24Mbps
蓝牙5.0 2016 48Mbps
蓝牙5.1 2019 48Mbps
蓝牙5.2 2020 48Mbps
三、蓝牙常用关键词介绍
HCI(HOST CONTROLLER INTERFACE):主机控制层接口
L2CAP(Logical Link Control and Adaptation Protocol):逻辑链路控制与适配协议,将ACL数据分组交换为便于高层应用的数据分组格式,并提供协议复用和服务质量交换等功能。
SPP(Serial Port Profile)是蓝牙技术中的一个协议配置文件,用于在蓝牙设备之间建立串行端口通信,SPP协议配置文件定义了在蓝牙设备之间建立和管理串行端口通信所需的规范和协议。它使用RFCOMM(Radio Frequency Communication)协议作为底层传输协议,通过虚拟的串行端口(类似于COM端口)进行数据交换
SDP(SERVICE DISCOVERY PROTOCOL):服务发现协议,服务发现协议(SDP)为应用程序提供了一种方法来发现哪些服务可用,并确定这些可用服务的特征
RFCOMM(Serial Port Emulation):串口仿真协议,上层协议蓝牙电话,蓝牙透传SPP等协议都是直接走的RFCOMM
OBEX(Object Exchange):对象交换协议,蓝牙电话本,蓝牙短信,文件传输等协议都是走的OBEX
HFP(Hands-Free):蓝牙免提协议
A2DP(Advanced Audio Distribution): 蓝牙音乐协议
PBAP(Phone Book Access):蓝牙电话本访问协议
MAP(MESSAGE ACCESS PROFILE):蓝牙短信访问协议
OPP(OBJECT PUSH PROFILE):对象推送协议
AVDTP(AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL):音视频分布传输协议,是A2DP的底层
HID(HUMAN INTERFACE DEVICE):人机接口协议
AVRCP(AUDIO/VIDEO REMOTE CONTROL PROFILE):蓝牙音乐控制协议
ATT(Attribute Protocol):蓝牙属性协议,位于L2CAP(Logical Link Control and Adaptation Protocol)之上的协议层
GATT(Generic Attribute Profile):蓝牙通用属性协议,是蓝牙低功耗(Bluetooth Low Energy,BLE)技术中用于设备之间通信和数据交换的协议框架
四、蓝牙通信基本框架
蓝牙的基本框架是由多个层次构成的,通常包括以下几层:
-
物理层:主要负责定义蓝牙的无线通信规范,包括无线传输的频率和功率控制等。
-
基带层:用于管理蓝牙设备之间的连接,负责处理数据的传输和接收,实现可靠的无线通信。
-
链路层:包括管理和控制连接的 L2CAP(逻辑链路控制和适配协议)以及实现蓝牙设备之间的数据传输和 QoS(服务质量)控制等功能。
-
主机控制器接口(HCI)层:连接蓝牙核心和物理蓝牙控制器之间的接口,负责传输上层的数据和命令。
-
逻辑链路控制和适配协议(L2CAP)层:提供多路复用、分段和重组等功能,以实现在基带层之上的数据传输。
-
服务发现协议(SDP)层:帮助设备发现和识别对方支持的服务和功能。
蓝牙协议由 HOST 层和 CONTROLLER 层组成。
CONTROLLER 控制器层
- PHY:基带物理层
- LL:链路层
- HCI:主机控制接口
HOST 主机层
- L2CAP:逻辑链路控制和适配器
- ATT:属性协议
- GATT:属性协议配置规范
- SM:安全管理
- GAP:通用访问规范
对于传统蓝牙,应用层到底层:SPP->RFOMM->L2CAP->HCI->TRANSPORT
对于低功耗蓝牙,应用层到底层:BAS->GATT->ATT->L2CAP->HCI->TRANSPORT
五、蓝牙功率等级
蓝牙功率分3个级别:
功率等级 功率限制 覆盖距离
Class 1: 0dBm~20dBm; 100米
Class2: -6dBm~4dBm; 10米
Class3: 小于0dBm; 1米
常见的就是Class2,功率一般在0dBm附近。不过不是标准值,功率在Class1-2之
六、蓝牙信道
蓝牙(Bluetooth)工作在2.4G的ISM(Industrial, Science and Medicine)频段,具体为2400-2483.5MHz,信道带宽1MHz,有79个信道。第一个信道从2.402开始;信道频率为2402+K,K取0-78,共79个信道。
不同国家的信道
地区 频率范围 射频通道
美国、欧洲和世界其他地区 2.4至2.4835 GHz f=2.402+n,MHz(n=0至78)
日本 2.471至2.497 GHz f=2.473+n,MHz(n=0至22)
法国 2.4465至2.4835 GHz f=2.454+n,MHz (n=0至22)
传统蓝牙(BR/EDR)跳频信道数:79个,每个信道带宽为1MHz 2402-2480
低功耗蓝牙使用40个通道,有37个通道(称为通用通道,general purpose channels)可在连接通信时使用,其它三个信道用来广播,广播信道:37、38、39,对应的中心频率是2402MHz,2426MHz,2480MHz。广播信道之间相差至少24MHz。每次广播都会在3个信道上将广播数据发送一次,3个信道同时被干扰的几率很小。
七、蓝牙调试工具介绍(bluez)
obexd、bluetoothd和bluetoothctl都是与蓝牙相关的软件组件或工具,其中都属于bluez。
bluez5 包含以下工具:
(1)bluetoothd
1)是BlueZ的中央守护进程,蓝牙的扫描,链接,管理都得经过它。
2)提供用于UI和其他子系统的D-Bus接口
3)减少暴露底层细节
4)可以通过插件扩展(例如通过neard支持NFC,通过sixaxis支持DS3)
(2)obexd
1)是OBEX协议的守护进程
2)提供用于UI的D-Bus接口
3)具有与bluetoothd类似的架构
4)文件传输的守护进程
(3)底层工具(tools)
1)bluetoothctl - bluetoothd的客户端工具,命令行下操作蓝牙,大部分得靠它。
2)obexctl - obexd 的客户端工具
3)btmon - HCl信息跟踪
4)hciconfig 等其他用于测试,开发和跟踪的命令行工具集
(4)上层协议
1)Audio and media (A2DP, AVRCP)
2)Telephony (HFP, HSP)
3)Networking (PAN, 6LoWPAN)
4)Input device (HID, HoG)
5)OBEX (FTP, OPP, MAP, PBAP)
6)Others
7.1 obexd
obexd是一个用于支持蓝牙对象交换协议(OBEX)的守护进程。OBEX是一种用于在蓝牙设备之间传输对象(如文件、联系人、日历事件等)的协议。obexd负责管理蓝牙设备之间的对象交换过程,它提供了OBEX协议的实现,允许设备之间进行文件传输和其他交互。
7.2 bluetoothd & bluetoothctl
bluetoothd:bluetoothd是蓝牙协议栈(Bluetooth stack)中的守护进程,也称为蓝牙管理器。它是Linux系统中蓝牙功能的核心组件之一。bluetoothd负责管理蓝牙设备的发现、配对、连接和通信。它提供了与蓝牙硬件和其他蓝牙设备进行交互的接口,以及管理蓝牙配置和服务的功能。
bluetoothctl:bluetoothctl是一个命令行工具,用于与蓝牙管理器(bluetoothd)进行交互。它提供了一个交互式界面,允许用户执行各种蓝牙操作,如扫描设备、配对、连接和配置蓝牙设备等。通过bluetoothctl,用户可以在命令行中执行蓝牙相关的操作,而不需要依赖图形界面工具。
综上所述,obexd是用于支持蓝牙对象交换协议(OBEX)的守护进程,bluetoothd是蓝牙协议栈中的守护进程,而bluetoothctl是一个命令行工具,用于与蓝牙管理器进行交互。它们一起提供了在Linux系统中管理和操作蓝牙设备的功能。
7.3 hcitool
hcitool 是一个命令行工具,用于控制蓝牙设备的相关操作,如扫描周围的蓝牙设备、获取设备信息、设置设备参数等,与之配套使用的命令还有hciattach 、hciconfig。
7.4 bluez
bluez是一个开源的蓝牙协议栈,它提供了在 Linux 系统上进行蓝牙通信的支持。它包括了蓝牙协议的实现以及各种工具和库,用于管理和控制蓝牙设备。其官网信息可具体查看:https://www.bluez.org/
7.5 其他工具和命令(hcidump、btmon、sdptool、rfcomm)
调试蓝牙的工具和命令还有:
- hcidump: 用于捕获和显示蓝牙通信的原始数据包,帮助进行蓝牙协议的分析和故障排除。
- btmon: 用于监视和记录蓝牙通信过程中的事件,包括命令、事件和数据报文。
- sdptool: 用于查看和管理蓝牙设备上的服务记录,可以列出设备支持的服务以及相关属性。
- rfcomm: 用于在蓝牙设备之间建立串口连接,将蓝牙设备模拟为串口设备进行数据传输。
八、命令操作演示
8.1 hcitool命令操作
hcitool -h
hcitool - HCI Tool ver 5.64
Usage:
hcitool [options] <command> [command parameters]
Options:
--help Display help
-i dev HCI device
Commands:
dev Display local devices
inq Inquire remote devices
scan Scan for remote devices
name Get name from remote device
info Get information from remote device
spinq Start periodic inquiry
epinq Exit periodic inquiry
cmd Submit arbitrary HCI commands
con Display active connections
cc Create connection to remote device
dc Disconnect from remote device
sr Switch central/peripheral role
cpt Change connection packet type
rssi Display connection RSSI
lq Display link quality
tpl Display transmit power level
afh Display AFH channel map
lp Set/display link policy settings
lst Set/display link supervision timeout
auth Request authentication
enc Set connection encryption
key Change connection link key
clkoff Read clock offset
clock Read local or remote clock
lescan Start LE scan
leinfo Get LE remote information
lealadd Add device to LE Accept List
lealrm Remove device from LE Accept List
lealsz Read size of LE Accept List
lealclr Clear LE Accept List
lewladd Deprecated. Use lealadd instead.
lewlrm Deprecated. Use lealrm instead.
lewlsz Deprecated. Use lealsz instead.
lewlclr Deprecated. Use lealclr instead.
lerladd Add device to LE Resolving List
lerlrm Remove device from LE Resolving List
lerlclr Clear LE Resolving List
lerlsz Read size of LE Resolving List
lerlon Enable LE Address Resolution
lerloff Disable LE Address Resolution
lecc Create a LE Connection
ledc Disconnect a LE Connection
lecup LE Connection Update
For more information on the usage of each command use:
hcitool <command> --help
hcitool dev
Devices:
hci0 E0:D0:45:61:A1:38
hcitool scan
Scanning ...
A0:D8:07:56:CC:8D mate30其他配套命令有:
hciconfig hci0 up
hciconfig hci0 piscan
hciconfig hci0 leadv
免认证:
hciconfig hci0 auth
广播:
hciconfig hci0 leadv
hcitool -i hci0 lescan
8.2 bluetoothctl命令操作
操作bluetoothctl后,会进入到其会话终端bluetooth:常用的scan on扫描,pair配对,remove移除等命令,需要启动该进程:/usr/lib/bluetooth/bluetoothd( bluetooth.service)
bluetoothctl
Agent registered
[CHG] Controller E0:D0:45:61:A1:38 Pairable: yes
[bluetooth]# scan on
Discovery started
[CHG] Controller E0:D0:45:61:A1:38 Discovering: yes
[NEW] Device D8:34:1C:5C:D0:AF midea
[NEW] Device 80:76:C2:C8:FF:7D midea
[NEW] Device 72:C4:93:5F:31:D5 72-C4-93-5F-31-D5
[NEW] Device A0:D8:07:56:CC:8D mate30
[CHG] Device DC:97:58:13:39:18 RSSI: -70
[CHG] Device D8:34:1C:5C:D0:AF ManufacturerData Key: 0x06a8
[CHG] Device D8:34:1C:5C:D0:AF ManufacturerData Value:
01 5f 1c 32 af d0 5c 1c 34 d8 00 ._.2..\.4..
[CHG] Device 80:76:C2:C8:FF:7D ManufacturerData Key: 0x06a8
[CHG] Device 80:76:C2:C8:FF:7D ManufacturerData Value:
01 03 00 32 7d ff c8 c2 76 80 00 ...2}...v..
[bluetooth]# pair A0:D8:07:56:CC:8D
Attempting to pair with A0:D8:07:56:CC:8D
[CHG] Device A0:D8:07:56:CC:8D Connected: yes
Request confirmation
[agent] Confirm passkey 725488 (yes/no): [DEL] Device D8:34:1C:5C:D0:AF midea
[agent] Confirm passkey 725488 (yes/no): [DEL] Device 80:76:C2:C8:FF:7D midea
[agent] Confirm passkey 725488 (yes/no): yes
[DEL] Device 72:C4:93:5F:31:D5 72-C4-93-5F-31-D5
Failed to pair: org.bluez.Error.AuthenticationFailed
[CHG] Device A0:D8:07:56:CC:8D Connected: no
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 00001105-0000-1000-8000-00805f9b34fb[NEW] Device 80:76:C2:C8:FF:7D midea
[NEW] Device D8:34:1C:5C:D0:AF midea
[bluetooth]# pair A0:D8:07:56:CC:8D
Attempting to pair with A0:D8:07:56:CC:8D
[CHG] Device A0:D8:07:56:CC:8D Connected: yes
Request confirmation
[agent] Confirm passkey 762348 (yes/no): yes
[CHG] Device A0:D8:07:56:CC:8D Modalias: bluetooth:v010Fp107Ed1436
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 0000046a-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 00001105-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 0000110a-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 00001112-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 00001115-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 00001116-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 0000111f-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 0000112f-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 00001132-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 00001800-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 00001801-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 0000fdd1-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 0000fe35-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 11c8b310-80e4-4276-afc0-f81590b2177f
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 8ce255c0-200a-11e0-ac64-0800200c9a66
[CHG] Device A0:D8:07:56:CC:8D UUIDs: 9664aa26-d76c-43ad-9775-d310f253a408
[CHG] Device A0:D8:07:56:CC:8D ServicesResolved: yes
[CHG] Device A0:D8:07:56:CC:8D Paired: yes
Pairing successful
[CHG] Device 80:76:C2:C8:FF:7D ManufacturerData Key: 0x06a8
[CHG] Device 80:76:C2:C8:FF:7D ManufacturerData Value:
01 03 00 32 7d ff c8 c2 76 80 00 ...2}...v..
[CHG] Device A0:D8:07:56:CC:8D ServicesResolved: no
[CHG] Device A0:D8:07:56:CC:8D Connected: no
[CHG] Device D8:34:1C:5C:D0:AF ManufacturerData Key: 0x06a8
[CHG] Device D8:34:1C:5C:D0:AF ManufacturerData Value:
01 5f 1c 32 af d0 5c 1c 34 d8 00 ._.2..\.4..
[CHG] Device A0:D8:07:56:CC:8D RSSI: -66
[CHG] Device A0:D8:07:56:CC:8D ManufacturerData Key: 0x027d
[CHG] Device A0:D8:07:56:CC:8D ManufacturerData Value:
0f 04 ..
[CHG] Device A0:D8:07:56:CC:8D ServiceData Key: 0000fdee-0000-1000-8000-00805f9b34fb
[CHG] Device A0:D8:07:56:CC:8D ServiceData Value:
06 05 a8 69 71 00 00 00 00 00 02 0e 19 c8 8d b3 ...iq...........
c9 35 4c ba 01 0a 9d 9a .5L.....
[CHG] Device 80:76:C2:C8:FF:7D ManufacturerData Key: 0x06a8
[CHG] Device 80:76:C2:C8:FF:7D ManufacturerData Value:
01 03 00 32 7d ff c8 c2 76 80 00 ...2}...v..
[CHG] Device A0:D8:07:56:CC:8D RSSI: -55
[CHG] Device D8:34:1C:5C:D0:AF ManufacturerData Key: 0x06a8
[CHG] Device D8:34:1C:5C:D0:AF ManufacturerData Value:
[CHG] Device A0:D8:07:56:CC:8D RSSI: -56
[bluetooth]#bluetooth]# remove A0:D8:07:56:CC:8D
[DEL] Device A0:D8:07:56:CC:8D mate30
Device has been removed其他还可在交互终端进行 show, devices, list , power on , connect, trust等操作
8.3 obexd命令操作
1、开启obexd 守护进程
$ echo "hello" > /home/root/test.txt
$ export $(dbus-launch)
$ /usr/libexec/bluetooth/obexd -r /home/root -a -d &
2、链接&传送文件
执行obexctl 进行以下交互命令:
obexcl
[obex]# connect 98:39:8E:1B:D8:89
[obex]# send /home/a.txt
[obex]# quit
8.4 rfkill节点
cat /sys/class/rfkill/rfkill2/name
hci0
cat /sys/class/rfkill/rfkill2/uevent
RFKILL_NAME=hci0
RFKILL_TYPE=bluetooth
RFKILL_STATE=1
RFKILL_HW_BLOCK_REASON=0x0
说明:rfkill是一个Linux内核模块,用于控制和管理无线设备的软件状态。rfkill节点是通过rfkill模块在Linux系统中创建的虚拟文件节点,用于管理和控制无线设备的硬件开关状态
九、抓包工具及分析
采用wireshark对bluetooth-monitor设备进行抓包,整体如下图,可以使用journalctl -u bluetooth.service抓取蓝牙的一些log信息:
此处记录wireshark还可以抓取dbus等信息日志:
抓到的蓝牙整体协议包如下: