Python recv удаляет данные Bluetooth?

#python #sockets #recv #pybluez

#python #сокеты #recv #pybluez

Вопрос:

У меня есть приложение python, запущенное на устройстве IOT, которое получает данные через соединение Bluetooth (pybluez). Я тестирую устройство интернета вещей с помощью телефона Android. Большая часть протокола представляет собой небольшие пакеты chatty, однако есть одна операция, которая требует одновременной отправки большего объема данных, около 58 КБ в моем текущем тесте.

Иногда это работает, но чаще всего зависает в ожидании дополнительных данных, которые никогда не поступают. Я подозреваю, что это означает, что я либо переполняю буфер ограниченного размера и удаляю данные, либо транспорт ненадежен, и некоторые данные удаляются.

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

 # Read the boundary off the socket
borderDataSize = borderPoints * 16
while len(data) < borderDataSize:
    newdata = client_sock.recv(4096)
    data  = newdata

# ... logic to process the data ...
  

Кто-нибудь сталкивался с этим? Я не думаю, что я когда-либо видел это с моими меньшими сообщениями chatty, работающими в цикле, означает ли это, что это, вероятно, какой-то переполненный буфер? Существуют ли какие-либо рекомендации для решения этой проблемы?

Комментарии:

1. Вы сказали, что у вас есть данные «около 58 Тыс.». Итак, вы не знаете точный размер ожидаемых данных? Подумайте о том, что происходит, когда фактический размер данных меньше, чем borderDataSize, а разница превышает 4096. В этом случае вы будете считывать все данные из сокета и в следующем блоке итерации на recv. Это, скорее всего, то, что происходит в вашем случае.

2. Существуют различные способы обработки случаев, когда вы не знаете точно, какой объем данных ожидать. Один из простых способов — использовать сокет. установите тайм-аут и перехватите исключение socket.timeout; затем вы можете обработать данные, чтобы узнать, есть ли у вас полные данные или нет. Вы также могли бы использовать флаг MSG_PEEK, но я не пробовал его в python.

3. @singhatulks Я должен был добавить, что размер данных (пограничные точки) отправляется по протоколу и что я проверил, что количество байтов на клиенте совпадает с отпечатками. Установка тайм-аута также является хорошим предложением