bt pan and spp 功能简单介绍及实际问题分析

协议简介:

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网络。
  • 典型应用
    • 手机通过蓝牙共享网络给笔记本电脑。
    • 蓝牙设备之间的文件共享。
  • 基于蓝牙网络封装协议(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. 议栈对比

特性PANSPP
用途建立小型局域网,共享网络连接模拟串口通信,传输数据
协议依赖BNEP、L2CAP、HCIRFCOMM、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值