Gatt service что это за программа

BLE & GATT или как отправить данные по Bluetooth.

Разрабатывая кормушку для кота, я в итоге прикрутил к ней блютус. Конечно, можно поставить на телефон обычный Bluetooth to Serial Terminal и спокойно слать нужные команды. Но так как мы не ищем простых путей, я решил написать свое приложение (на JS + Cordova) для общения с модулем HM-10. Однако, общение оказалось не таким простым, как c обычными Bluetooth устройствами. А все почему? Да потому что устройства BLE имеют немного другой принцип коммуникации.

Принцип работы BLE описан уже в его названии: Low Energy. Протокол подразумевает передачу данных короткими пакетами по необходимости, затем – выключение передатчика. Низкое энергопотребление частично достигается применением именно этого принципа. Вместо классического тандема в обычном Bluetooth, устройства BLE связываются друг с другом лишь при необходимости отправки или получения информации.

Протокол BLE строго структурирован по принципу своей коммуникации с другими устройствами. Вначале девайсы изучают доступные сервисы для отправки/принятия данных; неотъемлемая часть этих сервисов – их характеристики (characteristics), определяющие тип данных для будущей передачи. Характеристики, из соображений наглядности, могут иметь в своём составе описания-дескрипторы (descriptors), которые помогают определить тип данных. К примеру, разберём сервис под названием «Heart Rate Monitor» (монитор частоты сердцебиения) – среди его характеристик присутствуют такие, как «измерение пульса».

Большинство API для Bluetooth LE позволяют искать локальные устройства и определять доступные в них сервисы, характеристики и дескрипторы.

Термины и концепции протокола BLE

Предлагаю вашему вниманию краткий обзор ключевых терминов протокола BLE и его концепций. До начала работы над проектом BLE нужно понимать каждый из них.

Профиль общих атрибутов (GATT)

Профиль общих атрибутов (General Attribute Protocol, GATT) – это обязательный профиль с общими спецификациями отправки и приёма коротких порций данных, известных в Bluetooth Low Link под названием «атрибуты». Все нынешние профили приложений LE основаны на GATT. Институт стандартизации и разработки протокола – Bluetooth Special Interest Group уже задал для устройств BLE несколько профилей. Эти профили представляют собой спецификации, описывающие способ применения и взаимодействия с устройствами.

Протокол атрибутов (ATT)

Протокол атрибутов (он же Attribute Protocol, ATT) – основывается на GATT. ATT – оптимизированный протокол, созданный исключительно для устройств BLE. Принцип ATT – отсылать столь малое количество байтов, насколько это возможно. У каждого атрибута есть уникальный универсальный идентификатор, UUID. Он представляет собой стандартизированный 128-битный строковый ID, используемый для идентификации уникальной информации. Формат атрибутов, передаваемых как ATT, бывает двух типов: характеристики и сервисы:

Характеристика (Characteristic)

Характеристика содержит однозначный параметр, а также дескрипторы. Количество дескрипторов может быть равно нулю, то есть это не обязательная часть характеристики. Дескрипторы описывают значение характеристики.

Дескрипторы (Descriptors)

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

Сервис (Service)

Сервис это совокупность характеристик. Список существующих профилей на основе GATT можно просмотреть здесь.

Работа с GATT в Cordova

Для большей наглядности взаимосвязи этих терминов приведем схему

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

Пока не особо понятно, как мне теперь со всем этим работать. Естетсвенно, порыскав в гугле я начал пробовать все это на практике.

Вот наши сервисы:
Gatt service что это за программа. Смотреть фото Gatt service что это за программа. Смотреть картинку Gatt service что это за программа. Картинка про Gatt service что это за программа. Фото Gatt service что это за программа

А вот наши характеристики:
Gatt service что это за программа. Смотреть фото Gatt service что это за программа. Смотреть картинку Gatt service что это за программа. Картинка про Gatt service что это за программа. Фото Gatt service что это за программа

Однако это все я узнал немного позднее. Сначала я экспериментировал с передачей данных подключаясь к устройствам исходя из описания характеристик.

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

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

Если у Вас есть что добавить, уточнить или указать мне на неточности или ошибки, пишите комментарии. Потому что некоторые углубленные моменты для меня остались непонятны 🙂

В статье были исользованы материалы с хабра и оф сайта Bluetooth

Присоединяйтесь к нашим каналам FrontEndDev и Web Stack и моему личному блогу Sleepless Tech в Telegram, чтобы не пропустить самое интересное из мира Web!

Источник

Клиент Bluetooth GATT

В этой статье описывается использование API-интерфейсов клиента Bluetooth Generic Attribute (GATT) для приложений универсальной платформы Windows (UWP) и приводится пример кода для основных задач клиента GATT.

В Package. appxmanifestнеобходимо объявить возможность «Bluetooth».

Общие сведения

С помощью API-интерфейсов в пространстве имен Windows.Devices.Bluetooth.GenericAttributeProfile разработчики получают доступ к устройствам Bluetooth с низким энергопотреблением. Функции устройств Bluetooth с низким энергопотреблением обеспечиваются коллекцией следующих элементов:

Службы определяют функциональный контракт устройства с низким энергопотреблением и содержат набор характеристик, определяющих службу. Характеристики в свою очередь содержат описывающие их дескрипторы. Эти 3 элемента, как правило, называют атрибутами устройства.

API-интерфейсы Bluetooth GATT для устройств с низким энергопотреблением предоставляют доступ к объектам и функциям, а не собственно к механизмам передачи. Кроме того, API-интерфейсы Bluetooth GATT позволяют разработчикам работать с устройствами Bluetooth с низким энергопотреблением и выполнять следующие задачи:

