Python PyBluez через некоторое время теряет соединение Bluetooth

Я использую Python для написания простого последовательного скрипта Bluetooth, который периодически отправляет информацию о моей компьютерной статистике. Приемное устройство представляет собой Sparkfun BlueSmirf Silver .

Проблема в том, что после того, как скрипт выполняется в течение нескольких минут, он прекращает отправку пакетов получателю и завершается с ошибкой:

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

РЕДАКТИРОВАТЬ: я должен добавить, что этот код нормально подключается после того, как я включаю и выключаю приёмник и запускаю скрипт. Однако после первого исключения произойдет сбой, пока я не перезапущу приемник.

P.S. Это связано с моим недавним вопросом: Почему / dev / rfcomm0 создает проблемы с PySerial? , но это было больше о PySerial, особенно с rfcomm0. Здесь я спрашиваю об общем этикете.

0
задан 13 April 2017 в 15:24

1 ответ

Ответ на этот вопрос совпадает с ответом на Почему / dev / rfcomm0 вызывает проблемы с PySerial? , простой вопрос переполнения буфера Bluetooth на ПК.

0
ответ дан 13 April 2017 в 15:24

Другие вопросы по тегам:

Похожие вопросы: