Acontece que o buffer Bluetooth no PC estava transbordando porque eu nunca estava chamando recv () no script Python.
O acessório Bluetooth estava enviando caracteres para o PC, que o script ignorou e que inevitavelmente levou a um estouro de buffer. Esse estouro aparentemente faz com que o canal rfcomm bloqueie até que o buffer seja lido.
Aqui está o script de trabalho, para referência futura:
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:
gaugeSocket.close()
print "Could not connect: ", error, "; Retrying in 10s..."
time.sleep(10)
return gaugeSocket;
gaugeSocket = connect()
while(True):
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 gaugeSocket.recv(1024)
#print("Wrote temp: " + str(temp))
except bluetooth.btcommon.BluetoothError as error:
print "Caught BluetoothError: ", error
time.sleep(5)
gaugeSocket = connect()
pass
gaugeSocket.close()
A mudança da chave está na adição da linha
gaugeSocket.recv(1024)
que limpa o buffer das mensagens "OK" enviadas de volta do dispositivo remoto.