Для эффективной реализации разработчик должен иметь представление о службах и характеристиках GATT, которые будет обрабатывать приложение. Он должен уметь преобразовывать значения отдельных характеристик, например двоичных данных, предоставляемых API-интерфейсами, в полезные данные, отображаемые для пользователей. API Bluetooth GATT предоставляют только основные примитивы, необходимые для взаимодействия с устройством Bluetooth с низким энергопотреблением. Для интерпретации данных необходимо определить профиль приложения. Для этого используется либо стандартный профиль Bluetooth SIG, либо настраиваемый профиль, реализованный поставщиком устройства. Профиль создает контракт привязки между приложением и устройством в отношении содержимого передаваемых данных и их интерпретации.

Для удобства Bluetooth SIG ведет список доступных общих профилей.

Примеры

Отправка запросов для ближайших устройств

Существует два основных метода отправки запросов для ближайших устройств:

Второй метод подробно рассматривается в документации по классу Advertisement, поэтому здесь упоминается только основной принцип — поиск адресов ближайших устройств Bluetooth, соответствующих критериям конкретного фильтра объявления. Когда адрес найден, можно вызвать BluetoothLEDevice.FromBluetoothAddressAsync для получения ссылки на устройство.

Вернемся к методу DeviceWatcher. Устройство Bluetooth с низким энергопотреблением ничем не отличается от любых других устройств в Windows. Запрос к этому устройству можно отправить с помощью API-интерфейсов перечисления. Используйте класс DeviceWatcher, чтобы передать строку запроса с указанием искомых устройств:

После запуска DeviceWatcher вы получите DeviceInformation для каждого устройства, соответствующего критериям запроса, в обработчике события Added для соответствующих устройств. Чтобы получить более полное представление о методе DeviceWatcher, см. полный пример кода на Github.

Подключение к устройству

После обнаружения нужного устройства используйте DeviceInformation.Id, чтобы получить объект BluetoothLEDevice для соответствующего устройства:

С другой стороны, при удалении всех ссылок на объект BluetoothLEDevice инициируется автоматическое отключение от устройства после короткого периода ожидания (если на это устройство не ссылаются другие приложения в системе).

Если приложению снова потребуется доступ к устройству, создайте объект устройства заново и предоставьте доступ к характеристике (см. следующий раздел). После этого операционная система будет инициировать повторное подключение по требованию. Если устройство находится поблизости, вы получите доступ к нему. В противном случае будет получен ответ с ошибкой DeviceUnreachable.

Создание объекта блуетуследевице путем вызова только этого метода не (обязательно) инициирует соединение. Чтобы инициировать подключение, задайте гаттсессион. маинтаинконнектион для или вызовите некэшированный метод обнаружения службы для блуетуследевицеили выполните операцию чтения и записи на устройстве.

В настоящее время невозможно отменить процесс подключения.

Перечисление поддерживаемых служб и характеристик

Теперь, когда у вас есть объект BluetoothLEDevice, можно перейти к следующему шагу — обнаружению данных, предоставляемых устройством. Сначала необходимо запросить службы:

После определения нужных служб необходимо запросить характеристики.

Операционная система возвращает список ReadOnly, где перечислены объекты GattCharacteristic, с которыми можно выполнять операции.

Выполнение операций чтения и записи с характеристикой

Характеристика — неотъемлемая часть обмена данными с использованием GATT. Она содержит значение, представляющее уникальный фрагмент данных на устройстве. Например, характеристика Battery Level содержит значение, представляющее уровень заряда аккумулятора устройства.

Изучите свойства характеристики, чтобы определить поддерживаемые операции:

Если поддерживается чтение, можно прочитать значение:

Запись в характеристику выполняется по аналогичному шаблону:

совет. datareaderи незаменимым используются при работе с необработанными буферами, полученными из многих api-интерфейсов Bluetooth.

Подписка на уведомления

Проверьте свойства характеристики и убедитесь, что характеристика поддерживает операцию Indicate или Notify.

Примечание. Операция Indicate считается более надежной, поскольку каждое событие изменения значения подтверждается клиентским устройством. Операция Notify используется чаще, так как большинство транзакций GATT обеспечивает экономию энергии, а не высочайший уровень надежности. Так или иначе, все эти операции обрабатываются на уровне контроллера без участия приложения. В дальнейшем для этих операций будет использоваться собирательный термин «уведомления».

Перед получением уведомлений необходимо обеспечить выполнение двух условий:

Запись в CCCD сообщает серверу, что данный клиент должен получать оповещение каждый раз, когда меняется значение определенной характеристики. Для этого выполните следующие действия.

Теперь событие ValueChanged для GattCharacteristic будет вызываться при каждом изменении значения на удаленном устройстве. Осталось только реализовать обработчик:

Источник

Сервер Bluetooth GATT

В этой статье описываются API-интерфейсы сервера Bluetooth Generic Attribute (GATT) для приложений универсальной платформы Windows (UWP) и приводится пример кода для основных задач сервера GATT.

В Package. appxmanifestнеобходимо объявить возможность «Bluetooth».

Важные API

Общие сведения

Как правило, Windows функционирует в роли клиента. Однако существует множество сценариев, когда операционная система Windows должна выполнять функции сервера Bluetooth GATT с низким энергопотреблением. Сюда относятся почти все сценарии для устройств интернета вещей, а также большинство сценариев обмена данными с использованием BLE. Все эти сценарии требуют, чтобы операционная система Windows функционировала как сервер GATT. Кроме того, эта технология обязательна для такого популярного сценария, как отправка уведомлений на ближайшие носимые устройства.

