Python蓝牙RFCOMM编程代码卡在server.accept()问题求助
故障原因
- 逻辑角色错误:你当前的Python代码实现的是蓝牙RFCOMM服务端,作用是等待其他蓝牙设备作为客户端主动发起连接。但从日志可见树莓派已经通过系统配置主动连接了目标设备WT11i-A,不需要再做服务端等待连接。
- 端口占用冲突:你在
/etc/bluetooth/rfcomm.conf中配置了开机自动绑定RFCOMM通道1到目标设备,系统已经占用了RFCOMM channel 1,你的Python服务端再绑定同一个端口时虽然没有显式报错,但实际上无法收到新的连接请求。 - 已存在连接冲突:系统已经和目标设备建立了rfcomm1的连接,目标设备不会再重复发起连接到你的Python服务端,所以
accept()会一直阻塞等待新连接。
排查解决方法
根据你的实际需求选择对应方案即可:
方案1:树莓派作为服务端,等待目标设备主动连接(和安卓手机连接的场景一致)
- 先释放系统占用的RFCOMM通道1:
sudo rfcomm release rfcomm1 - 修改
/etc/bluetooth/rfcomm.conf,将bind yes改为bind no,禁用开机自动绑定,重启蓝牙服务:sudo systemctl restart bluetooth - 将目标设备设置为主动发起连接的模式,再运行你原来的Python代码即可正常收到连接请求。
方案2:树莓派作为客户端,直接对接已经配对连接的WT11i-A设备
你原来的服务端代码不符合需求,直接替换为两种可用的实现即可:
实现1:用pybluez主动发起连接
import bluetooth target_addr = "00:07:80:E0:A4:FC" port = 1 sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) sock.connect((target_addr, port)) print("连接成功") try: while True: data = sock.recv(1) print(data) sock.send(data) except: sock.close()
实现2:直接对接系统已经建立的rfcomm串口设备
不需要依赖pybluez库,直接操作串口即可,波特率和目标设备配置保持一致:
import serial ser = serial.Serial('/dev/rfcomm1', 9600) while True: data = ser.read(1) print(data) ser.write(data)
内容的提问来源于stack exchange,提问作者mortpiedra
相关产品推荐
相关产品推荐

