Arduino:Библиотеки/CurieBLE

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Библиотека CurieBLE[1]

Эта библиотека позволяет задействовать BLE-функции (от «Bluetooth low energy», что значит «Bluetooth с низким энергопотреблением») платы Arduino/Genuino 101, чтобы коммуницировать и взаимодействовать с девайсами вроде смартфонов и планшетов.

Краткое введение в BLE

Bluetooth версии 4.0 включает в себя и традиционный Bluetooth (именуемый теперь «Bluetooth Classic»), и новый Bluetooth Low Energy (Bluetooth LE или BLE). Технология BLE оптимизирована для работы от маломощных источников (к примеру, от простых литиевых батареек-таблеток), используемых при малых скоростях передачи данных.

В отличие от стандартной Bluetooth-коммуникации (которая, как правило, основана на асинхронном последовательном подключении, т.е. UART), BLE-устройство работает сродни доске объявлений. Компьютеры, которые подключаются к BLE-устройству – это что-то вроде людей, читающих доску объявлений (назовем их «читателями»). Каждое устройство функционирует либо как доска объявлений, либо как читатель. Если устройство – доска объявлений (в терминологии BLE такие устройства называют «периферийными»), то оно публикует данные для всех устройств, находящихся в зоне действия сигнала. Если устройство – читатель (такие устройства называют «центральными»), то оно считывает информацию со всех досок объявлений (т.е. периферийных устройств), которые содержат нужную ему информацию.

Если рассмотривать этот вид коммуникации по принципу «клиент-сервер», то сервером здесь будут служить периферийные устройства (поскольку они хранят информацию, которую запрашивают читатели), а клиентами – центральные устройства (поскольку они считывают информацию с периферийных устройств).

Итак, периферийные устройства – это доски объявлений, а центральные устройства – это читатели. Центральные устройства просматривают сервисы, получают необходимые данные и уходят. Каждый сеанс передачи данных проходит очень быстро (в течение нескольких миллисекунд), благодаря чему периферийное устройство может раздавать данные сразу нескольким центральным устройствам.

Информация, представленная периферийным устройством, структурирована в виде сервисов, каждый из которых состоит из характеристик. Если продолжать метафору с доской объявлений, то сервисы можно рассматривать, собственно, как сами объявления, а характеристики – как параграфы в этих объявлениях. Таким образом, периферийное устройство, когда нужно, просто обновляет характеристики, и не беспокоится о том, считало ли их центральное устройство или нет.

Центральное устройство, в свою очередь, просто подключается к периферийному устройству и считывает нужные характеристики. Если какая-либо характеристика поддается и перезаписи, и считыванию, то ее могут менять и периферийное, и центральное устройство.

Уведомления

Спецификация BLE включает в себя механизм уведомлений (notify), позволяющий узнавать, когда были изменены данные. Когда у какой-либо характеристики включены уведомления, и отправитель делает запись на эту характеристику, то это новое значение автоматически отсылается получателю, даже если он не давал команду считывания. Этот метод часто используется для потоковых данных – вроде тех, что генерируют акселерометры и другие датчики. У механизма уведомлений есть разновидность, называемая уведомление с подтверждением (indicate), т.е. получатель перед тем, как принять данные, должен отправить подтверждение.

Клиент-серверная структура BLE в сочетании с механизмом уведомлений называется, как правило, моделью публикации и подписки.

Обновление характеристики

Если характеристика подверглась значительному изменению (к примеру, если состояние переключателя поменялось с «выкл» на «вкл» или значение на аналоговом датчике резко прыгнуло на несколько пунктов вверх или вниз), периферийное устройство должно ее обновить. Обновление характеристики нужно делать регулярно, но если значение характеристики не будет меняться, это приведет к пустым тратам энергии и вычислительной мощности.

Центральные и периферийные устройства

Центральные устройства – это клиенты. Они считывают и записывают данные на периферийные устройства. Периферийные устройства – это серверы. Они публикуют данные от датчиков в виде читаемых характеристик, а также предоставляют доступ к перезаписываемым характеристикам, чтобы с их помощью управлять устройствами-исполнителями вроде моторов, фонарей и т.д.

Сервисы, характеристики и UUID

