Почему некоторые данные теряются по каналу Bluetooth RFCOMM? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть проект, в котором устройство отправляет файл через Bluetooth через SPP на плату Raspberry Pi.В большинстве случаев файлы принимаются успешно, но иногда в файле отсутствуют некоторые байты, и устройство сообщает, что файл был успешно отправлен.

У меня нет контроля над отправляющим устройством, но я знаю, что оно устанавливает соединение, отправьте файл и затем закройте соединение.Если он хочет отправить несколько файлов, он отправляет только один файл на одно соединение и закрывает его, затем запускает другое соединение, чтобы отправить второй файл, затем закрывает его и т. Д.

На принимающей стороне (raspberry pi),я запускаю скрипт на python с прослушивающим сокетом RFCOMM-сервера и объявляю SPP через этот сокет.Затем я сохраняю все данные, полученные в байтовом массиве, и после завершения соединения сохраняю этот массив в файл и жду следующего соединения.

Размер файла варьируется, но всегда составляет около 200 КБ.Когда возникает эта проблема, отсутствующие байты всегда кратны 128 (например, 256, 384).

Код работает идеально в 98% случаев. (Я тестировал на 100 файлах итолько 2 из них имели эту проблему)

Проблема возникает случайным образом, я не могу найти какой-либо образец о том, когда это происходит.

Что-то не так с кодом ??Если нет, что может вызвать эту проблему?

Мой код выглядит следующим образом:

report_count = 0 
server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)
advertise_service(server_sock, "Server",service_classes = [ SERIAL_PORT_CLASS ],profiles = [ SERIAL_PORT_PROFILE ] )

while 1:
    client_sock, client_info = server_sock.accept()
    print ("Accepted connection from ",client_info)
    data = b""
    try:
        while 1:
            data += client_sock.recv(1024)

    except:
        with open(str(report_count)+".pcl", "ab") as f:
            f.write(data)
        client_sock.close()
        print("Socket closed")
        report_count +=1
...