- Обзор на Bluetooth Low Energy во Flutter
- Чем Bluetooth Low Energy отличается от стандартного Bluetooth?
- Выбираем библиотеку для Bluetooth Low Energy
- Разбираемся с Bluetooth Low Energy
- Правильная мысленная модель работы BLE
- Подключение BLE
- Bluetooth Low Energy и GATT
- Характеристики в Bluetooth Low Energy
- Запись и чтение характеристик в BLE
- Получение уведомлений и индикаций
- Соединение с BLE
- Распространенные проблемы в работе Bluetooth Low Energy
- Подводим итоги
Обзор на Bluetooth Low Energy во Flutter
С ростом числа интеллектуальных устройств увеличивается необходимость их контроля. Во многих случаях использования девайса нельзя ожидать от него подключения к интернету, пока есть необходимость осуществлять контроль. В таких случаях использование «Bluetooth Low Energy» (Bluetooth с низким потреблением энергии, также известный как Bluetooth LE, или BLE) кажется лучшим выбором из-за низкого энергопотребления, повсеместной распространенности в наших телефонах и отсутствия необходимости подключения к более обширной сети. В связи с этим растет спрос на приложения для Bluetooth.
Чем Bluetooth Low Energy отличается от стандартного Bluetooth?
Если вкратце, то Bluetooth — это технология беспроводной связи с переключением частоты, которая передает пакеты данных в диапазоне 2,4 ГГц для связи с близко расположенными устройствами. Bluetooth Low Energy — это один из видов Bluetooth, который также работает в диапазоне 2,4 ГГц, но его максимальная скорость составляет всего 1 Мбит/с, а потребляемая мощность — от 0,01 до 0,5 Вт. Это одна треть от скорости стандартного Bluetooth, в результате чего энергопотребление расходуется значительно ниже.
Более низкое энергопотребление возможно благодаря тому, что BLE находится в спящем режиме до тех пор, пока не будет установлено соединение. Фактическое время соединения длится всего несколько миллисекунд, в отличие от стандартного Bluetooth, который за один раз устанавливает соединение на несколько секунд или несколько часов. Основная цель Bluetooth — непрерывная передача данных приложениям, в то время как Bluetooth Low Energy предназначен для приложений, которым не требуется обмен большими объемами данных.
Выбираем библиотеку для Bluetooth Low Energy
Перед написанием любого кода, связанного с Bluetooth, необходимо выбрать базовую библиотеку.
В настоящее время на pub представлены три библиотеки BLE, которые, на первый, взгляд могут показаться довольно перспективными: `flutter_blue`, `flutter_ble_lib` и `flutter_reactive_ble`.
Все они имеют практически одинаковый набор функций, но сильно отличаются в плане практического использования.
Во время последнего коммита на GitHub, который был 9 месяцев назад (по состоянию на декабрь 2021 года), было выявлено 500 открытых проблем и множество серьезных ошибок. Похоже, что библиотека сейчас не поддерживается, поэтому её выбор сильно затруднит разработку вашего приложения.
Библиотека почти полностью готова и имеет дополнительный эмулятор устройства, что значительно помогает при тестировании. Почти все функции работают безупречно, но, как и в любом другом программном обеспечении, здесь присутствуют некоторые незначительные ошибки. К сожалению, несмотря на то что библиотека поддерживается, ее развитие идет медленными темпами и она все еще не является null-safe. Выбор этой библиотеки не будет оптимальным, если только Вам не нужно полностью автоматическое тестирование Bluetooth в процессе разработки.
3.`Flutter_reactive_BLE`
Эта библиотека кажется лучшим выбором, поскольку она имеет все, что и другие библиотеки, за исключением эмулятора, и активно поддерживается. Риск того, что от нее откажутся в ближайшем будущем, невелик, поскольку она разрабатывается командой Philips Hue.
Разбираемся с Bluetooth Low Energy
Теперь, когда мы выбрали библиотеку, необходимо знание базового протокола. Стандарт BLE хорошо документирован, но он также очень сложен. Далее мы попытаемся абстрагироваться от всего, что возможно, и объяснить Вам, как работать с Вашим устройством, не вникая во все детали и нюансы .
Правильная мысленная модель работы BLE
Практически во всех ситуациях Ваш телефон будет работать в качестве ведущего устройства BLE, а периферийные устройства, к которым вы подключаете телефон, будут выступать в качестве ведомых устройств BLE. Ведущее устройство может подключаться к нескольким периферийным устройствам, в то время как периферийное устройство может быть подключено только к одному ведущему устройству.
Подключение BLE
Чтобы начать работу с периферийным устройством, необходимо сначала подключиться к нему. В большинстве случаев Вам потребуется начать сканирование устройств BLE и либо автоматически подключиться к устройству, выбранному по заданному критерию, либо позволить пользователю подключиться к нужному ему устройству.
При сканировании на наличие периферийных устройств Вы получите их идентификаторы, имена и список предоставляемых сервисов .
Обратите внимание, что во время подключения у Вас есть возможность согласования MTU с устройством, что изменяет максимальный размер данных, которые вы можете отправлять и получать.
Bluetooth Low Energy и GATT
Периферия Bluetooth Low Energy должна иметь клиента GATT (Generic Attribute Profile), определяющего способ, которым два устройства Bluetooth Low Energy передают данные туда и обратно и обеспечивают доступ к сервисам и характеристикам.
Сервисы — это группы характеристик, идентифицируемых по GUID, а характеристики — это узлы, о которых мы, разработчики приложений, будем заботиться. Обратите внимание, что характеристики всегда группируются в сервисе .
Характеристики в Bluetooth Low Energy
Характеристики — это объекты, которые вы читаете, записываете или прослушиваете (с помощью функции notify или indicate).
Они идентифицируются по GUID и всегда имеют как минимум один дескриптор . Дескрипторы используются для хранения метаданных о характеристике. Если бит, соответствующий `Read`, в дескрипторе установлен в `1`, то характеристика доступна для чтения. То же самое следует для `Write`, `Notify` и так далее. Большинство библиотек предоставляют методы по типу `characteristic.isReadable()`, чтобы абстрагироваться от использования битовых полей дескрипторов.
Запись и чтение характеристик в BLE
Если характеристика может быть записана с ответом (когда ответ ограничен ответом подтверждения), то вызов эквивалента `characteristic.writeWithResponse(value)` изменит соответствующее значение на ведомом устройстве и сообщит, что все прошло успешно. Операции чтения (reading) и записи (writing) без ответа аналогичны.
Получение уведомлений и индикаций
Если Вы хотите быть в курсе изменения значений характеристик в Вашем приложении, Вы можете подписаться на характеристику с помощью эквивалента `characteristic.subscribe()`. Это сообщит периферийному устройству, что оно должно сообщать Вам информацию об изменении значения характеристики.
Чтобы реагировать на изменения значений, Вы можете воспользоваться функцией прослушивания `dart:Stream`.
Bluetooth Low Energy предоставляет возможность включить уведомления и индикации , которые отличаются только тем, что распознается уведомление, а не индикация . Они также имеют соответствующие значки `isNotifiable`/ `isIndicatable` в дескрипторе характеристики.
Соединение с BLE
Как только вы разберетесь во всех возможных операциях, Вы сможете делать все то же самое, что и с любым другим источником данных, за исключением того, что вы работаете с байтовыми данными. Возможно, вы захотите написать класс-репозиторий, который будет преобразовывать байтовые данные в хорошо типизированные модели данных для удобства использования.
Распространенные проблемы в работе Bluetooth Low Energy
Этих знаний в сочетании с чтением документации выбранной вами библиотеки должно быть достаточно для всех взаимодействий с периферийными устройствами Bluetooth Low Energy в идеальном мире. Однако, к сожалению, ошибки случаются, и базовые модули BLE устройств могут работать не так гладко, как хотелось бы. Давайте разбираться: с чего следует начинать поиск источников проблем при их появлении?
Лучше всего начать с проверки стабильности соединения. Поскольку антенны Bluetooth Low Energy являются маломощными, соединение может быть легко потеряно в любой момент. При написании логического кода помните, что любая отдельная операция BLE может легко завершиться неудачей в любой момент.
Обычным источником могут быть проблемы с поставщиком прошивки Вашего периферийного устройства. Используйте отдельное приложение Bluetooth Low Energy для проверки наличия всего необходимого для работы флагов, а также проверьте соответствие всех GUID.
Источником проблем могут быть и сами библиотеки. Например, `flutter_BLE_lib` часто дает сбой при быстрой параллельной записи и слишком рано завершает соединение с устройством. Во время отладки Вы также можете захотеть добавить некоторую задержку до и после операций Bluetooth.
Подводим итоги
Мы надеемся, что эта статья поможет вам в написании приложения Bluetooth Low Energy Flutter. Технологию BLE определенно стоит использовать из-за ее низкой стоимости, простоты развертывания и положительного влияния на длительное время автономной работы бытовой электроники, которая может быть подключена к интернет-приложениям.
Если Вы планируете создать приложение, использующее BLE, разработчики LeanCode помогут Вам с его реализацией. Ознакомьтесь с мобильным приложением STERYLIS для управления устройствами, подключенными к Интернету, и STERYLIS Pure — Bluetooth-приложением-компаньоном для стерилизационных устройств клиента.