Программирование ARM Сниффер BLE на основе nRF5x Thu, March 28 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Сниффер BLE на основе nRF5x Печать
Добавил(а) microsin   

Вам интересно, как работает Bluetooth Low Energy (BLE) на низком уровне? Возможно, чтобы отладить свое железо BLE, и найти причину проблем? Или возможно Вы пишете свое ПО для Android, PC или MAC, которое работает с готовым устройством BLE, но не знаете подробностей реализации его протокола? Тогда возможно поможет решение, предлагаемое Adafruit [1, 2].

Платка Bluefruit LE Friend программируется специальной прошивкой firmware, которая работает как BLE сниффер.

nRF51822 Bluefruit LE Friend Black

Можно пассивно прослушивать радиоэфир, захватывая данные обмена между двумя устройствами BLE, передавая данные в утилиту Wireshark (open source инструмент анализа пакетов). Таким способом можно визуализировать процессы, происходящие на уровне пакетов, использовать полезные дескрипторы протокола, чтобы понять смысл двоичных значений данных без необходимости постоянно лезть в сложную спецификацию Bluetooth 4.0 Core. В августе 2018 года прошивка сниффера была улучшена, теперь поток данных для Wireshark хорошо обрабатывается на всех операционных системах.

Примечание: вместо Bluefruit LE Friend можно использовать любую платку с чипом nRF51822, например [3], которая продается на AliExpress.

К сожалению, firmware сниффера не может работать с традиционным загрузчиком (Nordic DFU bootloader firmware), т. е. по радио запрограммировать сниффер нельзя. Это означает, что для программирования прошивки сниффера нужно использовать отладчик J-Link (или возможно адаптер SWD + SWD Breakout).

[Ограничения сниффера на основе nRF51822]

Следует иметь в виду, что этот сниффер предназначен для прослушивания только устройств BLE, он не работает с обычными (классическими) устройствами Bluetooth.

Поскольку этот nRF-сниффер работает пассивно, просто сканируя радиопакеты, есть возможность потери некоторых пакетов, особенно при интенсивном обмене данными. Чтобы обеспечить максимальную пропускную способность сниффера, подключите его к самому не загруженному порту USB. Плохим решением будет запускать сниффер на виртуальной машине, поскольку это добавит латентности для прохождения пакетов через USB.

[Использование Sniffer V2]

Установка драйвера. Для черных платок Bluefruit LE Friend понадобится драйвер чипа моста (USB to Serial bridge) CP2104 [4]. Для голубых платок Bluefruit LE Friend нужен драйвер для чипа FT231x компании FTDI [5].

Firmware. В середине 2018 года Nordic выпустила новое Bluetooth LE sniffer firmware, оно лучше всего работает со сканером Wireshark. Начиная с августа 2018 года компания Adafruit продает запрограммированные снифферы с firmware version 2. Если у Вас firmware V1 (на упаковке не написано, что это версия firmware V2, или если сниффер был куплен до августа 2018 года), то см. описание соответствующей версии.

Официальное руководство по использованию сниффера от Nordic см. на страничке [6].

Для программирования firmware понадобится адаптер J-Link для интерфейса программирования SWD (можно использовать адаптер ST-Link v2). На черной платке Bluefruit LE Friend также понадобится запаять коннектор SWD для программирования.

Bluefruit LE Friend SWD pins

Возможно, что у Вас есть другая платка с чипом nRF51822, тогда можете взять прошивку nrf_sniffer_2.0.0-beta-1_51296aa.hex из папки firmware архива [8]. Эта прошивка хороша тем, что она не требует наличия подключенного к чипу кварца на 32 кГц (однако кварц на 16 МГц все еще требуется).

Процесс по шагам на примере J-Link Commander V7.22:

1. Подключите адаптер J-Link к интерфейсу SWD платы сигналами SWDIO, SWCLK, GND. Подайте питание +3.3V на плату. Если это платка Bluefruit LE Friend, то просто подключите её в порт USB.

2. Запустите J-Link Commander. В его командной строке введите connect и нажмите Enter. Выведется запрос, к какому чипу нужно подключиться.

