Поиск низкой энергии Bluetooth с помощью python

Возможно ли, чтобы этот код был изменен, чтобы включить устройства Bluetooth Low Energy? https://code.google.com/p/pybluez/source/browse/trunk/examples/advanced/inquiry-with-rssi.py?r=1

Я могу найти такие устройства, как мой телефон и другие устройства bluetooth 4.0, но не BLE. Если это невозможно изменить, возможно ли запустить hcitool lescan и вытащить данные из дампа hci в python? Я могу использовать инструменты для просмотра устройств, которые я ищу, и он дает RSSI в hcidump, и это моя конечная цель. Чтобы получить MAC-адрес и RSSI с устройства BLE.

Благодаря!

    Как я уже сказал в комментарии, эта библиотека не будет работать с BLE.

    Вот пример кода для простого сканирования BLE:

    import sys import os import struct from ctypes import (CDLL, get_errno) from ctypes.util import find_library from socket import ( socket, AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI, SOL_HCI, HCI_FILTER, ) if not os.geteuid() == 0: sys.exit("script only works as root") btlib = find_library("bluetooth") if not btlib: raise Exception( "Can't find required bluetooth libraries" " (need to install bluez)" ) bluez = CDLL(btlib, use_errno=True) dev_id = bluez.hci_get_route(None) sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI) sock.bind((dev_id,)) err = bluez.hci_le_set_scan_parameters(sock.fileno(), 0, 0x10, 0x10, 0, 0, 1000); if err < 0: raise Exception("Set scan parameters failed") # occurs when scanning is still enabled from previous call # allows LE advertising events hci_filter = struct.pack( "<IQH", 0x00000010, 0x4000000000000000, 0 ) sock.setsockopt(SOL_HCI, HCI_FILTER, hci_filter) err = bluez.hci_le_set_scan_enable( sock.fileno(), 1, # 1 - turn on; 0 - turn off 0, # 0-filtering disabled, 1-filter out duplicates 1000 # timeout ) if err < 0: errnum = get_errno() raise Exception("{} {}".format( errno.errorcode[errnum], os.strerror(errnum) )) while True: data = sock.recv(1024) # print bluetooth address from LE Advert. packet print(':'.join("{0:02x}".format(x) for x in data[12:6:-1])) 

    Мне пришлось собрать все это вместе, посмотрев исходный код hcitool и gatttool который поставляется с Bluez. Код полностью зависит от libbluetooth-dev поэтому вам нужно убедиться, что вы установили его первым.

    Лучшим способом было бы использовать dbus для звонков на bluetoothd , но у меня пока не было возможности исследовать это. Кроме того, интерфейс dbus ограничен тем, что вы можете сделать с подключением BLE после его создания.

    РЕДАКТИРОВАТЬ:

    Мартин Трамшак отметил, что в Python 2 вам нужно изменить последнюю строку для print(':'.join("{0:02x}".format(ord(x)) for x in data[12:6:-1]))

    Вы также можете попробовать pygattlib . Он может использоваться для обнаружения устройств, и (в настоящее время) существует базовая поддержка характеристик чтения / записи. Пока нет RSSI.

    Вы можете обнаружить следующий фрагмент:

     from gattlib import DiscoveryService service = DiscoveryService("hci0") devices = service.discover(2) 

    DiscoveryService принимает имя устройства, и метод discover принимает тайм-аут (в секундах) для ожидающих ответов. devices – это словарь, с адресом BL в качестве ключей и именами как значения.

    pygattlib упакован для Debian (или Ubuntu), а в разделе «Загрузки» есть .deb.