Python PyBluez perde a conexão Bluetooth depois de um tempo

0

Estou usando o Python para escrever um script Bluetooth serial simples que envia informações sobre as estatísticas do meu computador periodicamente. O dispositivo receptor é um Sparkfun BlueSmirf Silver .

O problema é que, depois que o script é executado por alguns minutos, ele para de enviar pacotes para o receptor e falha com o erro:

(11, 'Resource temporarily unavailable')

Percebendo que isso inevitavelmente acontece, adicionei alguns códigos para tentar reabrir a conexão automaticamente. No entanto, então eu recebo:

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

Estou fazendo algo errado com a conexão? Eu preciso reabrir ocasionalmente o soquete? Não sei como recuperar esse tipo de erro.

Eu entendo que às vezes a porta estará ocupada e uma operação de gravação será adiada para evitar o bloqueio de outros processos, mas não esperaria que a conexão falhasse tão regularmente. Alguma idéia?

Aqui está o script:

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()

EDIT: devo acrescentar que este código se conecta bem depois de ligar e desligar o receptor e iniciar o script. No entanto, ele falha após a primeira exceção até que eu reinicie o receptor.

P.S. Isso está relacionado à minha pergunta recente, Por que o / dev / rfcomm0 está dando problemas ao PySerial? , mas isso era mais sobre o PySerial especificamente com o rfcomm0. Aqui estou perguntando sobre a etiqueta geral do rfcomm.

    
por Travis G. 20.03.2012 / 06:27

1 resposta

0

A resposta a esta pergunta é a mesma que a resposta a Porque é / dev / rfcomm0 dando problemas PySerial? , um simples problema do estouro do buffer Bluetooth no PC.

    
por Travis G. 22.03.2012 / 06:01