Операции сервера связаны с классами Service Provider и GattLocalCharacteristic. Эти два класса предоставляют функции, необходимые для объявления, реализации и предоставления иерархии данных на удаленном устройстве.

Определение поддерживаемых служб

Приложение может объявить одну или несколько служб, которые будут опубликованы в Windows. Каждая служба имеет уникальный идентификатор UUID.

Атрибуты и идентификаторы UUID

Каждая служба, характеристика и дескриптор имеет свой уникальный 128-битный идентификатор UUID.

Ко всем API-интерфейсам Windows применяется термин GUID, но в стандарте Bluetooth этот идентификатор определяется как UUID. В нашем случае эти два термина взаимозаменяемы, поэтому мы будем использовать термин UUID.

если атрибут является стандартным и определяется Bluetooth определяемым SIG, он также будет иметь соответствующий 16-разрядный короткий идентификатор (например, UUID уровня аккумулятора — 00002A19-0000-1000-8000-00805F9B34FB, а короткий идентификатор — 0x2A19). Эти стандартные идентификаторы UUID описаны в статьях GattServiceUuids и GattCharacteristicUuids.

Если ваше приложение реализует собственную службу, необходимо создать пользовательский UUID. это легко сделать в Visual Studio с помощью tools- > креатегуид (используйте вариант 5, чтобы получить его в формате «xxxxxxxx-xxxx-. XXXX «формат». Этот UUID можно использовать для объявления новых локальных служб, характеристик или дескрипторов.

Службы с ограниченным доступом

Перечисленные ниже службы зарезервированы системой и в настоящее время недоступны для публикации:

При попытке создать заблокированную службу вызов к CreateAsync вернет ошибку BluetoothError.DisabledByPolicy.

Генерируемые атрибуты

Перечисленные ниже дескрипторы автоматически генерируются системой в соответствии с классом GattLocalCharacteristicParameters, предоставленным в процессе создания характеристики:

Значение дескриптора Extended Properties определяется свойствами характеристики ReliableWrites и WritableAuxiliaries.

Попытка создать зарезервированный дескриптор вызывает исключение.

Примечание: широковещательная рассылка в настоящее время не поддерживается. Если задать свойство Broadcast GattCharacteristicProperty, будет создано исключение.

Создание иерархии служб и характеристик

Для создания и объявления определения основной корневой службы используется класс GattServiceProvider. Каждой службе требуется собственный объект ServiceProvider, в который передается GUID:

Основные службы находятся на верхнем уровне дерева GATT. Основные службы содержат характеристики и другие службы («включенные» или дополнительные).

Задайте обязательные характеристики и дескрипторы для службы:

Здесь также удобно объявлять обработчики событий для операций, поддерживаемых каждой характеристикой (см. рис. выше). Чтобы приложение правильно реагировало на запросы, необходимо определить и настроить обработчик событий для каждого типа запроса, поддерживаемого атрибутом. Если обработчик не зарегистрирован, система мгновенно выполняет запрос с ошибкой UnlikelyError.

Постоянные характеристики

Некоторые значения характеристик не меняются в течение всего жизненного цикла приложения. В этом случае рекомендуется объявить постоянную характеристику во избежание нежелательной активации приложения:

Публикация службы

После определения всех атрибутов службы необходимо опубликовать поддержку для этой службы. Публикация информирует операционную систему о том, что эта служба должна возвращаться, когда удаленные устройства выполняют поиск служб. Необходимо настроить два свойства: IsDiscoverable и IsConnectable.

Когда для службы заданы оба свойства, Discoverable и Connectable, система добавляет UUID этой службы в пакет объявления. Размер пакета объявления составляет всего 31 байт, и 16 из них занимает 128-битный UUID.

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

Реагирование на запросы чтения и записи

Как упоминалось в разделе об объявлении требуемых характеристик, атрибут GattLocalCharacteristics поддерживает 3 типа событий: ReadRequested, WriteRequested и SubscribedClientsChanged.

Чтение

Когда удаленное устройство пытается прочитать значение характеристики и это значение не является постоянным, вызывается событие ReadRequested. Характеристика, для которой была вызвана операция чтения, а также аргументы, содержащие сведения об удаленном устройстве, передаются делегату:

запись

Когда удаленное устройство пытается записать значение в характеристику, вызывается событие WriteRequested с подробными сведениями об удаленном устройстве, соответствующей характеристике и самом значении:

Существует 2 типа операций записи: с ответом и без ответа. Чтобы определить, какую операцию записи выполняет удаленное устройство, используйте свойство GattWriteOption в объекте GattWriteRequest.

Отправка уведомлений подписанным клиентам

Отправка уведомлений — наиболее часто выполняемая операция сервера GATT. Уведомления выполняют важную функцию публикации данных на удаленных устройствах. В зависимости от конкретной ситуации можно отправлять уведомления всем подписанным клиентам или самостоятельно выбирать устройства для отправки нового значения:

Когда новое устройство подписывается на уведомления, вызывается событие SubscribedClientsChanged:

Примечание: приложение может определять максимальный размер уведомления для конкретных клиентов с помощью свойства MaxNotificationSize. Система применяет усечение к любым данным, размер которых превышает максимальное значение.

Источник

Чтение GATT-характеристик Bluetooth устройства

Работая над своей ANE библиотекой для работы с Bluetooth LE в AIR приложении для iOS+OSX, обнаружил что помимо ваших собственных сервисов и характеристик для обмена информацией, у bluetooth-устройств есть стандартные. Статья о том, как считывать информацию с этих характеристик. Скажу сразу я не большой знаток bluetooth и всего что с ним связано, и для меня все это в новинку 🙂 Поехали…

Сервисы и характеристики OSX устройства

Сервис Continuity

Сервис Continuity служит для передачи данных между связанными Apple устройствами, подробнее здесь: www.apple.com/ru/ios/whats-new/continuity. Если будет время разобраться в формате передаваемых данных — напишу об этом отдельный пост.

Сервис 180A (Device Information)

В моем случае я получил значения:

С этими характеристиками было все просто, идем дальше.

Сервисы и характеристики iOS устройства

Сервис 7905F431-B5CE-4E99-A40F-4B1E122D00D0, это сервис центра уведомлений Apple, подробнее здесь: developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/Specification/Specification.html. Будет время, попробую разобраться в формате данных и напишу отдельный пост по работе с bluetooth-сервисами устройств Apple.

Сервис 180F (Battery Service)

Сервис 180F — это информация о заряде батареи. Этот сервис имеет одну единственную характеристику 2A19, в описании которой сказано что характеристика имеет одно единственное поле формата uint8:
Gatt service что это за программа. Смотреть фото Gatt service что это за программа. Смотреть картинку Gatt service что это за программа. Картинка про Gatt service что это за программа. Фото Gatt service что это за программа
Прочитать эту информацию в AIR приложении можно так:

Получим значение от 0 до 100, соответствующее уровню заряда батареи устройства.

Сервис 1805 (Current Time Service)

Характеристика 2A0F (Local Time Information)

Характеристика 2A0F имеет два поля:
Gatt service что это за программа. Смотреть фото Gatt service что это за программа. Смотреть картинку Gatt service что это за программа. Картинка про Gatt service что это за программа. Фото Gatt service что это за программа

Открываем описание первого поля Time Zone и видим что оно содержит в себе одно поле формата sint8.

Второе поле у сервиса 2A0F это Daylight Saving Time — информация о переходе на летнее время, формат: uint8.

Итак, чтобы прочитать характеристику 2A0F в AIR приложении используем следующий код:

В моем случае я получил значения:

Значение 12 в поле TimeZone соответствует временной зоне UTC+3:00, согласно XML файлу:

cкачать который можно в описании поля Time Zone нажав кнопку Download / View напротив имени поля.

Характеристика 2A2B (Current Time)

Характеристика 2A2B представляет текущее время на устройстве, и она имеет многоуровневую вложенность полей, ознакомиться с описаниями и форматами которых вы можете самостоятельно. Я приведу только код, для считывания полной информации о текущем времени устройства:

Здесь есть несколько важных моментов.
Первое: в примечаниях всех GATT спецификаций сказано:

Это значит что в ByteArray первым идет младший байт, в AIR это можно указать с помощью свойства endian:

Второе: поле fraction, как следует из описания — это 1/256я секунды, т.е. чтобы получить миллисекунды пишем код:

И третье: я так и не разобрался что такое Adjust Reason. Кто знает — поделитесь информацией :).

