我正在使用 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 上蓝牙缓冲区溢出的一个简单问题。