BLE под микроскопом. Часть 1
часть 2В мире существует большое разнообразие способов передачи информации «по воздуху». В последнее время всё большую популярность обретает формат BLE. Сегодня мы рассмотрим особенности этого протокола и поговорим о том, почему же он так востребован в современном мире. Так же мы рассмотрим средства разработки и особенности работы вспомогательных приложений на windows, android от фирмы Nordic.
Зачем придумали BLE
Как только люди научились передавать информацию без помощи проводов, встала задача передачи данных, используя устройство с батарейным питанием. Проблема в том, что ему должно помогать другое устройство, которое будет постоянно либо прослушивать эфир, либо передавать данные. Проблема возникает в том случае, если и приемник и передатчик имеют батарейное питание. В этом случае приходит на помощь BlueTooth Low Energy (BLE). Он впервые вошел в протокол BlueTooth 4.0. На данный момент уже вышла спецификация BlueTooth 5.0, однако мы будем рассматривать в основном формат BlueTooth 4.0, иногда указывая нововведения для формата 5.0. В качестве одного из устройств обычно выступает смартфон, а второго — батарейный гаджет. Андроид поддерживает BLE с версии 4.3.
Для передачи и приема данных необходима энергия, поэтому поднимают скорость передачи данных, что бы в единицу времени успеть передать больше информации. Для этого в BLE принята скорость передачи информации в 1 Mbit/c. Однако не только скорость передачи данных важна. Самым важным в BLE является то, что устройства связи умеют переходить в синхронный режим работы. Другими словами, устройства спят 99% времени, потом просыпаются на очень короткое время, обмениваются информацией и опять засыпают. Однако перед тем как войти в этот режим, необходимо пройти процедуру синхронизации. Для этого существует режим «advertising». Его мы рассмотрим позднее. А перед тем как погрузится в описание протокола BLE, хотелось бы затронуть тему инструментальных средств, для работы с протоколом BLE.
Инструменты
Для того чтобы разобраться во всем многообразии посылок и запросов нам необходимы инструментальные средства. С их помощью мы смогли бы увидеть содержимое посылок и проконтролировать механизм взаимодействия между устройствами. Для этих целей мы будем использовать nRF51822 Development Dongle (PCA10000), программу сниффера и, для отображения результатов, хорошо известную всем сисадминам программу «Wireshark».
Программы бесплатные, но достать сам донгл может оказаться проблемой. Однако без инструментария, заниматься разработкой таких сложных устройств будет весьма проблематично. На первом этапе может помочь программа на андроиде «nRF Connect».
Она позволяет сканировать эфир, находить и разбирать посылки как присоединяемых, так и не присоединяемых устройств. У Nordic-a есть и ещё инструменты для разработки BLE устройств, но нам будет достаточно этих. На российском рынке присутствует представитель компании Nordic – фирма «Rutronik» (rutronik24.com, rutronik.com). Через её представителей можно приобрести необходимые микросхемы, отладочные платы и т.д. Кроме того, в интернете имеется форум, на котором представители фирмы отвечают на вопросы разработчиков.
Сначала вкратце поговорим о том, как пользоваться нашими инструментами. Вставим в разъем USB наш донгл и запустим программу ble_sniffer_win. Мы увидим следующее окно.
Если донгл увидит BLE устройства, то внизу появится информация о них. В данном случае, в эфире присутствует одно устройство с именем «TestBLE». Так же отображается его уровень сигнала, MAC адрес и то, что этот адрес является случайным (random). Забегая вперед, хочется заметить, что здесь кроется один из подводных камней для разработчиков. Некоторые телефоны (LG G3S, Samsung S6) работают только с устройствами, MAC адреса которых зарегистрированы (public).
У сниффера есть два режима работы. Если мы нажмем кнопку «w» на клавиатуре, то запустится программа «Wireshark». Сниффер будет сканировать три рекламных канала и выдавать информацию обо всех устройствах объявления. Если мы сначала нажмем цифру на клавиатуре, такую же, как напротив интересующего нас устройства, то включится другой режим работы. В нем сниффер будет отслеживать трафик только одного выбранного устройства, причем как на каналах объявления, так и на рабочих каналах
Используя «Wireshark», легко получить всю информацию о посылке. Программа состоит из трех окон. Сверху отображаются все принятые посылки, во втором окне – детальная информация о выбранном пакете, а в третьем окне отображается сам фрейм. В свою очередь, во втором окне имеется три блока информации. В самом верхнем – временные значения выбранного фрейма, во втором (Nordic BLE sniffer meta) – общая информация о фрейме, такие как уровень сигнала, частотный канал и некоторые другие. Самым интересным для нас является третий блок информации (Bluetooth Low Energy Link Layer). В нем можно посмотреть разбор самого фрейма. В дальнейшем мы будем говорить именно об этом блоке информации. Сначала мы разберем формирование рекламных пакетов.
Advertising
Посмотрим на рисунок ниже. На нем показаны распределения каналов по частотам для BLE. Рекламные каналы — это 37 (2402Мгц), 38 (2426Мгц) и 39 (2480Мгц) каналы. Такое распределение рекламных каналов выбрано не случайно. Во-первых, рекламные каналы попадают между каналами Wi-Fi (1, 6, 11 каналы), что позволяет даже при малом уровне мощности, быть услышанными другими устройствами. Во-вторых, когда мы разносим рекламные каналы далеко друг от друга, мы получаем гарантированную доставку сообщения. Это связано с интерференцией сигнала в помещениях. Известно, что в результате отражения радиосигналов от стен, может получиться ситуация, когда приемник и передатчик не слышат друг друга. Однако в нашем случае, когда передача рекламных пакетов идет последовательно на трех разных каналах, максимально удаленных друг от друга по частоте, этот эффект отсутствует.
Рассмотрим теперь формат самого пакета advertising. В спецификации длина данных измеряется в октетах. Для нас это байты. Самым первым байтом идет преамбула. Она состоит из чередующихся нулей и единиц. Это нужно для синхронизации передатчика и приемника. Следом за преамбулой передаются четыре байта адреса доступа(Access Address). После него идет пакет данных (PDU). В спецификции 4.0 максимальная длина PDU составляет 39 байт, а в версии 5.0 длина пакета данных увеличена до 257 байт. В конце каждого рекламного пакета идут три байта контрольной суммы (CRC).
Здесь надо заметить, что Access Address служит для того, что бы устройства понимали, для кого предназначен BLE пакет. Это своеобразный код доступа. Если этот код доступа не знаком устройству, то пакет игнорируется. На всех рекламных каналах, в отличии от рабочих, он одинаков (0x8E89BED6), поэтому все устройства на каналах объявления видят друг друга.
Рассмотрим теперь формат блока данных PDU. В самом начале пакета PDU идет заголовок длинной 16 бит. В нем содержится тип пакета, флаги TxAdd, RxAdd, а так же длина всего поля PDU в байтах. RFU – это зарезервированные поля. Для спецификации 4.0 это выглядит так:
Заголовок:
Для спецификации 5.0 увеличена длина поля Payload до 255 байт, а так же добавлены новые поля в заголовок:
Заголовок:
Поле TxAdd как раз и отвечает за то, как будет видеться MAC адрес устройства. Если это поле равно единице, то МАС устройства будет виден как random. Рассмотрим теперь какие бывают типы advertising пакетов. На рисунке приведен их список для спецификации 4.0. В формате 5.0 их число увеличено, но мы будем рассматривать то, что есть в обоих форматах.
ADV_IND – это ненаправленные пакеты, которые рассылают устройства, готовые к присоединению. Большинство гаджетов при рассылке рекламных пакетов используют именно их.
ADV_DIRECT_IND — направленные рекламные пакеты присоединяемых устройств. Присоединять и обмениваться данными с ними может только конкретное устройство с заранее известным МАС адресом.
ADV_NONCONN_IND – рекламные пакеты, которые рассылают не присоединяемые устройства. Это маяки (beacon). Обычно они служат для получения какой-либо справочной информации. Например, при входе в магазин могут информировать об акциях. Кроме того, измеряя уровень сигналов от маяков и зная карту их расположения, можно осуществить автоматическое позиционирование внутри помещений. Это актуально для автоматизированных складов.
SCAN_REQ, SCAN_RSP, CONNECT_REQ – пакеты, которыми обмениваются присоединяемое устройство и телефон в процессе установления синхронного соединения. Эти пакеты и сам процесс присоединения мы рассмотрим во второй части статьи.
ADV_SCAN_IND – эти пакеты рассылает не присоединяемое устройство, которое может предоставить дополнительную информацию в ответ на запрос при сканировании.
Во второй части статьи мы рассмотрим различные режимы работы BLE устройств, а так же механизм «присоединения» устройства к телефону и переход на рабочие частоты.
Печерских Владимир
Комментарии (34)
wholeman
10.01.2017 20:47BLE же, вроде, в Bluetooth Smart переименовали.
pecherskih
11.01.2017 00:44Вики не делает различия этих названий. Кому как удобнее.
wholeman
11.01.2017 08:36Действительно. Bluetooth SIG тоже вовсю использует название Bluetooth LE. К сожалению, я уже не помню, где читал, что Smart будет вместо BLE, а то написал бы им, что я о них думаю.
symydo
11.01.2017 00:34Рекламные? Может быть, лучше «оповещательные»?
pecherskih
11.01.2017 00:39Иногда говорят что это посылки объявления. «Оповещательные» наверное то же правильно. Хотя advertising переводится как реклама. Кому что ближе.
Self_Perfection
11.01.2017 01:56-1Пожалуйста, при подготовке статей используйте lossless формат для скриншотов. Рябь вокруг букв текста на скриншотах царапает глаза не меньше орфографических ошибок.
pecherskih
11.01.2017 11:07Спасибо за совет. Сейчас посмотрю что это такое. Это моя первая публикация, поэтому не всё правильно оформлено. Кстати, может тогда посоветуете чем лучше пользоваться. Буду рад поучиться.
ComodoHacker
11.01.2017 16:51Это PNG. К примеру, с помощью IrfanView можно и скриншот снять, и подправить что-то, (выделение, пояснительные надписи), и сохранить в любой формат.
Кстати, можно и в JPEG сохранять скриншоты так, чтобы не «царапало глаза». Но тут уже навык нужен.Self_Perfection
11.01.2017 23:28Да, стоило не грузить, а просто посоветовать использовать png. Но есть ещё у меня надежда, что в ближайшие годы какой-нибудь более эффективный формат наберёт популярность, чтобы можно было его без раздумий использовать вместо png. webp в lossless режиме например.
Даже если при сохранении а jpeg выкрутить качество на максимум, артефакты всего лишь станут практически незаметны, а размер файла скорее всего будет в разы больше чем при сохранении в png.
bluetooth
11.01.2017 11:08Не BlueTooth, а Bluetooth!
pecherskih
11.01.2017 11:09Возможно вы и правы. Учту.
bluetooth
11.01.2017 15:34Не возможно, а точно.
Из руководства по бренду Bluetooth SIG:
The Bluetooth word mark is a trademark too! That means the spelling can’t change.
zolkko
11.01.2017 12:26Донгл покупать не обязательно. В качестве снифера можно собрать свой, прошив его https://github.com/adafruit/Adafruit_BluefruitLE_Firmware/tree/master/sniffer/1.0.1 этим.
pecherskih
11.01.2017 13:01Хотелось бы схему посмотреть. На оригинальном донгле связь с USB портом осуществляется через другой процессор. Он находится на обратной стороне платы. Кстати, видится донгл как программатор. Если он вставлен и пользуешься программой nRFgo Stodio, то можно свою прошивку залить и в донгл. Так что не всё так просто. А у процессора nRF51822 нет USB поддержки, только UART.
Кстати, тем кто хочет попробовать поработать с этой микросхемой, а кита нет, советую купить маячок Stickr TrackR. О нем можно почитать например здесь:
http://nig.mirtesen.ru/blog/43919973570/GPS-treker-Stickr-TrackR-razmerom-s-monetu-otsledit-mestopolozhe
Он так же собран на микросхеме nRF51822. Если снять кнопку и вывести провода для программирования
то может получиться следующая конструкция:
http://vovka-ru.users.photofile.ru/photo/vovka-ru/200969120/xlarge/110279799.jpg
http://vovka-ru.users.photofile.ru/photo/vovka-ru/200969120/xlarge/110279800.jpgpecherskih
11.01.2017 13:24Да, ещё. Может быть кому будет интересно на счет программатора. У многих есть киты от ST с программатором ST-Link на борту. Появился вариант их переделки в J-Link. Есть возможность отката назад. Сам не пробовал. J-Link у меня есть. К тому же будет ли он работать с nRF51822 — то же вопрос. Но тем у кого ручки чешутся може пригодиться ссылка. Самое интересное там в комментах.
http://we.easyelectronics.ru/STM32/chudesnoe-prevraschenie-st-link-v-j-link.html
BurlakovSG
11.01.2017 16:10Зачем же покупать за 25$ какой-то маячок, если можно в Китае купить нормальный модуль nRF51822 Core. За 15$ можно купить модуль с отладочной платой (только она без программатора), на которой выведены все интерфейсы на гребёнки.
zolkko
11.01.2017 20:25Готовую ПП я не нашёл у себя. Но там типовое включение пойдёт. Антенка перерисовывается как на 11 странице http://www.seeedstudio.com/document/BLE40nRF510102DK%20datasheet.pdf. Из интерфейсов микроконтроллера нужны только usart и swd. Остальное можно оставить висеть в воздухе.
Либо как вариант вообще просто купить один из множества подобных модулей (как в даташите) или RedBear BLE Nano и модуль usart-usb готовый и на соплях их соединить. Но программатор, да, нужно иметь.
Про nRFgo Studio ничего не знаю, т.к. их в osx/linux не завезли =] И оригинального донгла в руках не держал, но полагаю, брейкпоит в коде такой донгл поставить не даст.
pecherskih
11.01.2017 22:59Вообще то, как я уже писал, на первых порах можно использовать «nRF Connect» на андроиде. Он даже сам разбирает содержимое посылки по полям. Но донгл, а точнее программа работы с ним позволяет запускать Wireshark. А вот это уже сильно. Позволяет понять где какие поля находятся. У первой версии Wireshark-а, работающего с Bluetooth 4.0, была ошибка в одном поле. Я связывался с представителем Nordic-a, они прояснили. Кстати, раз уж разговор зашел, м/с nRF51822 ужасна. Половину интерфейсов не работают как заявлено, а ШИМ — просто нечто. Не держит скважность. Переворачивает сигнал. Они даже 2 библиотеки выпустили что бы это исправить — не помогло. У него ядро тормознутое — ARM0. Из-за этого и сниффер часто зависает. Но другого у меня всё равно нет. Сейчас перехожу на их новый камень — nRF52832. Там ARM4, побыстрее будет
BurlakovSG
11.01.2017 16:30А вот мне интересно можно купить в Китае какой-нибудь аналог, а то оригинальный дорого для просто попробовать? На Али видел донглы, но не понятно можно их прошить или они уже прошиты для снифера.
pecherskih
11.01.2017 16:10Разве только за тем, что не надо ждать. Не знаю как сейчас, а года 2 назад его можно было купить в Москве.
BurlakovSG
11.01.2017 16:49Ещё есть донглы на CC2540 — с помощью их не пробовали анализировать пакеты?
pecherskih
11.01.2017 23:04У меня его нет. Думаю с ним аналогично. Главное что бы умел запускать Wireshark. Уж очень удобная вещь для изучения.
BurlakovSG
12.01.2017 09:30Нет, он не умеет работать с Wireshark. Там есть программа от TI специальная, но она давно не обновлялась.
pishchin
13.01.2017 10:00Можно конвертировать сохранённые в SmartRF пакеты в pcap и анализировать их в Wireshark оффлайн
alexzzam
11.01.2017 18:32А посоветуйте пожалуйста заодно простой и недорогой модуль BLE. Типа ESP-8266 в режиме управления извне, но для Bluetooth.
pecherskih
11.01.2017 23:09Не могу, с модулями я не работал. Есть у Nordic-а серия nRF8001 для управления внешним контроллером. И серия nRF8002 — там вообще только кнопки и светодиоды с буззером. Но я их не ковырял. По моему внешнее управление ещё сложнее. Здесь можно хотя бы под отладчиком что-то посмотреть, а там — нет
BurlakovSG
12.01.2017 09:33Посмотрите на Али модули nRF51822 Core. Есть комплекты с отладочной платой, но без программатора. Я всё облизываюсь на него, но пока не до него.
pecherskih
12.01.2017 11:01Посмотрел. Но я на Али ничего не заказывал пока. Я всё отлаживаю сразу на платах для работы. Вот сейчас поднимаю nRF52832. Он получше будет серии nRF51х.
maniacscientist
Шикарное название
pecherskih
Спасибо, долго не думал, само как то пришло