BlueZ / Pybluez - сканирование Bluetooth LE при подключении к периферийному устройству

Краткий вопрос: можно ли сканировать устройства LE при периодическом подключении к некоторым и считывать характеристики а) в целом [позволяет ли это протокол] и б) со стеком BlueZ?

Длинный вопрос: я пишу сценарий Python для сканирования устройств LE, рекламирующих определенный UUID. Если он найден, мы должны подключиться, прочитать определенное значение характеристики (назовите это ValueA) и отключиться. Идея состоит в том, чтобы поддерживать в режиме реального времени список присутствующих ValueA. Я хочу иметь возможность создавать поток, который запускает сканирование LE и собирает рекламные события в поточно-ориентированный контейнер. При обнаружении нового устройства должен быть запущен обработчик для чтения ValueA.

Мои попытки использовать PyBluez и BluePy (для подключения к периферийным устройствам) не увенчались успехом. Когда я использую команды терминала (sudo hcitool lescan --duplicates и sudo gatttool -I, за которыми следуют команды подключения и чтения), они не работают, если я пытаюсь подключиться после запуска сканирования (сканирование прерывается)

Я сбит с толку, потому что замечаю, что если я подключен к устройству через gatttool до начала сканирования LE, я могу начать сканирование и продолжить чтение ValueA, не влияя на сканирование, но не наоборот.

Приветствуются любые идеи или хорошая документация по программированию BlueZ. Использование BlueZ 4.1 в Ubuntu 14.10 Macbook Pro


person thegeebe    schedule 03.04.2015    source источник


Ответы (1)


Я недавно не проверял, но не думаю, что PyBluez может выполнять BLE.

Проблема с попыткой подключиться во время сканирования - это известная проблема, которая возникает с некоторым оборудованием. Это проблема, специфичная для определенного оборудования. По сути, вам нужно остановить сканирование, установить соединение L2CAP / GATT, а затем перезапустить сканирование ... или купить другой ключ, у которого нет этой проблемы.

Вся работа, которую я проделал с BLE в Python, заключалась в том, чтобы имитировать то, что hcitool и gatttool делают в Python. К сожалению, пока нет библиотеки (о которой я знаю), которая поддерживает BLE. Вот фрагмент кода, который может помочь вам начать работу: Поиск Bluetooth с низким энергопотреблением с питоном

В качестве альтернативы вы можете взаимодействовать с Bluez, используя предоставляемый им интерфейс DBUS. Мне сказали, что вы не можете взаимодействовать с атрибутами, которые не являются частью профиля Bluetooth. (Таким образом, вы можете взаимодействовать с устройством BLE, которое использует профиль сердечного ритма, но не считывать значение с акселерометра)

РЕДАКТИРОВАТЬ: Кажется, есть библиотека для GATT: https://pypi.python.org/pypi/gattlib

person Tim Tisdall    schedule 07.04.2015
comment
Ах, значит, в спецификации Bluetooth нет ничего, что препятствовало бы этому. Были ли у вас успехи с конкретным ключом или есть имя для этой функции, которое я мог бы найти? С какой версией BlueZ вы работаете, 4.x или 5.x? Кроме того, в отношении периферийных устройств я добился некоторого успеха, используя bluepy для обнаружения служб и считывания характеристик. - person thegeebe; 08.04.2015
comment
Ну, это не указано в стандарте, так что это зависит от производителя оборудования. Iogear GBU521 может продолжать сканирование при подключении. Дешевый (скорее всего фальшивый) CSR, который я получил из Китая, не смог. Вам просто нужно протестировать, чтобы узнать. Если вы хотите, чтобы ваш код был надежным, вы можете временно отключить сканирование при попытке подключения, а затем снова включить его после того, как соединение будет установлено. - person Tim Tisdall; 08.04.2015
comment
Хорошо знать; Я также использую дешевую CSR из Китая. Спасибо! - person thegeebe; 08.04.2015
comment
извините, пропустил один из ваших вопросов ... Я использую версию 4.101, потому что я использую ядро ​​3.4 и не могу легко перейти на более новое ядро. Bluez 5.X требует более нового ядра, но я не могу вспомнить, где находится отсечка. - person Tim Tisdall; 08.04.2015