蓝牙串口、文件传输、通话控制如何实现?

摘要:liwen01 2026.01.02 前言 日常生活中,我们用到的很多蓝牙功能,都是基于蓝牙 RFCOMM 传输协议来实现,比如: 手机与手机间通过蓝牙分享名片、短信、图片、文件等 手机与车机之间的来电显示、电话接听、挂断、音量调节等 蓝牙
liwen01 2026.01.02 前言 日常生活中,我们用到的很多蓝牙功能,都是基于蓝牙 RFCOMM 传输协议来实现,比如: 手机与手机间通过蓝牙分享名片、短信、图片、文件等 手机与车机之间的来电显示、电话接听、挂断、音量调节等 蓝牙模拟串口的数据透传等 对应的蓝牙Profile(配置文件)有:OPP/FTP,PBAP/MAP/SYNC,BPP/BIP,HFP/HSP,SPP,DUN等等 它们间的层级关系如下图: 具体功能如下表: Profile 中文名称 主要功能 常见设备 OPP 对象推送 文件、名片传输 手机间传文件 FTP 文件传输 访问远程文件系统 手机、电脑 SPP 串口通信 数据传输通道 MCU 模块、扫描枪 DUN 拨号联网 调制解调器上网 手机 → 电脑 HSP 耳机 基础语音通信 蓝牙耳机 HFP 免提 电话控制与语音通话 车载系统 PBAP 电话本访问 读取联系人 车机 MAP 短信访问 读/发短信 车机、智能手表 SYNC 信息同步 联系人、日历同步 手机与电脑 BPP 基本打印 蓝牙打印 手机打印机 BIP 图像传输 图片传输与控制 相机、打印机 这里,我们只简单介绍蓝牙的串口数据透传、文件传输、通话控制。 (一)RFCOMM 简介 RFCOMM 是金典蓝牙(BR/EDR)的一个传输层协议,它是串口数据透传、文件传输、通话控制等应用功能的基础。 (1)RFCOMM 历史 RFCOMM (Radio Frequency Communication)诞生于 20 世纪 90 年代末,当时计算机和外设(如调制解调器、打印机)主要通过物理串口(COM 口)连接。 RFCOMM 的核心任务是在蓝牙连接之上模拟传统的 RS-232 串口(Serial Port)通信,它是蓝牙协议栈中极为重要的一个传输层协议。 蓝牙技术联盟(Bluetooth SIG)在制定蓝牙 V1.0 版本规范时,目标之一就是电缆替代。为了让原本基于串口工作的旧软件能无缝迁移到无线蓝牙,开发者需要一种协议来模拟串口,于是就有了 RFCOMM。 RFCOMM 是基于 ETSI TS 07.10 标准修改而来,而 TS 07.10 是 GSM 蜂窝网络中用于在移动设备和终端之间进行多路复用串口通信的标准。 具体定义可以查看官网的《RFCOMM WITH TS 07.10》。 (2)RFCOMM 的技术变迁 (A)信号模拟 最初的 RFCOMM 仅实现了对 RS-232 九针串口信号(如 RTS/CTS, DTR/DSR)的逻辑映射。这使得早期的蓝牙手机可以像接了串口线一样,被电脑识别为一个无线调制解调器。 (B)基于信用的流控制 最初 RFCOMM 依赖底层的 L2CAP 进行简单的流控,但在高负载下容易丢包或死锁。 在蓝牙核心规范 V1.1 及后续版本中引入了信用(Credit)机制。发送方必须先获得接收方的信用额度才能发送数据包。 每发送一个包,信用减一;接收方处理完数据后,再返还信用。这极大地提高了大规模数据传输(如文件传输)的稳定性。 (C)安全性增强 随着蓝牙版本从 V2.1 进化到 V5.x 及目前最新的 V6.x,RFCOMM 本身虽然结构未变,但其底层的链路层引入了 SSP(安全简易配对) 和 AES-128 加密,使得通过 RFCOMM 传输的串口数据安全性有了大幅度的提升。 (3)模拟串口 (A)RFCOMM 的两种连接方式 这是最常见、最标准的 蓝牙串口通信方式(SPP 类),两个设备都有蓝牙功能(Type 1 与 Type 2),二者通过 蓝牙链路(BT) 进行通信。 在这条链路上运行 RFCOMM 协议,从而提供虚拟串口连接。 典型的应用是:手机(Type 1)与 蓝牙 GPS 模块(Type 2)通过蓝牙虚拟串口传输 NMEA 数据。 这里多了一个 Device C(没有蓝牙功能),蓝牙设备 Type 2 在此扮演中继桥接(gateway)角色。把蓝牙 RFCOMM 链路与传统的有线串口相连接。 典型的应用是:电脑(Type 1)通过蓝牙连接到蓝牙-转-串口适配器(Type 2), 而该适配器再通过 RS-232 连接到一台老式工业设备(Device C)。 电脑看上去就像直接用串口连着那台设备一样。 (A)RFCOMM 串口端口号 在一个会话中,理论上可以支持最大60个端口号。 但是实际上大多数蓝牙受内存和调度能力限制,一般只支持1 ~ 7个端口。 (二)数据透传 (1)SPP 简介 SPP 的全称是Serial Port Profile。它的核心定义是:如何在两个蓝牙设备之间建立仿真串口连接。 它在蓝牙链路上模拟了 RS232 控制信号,使得传统的串口应用程序可以无缝迁移到蓝牙无线传输上,而无需修改应用层逻辑。 (2)SPP 的协议栈架构 SPP 是构建在RFCOMM协议之上的应用协议,它依赖于:RFCOMM、SDP、L2CAP的支持。 RFCOMM 层:SPP 的直接承载者。RFCOMM 在 L2CAP 之上模拟了 9 针串口信号,支持多路复用(即一个蓝牙链路可以跑多个虚拟串口)。 SDP(Service Discovery Protocol):服务发现协议。客户端通过查询 SDP 记录,找到服务器上 SPP 服务对应的RFCOMM Server Channel(1~30)。 L2CAP 层:负责数据的分段与重组,为 RFCOMM 提供面向连接的数据服务。 (3)SPP 的建立连接流程 要实现两个设备间的串口通信,通常需要经历以下四个阶段: (A)查询与发现(Inquiry/Discovery):主设备(Client)扫描周围的蓝牙设备。 (B)服务发现(SDP Query):主设备向从设备(Server)发起 SDP 请求,查询其是否含有UUID 为0x1101的服务。从设备返回其对应的RFCOMM 通道号。 (C)链路建立(Connection): 主设备发起 RFCOMM 连接请求,指定通道号。此时,底层会依次建立 ACL 链路和 L2CAP 通道。 (D)数据传输(Data Exchange):一旦 RFCOMM 通道打开,两端就可以像读写本地串口文件(如 Linux 下的/dev/rfcomm0)一样发送原始字节流。 (4)SPP 与 BLE (GATT) 串口的区别 在蓝牙 4.0 之后,存在两种实现串口的方式: 特性 经典蓝牙 SPP BLE 透传 (GATT) 标准性 SIG 标准定义,通用性强 非 SIG 标准,各厂商自定义 UUID 数据量 适合大吞吐量、持续传输 适合小包、间歇性传输 功耗 较高 极低 系统支持 Android 支持,iOS 不支持(需 MFi) Android、iOS 均完美支持 如果你的产品需要连接 iPhone,且不打算申请 Apple 的 MFi 认证,那么请务必选择 BLE 透传,而非 SPP。 (三)文件传输(OBEX、OPP 与 FTP) OBEX (Object Exchange) 协议最初是由红外标准组织(IrDA)开发的,后来被蓝牙协议栈吸收。它的设计哲学与 HTTP 非常相似,采用了经典的请求-响应模型。 (1)OPP (Object Push Profile):轻量级推送 OPP 是最基础的文件传输方式。它的核心特点是无状态和点对点直接推送。 (A)核心逻辑 在 OPP 中,Client(发送方)不需要知道 Server(接收方)的文件系统结构。它就像是把一张名片或一张照片扔给对方,对方可以选择接收或拒绝。 (B)交互流程 SDP 查询:Client 查找 UUID 为0x1105的服务。 OBEX 连接:建立临时会话。 PUT 操作: Client 发送PUT请求,头部携带Name和Length。 Server 弹出提示框。 如果用户点击同意,Server 返回Continue (0x90),Client 开始分段发送Body。 断开:传输完成,连接立即释放。 主要应用场景有:两台手机通过蓝牙分享一张联系人名片(vCard)或一张图片。 (2)FTP (File Transfer Profile):全功能文件管理器 虽然名字也叫 FTP,但它和互联网上的 FTP 协议不同,它是OBEX 上的 FTP。相比 OPP,它提供了完整的远程文件系统访问权限。 (A)核心功能 核心功能有:浏览目录、路径切换、多文件操作 浏览目录:Client 可以请求 Server 的文件夹列表。 路径切换:使用SetPath操作在文件夹间跳转。 多文件操作:支持连续的GET(下载)或DELETE(删除)。 (B)关键点:Folder Listing Object 当 Client 想要查看 Server 端的文件夹时,Server 会返回一个特殊的XML 对象。这个 XML 描述了当前目录下所有的文件和子文件夹信息。 <folder-listingversion="1.0"> <parent-folder/> <filename="report.pdf"size="102400"modified="20231027T103000Z"/> <foldername="Photos"/> </folder-listing>` (C)OPP 与 FTP 对比 特性 OPP (Object Push) FTP (File Transfer) UUID 0x1105 0x1106 控制力 只能发送/推送,无法查看对方文件 可以浏览、下载、删除、创建文件夹 交互复杂度 低(推完即断) 高(需要维持会话进行多次操作) 安全性 每次推送通常需要手动确认 建立连接时一次性鉴权,后续操作更自由 典型案例 手机互发一张照片 电脑管理嵌入式设备的日志文件夹 (3)OBEX 的扩展 在蓝牙协议栈中,有不少重要的Profile都是 OBEX 的的变种 PBAP(Phone Book Access):把电话本看作一个文件进行 GET。 MAP(Message Access):把短信/邮件看作对象进行操作。 (四)蓝牙通话控制(HSP 与 HFP) (1)核心角色定义 在通话协议中,蓝牙定义了两个核心角色: AG(Audio Gateway):音频网关。通常指手机。它是音频数据的来源,也是连接移动网络的网关。 HF(Hands-Free) / HS (Headset):免提端/耳机端。通常指蓝牙耳机、车载中控。它作为 AG 的远程控制器和音频 IO 设备。 (2)HSP (Headset Profile) :简约的先驱 HSP 是最早的通话协议,它只提供了最基本的功能:耳机作为手机的音频输入/输出设备,并能进行简单的控制。 功能子集:接听电话、挂断电话、调节音量。 控制机制:基于RFCOMM传输极简的 AT 指令。 局限性:它不支持查看来电号码、不支持拒接(只能接听后再挂断)、不支持三方通话。 目前的现状就是:现代蓝牙设备中,HSP 几乎已经被 HFP 完全取代,仅作为协议兼容性的最低保障存在。 (3)HFP (Hands-Free Profile) :现代通话的标准 HFP 是目前 TWS 耳机和车载系统的标配。它在 HSP 的基础上进行了巨大的功能扩充,目前主流版本为v1.7或v1.8。 (A)协议栈架构 HFP 的实现依赖于两条完全并行的链路: 控制链路(Control Plane):运行在RFCOMM之上。用于传输 AT 指令,负责拨号、同步联系人、电量显示、通话状态切换等。 音频链路(User Plane):运行在基带层(Baseband)之上,使用SCO (Synchronous Connection Oriented)或eSCO链路。它绕过了 L2CAP,直接传输同步语音数据,以保证极低的延迟。 (B)HFP 的关键技术流程 要实现一次完美的蓝牙通话,必须经过以下三个关键步骤: (1)服务级连接建立 (SLC - Service Level Connection) 当耳机连接上手机后,双方会先在 RFCOMM 上进行一系列暗号对接,确认彼此支持的功能: 特性协商:HF 发送AT+BRSF(Bluetooth Retrieve Supported Features),告诉手机“我支持降噪、支持电量显示”。 指标更新:通过AT+CIND获取手机当前的信号强度、电量、漫游状态。 事件报告:通过AT+CMER开启事件通知,这样手机有来电时才会主动推送RING。 (2) 语音链路的建立 (SCO vs eSCO) 这是决定通话音质的关键: SCO:传统的语音链路,带宽固定为 64kbps,通常使用CVSD编码。音质类似于老式座机(采样率 8kHz)。 eSCO(Extended SCO):HFP 1.5+ 引入。支持数据重传,抗干扰能力更强。 宽带语音(Wideband Speech):HFP 1.6+ 引入,使用mSBC编码,采样率提升至16kHz(高清通话),这是目前大多数蓝牙耳机“通话清晰”的技术支撑。 (3)典型通话信令示例 当一个电话打入时,RFCOMM 上的 AT 指令流如下: AG -> HF: `RING`(振铃) AG -> HF: `+CLIP:"13800138000",129`(来电显示号码) HF -> AG: `ATA`(用户按下耳机键,Answer) AG -> HF: `OK`(手机响应,通话接通) 后续: 建立 eSCO 语音链路,声音开始传输。 (C) HFP 特有的高级功能 三方通话(Three-Way Calling):支持保持当前通话并接听等待中的第二个来电。 语音拨号(Voice Recognition):通过AT+BVRA唤醒手机端的 Siri 或小爱同学。 电量上报:通过特定的厂商自定义指令(如 Apple 的AT+IPHONEACCEV)或标准指令在手机右上角显示耳机电量。 结尾 这里我们简单地介绍了一下蓝牙的串口、文件传输和通话控制应用,下一章我们将详细地分析介绍蓝牙鼠标的工作原理。 ------------------End------------------如需获取更多内容请关注liwen01公众号