Обнаружение BLE устройств с помощью модуля ESP32


Датчики приближения (proximity sensors) предназначены для обнаружения близкорасположенных объектов с помощью света, электромагнитного поля или звука. В ряду случаев для обнаружения близко расположенных объектов целесообразно использовать технологию BLE (Bluetooth Low Energy – Bluetooth с низким энергопотреблением). Для создания подобного датчика можно использовать модуль ESP32, поскольку он имеет встроенную поддержку BLE.

Проект детектора BLE устройств на основе модуля ESP32

В данной статье мы рассмотрим создание детектора BLE устройств на основе модуля ESP32. Ранее на нашем сайте мы рассматривали использование технологии BLE в ESP32 для соединения с фитнес браслетом.

Необходимые компоненты

  1. Модуль ESP32 (купить на AliExpress).
  2. Смартфон.
  3. Умные часы.

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

Внешний вид компонентов, необходимых для нашего проекта

Основные принципы работы технологии BLE

BLE (Bluetooth Low Energy) – это Bluetooth с низким потреблением. Технология BLE была разработана в 2011 г. и с тех пор находит широкое применение для связи на короткие расстояния в устройствах, получающих питание от батареек/аккумуляторов: смартфоны, умные часы, беспроводные гарнитуры, беспроводные колонки и т.п.

Значок технологии Bluetooth

Технология BLE была разработана специальной группой по интересам (Special Interest Group, SIG) Bluetooth. Основной целью создания технологии было максимальное снижение энергопотребления устройств. Хотя в названии технологии BLE есть слово "Bluetooth", тем не менее, данная технология не обладает обратной совместимостью, то есть классические Bluetooth устройства не могут осуществлять прием данных от устройств BLE. Но зато это позволило разработчикам создать технологию, благодаря которой беспроводные устройства могут работать от крошечной батарейки несколько месяцев (или даже лет).

Технология BLE использует иерархическую структуру данных для передачи и приема информации. BLE устройство, работающее в качестве сервера, предоставляет услуги и характеристики, которые могут быть обнаружены клиентом. И как только произойдет обмен информацией между клиентом и сервером, эти два устройства смогут работать друг с другом одновременно. Этот стек (совокупность) информации является атрибутом (отличительным свойством) BLE устройства. Данная информация задается с помощью профиля GATT (Generic Attributes). Данный профиль содержит услуги/службы (Service), характеристики (Characteristics) и значения (values) в иерархическом порядке. Службы содержат характеристики, а характеристики содержат значения. Считывая характеристики, мы можем считывать их значения и изменять их.

Структура GATT профиля представлена на следующем рисунке.

Структура GATT профиля в технологии BLE

Характеристики (Characteristics) могут быть использованы для чтения или записи информации. Устройства, содержащие компоненты для чтения, могут публиковать (publish) информацию, а устройства, содержащие компоненты для записи, могут принимать данные от клиента.

GATT профиль технологии BLE также известен как UUID (Universally Unique Identifier – универсальный уникальный идентификатор). Существует ряд стандартных служб и характеристик, определенных корпорацией SIG. Если мы считываем UUID BLE устройства, мы сразу можем определить тип этого устройства.

Данные BLE передаются и принимаются с помощью очень коротких пакетов. Пакет BLE содержит всего 31 байта, в то время как, например, пакет протокола TCP может содержать более 60 байт. Важным правилом при работе с технологией BLE является то, что ее пакеты должны иметь строго определенную структуру и байты этих пакетов должны передаваться и приниматься последовательно.

Как работает датчик приближения на основе технологии BLE

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

Принцип обнаружения клиентом сервера в технологии BLE

BLE серверы регулярно передают в эфир сигналы приветствия (advertisement signals), поэтому клиенты могут обнаружить эти сигналы и, таким образом, подключиться к серверам. Эти сигналы приветствия содержат уникальный BLE MAC (Media Access Control) адрес, который очень похож на MAC адрес, используемый в технологии Wi-Fi. Поскольку модуль ESP32 имеет встроенную поддержку Bluetooth, с его помощью мы можем легко обнаружить эти транслируемые сигналы приветствия и сравнить их с таблицей соответствия чтобы обнаружить присутствие необходимого нам устройства.

Когда устройство обнаружено и проверено на соответствие адреса, мы можем, к примеру, включить светодиод, подключенный к модулю ESP32, или с помощью сервиса Adafruit IO отправить уведомление на смартфон с операционной системой android.

Объяснение программы для модуля ESP32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

В целях демонстрации работы проекта мы запрограммируем модуль ESP32 на обнаружение известных BLE маяков (beacons) и когда мы будем обнаруживать такой маяк, мы будем зажигать встроенный в модуль ESP32 светодиод.

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

Далее объявим ряд необходимых переменных, первой из которых будет массив, в котором мы будем хранить известные BLE MAC адреса. Далее мы объявим значение границы (минимальный уровень сигнала), при превышении которой будет фиксироваться факт обнаружения устройства и выполняться необходимое действие. Далее объявим переменную логического типа (Boolean) которую мы будем устанавливать в true если одно из просканированных (обнаруженных) устройств содержится в нашем массиве с известными адресами. Также мы объявим еще одну переменную чтобы очищать уже просканированные BLE устройства, если мы не будем делать этого, то рано или поздно возникнут проблемы с переполнением памяти. И еще мы объявим указатель на класс BLEScan.

Также мы запрограммируем функцию обратного вызова  (call-back function), сначала эта функция будет вызываться каждые несколько секунд чтобы проверить присутствуют ли в зоне действия нашего модуля новые BLE устройства или нет. Внутри этой функции при обнаружении BLE устройства мы будем устанавливать соответствующий флаг и осуществлять выход из цикла. И наконец, мы будем выводить на экран информацию об обнаруженном BLE устройстве.

Далее в функции setup мы зададим режим работы контакта, к которому подключен светодиод, на вывод данных. Также мы инициализируем BLE устройство (BLEDevice) с помощью метода BLEDevice::init, после этого мы получим просканированный объект от нашего BLEDevice, мы сохраним этот адрес в ранее объявленном указателе на pBLEScan.

Затем мы инициализируем функцию обратного вызова – она будет вызываться каждые несколько секунд чтобы проверить доступны ли новые устройства или нет. Далее мы используем метод SetActiveScan чтобы установить активный режим сканирования – данный режим потребляет больше энергии, но позволяет быстрее получить результаты сканирования. Также установим интервал и окно сканирования с помощью методов setInterval и setWindow.

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

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

Затем мы будем удалять результаты сканирования чтобы очистить память.

После того как вы загрузите код программы в модуль ESP32, вы сможете с его помощью обнаруживать известные BLE устройства, когда они находятся рядом с вами. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
1 162 просмотров

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

Ваш адрес email не будет опубликован.