SEGGER J-Link Commander V7.22 (Compiled Jun  2 2021 10:04:41)
DLL version V7.22, compiled Jun  2 2021 10:03:15
Connecting to J-Link via USB...O.K.
Firmware: J-Link ARM V8 compiled Nov 28 2014 13:44:46
Hardware version: V8.00
S/N: 12345678
VTref=3.293V
Type "connect" to establish a target connection, '?' for help
J-Link>connect
Please specify device / core. < Default >: NRF52832_XXAA
Type '?' for selection dialog
Device>

3. Введите ? и нажмите Enter. Откроется графический диалог для выбора модели чипа. В выпадающем списке Manufacturer (левая колонка) выберите Nordic Semi, список чипов сократится. На платке Bluefruit LE Friend используется модуль MDBT40-256 с чипом nRF51822_xxAA, выберите его.

nRF51822 sniffer J Link Commander select nRF51822 xxAA

4. Выведется запрос типа интерфейса для подключения:

Please specify target interface:
  J) JTAG (Default)
  S) SWD
  T) cJTAG
TIF>

Выберите S для SWD.

5. Выведется запрос выбора скорости подключения:

TIF>S
Specify target interface speed [kHz]. < Default >: 4000 kHz
Speed>

Просто нажмите Enter, будет использоваться скорость передачи SWD по умолчанию 4000 кГц. После этого выведется лог, сообщающий об успешном подключении:

Device "NRF51822_XXAA" selected.
 
Connecting to target via SWD
Found SW-DP with ID 0x0BB11477
DPv0 detected
Scanning AP map to find all available APs
AP[1]: Stopped AP scan as end of AP map has been reached
AP[0]: AHB-AP (IDR: 0x04770021)
Iterating through AP map to find AHB-AP to use
AP[0]: Core found
AP[0]: AHB-AP ROM base: 0xF0000000
CPUID register: 0x410CC200. Implementer code: 0x41 (ARM)
Found Cortex-M0 r0p0, Little endian.
FPUnit: 4 code (BP) slots and 0 literal slots
CoreSight components:
ROMTbl[0] @ F0000000
ROMTbl[0][0]: E00FF000, CID: B105100D, PID: 000BB471 ROM Table
ROMTbl[1] @ E00FF000
ROMTbl[1][0]: E000E000, CID: B105E00D, PID: 000BB008 SCS
ROMTbl[1][1]: E0001000, CID: B105E00D, PID: 000BB00A DWT
ROMTbl[1][2]: E0002000, CID: B105E00D, PID: 000BB00B FPB
ROMTbl[0][1]: F0002000, CID: B105900D, PID: 000BB9A3 ???
Cortex-M0 identified.
J-Link>

6. Теперь командой loadfile загрузите прошивку во FLASH-память микроконтроллера:

J-Link>loadfile C:\temp\nrf_sniffer_2.0.0-beta-1_51296aa.hex
Downloading file [C:\temp\nrf_sniffer_2.0.0-beta-1_51296aa.hex]...
J-Link: Flash download: Bank 0 @ 0x00000000: 1 range affected (14336 bytes)
J-Link: Flash download: Total: 0.644s (Prepare: 0.051s, Compare: 0.031s,
 Erase: 0.264s, Program & Verify: 0.272s, Restore: 0.024s)
J-Link: Flash download: Program & Verify speed: 51 KiB/s
O.K.
J-Link>

Прошивка закончена, SoftDevice для этой программы не требуется.

Установка Wireshark. Для V2 firmware рекомендуется использовать Wireshark. У firmware V1 были различные методы, такие как Python API, но на самом деле все они были посредственными по сравнению с возможностями Wireshark. Для установки Wireshark перейдите на страничку [7] и загрузите последнюю версию для своей операционной системы. На момент написания статьи это была версия Stable Release (3.4.8) August 25, 2021. При установке на Windows также поставьте галочку для установки драйвера WinPcap (Npcap 1.31).

