GATT это акроним для профиля устройства BLE (Generic Attribute Profile). В нем определяется способ, с помощью которого устройства BLE передают данные туда и обратно, используя концепции служб и характеристик (Services и Characteristics). В обмене применен простой протокол данных, который называется Attribute Protocol (ATT), который используется для сохранения Services, Characteristics и связанных с этим данных в простой справочной таблице, где для каждой записи имеются 16-битные ID [1].
Примечание: здесь приведен перевод статьи [1]. Все непонятные термины и сокращения см. в Словарике [3].
Технология Bluetooth Low Energy (BLE), которую иногда называют "Bluetooth Smart" (умный Bluetooth), это облегченное подмножество классического протокола Bluetooth. BLE была представлена как часть основной спецификации Bluetooth 4.0. Несмотря на некоторое пересечение со стандартом классического Bluetooth, BLE в сущности другое направление в разработке беспроводного протокола, с акцентом на минимизацию потребления энергии (что очень важно для устройств с питанием от батарей). Начало было положено фирмой Nokia как домашний проект Wibree перед тем, как эта разработка была адаптирована Bluetooth SIG [4].
Существует множество протоколов для инженеров и разработчиков беспроводных устройств. Однако именно BLE делает наиболее интересным тот факт, что это почти наверняка самый простой способ организации связи с любой современной мобильной платформой (iOS, Android, телефоны на основе Windows, и т. п.). В частности, для устройств Apple это единственный вариант спроектировать устройство без необходимости прохождения бесконечных циклов согласования, чтобы иметь возможность легально продавать Ваши устройства для устройств на базе iOS.
В этом руководстве приведен краткий обзор BLE, с акцентом на то, как организованы данные в протоколе Bluetooth Low Energy, и как устройства оповещают о своем присутствии в беспроводной сети (advertise), чтобы Вы смогли подключиться к ним и начать передавать данные туда и обратно.
[Платформы, поддерживающие BLE]
Поддержка Bluetooth 4.0 и Bluetooth Low Energy (BLE является подмножеством спецификации Bluetooth BT 4.0) доступна на большинстве основных платформ:
iOS5+ (предпочтительнее iOS7+) Android 4.3+ (в 4.4+ исправлено множество багов) Apple OS X 10.6+ Windows 8, Windows 10, Windows Mobile (Windows XP, Windows Vista и Windows 7 поддерживают только Bluetooth 2.1) GNU/Linux Vanilla BlueZ 4.93+
GATT вступает в игру, когда между двумя устройствами BLE уже установлено выделенное соединение, т. е. они уже прошли процесс установки соединения (advertising, анонс), регулируемый профилем доступа GAP [2].
Самое важное, что следует иметь в виду для GATT и его соединений - эти соединения эксклюзивные. Это означает, что в любой момент времени периферийное устройство BLE может соединиться только с одним центральным устройством (например, с мобильным телефоном). Как только периферийное устройство подключится к центральному устройству, оно перестанет анонсировать себя, и другие устройства перестанут видеть его или не смогут подключаться к нему до тех пор, пока существующее соединение не будет разорвано.
Установка соединения также является единственным способом осуществить двусторонний обмен данными, когда центральное устройство может посылать данные в периферийное устройство, и наоборот.
[Топология соединений сети BLE]
На рисунке ниже показано, как устройства BLE работают в среде сетевых соединений. Это так называемая звездообразная топология организации сети. Периферийное устройство (белые кружки) в любой момент времени может соединиться только с одним центральным устройством (таким как смартфон, на рисунке показано черным кружком), однако центральное устройство может соединяться с несколькими периферийными устройствами.
Если между двумя периферийными устройствами необходимо реализовать обмен данными, необходимо реализовать кустарную систему почтовых ящиков (custom mailbox system), где все сообщения проходят через центральное устройство.
Как только соединение между центральным и периферийным устройством установлено, обмен данными может осуществляться в обоих направлениях, что отличается от способа передачи данных однонаправленным широковещанием, который используется только для advertising данных и GAP.
Периферийное устройство известно как GATT Server, который хранит данные справочной таблицы протокола атрибутов (ATT lookup data), данные службы и определения характеристик. GATT Client (обычно это телефон или планшет) отправляет запросы на этот сервер. Все транзакции начинаются главным устройством GATT Client, который получает ответ от подчиненного устройства (secondary device) GATT Server.
Когда устанавливается соединение, периферийное устройство рекомендует для центрального устройства установить интервал соединения (Connection Interval), и центральное устройство будет пытаться выполнять повторное подключение (reconnect) с этим интервалом, чтобы посмотреть, есть ли у периферийного устройства новые данные. Важно помнить, что этот интервал всего лишь рекомендуемый. Ваше центральное устройство может не соблюсти этот интервал, потому что оно занято общением с другим периферийным устройством, или по какой-нибудь другой причине, когда для связи недостаточно системных ресурсов.
Следующая диаграмма иллюстрирует процесс обмена данными между периферийным устройством (GATT Server) и центральным устройством (GATT Client), где главное устройство инициирует каждую транзакцию.
[Сервисы и характеристики]
Транзакции GATT в BLE основаны на высокоуровневых, вложенных друг в друга объектах, которые называются профилями (Profiles), сервисами (Services) и характеристиками (Characteristics), что можно увидеть на картинке ниже:
Profile. Профиль в действительности не находится в самом периферийном устройстве BLE, это просто предварительно определенный набор служб (Services), который был скомпилирован заранее либо Bluetooth SIG [4], либо разработчиками периферийного устройства. Например, профиль контроля сердцебиения (Heart Rate Profile) комбинирует в себе Heart Rate Service и Device Information Service. Полный список официально адаптированных профилей, основанных на GATT, можно посмотреть по ссылке [5].
Service. Службы используются для разбиения данных на логические составляющие, они содержат специфические куски данных, которые называются характеристиками (characteristics). У службы может быть одна или большее количество характеристик, и каждая служба отличает себя от других по уникальному числовому идентификатору, который называется UUID. Этот идентификатор может быть либо 16-битным (для официально адаптированных BLE Services), либо 128-битным (для пользовательских служб).
Полный список официально адаптированных служб BLE можно увидеть на странице Services портала разработчиков Bluetooth [6]. Если, к примеру, Вы обратитесь к Heart Rate Service, то увидите, что у этой службы 16-битный UUID 0x180D, и в ней содержится до 3 характеристик (Heart Rate Measurement, Body Sensor Location и Heart Rate Control Point), хотя основное значение имеет только первая из них.
Characteristic. Самый низкий уровень концепции транзакций GATT это характеристика (characteristic), которая инкапсулирует одну точку данных (хотя может содержать массив связанных данных, такие как значения координат X/Y/Z от 3-осевого акселерометра, и т. п.).
Подобно службам, каждая характеристика отличает себя от других по предварительно определенному 16-битному или 128-битному UUID, и Вы свободны использовать стандартные характеристики, определенные Bluetooth SIG [6] (которые обеспечивают совместимость между железом и программным обеспечением, работающими с BLE), либо можете определить свои собственные кустарные (пользовательские, custom) характеристики, которые понимают только Ваше периферийное устройство и соответствующее ПО.
В качестве примера, характеристика Heart Rate Measurement важна для Heart Rate Service, и эта характеристика использует UUID 0x2A37. Она начинается с 8-битного значения, описывающая HRM-формат данных (где эти данные могут быть типа UINT8 или UINT16, к примеру), и далее включает данные измерения частоты сердечных сокращений, которые соответствуют этому байту конфигурации.
Характеристики это основная точка с которой Вы будете иметь дело при работе с периферийным устройством BLE. Характеристики также используются для отправки данных обратно в периферийное устройство BLE, поскольку Вы также можете делать запись в характеристику. Можно реализовать простой интерфейс типа UART как пользовательскую службу 'UART Service', с двумя характеристиками - одна для канала TX, и другая для канала RX, где одна из характеристик может быть сконфигурирована только для чтения (read only), и другая должна обладать возможностью записи (write).