0
0 комментариев

Доброго времени суток!


Конкретизирую и повторюсь для лучшего понимания:

  1. Работаю в среде Spyder 3.0.2 (Python 3.5), ОС Windows 10 Pro
  2. Использую штатный модуль Bluetooth ноутбука для связи по протоколу RFCOMM с Bluetooth-модулем HC-06
  3. Использую модуль PyBluez

Упрощённый код скрипта (опущен процесс поиска и подключения по заданному имени):

import bluetooth
 
bluetooth_addr = '20:16:01:11:67:40'
socket_port = 1
 
socket = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
socket.connect( (bluetooth_addr, socket_port) )

Код рабочий, подключение происходит, данные передаются.

Однако проблема с функцией socket.recv (buffsize). Она намертво зависает в случае если число доступных байт в буфере сокета меньше аргумента функции — buffsize… Что означает необходимость знать число байт находящихся в буфере сокета для исключения сбоев в работе.

Вижу два пути решения проблемы — каким-то образом узнать число байт в буфере сокета, или же использовать таймауты.

Описано и работает решение с использованием таймаута:

In [1]: import bluetooth
 
In [2]: bluetooth_addr = '20:16:01:11:67:40'
 
In [3]: socket_port = 1
 
In [4]: socket = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
 
In [5]: socket.settimeout (1)
 
In [6]: socket.connect( (bluetooth_addr, socket_port) )
 
In [7]: socket.recv (1)
Traceback (most recent call last):
 
  File "<ipython-input-7-30e8d180471b>", line 1, in <module>
    socket.recv (1)
 
  File "C:\Users\123\Anaconda3\lib\site-packages\pybluez-0.22-py3.5-win-        amd64.egg\bluetooth\msbt.py", line 84, in recv
    return bt.recv (self._sockfd, numbytes)
 
OSError

однако по ряду причин оно неприемлемо.


В обсуждении было предложено использовать переменную socket.MSG_DONTWAIT, однако такой переменной в классе BluetoothSocket нет.

Так же было дано уточнение:

| >>> import socket >>> socket.MSG_DONTWAIT 64 сокет не ваш объект, а модуль – eri

Смысл которого до меня всё же не дошёл. Для проверки в консоли IPython выполнил такой код:


In [1]: import bluetooth
In [2]:
 
In [3]: import socket
 
In [4]: socket = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
 
In [5]: bluetooth_devices = bluetooth.discover_devices()
 
In [6]: bluetooth_devices
Out[6]: ['20:12:11:22:87:98', '20:16:01:11:67:40', 'E4:E0:C5:C2:34:26']
 
In [7]: socket.connect( ('20:16:01:11:67:40', 1) )
 
In [8]: socket.MSG_DONTWAIT
Traceback (most recent call last):
 
File "<ipython-input-8-1b2974ae0a63>", line 1, in <module>
  socket.MSG_DONTWAIT
 
AttributeError: 'BluetoothSocket' object has no attribute 'MSG_DONTWAIT'


И так — что я делаю не так? И всё же, есть ли возможность через класс BluetoothSocket узнать число байт в его буфере для реализации не зависающего скрипта?


Добавить комментарий