Периферийное устройство публикует информацию через сервисы, которые, в свою очередь, состоят из характеристик. Вы можете задать собственные сервисы либо использовать стандартные сервисы.

Сервисы идентифицируются уникальными номерами, известными как UUID. Стандартные сервисы имеют 16-битные UUID, а пользовательские – 128-битные UUID. Способность определять сервисы и характеристики зависит от устройства, которое вы используете, и его прошивки.

Способы создания сервиса

Значение характеристики не должно превышать объем в 20 байтов – это главное ограничение при создании сервисов. Его нужно обязательно учитывать при определении того, как лучше всего хранить данные от датчиков и прочих устройств, используемых в вашем проекте. Самый простой способ – каждому значению по характеристике (в ASCII-формате):

Характеристика Значение
Акселерометр; ось X 200
Акселерометр; ось Y 134
Акселерометр; ось Z 150

Этот способ требует больше ресурсов памяти и больше времени на считывание данных. Впрочем, он проще в разработке и отладке.

Второй способ – это объединение в одной характеристике нескольких значений. Он удобен, к примеру, если эти несколько значений связаны с одним и тем же устройством.

Характеристика Значение
Мотор; скорость и направление движения 150, 1
Акселерометр; оси X, Y и Z 200, 133, 150

Второй способ более эффективен, однако при его использовании нужно быть осторожнее, чтобы не превысить 20-байтный лимит. К примеру, характеристика для акселерометра из таблицы выше представлена в виде ASCII-строки, занимающей 11 байтов.

Операции для работы с характеристиками

Существует 4 операции, с помощью которых центральное устройство может взаимодействовать с характеристиками:

  • Чтение (read). Запрашивает у периферийного устройства текущее значение характеристики. Как правило, используется для характеристик, значения которых меняются нечасто – к примеру, для тех, где хранится информация о настройках, номере версии и т.д.
  • Запись (write). Изменяет значение в характеристике. Как правило, используется для команд – к примеру, для того, чтобы приказать периферийному устройству включить или выключить мотор.
  • Уведомление (notify) и уведомление с подтверждением (indicate). Запрашивает у периферийного устройства постоянную отправку обновленных значений характеристики, чтобы центральному устройству не пришлось запрашивать каждое из этих значений по отдельности. При использовании операции «indicate» периферийное устройство сначала должно прислать подтверждение на отправку данных.

Пакеты-объявления и GAP

BLE-устройства дают знать о своем существовании при помощи объявлений, и это осуществляется через GAP (от «Generic Access Point», что значит «профиль общего доступа»). Пакеты-объявления могут содержать название устройства, список предлагаемых им сервисов и другую информацию.

Пакет-объявление имеет ограниченный размер – в частности, он вмещает только один 128-битный UUID сервиса. Поэтому убедитесь, что название BLE-устройства не слишком длинное, иначе оно может просто не вместиться с пакет.

Поскольку размер объявления ограничен, есть вероятность, что он может не вместить UUID всех сервисов, имеющихся на периферийном устройстве. Впрочем, вам не обязательно объявлять сразу обо всех сервисах, т.к. центральное устройство будет узнавать о них в момент подключения к периферийному устройству.

Отсюда следует, что эти невидимые (дополнительные) сервисы нельзя использовать в качестве «приманки» для центральных устройств. Но эту проблему можно обойти. К примеру, если вы сами спроектировали какое-нибудь периферийное устройство и снабдили его каким-то особым сервисом, то ПО на вашем центральном устройстве можно запрограммировать так, что оно будет думать в духе: «Ага! Раз на этом периферийном устройстве есть вот этот особый сервис, значит, есть и другие нужные мне сервисы».

GATT

Протокол BLE функционирует на нескольких уровнях, и одним из них является GATT (от «General Attribute Profile», что значит «профиль общих атрибутов») – он определяет, что такое сервисы и характеристики, а также позволяет делать с ними операции чтения, записи, уведомления и уведомления с подтверждением. В большинстве случаев GATT-сервером будет периферийное устройство (поскольку оно предлагает сервисы и характеристики), а GATT-клиентом – центральное устройство. Но имейте в виду, так бывает не всегда.

Структура библиотеки

Библиотека CurieBLE может выполнять разные задачи, поэтому состоит из нескольких классов:

Примеры

См.также

Внешние ссылки