Источник

Bluetooth Low Energy

Принцип работы BLE описан уже в его названии: Low Energy. Протокол подразумевает передачу данных короткими пакетами по необходимости, затем – выключение передатчика. Низкое энергопотребление частично достигается применением именно этого принципа. Вместо классического тандема в обычном Bluetooth, устройства BLE связываются друг с другом лишь при необходимости отправки или получения информации.

Протокол BLE строго структурирован по принципу своей коммуникации с другими устройствами. Вначале девайсы изучают доступные сервисы для отправки/принятия данных; неотъемлемая часть этих сервисов – их характеристики (characteristics), определяющие тип данных для будущей передачи. Характеристики, из соображений наглядности, могут иметь в своём составе описания-дескрипторы (descriptors), которые помогают определить тип данных. К примеру, разберём сервис под названием «Heart Rate Monitor» (монитор частоты сердцебиения) – среди его характеристик присутствуют такие, как «измерение пульса».

Большинство API для Bluetooth LE позволяют искать локальные устройства и определять доступные в них сервисы, характеристики и дескрипторы.

Далее перевод статьи Bluetooth Low Energy | Android Developers подготовил Антон Акимов.

ОС Android 4.3 (API 18) представляет встроенную поддержку Bluetooth Low Energy и API, при помощи которого приложения могут использовать поиск устройств, запрос услуг и чтение/запись характеристик. В отличие от классического Bluetooth, BLE призван обеспечить существенно меньшее энергопотребление. Это позволяет приложениям для Android общаться с BLE-устройствами, которые имеют низкие требования к питанию, таких как датчики, мониторы сердечного ритма, фитнес-устройства и так далее.

Ключевые термины и понятия

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

Attribute Protocol (ATT) – GATT строится на основе протокола атрибутов АТТ. Это также относится к GATT/ATT. АТТ оптимизирован для работы на BLE-устройствах. Для этого он использует настолько мало байтов, насколько возможно. Каждый атрибут идентифицируется уникальным универсальным идентификатором (UUID), который представляет собой стандартизированный 128-битный строковый идентификатор используемый для однозначной идентификации информации. Атрибуты переносятся с помощью АТТ в виде характеристик и услуг.

Характеристика (Characteristic) – содержит одно значение, и от 0 до N дескрипторов, описывающих значение характеристики. Характеристика может рассматриваться как тип, аналог класса.

Дескриптор (Descriptor) может содержать удобочитаемое описание, приемлемый диапазон значений или единицу измерения, конкретные значения характеристики.

Услуга (Service) – это набор характеристик. Например, вы можете иметь услугу под названием «пульсометр», что включает в себя такую характеристику, как «Измерение пульса». Вы можете найти список существующих на основе GATT профилей и услуг на bluetooth.org.

Роли и обязанности при взаимодействии Android с BLE-устройством

