Python PyBluez 一段时间后失去蓝牙连接

Python PyBluez 一段时间后失去蓝牙连接

我正在使用 Python 编写一个简单的串行蓝牙脚本,该脚本会定期发送有关我的计算机统计信息。接收设备是Sparkfun BlueSmirf 银色

问题是,脚本运行几分钟后,它会停止向接收方发送数据包并失败并出现错误:

(11, 'Resource temporarily unavailable')

注意到这种情况不可避免地会发生,我添加了一些代码来自动尝试重新打开连接。然而,我得到了:

Could not connect:  (16, 'Device or resource busy')

我是否在连接时做错了什么?我是否需要偶尔重新打开套接字?我不确定如何从此类错误中恢复。

我知道有时端口很忙,写入操作会被推迟以避免阻塞其他进程,但我没想到连接会如此频繁地失败。有什么想法吗?

脚本如下:

import psutil
import serial
import string
import time
import bluetooth

sampleTime = 1
numSamples = 5
lastTemp = 0

TEMP_CHAR = 't'
USAGE_CHAR = 'u'
SENSOR_NAME = 'TC0D'

filename = '/sys/bus/platform/devices/applesmc.768/temp2_input'


def parseSensorsOutputLinux(output):
    return int(round(float(output) / 1000))

def connect():
    while(True):    
        try:
            gaugeSocket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
            gaugeSocket.connect(('00:06:66:42:22:96', 1))
            break;
        except bluetooth.btcommon.BluetoothError as error:
            print "Could not connect: ", error, "; Retrying in 5s..."
            time.sleep(5)
    return gaugeSocket;

gaugeSocket = connect()
while(1):
    usage = psutil.cpu_percent(interval=sampleTime)
    sensorFile = open(filename)
    temp = parseSensorsOutputLinux(sensorFile.read())
    try:
        gaugeSocket.send(USAGE_CHAR)
        gaugeSocket.send(chr(int(usage)))
        #print("Wrote usage: " + str(int(usage)))

        gaugeSocket.send(TEMP_CHAR)
        gaugeSocket.send(chr(temp))
        #print("Wrote temp: " + str(temp))
    except bluetooth.btcommon.BluetoothError as error:
        print "Caught BluetoothError: ", error
        time.sleep(5)
        gaugeSocket = connect()
        pass

gaugeSocket.close()

编辑:我应该补充一点,在我关闭接收器电源并启动脚本后,此代码可以正常连接。但是,在第一次异常之后,它失败了,直到我重新启动接收器。

PS 这与我最近的问题有关,为什么 /dev/rfcomm0 会给 PySerial 带来问题?,但这更多是关于 PySerial 特别是 rfcomm0 的。这里我问的是一般的 rfcomm 礼仪。

答案1

这个问题的答案与为什么 /dev/rfcomm0 会给 PySerial 带来问题?,PC 上蓝牙缓冲区溢出的一个简单问题。

相关内容