Сканирование Bluetooth-устройств на Raspberry Pi |
![]() |
Добавил(а) microsin |
Чтобы установить bluescan, понадобилось также установить libglib2.0-dev, libcairo2-dev, libgirepository1.0-dev. Подсказки на разрешение этих зависимостей давала команда pip3 install bluescan. Команды для установки пакетов нужно запускать с помощью утилиты повышения уровня доступа sudo. $ sudo apt-get install libglib2.0-dev
$ sudo apt install libcairo2-dev
$ sudo apt install libgirepository1.0-dev
$ sudo pip3 install bluescan
Примечание: новые термины и сокращения, касающиеся технологии Bluetooth, см. в Словарике [4]. Ошибка заключается, как всегда, в проблеме зависимостей кода от библиотек, которые традиционно меняются при смене версии Python. В моей версии Python 2.7.16, установленной на Paspberry Pi [1], не хватало функции removesuffix (этот метод для str появился в версии 3.9+ Python), на что указывало сообщение об ошибке: Traceback (most recent call last):
File "/usr/local/bin/bluescan", line 6, in < module >
from bluescan.__main__ import main
File "/usr/local/lib/python3.7/dist-packages/bluescan/__main__.py", line 19, in < module >
from .br_scan import BRScanner
File "/usr/local/lib/python3.7/dist-packages/bluescan/br_scan.py", line 31, in < module >
from .common import bdaddr_to_company_name
File "/usr/local/lib/python3.7/dist-packages/bluescan/common.py", line 28, in < module >
company_id = items[0].removesuffix(' (hex)')
AttributeError: 'str' object has no attribute 'removesuffix'
Я не стал заморачиваться с поиском библиотек или переустановкой Python (чтобы не начали вылезать проблемы с другими программами), и временно устранил ошибку, просто удалив вызов функции removesuffix: #company_id = items[0].removesuffix(' (hex)') company_id = items[0] Впоследствии можно будет либо самому дописать функцию removesuffix, либо все-таки перейти на более новую версию Python. [Сканирование классических устройств Bluetooth] Классические устройства (Classic Bluetooth) могут использовать 3 технологии BR (Basic Rate), EDR (Enhanced Data Rate) и AMP (Alternate MAC/PHY). Поскольку все это относится к системе Basic Rate, можно выполнить сканирование следующим образом, пример сканирования клавиатуры Bluetooth v3.0 компании Oklick, модель 840S: pi@raspberrypi:~ $ sudo bluescan -m br
Unable to init server: Could not connect: Connection refused
Unable to init server: Could not connect: Connection refused
(bluescan:4061): Gdk-CRITICAL **: 12:12:55.303: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed
(bluescan:4061): Gdk-CRITICAL **: 12:12:55.306: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed
[INFO] BR scanning on hci0 with timeout 10.24 sec
Addr: 0C:FC:85:4F:17:1C (Unknown)
Page scan repetition mode: 1 (R1)
Reserved: 0x00
CoD: 0x002540
Service Class: 0b1
Limited Discoverable Mode
Major Device Class: 0b101, Peripheral (HID)
Clock offset: 0x62EB
RSSI: -61
Extended inquiry response:
Complete Local Name: Bluetooth Keyboard
Complete List of 16-bit Service Class UUIDs
0x1124 HumanInterfaceDeviceService
[INFO] Inquiry completed
[INFO] Requesting the name of the scanned devices...
0C:FC:85:4F:17:1C: Bluetooth Keyboard
Примечание: сообщения "Unable to init server" и "'GDK_IS_DISPLAY (display)' failed" выводятся потому, что консоль была запущена не в графическом окружении рабочего стола, а просто из консоли SSH. На эти сообщения можно не обращать внимания. Как показано в примере выше, сканированием BR-устройств мы можем получить MAC-адрес, режим сканирования (page scan repetition mode [2]), класс устройства, смещение тактов (clock offset), уровень радиосигнала (RSSI), ответ на расширенный запрос extended inquiry response (здесь может быть информация об имени, передаваемой мощности, и т. д.). [Сканирование служб SDP] Классические устройства Bluetooth сообщают внешнему миру о своем функционале через SDP. После сканирования SDP будут выведены записи службы (service records) указанного Classic Bluetooth-устройства. Пример SDP-сканирования клавиатуры Bluetooth v3.0 компании Oklick, модель 840S: pi@raspberrypi:~ $ sudo bluescan -m SDP 0C:FC:85:4F:17:1C
[INFO] Scanning...
Number of service records: 3
Service Record
0x0000: ServiceRecordHandle (uint32)
0x00010000
0x0001: ServiceClassIDList (sequence)
0x1124: HumanInterfaceDeviceService
0x0004: ProtocolDescriptorList (sequence)
0x0100: L2CAP
PSM: 0x0011
0x0011: HIDP
0x0005: BrowseGroupList (sequence)
0x1002: PublicBrowseRoot
0x0006: LanguageBaseAttributeIDList (sequence)
language name: 0x656e
encoding: 0x006a
attribute ID base: 0x0100
0x0009: BluetoothProfileDescriptorList (sequence)
0x1124: HumanInterfaceDeviceService v1.0
0x000d: AdditionalProtocolDescriptorList (sequence)
0x0100: L2CAP
PSM: 0x0013
0x0011: HIDP
0x0100: ServiceName (text)
Airoha BT Keyboard
0x0101: ServiceDescription (text)
Bluetooth KB
0x0102: ProviderName (text)
Airoha
0x0200: HIDDeviceReleaseNumber (Deprecated) (uint16)
0x0100
0x0201: HIDParserVersion (uint16)
0x0111: USB HID specification v1.1.1
0x0202: HIDDeviceSubclass (uint8)
0x40
0x0203: HIDCountryCode (uint8)
0x00
0x0204: HIDVirtualCable (boolean)
True
0x0205: HIDReconnectInitiate (boolean)
True
0x0206: HIDDescriptorList (sequence)
< Element 'sequence' at 0xae045ed0 >
0x0207: HIDLANGIDBaseList (sequence)
< Element 'sequence' at 0xae045fc0 >
0x0208: HIDSDPDisable (Deprecated) (boolean)
False
0x0209: HIDBatteryPower (boolean)
True
0x020a: HIDRemoteWake (boolean)
True
0x020b: HIDProfileVersion (uint16)
0x0100
0x020c: HIDSupervisionTimeout (uint16)
0x0C80
0x020d: HIDNormallyConnectable (boolean)
False
0x020e: HIDBootDevice (boolean)
True
0x020f: HIDSSRHostMaxLatency (uint16)
0x0640
0x0210: HIDSSRHostMinTimeout (uint16)
0x0320
Service Record
0x0000: ServiceRecordHandle (uint32)
0x00010001
0x0001: ServiceClassIDList (sequence)
0x1200: PnPInformation
0x0004: ProtocolDescriptorList (sequence)
0x0100: L2CAP
PSM: 0x0001
0x0001: SDP
0x0005: BrowseGroupList (sequence)
0x1002: PublicBrowseRoot
0x0009: BluetoothProfileDescriptorList (sequence)
0x1200: PnPInformation v1.0
0x0200: unknown
< uint16 value="0x0103" />
0x0201: unknown
< uint16 value="0x05ac" />
0x0202: unknown
< uint16 value="0x0239" />
0x0203: unknown
< uint16 value="0x011b" />
0x0204: unknown
< boolean value="true" />
0x0205: unknown
< uint16 value="0x0002" />
Service Record
0x0000: ServiceRecordHandle (uint32)
0x00010006
0x0001: ServiceClassIDList (sequence)
0x1138: 3D Glasses
0x0009: BluetoothProfileDescriptorList (sequence)
0x1139: 3D Synchronization v1.0
0x0100: ServiceName (guess) (text)
3D Glasses
[Сканирование функций LMP] Детектирование функций LMP для Classic Bluetooth устройств позволяет сделать выводы о нижележащих функций безопасности [3]. [Сканирование BLE-устройств] Технология Bluetooth, начиная с версии 4.0, в дополнение к системе Basic Rate, поддерживает технологию Bluetooth Low Energy (BLE) system. Пример сканирования: pi@raspberrypi:~ $ sudo bluescan -m le
[WARNING] Before doing an active scan, make sure you spoof your BD_ADDR.
[INFO] LE active scanning on hci0 with timeout 10 sec
----------------LE Devices Scan Result----------------
Addr: 8C:EA:48:0A:B2:C3 (Unknown)
Addr type: public
Connectable: False
RSSI: -90 dBm
General Access Profile:
Manufacturer Specific Data:
Company ID: 0x0075 (Samsung Electronics Co. Ltd.)
Data: 42040180668CEA480AB2C38EEA480AB2C201000000000000
Addr: E7:36:C9:99:25:85
Addr type: random
Connectable: True
RSSI: -87 dBm
General Access Profile:
Manufacturer Specific Data:
Company ID: 0x434E (Unknown)
Data: C8CF1E3F8D0214940001
Shortened Local Name: Nordic Device
Addr: CD:5C:E2:9C:18:94 (Unknown)
Addr type: public
Connectable: True
RSSI: -87 dBm
General Access Profile:
Flags:
LE General Discoverable Mode
BR/EDR Not Supported
Manufacturer Specific Data:
Company ID: 0x0157 (Anhui Huami Information Technology Co., Ltd.)
Data: 02FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02CD5CE29C1894
Complete Local Name: Mi Smart Band 4
Incomplete List of 16-bit Service Class UUIDs:
0xFEE0
Service Data - 16-bit UUID:
UUID: 0xE0FE
Data: 64160000
Addr: 7A:EA:14:ED:0E:F3
Addr type: random
Connectable: False
RSSI: -83 dBm
General Access Profile:
Manufacturer Specific Data:
Company ID: 0x0006 (Microsoft)
Data: 010920023D54168B8A79580AE7DAAB7251DF99496B2927632DB566
Addr: FD:F0:FF:F9:A9:9F
Addr type: random
Connectable: False
RSSI: -65 dBm
General Access Profile:
Manufacturer Specific Data:
Company ID: 0x004C (Apple, Inc.)
Data: 12020002
Как показано выше, результат LE-сканирования может дать нам адрес, тип адреса, статус соединения, уровень сигнала RSSI, GAP-данные, информацию о производителе. [Сканирование сервисов GATT] BLE-устройства говорят внешнему миру о своих открытых службах через GATT. После сканирования GATT мы можем получить представление о функционале и способу доступа к функционалу BLE-устройства. Впоследствии мы сможем прочитать эти GATT-данные (характеристики) с помощью дополнительных утилит [5]. Пример сканирования служб GATT устройства BLE: pi@raspberrypi:~ $ sudo bluescan -m gatt --addr-type=random D9:9D:36:54:C5:26
[INFO] Agent object registered
IO capability: NoInputNoOutput
[INFO] Changing D9:9D:36:54:C5:26 untrust succeeded
[INFO] Unregistered Agent object
----------------GATT Scan Result----------------
Number of services: 3
Service (0x0001 - 0x0009, 4 characteristics)
Handle: 0x0001
Type: 0x2800 (Primary Service)
Value: 00001800-0000-1000-8000-00805F9B34FB (Unknown)
Permissions: Read Only, No Authentication, No Authorization
Characteristic (0 descriptors)
Handle: 0x0002
Type: 0x2803 (Characteristic)
Value:
Properties: READ WRITE
Handle: 0x0003
UUID: 00002A00-0000-1000-8000-00805F9B34FB (Unknown)
Permissions: Read Only, No Authentication, No Authorization
Value
Handle: 0x0003
Type: 00002A00-0000-1000-8000-00805F9B34FB (Unknown)
Value: b'Nordic Relay'
Permissions: Higher layer profile or implementation specific
Characteristic (0 descriptors)
Handle: 0x0004
Type: 0x2803 (Characteristic)
Value:
Properties: READ
Handle: 0x0005
UUID: 00002A01-0000-1000-8000-00805F9B34FB (Unknown)
Permissions: Read Only, No Authentication, No Authorization
Value
Handle: 0x0005
Type: 00002A01-0000-1000-8000-00805F9B34FB (Unknown)
Value: b'\x00\x00'
Permissions: Higher layer profile or implementation specific
Characteristic (0 descriptors)
Handle: 0x0006
Type: 0x2803 (Characteristic)
Value:
Properties: READ
Handle: 0x0007
UUID: 00002A04-0000-1000-8000-00805F9B34FB (Unknown)
Permissions: Read Only, No Authentication, No Authorization
Value
Handle: 0x0007
Type: 00002A04-0000-1000-8000-00805F9B34FB (Unknown)
Value: b'\x06\x00\x18\x00\x00\x00\x90\x01'
Permissions: Higher layer profile or implementation specific
Characteristic (0 descriptors)
Handle: 0x0008
Type: 0x2803 (Characteristic)
Value:
Properties: READ
Handle: 0x0009
UUID: 00002AA6-0000-1000-8000-00805F9B34FB (Unknown)
Permissions: Read Only, No Authentication, No Authorization
Value
Handle: 0x0009
Type: 00002AA6-0000-1000-8000-00805F9B34FB (Unknown)
Value: b'\x01'
Permissions: Higher layer profile or implementation specific
Service (0x000A - 0x000A, 0 characteristics)
Handle: 0x000A
Type: 0x2800 (Primary Service)
Value: 00001801-0000-1000-8000-00805F9B34FB (Unknown)
Permissions: Read Only, No Authentication, No Authorization
Service (0x000B - 0xFFFF, 2 characteristics)
Handle: 0x000B
Type: 0x2800 (Primary Service)
Value: 000018FF-0000-1000-8000-00805F9B34FB (Unknown)
Permissions: Read Only, No Authentication, No Authorization
Characteristic (0 descriptors)
Handle: 0x000C
Type: 0x2803 (Characteristic)
Value:
Properties: READ NOTIFY
Handle: 0x000D
UUID: 00002A99-0000-1000-8000-00805F9B34FB (Unknown)
Permissions: Read Only, No Authentication, No Authorization
Value
Handle: 0x000D
Type: 00002A99-0000-1000-8000-00805F9B34FB (Unknown)
Value: b''
Permissions: Higher layer profile or implementation specific
Characteristic (0 descriptors)
Handle: 0x000F
Type: 0x2803 (Characteristic)
Value:
Properties: WRITE NO RESPONSE WRITE
Handle: 0x0010
UUID: 00002A3D-0000-1000-8000-00805F9B34FB (Unknown)
Permissions: Read Only, No Authentication, No Authorization
Value
Handle: 0x0010
Type: 00002A3D-0000-1000-8000-00805F9B34FB (Unknown)
Value: Unknown
Permissions: Higher layer profile or implementation specific
[Ссылки] 1. Raspberry Pi, быстрый старт. |