Центральная/периферическая роль. Это относится к самому BLE-соединению. Устройство в центральной роли сканирует, ищет объявления, а устройства в периферийной роли создаёт объявления.

GATT-сервер/GATT-клиент. Это определяет, каким образом два устройства общаются друг с другом, когда они установили связь.

Чтобы понять разницу, представьте, что у вас Android-телефон и фитнес-трекер, который представляет собой BLE-устройство. Телефон поддерживает центральную роль; трекер активности поддерживает периферийную роль. Чтобы установить BLE-соединение, вам нужно по одному устройству, поддерживающему каждую из ролей; два периферийных устройства не смогут общаться друг с другом, также как и два центральных.

Как только телефон и трекер активности наладили связь, они начинают передачу метаданных GATT друг другу. В зависимости от того, какие данные они передают, тот или другой может выступать в качестве сервера. Например, если трекер хочет сообщить данные датчика телефону, трекеру имеет смысл работать в качестве сервера. Если трекер активности хочет получать обновления с телефона, то в качестве сервера имеет смысл использовать телефон.

В качестве примера в данном документе представлено Android-приложение, являющееся GATT-клиентом. Приложение получает данные от GATT-сервера на BLE-пульсометре. Но вы можете также спроектировать ваше приложение так, чтобы оно играло роль сервера.

BluetoothAdapter является обязательным для любых действий с Bluetooth. BluetoothAdapter представляет собственный Bluetooth-адаптер устройства (Bluetooth-приёмник). Есть один Bluetooth-адаптер для всей системы, и ваше приложение может взаимодействовать с ним, используя этот объект.

Подключение к GATT-серверу

Первым шагом во взаимодействии с BLE-устройством станет подключение к нему – точнее, подключение к GATT-серверу на устройстве. Для подключения к GATT-серверу на BLE-устройстве нужно использовать метод connectGatt(). Этот метод принимает три параметра: объект контекста, автосоединение (логическое значение, указывающее, следует ли автоматически подключиться к BLE-устройству, как только оно станет доступным), и ссылку на BluetoothGattCallback:

Оно подключается к GATT-серверу, находящемуся на BLE-устройстве, и возвращает экземпляр BluetoothGatt, который затем можно использовать для проведения клиентских операций GATT. Приложение для Android является GATT-клиентом. BluetoothGattCallback используется для получения результатов клиентом, таких как статус подключения, а также любые дополнительные клиентские операции GATT.

В этом примере BLE-приложение предоставляет активности (DeviceControlActivity) отображение данных о подключении, GATT-услугах и характеристиках, поддерживаемых устройством. На основе ввода пользователя, эта активность связывается со службой под названием BluetoothLeService, который взаимодействует с BLE-устройством через Android BLE API-интерфейс:

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

Ещё в DeviceControlActivity, эти события обрабатываются в BroadcastReceiver:

Чтение BLE-атрибутов

Как только ваше Android-приложение подключается к GATT-серверу и обнаруживает услуги, оно может читать и писать атрибуты, где это поддерживается. Например, этот фрагмент перебирает услуги и характеристик сервера и отображает их в интерфейсе:

Получение GATT-уведомлений

Это общие для BLE-приложений запросы для получения уведомлений об изменении отдельных характеристик на устройстве. Этот фрагмент показывает, как настроить уведомление для какой-либо характеристики с помощью метода setCharacteristicNotification():

Закрытие клиента приложения

Когда приложение завершено с помощью BLE-устройства, оно должно вызывать close(), чтобы система могла должным образом освобождать ресурсы:

BluetoothManager

Менеджер высокого уровня, используемый для получения экземпляра BluetoothAdapter и общего управления Bluetooth. Используйте getSystemService(java.lang.String) с BLUETOOTH_SERVICE чтобы создать BluetoothManager; после этого вызывайте getAdapter() для получения экземпляра BluetoothAdapter. Кроме того, можно просто вызвать BluetoothAdapter.getDefaultAdapter().

BluetoothAdapter getAdapter() [Добавлено в API 18] Получить стандартный Bluetooth-адаптер данного устройства. Возвращает: Стандартный Bluetooth-адаптер данного устройства. List getConnectedDevices (int profile) [Добавлено в API 18] Получить подключённые устройства указанного профиля. Возвращает набор устройств, которые находятся в состоянии STATE_CONNECTED. Это не относится к любой конфигурации приложения, но отображает состояние Bluetooth-подключения данного профиля. Это может использоваться в приложениях как строка состояния, которая просто хотела бы знать состояние Bluetooth. Требуется разрешение BLUETOOTH. Параметры: GATT или GATT_SERVER Возвращает: Список устройств. При ошибке список будет пуст. int getConnectionState (BluetoothDevice device, int profile) [Добавлено в API 18] Получить текущее состояние подключения профиля к удаленному устройству. Это не относится к любой конфигурации приложения, но отображает состояние Bluetooth-подключения данного профиля. Это может использоваться в приложениях как строка состояния, которая просто хотела бы знать состояние Bluetooth. Требуется разрешение BLUETOOTH. Параметры: Удалённое Bluetooth-устройство; GATT или GATT_SERVER. Возвращает: Состояние соединения профиля, одно из: STATE_CONNECTED, STATE_CONNECTING, STATE_DISCONNECTED, STATE_DISCONNECTING. List getDevicesMatchingConnectionStates (int profile, int[] states) [Добавлено в API 18] Получить список устройств, которые соответствуют любому из указанных состояний соединения. Если ни одно из устройств не соответствует ни одному из указанных состояний, будет возвращён пустой список. Это не относится к любой конфигурации приложения, но представляет состояние подключения локального адаптера Bluetooth для этого профиля. Это может использоваться в приложениях, как в строке состояния, который просто хотел бы знать состояние локального адаптера. Требуется разрешение BLUETOOTH. Параметры: GATT или GATT_SERVER; массив состояний: STATE_CONNECTED, STATE_CONNECTING, STATE_DISCONNECTED или STATE_DISCONNECTING. Возвращает: Список устройств. При ошибке список будет пуст. BluetoothGattServer openGattServer (Context context, BluetoothGattServerCallback callback) [Добавлено в API 18] Открывает GATT-сервер. Обратный вызов используется для получения результатов, такие как состояние подключения, а также результаты любых других серверных операций в рамках GATT. Метод возвращает экземпляр BluetoothGattServer. Вы можете использовать BluetoothGattServer для проведения операций на сервере в рамках GATT. Параметры: Контекст; обработчика обратных вызовов GATT-сервера, который будет получать асинхронные обратные вызовы. Возвращает: Экземпляр GATT-сервера.

