Чтобы установить 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:
Впоследствии можно будет либо самому дописать функцию 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.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)
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: