协议简介:
1. 蓝牙PAN(Personal Area Network)
- 用途:蓝牙PAN用于在蓝牙设备之间建立一个小型的局域网,允许多个设备共享网络连接(如互联网接入)。
- 工作原理:
- PAN设备分为三种角色:
- PANU(Personal Area Network User):普通用户设备,连接到网络。
- GN(Group Ad-hoc Network):组内设备共享网络连接。
- NAP(Network Access Point):作为网络接入点,提供互联网连接。
- 通过PAN协议,设备可以共享IP网络连接,类似于Wi-Fi网络。
- PAN设备分为三种角色:
- 典型应用:
- 手机通过蓝牙共享网络给笔记本电脑。
- 蓝牙设备之间的文件共享。
- 基于蓝牙网络封装协议(BNEP,Bluetooth Network Encapsulation Protocol)。
- 依赖于蓝牙协议栈的 L2CAP(Logical Link Control and Adaptation Protocol)和 HCI(Host Controller Interface)。
2. 蓝牙SPP(Serial Port Profile)
- 用途:SPP用于在蓝牙设备之间模拟传统的串行通信(如RS232串口),实现点对点的数据传输。
- 工作原理:
- SPP基于RFCOMM协议,提供可靠的串行通信通道。
- 设备分为服务端和客户端,服务端提供串口服务,客户端连接并发送数据。
- 典型应用:
- 蓝牙打印机、蓝牙扫描仪等外设与主机的通信。
- 蓝牙模块与微控制器之间的数据传输。
- 蓝牙调试工具与设备的通信。
3. 议栈对比
特性 | PAN | SPP |
---|---|---|
用途 | 建立小型局域网,共享网络连接 | 模拟串口通信,传输数据 |
协议依赖 | BNEP、L2CAP、HCI | RFCOMM、L2CAP、HCI |
连接类型 | 网络通信(IP 数据传输) | 通常为串行通信(点对点数据传输) |
应用场景 | 网络共享、文件传输 | 设备间数据传输、外设通信 |
4. 常见问题
- PAN问题:
- 网络连接不稳定。
- 设备无法发现或连接。
- SPP问题:
- 连接断开或数据传输失败。
- 波特率配置不匹配。
5. 实际碰到的问题:
pan 服务必须要开启bt tethering,否则设备连接不了,key log:
03-04 05:25:01.958 1455 1455 D PanService: handlePanDeviceStateChange preState: 0 state: 2
03-04 05:25:01.958 1455 1455 D PanService: handlePanDeviceStateChange BT tethering is off/Local role is PANU drop the connection
03-04 05:25:01.958 1455 1921 W bt_l2cap: L2CA_DisconnectReq() CID: 0x004c
查看代码:
packages/apps/Bluetooth/src/com/android/bluetooth/pan/PanService.java
500 void handlePanDeviceStateChange(BluetoothDevice device, String iface, int state, int localRole,
501 int remoteRole) {
...
540 Log.d(TAG, "handlePanDeviceStateChange preState: " + prevState + " state: " + state);
541 if (prevState == state) {
542 return;
543 }
544 if (remoteRole == BluetoothPan.LOCAL_PANU_ROLE) {
545 if (state == BluetoothProfile.STATE_CONNECTED) {
546 if ((!mTetherOn) || (localRole == BluetoothPan.LOCAL_PANU_ROLE)) {
547 Log.d(TAG, "handlePanDeviceStateChange BT tethering is off/Local role"
548 + " is PANU drop the connection");
549 mPanDevices.remove(device);
550 disconnectPanNative(Utils.getByteAddress(device));
551 return;
552 }
...
确认mTetherOn 为false时会drop the connection, 故会造成连接失败。
6、Android Bluedroid 的代码结构分析
代码路径:system/bt
主要文件结构及相应功能:
main
bte_main.cc
该功能涉及BTE核心栈的初始化和卸载。
bte_main_in_hw_init:负责芯片硬件的初始化
bte_main_boot_entry:调用 GKI_init,
bte_init.cc
BTE_InitStack:初始化 BTE 控制块,如 RFCOMM、DUN、SPP、HSP2 和 HFP 等。核心 stack 必须在创建 BTU task(任务)前调用。
bta
bta 用于和 Bluetooth process 层交互,实现蓝牙设备管理、状态管理以及一些 Profile 的 Bluedroid 实现。BTA 的主要组件如下所示。
AG 实现 BTA 音频网关(audio gateway)
AR 负责 Audio/Video 注册
AV 实现 BTA advanced audio/video
DM 实现 BTA 设备管理
GATT 实现通用属性配置文件(Generic Attribute Profile),此模块是 Bluetooth 4.0 新增加的核心协议。
HL 实现 HDP (Health Device Profile)协议,此协议主要用于与健康设备的蓝牙连接,比如心率监护仪、血压测量仪、体温计等。
PAN 实现 PAN (蓝牙个人局域网)协议,使得设备可以连接以下设备:个人局域网用户(PANU)设备、组式临时网络(GN)设备或网络访问点(NAP)设备。
HH 实现 HID (Human Interface Device)协议,典型的应用包括蓝牙遥控器、蓝牙鼠标、蓝牙键盘、蓝牙游戏手柄等。
PBAP 实现 PBAP (Phone Book Access Profile)协议,用于从电话薄交换服务器上获取电话薄内容。
SYS 主要实现 BTA 系统管理。
btif
Bluetooth Interface:提供所有 Bluetooth Process 需要的 API。
src/bluetooth.cc HAL 层定义数组和函数体的实现。
src/btif_av.cc Bluedroid 上 AV 的实现,主要结构和功能函数如下。
src/btif_core.cc 该功能包含 HAL 层和 BTE 核心协议栈的核心接口函数。
src/btif_dm.cc 该功能实现设备管理(Device Manage)相关的功能。
src/btif_gatt.cc 实现 gatt 相关的接口。
src/btif_hf.cc 该功能实现 handsfree 协议的接口。
src/btif_hh.cc 该功能实现 HID Host 的蓝牙接口。
src/btif_hl.cc 该功能实现健康设备(Health Device)的蓝牙接口。
src/btif_media_task.cc btif 中的多媒体模块处理,AV(Audio Video)、HS(Headset)、HF(Handsfree)中的 audio 和 video 任务的处理。
src/btif_pan.cc 该功能实现 PAN 的蓝牙接口。
src/btif_rc.cc AVRCP 的实现,完成蓝牙耳机对音乐播放的控制。
src/btif_rc.cc 关于 btif 中状态机的处理。
src/btif_sock.cc Socket 相关接口。通过 btsock_listen 和 btsock_connect 来处理 SCO、L2CAP 和 RFCOMM 的监听与连接的建立。
HCI
HCI library 的实现,主要内容包括 HCI 接口的打开和收/发控制、Vendor 的 so 的打开和回调函数的注册、LPM(Low Power Mode) 的实现、btsnoop 的抓取等。
src/bt_hci_bdroid.c 该功能主要处理 Bluedroid 中 Host/Controller 接口(HCI)的实现。
src/vendor.c 该功能定义了 vendor 的调用函数,加载 libbt-vendor.so 库(由 vendor 提供的 libbt 文件夹里面的代码生成),初始化 vendor_interface,注册 vendor 需要的回调函数。
src/hci_h4.c 该功能包含 HCI 传送/接收处理。
src/hci_mct.c 该功能处理多链路的 HCI 发送和接收。
src/lpm.c 低功耗模式(Low Power Mode,LPM)用于完成低功耗模式相关的处理。
不同的 Android 版本 hci 实现可能不同,可以在 system/bt/hci/src/ 下查看相关文件。
stack
stack 主要用于完成各协议在 Bluedroid 中的实现,协议包含 a2dp、avctp、avdtp、avrcp、bnep、gap、gatt、hid、l2cap、pan、rfcomm、sdp、macp(Multi-Channel Adaptation Protocol,多通道适配协议)、smp(用于生成对等协议的加密密钥和身份密钥),还包含几个其他模块。
btm 主要涉及 Bluetooth Manger。
btu 该功能主要用于核心协议层之间的事件处理与转换。
7、windows 其他bt服务配置脚本:
@echo off
rem 设置蓝牙支持服务为自动启动
sc config bthserv start= auto
rem 设置蓝牙音频网关服务为自动启动
sc config BluetoothAudioGatewayService start= auto
rem 设置蓝牙免提音频网关服务为自动启动
sc config BluetoothHandsfreeAudioGatewayService start= auto
rem 设置蓝牙音视频远程控制协议服务为自动启动
sc config BluetoothAVRCPService start= auto
rem 设置蓝牙设备监控服务为自动启动
sc config BluetoothDeviceMonitor start= auto
rem 设置蓝牙媒体播放器服务为自动启动
sc config BluetoothMediaPlayer start= auto
rem 设置蓝牙OBEX服务为自动启动
sc config BluetoothObexService start= auto
rem 设置蓝牙串口服务为自动启动
sc config BluetoothSerialPortService start= auto
rem 设置蓝牙堆栈服务为自动启动
sc config BluetoothStackService start= auto
rem 设置蓝牙免提服务为自动启动
sc config HandsFreeService start= auto
rem 设置蓝牙串口协议服务为自动启动
sc config RFCOMM start= auto
rem 设置蓝牙低功耗枚举器为自动启动
sc config BTHLEEnum start= auto
rem 设置蓝牙低功耗服务为自动启动
sc config BthLESvc start= auto
rem 设置蓝牙个人区域网络服务为自动启动
sc config PANService start= auto
rem 设置蓝牙A2DP服务为自动启动
sc config A2DPService start= auto
rem 设置蓝牙MAP服务为自动启动
sc config BluetoothMapService start= auto
rem 设置蓝牙HCI支持服务为自动启动
sc config HciSupportService start= auto
rem 设置蓝牙用户支持服务为自动启动
sc config BthUsrMgr start= auto
rem 设置蓝牙PAN服务器服务为自动启动
sc config PANNSvc start= auto
rem 设置蓝牙文件传输服务为自动启动
sc config BluetoothFileTransferService start= auto
rem 设置蓝牙HID服务为自动启动
sc config BluetoothHIDOverGATTService start= auto
rem 设置蓝牙打印机服务为自动启动
sc config BluetoothPrinterService start= auto
rem 设置蓝牙A2DP接收器服务为自动启动
sc config A2DPSinkService start= auto
rem 设置蓝牙安全简易配对服务为自动启动
sc config BluetoothSSPService start= auto
rem 设置蓝牙自动连接服务为自动启动
sc config BluetoothAutoConnectService start= auto
echo 所有蓝牙服务已设置为自动启动。
pause