【android bluetooth 协议分析 13】【RFCOMM详解 1】【通俗易懂 什么是rfcomm】
RFCOMM 是什么?
你可以把 RFCOMM 想象成蓝牙设备之间的“虚拟串口线”。
就像以前用一根物理线(比如老式打印机的串口线)连接两台设备传输数据一样,RFCOMM 在蓝牙上模拟了这种有线连接的效果,让设备能像插了线一样互相通信。
RFCOMM 协议支持两个蓝牙设备之间最多同时建立 60 个连接。蓝牙设备中可同时使用的连接数取决于具体实现。
1. 为什么需要 RFCOMM?
-
兼容老设备:很多旧设备(如打印机、刷卡机、工业传感器)原本是靠物理串口线(如 RS-232)工作的。
-
无线化简化:蓝牙无线化后,RFCOMM 让这些设备不用改硬件,直接通过蓝牙“假装成有线连接”,省去了改造的麻烦。
2. RFCOMM 的核心功能
① 模拟串口的所有功能
-
不仅传输数据,还能模拟串口的控制信号(如 RTS/CTS、DTR/DSR),就像真的插了线一样。
-
支持“虚拟多串口”:一条蓝牙连接上,可以同时开多个虚拟串口(比如一边传文件,一边控制设备)。
② 简单可靠的传输
-
数据像“快递包裹”一样被打包成帧(
UIH
帧)传输,底层蓝牙协议(如 L2CAP)负责纠错和流量控制。 -
支持流控(比如对方缓冲区满了会发信号暂停发送)。
3. RFCOMM 的工作原理
① 连接过程(像打电话)
-
拨号(SABM 帧):设备 A 发送连接请求。
- SABM:
- Set Asynchronous Balanced Mode (SABM) command
- 设置异步平衡模式 命令
- SABM:
-
接听(UA 帧):设备 B 同意连接,回确认。
- UA:
- Unnumbered Acknowledgement (UA) response
- 未编号 应答
- UA:
-
通话(数据传输):用
UIH
帧传数据。- UIH:
- Unnumbered information with header check (UIH) command and response
- 具备头检查的无编号信息 命令帧和应答帧
- UIH:
-
挂断(DISC 帧):一方发断开请求,另一方确认(DM)后断开。
- DIS:
- Disconnect (DISC) command
- 断开连接命令
- DM:
- Disconnected Mode (DM) response
- 断开应答帧
- DIS:
② 数据流控(避免“堵车”)
-
硬件流控:模拟串口的 RTS/CTS 信号(比如暂停/继续发送)。
-
软件流控:用特殊字符(如 XON/XOFF)控制流量。
-
信用机制:设备会告诉对方“我还能收多少数据”,避免数据丢失。
4. 两种设备类型
类型 | 角色 | 例子 |
---|---|---|
Type 1 | 通信终点设备 | 手机、电脑、打印机 |
Type 2 | 中转设备(带物理串口) | 蓝牙调制解调器、工业网关 |
-
Type 1 直接运行应用程序(如手机传文件给打印机)。
-
Type 2 把蓝牙数据转给其他设备(如蓝牙模块把数据转发给有线传感器)。
5. 实际应用场景
-
蓝牙耳机:配对时用 RFCOMM 传输控制指令(如调节音量)。
-
蓝牙打印机:手机通过 RFCOMM 发送打印数据,就像插了根虚拟打印线。
-
车载系统:手机通过 RFCOMM 把导航指令传给车载中控。
6. rfcomm 参考模型
- 例如服务侧应用程序, 通过 向SDP 中注册 服务说明。 这样 远端设备就可以通过 SDP 查询到 注册的 rfcomm 服务。 这样 两个设备就可以根据 SDP 中的信息,建立 rfcomm 通道。
- 建立完 rfcomm 通道后,应用侧,就可以类似 礼物 windows下访问 VCOMM 或者类似于 linux 下访问 /dev/ttyXXX 一样,读写虚拟串口。
- 最终虚拟串口,会通过 rfcomm 通道传递 出去。
总结:RFCOMM 是蓝牙的“万能串口转换器”
-
对用户:无感,就像设备之间插了一根线。
-
对开发者:兼容老协议,不用重写代码。
-
对硬件:省去物理串口,降低成本。
它的存在让蓝牙既能支持新应用,又能无缝兼容旧设备,是物联网和传统设备无线化的关键桥梁!