BluetoothGatt

Открытый API для Bluetooth-профидля GATT.

Этот класс обеспечивает функциональность Bluetooth GATT для взаимодействия со смарт-устройствами.

Чтобы подключиться к удалённому периферийному устройству, создайте BluetoothGattCallback и вызовите метод connectGatt(Context, boolean, BluetoothGattCallback), чтобы получить экземпляр этого класса. Устройства, поддерживающие GATT, могут быть найдены с помощью обычного обнаружения Bluetooth-устройств или с помощью сканирования BLE.

Константы

int CONNECTION_PRIORITY_BALANCED (приоритет соединения: сбалансированный)
[Добавлено в API 21]
Обновление параметра соединения: использовать параметры подключения, рекомендованные Bluetooth SIG. Это параметр по-умолчанию, если обновление параметров соединения не требуется. Значение константы: 0 (0x00000000)

int CONNECTION_PRIORITY_HIGH (приоритет соединения: высокий)
[Добавлено в API 21]
Обновление параметра соединения: запрос высокого приоритета, низкой задержки подключения. Приложение должно запрашивать высокий приоритет соединения только для передачи больших объемов данных через BLE. Когда передача будет завершена, приложение должно запросить параметр CONNECTION_PRIORITY_BALANCED для снижения энергопотребления. Значение константы: 1 (0x00000001)

int CONNECTION_PRIORITY_LOW_POWER (приоритет соединения: низкая энергия) [Добавлено в API 21]
Обновление параметра соединения: запрос низкой мощности, снижения скорости передачи данных.
Значение константы: 2 (0x00000002)

int GATT_CONNECTION_CONGESTED
[Добавлено в API 21]
Соединение с удалённым устройством перегружено.
Значение константы: 143 (0x0000008f)

int GATT_FAILURE
[Добавлено в API 18]
Операция с GATT не удалась. Произошла неизвестная ошибка, отличная от указанных выше.
Значение константы: 257 (0x00000101)

int GATT_INSUFFICIENT_AUTHENTICATION
[Добавлено в API 18]
Неподходящая аутентификация для данной операции. Значение константы: 5 (0x00000005)

int GATT_INSUFFICIENT_ENCRYPTION
[Добавлено в API 18]
Неподходящее шифрование для данной операции.
Значение константы: 15 (0x0000000f)

int GATT_INVALID_ATTRIBUTE_LENGTH
[Добавлено в API 18]
Операция записи превышает максимальную длину атрибута.
Значение константы: 13 (0x0000000d)

int GATT_INVALID_OFFSET
[Добавлено в API 18]
Для операции чтения или записи было запрошено недопустимое смещение.
Значение константы: 7 (0x00000007)

int GATT_READ_NOT_PERMITTED
[Добавлено в API 18]
Операция чтения не разрешена.
Значение константы: 2 (0x00000002)

int GATT_REQUEST_NOT_SUPPORTED
[Добавлено в API 18]
Данный запрос не поддерживается.
Значение константы: 6 (0x00000006)

int GATT_SUCCESS
[Добавлено в API 18]
Операция успешно выполнена.
Значение константы: 0 (0x00000000)

int GATT_WRITE_NOT_PERMITTED
[Добавлено в API 18]
Операция записи не разрешена.
Значение константы: 3 (0x00000003)

Общедоступные методы

void abortReliableWrite (BluetoothDevice mDevice) [Добавлено в API 18] Внимание: Этот метод является устаревшим для API уровня 19. Используйте метод abortReliableWrite().

void abortReliableWrite () [Добавлено в API 19] Отменяет надежную транзакцию записи для данного устройства. Вызов этой функции приведет к отклонению всех находящихся в очереди операций записи характеристик для данного удалённого устройства. Требуется разрешение BLUETOOTH.

boolean beginReliableWrite () [Добавлено в API 18] Инициирует надежную транзакцию записи для данного удалённого устройства. После того, как надёжная транзакция записи была начата, все вызовы writeCharacteristic(BluetoothGattCharacteristic) отправляются на удалённое устройство для проверки и выстраиваются в очередь на исполнение. Приложение получает результат в обратном вызове onCharacteristicWrite(BluetoothGatt, BluetoothGattCharacteristic, int) в ответ на каждый вызов writeCharacteristic(BluetoothGattCharacteristic). В этом обратном вызове производится проверка, было ли значение передано точно. После того, как все характеристики в очереди были проверены, executeReliableWrite() выполнит их запись. Если характеристика была записана неправильно, вызов abortReliableWrite() отменит текущую транзакцию без изменения каких-либо значений на удалённом устройстве. Требуется разрешение BLUETOOTH. Возвращает: true, если надёжная транзакция записи была начата.

