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

在 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.mzph.cn/web/73712.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    R002-云计算

    1 概念 英文名&#xff1a;Cloud Computing 核心:云计算的核心概念就是以互联网为中心&#xff0c;在网站上提供快速且安全的云计算服务与数据存储&#xff0c;让每一个使用互联网的人都可以使用网络上的庞大计算资源与数据中心 2.分类 基础设施即服务&#xff08;IaaS)它向…

    降维(DimensionalityReduction)基础知识2

    文章目录 五、基于局部结构保持的降维1、Laplacian Eigenmaps&#xff08;拉普拉斯特征映射&#xff09;&#xff08;1&#xff09;邻接矩阵&#xff08;2&#xff09;图论基础&#xff08;3&#xff09;Laplace算子1、散度&#xff08;Divergence&#xff09;2、拉普拉斯算子3…

    物联网中的物模型是什么意思,在嵌入式软件开发中如何体现?

    1. 物模型的概念 物模型&#xff08;Thing Model&#xff09;是物联网中对物理设备或虚拟设备的抽象描述&#xff0c;定义了设备的属性、事件和服务。它是设备与云平台或其他设备之间交互的基础&#xff0c;用于统一描述设备的能力和行为。 1.1 物模型的组成 属性&#xff0…

    【蓝桥杯】单片机设计与开发,PWM

    一、PWM概述 用来输出特定的模拟电压。 二、PWM的输出 三、例程一&#xff1a;单片机P34引脚输出1kHZ的频率 void Timer0Init(void);unsigned char PWMtt 0;void main(void) {P20XA0;P00X00;P20X80;P00XFF;Timer0Init();EA1;ET01;ET11;while(1);}void Timer0Init(void) //1…

    C#中,什么是委托,什么是事件及它们之间的关系

    1. 委托&#xff08;Delegate&#xff09; 定义与作用 ‌委托‌是类型安全的函数指针&#xff0c;用于封装方法&#xff0c;支持多播&#xff08;链式调用&#xff09;。‌核心能力‌&#xff1a;将方法作为参数传递或异步回调。 使用场景 回调机制&#xff08;如异步操作完…

    从替代到超越,禅道国产化替代解决方案2.0发布!

    3月22日&#xff0c;由禅道携手上海惠艾信息科技、麦哲思科技共同举办的禅道・中国行北京站活动圆满落下帷幕。 除深入探究AI赋能研发项目管理外&#xff0c;禅道在活动现场正式发布了《禅道国产化替代解决方案2.0》&#xff0c;助力企业全方位构建自主可控的研发项目管理新体…

    【VirtualBox 安装 Ubuntu 22.04】

    网上教程良莠不齐&#xff0c;有一个CSDN的教程虽然很全面&#xff0c;但是截图冗余&#xff0c;看蒙了给我&#xff0c;这里记录一个整洁的教程链接。以备后患。 下载安装全流程 UP还在记录生活&#xff0c;看的我好羡慕&#xff0c;呜呜。 [VirtualBox网络配置超全详解]&am…

    2025美国网络专线国内服务商推荐

    在海外业务竞争加剧的背景下&#xff0c;稳定高效的美国网络专线已成为外贸企业、跨国电商及跨国企业的刚需。面对复杂的国际网络环境和严苛的业务要求&#xff0c;国内服务商Ogcloud凭借其创新的SD-WAN技术架构与全球化网络布局&#xff0c;正成为企业拓展北美市场的优选合作伙…

    2.2.2 引入配置文件和定义配置类

    本实战通过三种方式实现Spring Boot中的配置加载与管理。首先&#xff0c;通过PropertySource加载自定义配置文件&#xff0c;结合ConfigurationProperties注解将配置文件中的属性绑定到Java类中&#xff0c;实现配置的灵活管理。其次&#xff0c;利用ImportResource加载XML配置…

    Django:构建高性能Web应用

    引言&#xff1a;为何选择Django&#xff1f; 在当今快速发展的互联网时代&#xff0c;Web应用的开发效率与可维护性成为开发者关注的核心。Django作为一款基于Python的高级Web框架&#xff0c;以其"开箱即用"的特性、强大的ORM系统、优雅的URL路由设计&#xff0c;…

    【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程

    更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer…

    《2核2G阿里云神操作!Ubuntu+Ollama低成本部署Deepseek模型实战》

    简介&#xff1a; “本文为AI开发者揭秘如何在阿里云2核2G轻量级ECS服务器上&#xff0c;通过Ubuntu系统与Ollama框架实现Deepseek模型的高效部署。无需昂贵硬件&#xff0c;手把手教程涵盖环境配置、资源优化及避坑指南&#xff0c;助力初学者用极低成本在云端跑通行业领先的大…

    【bug解决】NameError: name ‘fused_act_ext‘ is not defined

    问题 使用basicsr库做超分的时候发现NameError: name fused_act_ext is not defined这个问题&#xff0c;一直不断重复的使用pip uninstall basicsr 和 BASICSR_EXTTrue pip install basicsr 发现一直没有执行编译过程&#xff0c;导致一直推理失败 原因 之前已经安装过basi…

    Anaconda开始菜单里添加JupyterLab快捷方式

    Anaconda开始菜单里添加JupyterLab快捷方式 在 Windows 系统安装 Anaconda 后&#xff0c;发现开始菜单只有 Jupyter Notebook&#xff0c;却找不到Jupyter Lab入口。其实这是因为最新版 Anaconda 默认未预装 Lab 组件&#xff0c;本篇介绍一种添加 Jupyter Lab入口到开始菜单…

    【Qt】modbus客户端笔记

    Qt 中基于 Modbus 协议的通用客户端学习笔记 一、概述 本客户端利用 Qt 的 QModbusTcpClient 实现与 Modbus 服务器的通信&#xff0c;具备连接、读写寄存器、心跳检测、自动重连等功能&#xff0c;旨在提供一个可靠且易用的 Modbus 客户端框架&#xff0c;方便在不同项目中集…

    解决Vmware 运行虚拟机Ubuntu22.04卡顿、终端打字延迟问题

    亲测可用 打开虚拟机设置&#xff0c;关闭加速3D图形 &#xff08;应该是显卡驱动的问题&#xff0c;不知道那个版本的驱动不会出现这个问题&#xff0c;所以干脆把加速关了&#xff09;

    【网络】Socket套接字

    目录 一、端口号 二、初识TCP/UDP协议 三、网络字节序 3.1 概念 3.2 常用API 四、Socket套接字 4.1 概念 4.2 常用API &#xff08;1&#xff09;socket &#xff08;2&#xff09;bind sockaddr结构 &#xff08;3&#xff09;listen &#xff08;4&#xff09;a…

    内联函数/函数重载/函数参数缺省

    一、内联函数 为了减少函数调用的开销 在函数定义前加“inline”关键字&#xff0c;即可定义内联函数 二、函数重载 1.名字相同 2.参数个数或者参数类型不同 编译器根据调用语句实参的个数和类型判断应该调用哪个函数 三、函数的缺省参数 定义函数的时候可以让最右边的连…

    基于神经网络的文本分类的设计与实现

    标题:基于神经网络的文本分类的设计与实现 内容:1.摘要 在信息爆炸的时代&#xff0c;大量文本数据的分类处理变得至关重要。本文旨在设计并实现一种基于神经网络的文本分类系统。通过构建合适的神经网络模型&#xff0c;采用公开的文本数据集进行训练和测试。在实验中&#x…

    Baklib内容中台的核心定位是什么?

    构建企业级知识中枢 在数字化转型趋势下&#xff0c;Baklib内容中台通过构建企业级知识中枢&#xff0c;实现了从碎片化信息到体系化资产的跃迁。其核心能力体现为对多源内容的智能聚合与结构化存储&#xff0c;支持从文档、图片到视频的全格式整合&#xff0c;并通过语义标签…