Wireshark Plugin. Следующий шаг - установка плагина. Запустите Wireshark. Чтобы не путаться в терминологии, установите английский язык интерфейса вместо русского через меню Редактирование -> Параметры... (Ctrl+Shift+P), перейдите в раздел Появление, внизу из выпадающего списка "Язык:" выберите English. Закройте и снова откройте Wireshark.

Зайдите в меню Help -> About Wireshark, выберите закладку Folders, найдите путь до Extcap.

nRF51822 sniffer Wireshark Extcap path

Extcap это внешний драйвер для захвата пакетов, он нужен для работы с нашим сниффером. Для удобства можно использовать файлы из папки extcap архива [8], там находится все необходимое.

Примечание: на этом скриншоте видно, что есть 2 папки Extcap: одна Personal Extcap, другая Global Extcap. Вторая подойдет для пользователей с правами администратора, а вторая для любых пользователей.

Скопируйте содержимое каталога extcap из архива [8] в папку, на которую указывает Personal Extcap path (C:\Users\имяпользователя\AppData\Roaming\Wireshark\extcap).

nRF51822 sniffer Wireshark extcap folder

Выйдите из Wireshark, этот инструмент готов к работе.

Код сниффера Nordic предназначен только для Python 2, так что если у Вас по умолчанию установлен Python 3 (что скорее всего), то вероятно понадобится установить Python 2.

Примечание: версию Python можно узнать, выполнив команду python.exe -V:

c:\Program Files\Wireshark\extcap>python.exe -V
Python 2.7.16

Самый лучший способ определить, работает ли сниффер с текущей версией Python - перейти в каталог extcap в консоли команд, и попробовать запустить nrf_sniffer.bat (под Windows) или python nrf_sniffer.py (под Mac/Linux). Если увидите ошибку "LOGGING FAILED":

nRF51822 sniffer Python error LOGGING FAILED

Или ошибку "No module named 'Logger'":

nRF51822 sniffer Python error No module named Logger

То нужно установить Python версии 2. Под Windows можно установить как минимум Python 2.7.15 в каталог C:\Python27 (по умолчанию), и затем отредактировать файл nrf_sniffer.bat:

@echo off
C:\Python27\python "%~dp0nrf_sniffer.py"  %*

[Установка зависимостей]

При запуске nrf_sniffer.bat может появиться ошибка "No module named serial":

nRF51822 sniffer Python error No module named serial

В таком случае модуль serial (или другие модули, на который ругается скрипт) нужно установить с помощью утилиты pip. Внимание: поскольку используется Python 2, то убедитесь, что указываете полный путь до него, например C:\python27\Scripts\pip2.exe.

C:\python27\Scripts\pip2.exe install pyserial

Если появится сообщение "No arguments given!", то значит что сценарий, как минимум, полностью запущен, все в порядке.

C:\Users\microsin\AppData\Roaming\Wireshark\extcap>nrf_sniffer.bat
No arguments given!

Запустите Wireshark найдите строчку для источников пакетов nRF Sniffer COMx (вместо x будет указан номер автоматически определившегося COM-порта сниффера).

nRF51822 sniffer Wireshark capture select

Сделайте на этой строке двойной щелчок мышью, откроется окно захвата пакетов:

nRF51822 sniffer Wireshark capture BLE packets

[Ссылки]

1. BLUEFRUIT LE SNIFFER BLUETOOTH LOW ENERGY (BLE 4.0) NRF51822 site:adafruit.com.
2. Introducing the Adafruit Bluefruit LE Sniffer site:learn.adafruit.com.
3. NRF51822 2.4G Wireless Module Wireless Communication Module Bluetooth module site:aliexpress.com.
4. CP210x USB to UART Bridge VCP Drivers site:silabs.com.
5. Virtual COM Port Drivers site:ftdichip.com.
6. nRF Sniffer for Bluetooth LE site:nordicsemi.com.
7. Download Wireshark site:wireshark.org.
8. 210930nRF51822-BLE-sniffer.zip - прошивка, Python 2.7.15, Wireshark, extcap, документация.

 

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


Защитный код
Обновить

Top of Page