void close () [Добавлено в API 18] Закрыть Bluetooth GATT-клиент. Приложение должно вызвать этот метод как можно раньше после того, как это делается с текущим GATT-клиентом.

boolean connect () [Добавлено в API 18] Этот метод используется, чтобы повторно подключиться к удалённому устройству после того, как соединение было разорвано. Если устройство не находится в доступном диапазоне, повторное подключение будет произведено, как только устройство окажется доступно. Возвращает: true, если попытка подключения была успешно инициирована.

void disconnect () [Добавлено в API 18] Разрывает установленное соединение или отменяет попытку подключения, происходящую в настоящее время. Требуется разрешение BLUETOOTH.

boolean discoverServices () [Добавлено в API 18] Обнаруживает услуги на удалённом устройстве, а также их характеристики и дескрипторы. Это асинхронная операция. После завершения обнаружения услуг, срабатывает обратный вызов onServicesDiscovered(BluetoothGatt, int). Если обнаружение прошло успешно, удалённые услуги можно получить с помощью функции getServices(). Требуется разрешение BLUETOOTH. Возвращает: true, если обнаружение удалённых услуг было начато.

boolean executeReliableWrite () [Добавлено в API 18] Выполняет надежные транзакции записи для данного удалённого устройства. Эта функция позволяет фиксировать все характеристики, находящиеся в очереди операций записи для указанного удалённого устройства. Обратный вызов onReliableWriteCompleted(BluetoothGatt, int) срабатывает чтобы определить, правильно ли была выполнена операция. Требуется разрешение BLUETOOTH. Возвращает: true, если запрос на выполнение операции был отправлен.

List getConnectedDevices () [Добавлено в API 18] Не поддерживается. Пожалуйста, используйте BluetoothManager.getConnectedDevices(int) с BluetoothProfile.GATT в качестве аргумента. Возвращает: Список устройств. Список будет пустым при ошибке. Исключения: UnsupportedOperationException

int getConnectionState (BluetoothDevice device) [Добавлено в API 18] Не поддерживается. Пожалуйста, используйте BluetoothManager.getConnectionState (BluetoothDevice device, int profile). Параметры: Удалённое Bluetooth-устройство Возвращает: Состояние соединеня; одно из: STATE_CONNECTED, STATE_CONNECTING, STATE_DISCONNECTED, STATE_DISCONNECTING Исключения: UnsupportedOperationException

BluetoothDevice getDevice () [Добавлено в API 18] Возвращает удалённое устройство целевого GATT-склиента.

List getDevicesMatchingConnectionStates (int[] states) [Добавлено в API 18] Не поддерживается. Пожалуйста, используйте BluetoothManager.getDevicesMatchingConnectionStates (int profile, int[] states) с BluetoothProfile.GATT в качестве первого аргумента. Параметры: Массив состояний; одно из: STATE_CONNECTED, STATE_CONNECTING, STATE_DISCONNECTED, STATE_DISCONNECTING. Возвращает: Список устройств. Список будет пустым при ошибке. Исключения: UnsupportedOperationException

BluetoothGattService getService (UUID uuid) [Добавлено в API 18] Возвращает BluetoothGattService, если запрашиваемый идентификатор uuid поддерживается на удалённом устройстве. Эта функция требует, чтобы обнаружение услуг было выполнено для данного устройства. Если существует несколько экземпляров одной услуги (с таким же UUID), возвращается первый экземпляр службы. Требуется разрешение BLUETOOTH. Параметры: UUID запрашиваемой услуги. Возвращает: BluetoothGattService, если поддерживается, или NULL, если запрашиваемая услуга не предоставляется удаленным устройством.

List getServices () [Добавлено в API 18] Возвращает список GATT-услуг, предлагаемых удаленным устройством. Эта функция требует, чтобы обнаружение услуг было выполнено для данного устройства. Требуется разрешение BLUETOOTH. Возвращает: Список услуг удалённого устройства. Пустой список, если обнаружение услуг ещё не было выполнено.

boolean readCharacteristic (BluetoothGattCharacteristic characteristic) [Добавлено в API 18] Запрос на чтение характеристики с удалённого устройства. Это асинхронная операция. Результат операции чтения получает обратный вызов onCharacteristicRead(BluetoothGatt, BluetoothGattCharacteristic, int). Требуется разрешение BLUETOOTH. Параметры: Характеристика для чтения с удалённого устройства. Возвращает: true, если операция чтения была начата успешно.

boolean readDescriptor (BluetoothGattDescriptor descriptor) [Добавлено в API 18] Считывает значение дескриптора удалённого устройства. Как только операция чтения завершена, срабатывает обратный вызов onDescriptorRead(BluetoothGatt, BluetoothGattDescriptor, int), сигнализируя о результате операции. Требуется разрешение BLUETOOTH. Параметры: Дескриптор для чтения с удалённого устройства. Возвращает: true, если операция чтения была начата успешно.

boolean readRemoteRssi () [Добавлено в API 18] Считать RSSI подключённого удалённого устройства. (RSSI – это показатель уровня принимаемого сигнала). Обратный вызов onReadRemoteRssi(BluetoothGatt, int, int) срабатывает, когда значение RSSI было прочитано. Требуется разрешение BLUETOOTH. Возвращает: true, если операция чтения была начата успешно.

boolean requestConnectionPriority (int connectionPriority) [Добавлено в API 21] Запросить обновление параметра соединения. Эта функция отправит запрос на обновление параметра подключения к удалённому устройству. Параметры: Запрашиваемый статус соединения, один из: CONNECTION_PRIORITY_BALANCED, CONNECTION_PRIORITY_HIGH, CONNECTION_PRIORITY_LOW_POWER. Исключения: IllegalArgumentException, если параметры находятся за пределами указанного диапазона.

