Android 蓝牙/Wi-Fi通信协议之:经典蓝牙(BT 2.1/3.0+)介绍

news/2025/4/1 7:37:18/

在 Android 开发中,经典蓝牙(BT 2.1/3.0+)支持多种协议,其中 RFCOMM/SPP(串口通信)、A2DP(音频流传输)和 HFP(免提通话)是最常用的。以下是它们在 Android 中的实现详解:

  • 经典蓝牙(BT 2.1/3.0+)

    • 协议栈:RFCOMM(串口模拟)、SPP(串行端口协议)、A2DP(音频传输)、HFP(免提协议)。

    • 用途:大文件传输、音频设备(耳机/音箱)。

    • 带宽:1-3 Mbps,功耗较高。


1. RFCOMM & SPP(串口通信)

协议作用

  • RFCOMM(Serial Port Emulation):模拟串口通信,提供可靠的串行数据传输(类似 UART)。

  • SPP(Serial Port Profile):基于 RFCOMM,定义蓝牙设备间的虚拟串口通信标准。

Android 实现

1.1 权限申请
<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- Android 12+ 需要额外权限 --> 
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
1.2 设备配对与连接
// 获取 BluetoothAdapter
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();// 发现设备(需先启用蓝牙)
bluetoothAdapter.startDiscovery();// 绑定到已配对设备
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
BluetoothDevice targetDevice = pairedDevices.iterator().next(); // 示例:选择第一个设备// 通过 UUID 建立 RFCOMM 连接(SPP 标准 UUID:00001101-0000-1000-8000-00805F9B34FB)
UUID sppUuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
BluetoothSocket socket = targetDevice.createRfcommSocketToServiceRecord(sppUuid);
socket.connect(); // 阻塞式连接,需在子线程执行
1.3 数据传输

// 获取输入输出流
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();// 发送数据
outputStream.write("Hello Bluetooth".getBytes());// 接收数据(需循环读取)
byte[] buffer = new byte[1024];
int bytes = inputStream.read(buffer);
String receivedData = new String(buffer, 0, bytes);

2. A2DP(高级音频分发协议)

协议作用

  • 用于蓝牙立体声音频传输(如音乐播放),单向传输(手机→音箱)。

  • 不支持麦克风(录音需结合 HFP 或 SCO)。

Android 实现

2.1 权限
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
2.2 连接 A2DP 设备
// 获取 A2DP 代理
BluetoothA2dp bluetoothA2dp = BluetoothAdapter.getDefaultAdapter().getProfileProxy(context, new BluetoothProfile.ServiceListener() {@Overridepublic void onServiceConnected(int profile, BluetoothProfile proxy) {if (profile == BluetoothProfile.A2DP) {bluetoothA2dp = (BluetoothA2dp) proxy;}}}, BluetoothProfile.A2DP
);// 连接设备(需已配对)
List<BluetoothDevice> connectedDevices = bluetoothA2dp.getConnectedDevices();
if (!connectedDevices.isEmpty()) {BluetoothDevice audioDevice = connectedDevices.get(0);
}
2.3 音频路由控制

Android 实现

  • 音频默认通过 A2DP 设备播放(系统自动处理)。

  • 可通过 AudioManager 强制切换:

    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    audioManager.setBluetoothA2dpOn(true); // 启用 A2DP 输出

    3. HFP(免提协议)

    协议作用

  • 支持蓝牙通话功能(双向音频):麦克风输入 + 听筒输出。

  • 常用于车载免提、耳机通话场景。

3.1 权限
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
3.2 连接 HFP 设备
// 获取 HFP 代理
BluetoothHeadset bluetoothHeadset = BluetoothAdapter.getDefaultAdapter().getProfileProxy(context, new BluetoothProfile.ServiceListener() {@Overridepublic void onServiceConnected(int profile, BluetoothProfile proxy) {if (profile == BluetoothProfile.HEADSET) {bluetoothHeadset = (BluetoothHeadset) proxy;}}}, BluetoothProfile.HEADSET
);// 检查设备连接状态
List<BluetoothDevice> connectedDevices = bluetoothHeadset.getConnectedDevices();
boolean isConnected = (connectedDevices.size() > 0);
3.3 通话控制

  • 接听/挂断电话(需系统级权限,普通应用无法直接调用):

    // 通过 Intent 间接控制(部分设备支持)
    Intent answerIntent = new Intent(Intent.ACTION_HEADSET_PLUG);
    answerIntent.putExtra("state", 1); // 1 接听,0 挂断
    context.sendBroadcast(answerIntent);

  • 音频路由切换

    
    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    audioManager.setBluetoothScoOn(true);  // 启用 SCO 通道(通话音频)
    audioManager.startBluetoothSco();      // 启动 SCO 连接

关键区别总结

协议方向用途音频类型Android API 类
RFCOMM双向串口数据通信BluetoothSocket
A2DP单向(输出)音乐播放立体声(16-bit)BluetoothA2dp
HFP双向通话(麦克风+听筒)单声道(8kHz)BluetoothHeadset

注意事项

  1. 蓝牙权限:Android 12+ 需动态申请 BLUETOOTH_CONNECT

  2. 主线程限制:所有蓝牙操作(如 connect())需在子线程执行。

  3. 设备兼容性:部分旧设备可能不支持 A2DP 或 HFP 的完整功能。


    http://www.ppmy.cn/news/1584142.html

    相关文章

    详解TCP的四次握手和三次挥手,以及里面每个阶段的状态

    TCP 三次握手&#xff08;连接建立&#xff09; TCP 连接建立通过三次握手完成&#xff0c;确保双方同步初始序列号并确认可达性。 阶段说明 第一次握手 客户端 → 服务器&#xff1a;发送 SYN&#xff08;同步请求&#xff09;&#xff0c;携带初始序列号 seq x。客户端状态…

    VScode 画时序图(FPGA)

    1、先安装插件&#xff1a; 2、然后就可以编写一个.js文件&#xff0c;如下&#xff1a; {signal: [{name: clk, wave: p.......|..},{name: rstn, wave: 01......|..},{name: din_vld, wave: 0.1.0...|..},{name: din, wave: "x.x...|..", data: ["D0", …

    通过php连接redis数据库

    如上图所示&#xff0c;这是去搭建一个lamp平台&#xff0c; 阿帕奇和php安装好之后&#xff0c;php直接就被安装成阿帕奇的一个功能模块。 如上图所示&#xff0c;这就是php作为阿帕奇的功能模块。 如上图所示&#xff0c;我们去正常启动redis数据库。 如上图所示&#xff0c…

    SD(Stable Diffusion)模型学习图谱

    SD&#xff08;Stable Diffusion&#xff09;模型学习路径思维导图框架 一、新手阶段&#xff08;基础认知&#xff09; 核心概念理解 大模型&#xff08;ckpt/safetensors&#xff09;&#xff1a; 决定生成风格的基础架构存放于models/Stable-diffusion路径 VAE模型&#…

    2011-2020年 北京大学数字普惠金融指数(PKU-DFIIC)

    2011-2020年 北京大学数字普惠金融指数&#xff08;PKU-DFIIC&#xff09;.ziphttps://download.csdn.net/download/2401_84585615/90214715 https://download.csdn.net/download/2401_84585615/90214715 北京大学数字普惠金融指数&#xff08;PKU-DFIIC&#xff09;是由北京大…

    数字孪生技术:重塑UI前端的未来

    hello宝子们我们是艾斯视觉擅长u设计和前端数字李生&#xff0c;大数据&#xff0c;三维建模&#xff0c;三维动画10年经验希望我的分享能帮助到您如需帮助可以评论关注私信我们一起探讨&#xff0c;致敬&#xff01;感谢感恩&#xff0c;如有需要请私信或茄 我 数字孪生技术&a…

    JavaScript 中Object.assign()和展开运算符在对象合并时的区别,各自的适用场景是什么?

    JavaScript 中Object.assign()和展开运算符在对象合并时的区别&#xff0c;各自的适用场景是什么&#xff1f; 在 JavaScript 里&#xff0c;咱们常常要把多个对象合并成一个新对象。Object.assign()和展开运算符&#xff08;...&#xff09;就像两个得力小助手&#xff0c;能…

    生成式AI三巨头技术解析:ChatGPT、DeepSeek与Grok的核心差异与未来竞争格局

    引言 2025年的生成式AI领域已形成三足鼎立之势&#xff1a;OpenAI的ChatGPT、中国初创公司DeepSeek与马斯克旗下xAI的Grok-3。三大模型分别代表了不同技术路线与市场定位的典型范式。本文将从技术架构、训练方法、应用场景、性能表现及发展潜力五个维度展开深度对比&#xff0…