Linux下连接STM32WB55蓝牙串口设备及rfcomm替代方案求助
STM32WB55蓝牙串口PC端替代rfcomm的C++实现方案
方案1:BlueZ D-Bus API(现代标准方案)
BlueZ已废弃rfcomm命令行工具,但内核rfcomm模块及D-Bus管理接口仍可用,可通过D-Bus创建虚拟串口设备节点,实现类rfcomm的读写逻辑。
- 依赖库:安装
libdbus-1-dev、libdbus-c++-dev(或直接使用原生D-Bus API) - 核心步骤:
- 通过D-Bus调用
org.bluez.Device1接口完成设备配对、信任 - 调用
org.bluez.SerialManager1的CreateDevice方法,传入目标设备路径,生成/dev/rfcommX节点 - 在C++中用标准文件IO(
open()、read()、write())操作该节点,逻辑与普通串口完全一致
- 通过D-Bus调用
- 代码片段示例:
#include <dbus-c++/dbus.h> // 省略D-Bus连接初始化代码... // 调用CreateDevice生成串口节点 DBus::Message call = conn->create_method_call( "org.bluez", "/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX", "org.bluez.SerialManager1", "CreateDevice" ); DBus::Message reply = conn->send_with_reply_and_block(call, 5000); std::string rfcomm_path; reply >> rfcomm_path; // 得到类似/dev/rfcomm0的设备路径 // 打开设备并执行读写操作 int fd = open(rfcomm_path.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); // 后续read/write逻辑同普通串口编程
方案2:L2CAP套接字直接通信(底层无虚拟节点方案)
跳过虚拟串口节点,直接通过L2CAP套接字与SPP服务通信,适合不需要串口抽象的轻量场景。
- 核心步骤:
- 通过
bluetoothctl scan on获取目标设备MAC地址 - 创建L2CAP套接字并连接到SPP服务默认PSM(0x0003)
- 通过
- 代码片段示例:
#include <sys/socket.h> #include <bluetooth/bluetooth.h> #include <bluetooth/l2cap.h> int main() { int sock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); if (sock < 0) { perror("socket"); return 1; } struct sockaddr_l2 addr = {0}; addr.l2_family = AF_BLUETOOTH; addr.l2_psm = htobs(0x0003); // SPP服务默认PSM str2ba("XX:XX:XX:XX:XX:XX", &addr.l2_bdaddr); // 替换为目标设备MAC if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("connect"); close(sock); return 1; } // 数据收发示例 char buf[256]; int bytes_read = read(sock, buf, sizeof(buf)); if (bytes_read > 0) printf("Received: %.*s\n", bytes_read, buf); write(sock, "Hello STM32", 11); close(sock); return 0; }
- 编译命令:
g++ -o bt_spp bt_spp.cpp -lbluetooth
方案3:GATT Client API(针对BLE UART场景)
若STM32WB55使用BLE UART服务(如Nordic UART Service),则通过GATT接口实现数据收发:
- 核心步骤:
- 通过D-Bus连接BLE设备,发现UART服务(UUID:6E400001-B5A3-F393-E0A9-E50E24DCCA9E)
- 获取TX(写入)、RX(通知)特征UUID,订阅RX特征的通知事件
- 通过D-Bus调用写入TX特征,监听RX特征的信号获取数据
关键注意事项
- 确保BlueZ版本≥5.50,运行
bluetoothctl --version检查 - 提前用
bluetoothctl完成设备配对与信任:pair <MAC>、trust <MAC> - 程序需具备蓝牙访问权限:将用户加入
bluetooth组(sudo usermod -aG bluetooth $USER),或临时用sudo运行 - 检查
bluetoothd配置:确保/etc/bluetooth/main.conf中AutoEnable=true,未禁用SPP服务
内容的提问来源于stack exchange,提问作者Hannes Campidell
相关产品推荐
相关产品推荐