boolean requestMtu (int mtu) [Добавлено в API 21] Запросить размер MTU, используемого для данного подключения. (MTU – это размер одного неделимого блока данных, передаваемого в текущей сети за одну итерацию). При выполнении запроса на запись (запись без ответа), отправленные данные будут усечены до размера MTU. Эта функция может использоваться, чтобы запросить больший размер MTU, чтобы иметь возможность отправлять больше данных одновременно. Обратный вызов onMtuChanged(BluetoothGatt, int, int) будет указывать, прошла ли эта операция успешно. Требуется разрешение BLUETOOTH. Возвращает: true, если новое значение MTU было запрошено успешно.

boolean setCharacteristicNotification (BluetoothGattCharacteristic characteristic, boolean enable) [Добавлено в API 18] Включить или отключить уведомления/индикацию для данной характеристики. После включения уведомлений для характеристики, обратный вызов onCharacteristicChanged(BluetoothGatt, BluetoothGattCharacteristic) будет срабатывать, если удалённое устройство сообщит, что характеристика изменилась. Требуется разрешение BLUETOOTH. Параметры: Характеристика, для которой необходимо включить уведомления; true, если нужно включить уведомления. Возвращает: true, если запрашиваемое уведомление о был установлен успешно.

boolean writeCharacteristic (BluetoothGattCharacteristic characteristic) [Добавлено в API 18] Записывает указанную характеристику и её значение на удалённое связанное устройство. После того, как операция записи будет завершена, сработает обратный вызов onCharacteristicWrite(BluetoothGatt, BluetoothGattCharacteristic, int) с результатом операции. Требуется разрешение BLUETOOTH. Параметры: Характеристика для записи на удалённом устройстве. Возвращает: true, если операция записи была начата успешно.

boolean writeDescriptor (BluetoothGattDescriptor descriptor) [Добавлено в API 18] Записывает значение дескриптора на соединённое устройство. Обратный вызов onDescriptorWrite(BluetoothGatt, BluetoothGattDescriptor, int) срабатывает чтобы сообщить о результате операции. Требуется разрешение BLUETOOTH. Параметры: Дескрипотр для записи на удалённом устройстве. Возвращает: true, если операция записи была начата успешно.

BluetoothGattCallback

void onCharacteristicChanged (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) [Добавлено в API 18] Обратный вызов инициируется в результате получения уведомления от удалённой характеристики. Параметры: GATT-клиент; характеристика, обновлённая в результате удалённого уведомления.

void onCharacteristicRead (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) [Добавлено в API 18] Обратный вызов, сообщающий результат чтения удалённой характеристики. Параметры: GATT-клиент, вызвавший readCharacteristic; характеристика, чьё значение было прочитано; статус: GATT_SUCCESS, если операция чтения была успено завершена.

void onCharacteristicWrite (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) [Добавлено в API 18] Обратный вызов с указанием результата операции записи характеристики. Если этот обратный вызов срабатывает в то время, как надёжная транзакция записи находится в процессе, то значение характеристики представляет собой значение, указанное удалённым устройством. Прикладная программа должна сравнить эту величину с требуемым значением для записи. Если значения не совпадают, то приложение должно прервать транзакцию надежной записи. Параметры: GATT-клиент, вызвавший writeCharacheristic; записываемая характеристика; статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onConnectionStateChange (BluetoothGatt gatt, int status, int newState) [Добавлено в API 18] Обратный вызов, срабатывающий при подключении к удалённому GATT-серверу или отключении от него. Параметры: GATT-клиент, вызвавший подключение/отключение; статус: GATT_SUCCESS, если операция подключения/отключения прошла успешно; новое состояние соединения: STATE_CONNECTED или STATE_DICONNECTED.

void onDescriptorRead (BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) [Добавлено в API 18] Обратный вызов, сообщающий о результате операции прочтения дескриптора. Параметры: GATT-клиент, вызвавший readDescriptor; дескриптор, прочитанный на удалённом устройстве; статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onDescriptorWrite (BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) [Добавлено в API 18] Обратный вызов, сообщающий о результате операции записи дескриптора.

Параметры: GATT-клиент, вызвавший readDescriptor; дескриптор, прочитанный на удалённом устройстве; статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onMtuChanged (BluetoothGatt gatt, int mtu, int status) [Добавлено в API 21] Обратный вызов, сообщающий об изменении MTU для данного соединения. Этот обратный вызов срабатывает в ответ на функцию requestMtu(int) или в ответ на событие соединения. Параметры: GATT-клиент, вызвавший requestMtu; новый размер MTU; статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onReadRemoteRssi (BluetoothGatt gatt, int rssi, int status) [Добавлено в API 18] Обратный вызов, сообщающий RSSI для данного соединения. Этот обратный вызов срабатывает при вызове readRemoteRssi(). Параметры: GATT-клиент, вызвавший readRemoteRssi(); значение RSSI удалённого устройства; статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onReliableWriteCompleted (BluetoothGatt gatt, int status) [Добавлено в API 18] Обратный вызов, срабатывающий при завершении транзакции надёжной записи. Параметры: GATT-клиент, вызвавший executeReliableWrite(); статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onServicesDiscovered (BluetoothGatt gatt, int status) [Добавлено в API 18] Обратный вызов, срабатывающий когда список удалённых услуг, характеристик и дескрипторов удалённого устройства был обновлён, т.е. были обнаружены новые услуги. Параметры: GATT-клиент, вызвавший discoverServices(); статус: GATT_SUCCESS, если операция записи была проведена успешно.

Источник

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *