Программа сканирует BLE эфир и контролирует только появление любых устройств (меток). Если меток несколько, то программа ищет метку более мощным уровнем сигнала RSSI.
В конфигурации устройства, на вкладке Bluetooth необходимо включить
работу Bluetooth-модуля.
В программе есть две основные переменные для контроля меток: id
и fixed_id
.
id
- текущая ближайшая метка (значение может оперативно меняться в зависимости от данных в BLE эфире)
fixed_id
- текущая зафиксированная метка (метка, которую устройство принимает как основную, сохраняет и передает на сервер)
Также есть глобальный статус fix
. Статус устанавливается в true, если в fixed_id
записывается значение (нашли метку) и устанавливается в false если метка в fixed_id
не является мощнейшей или отсутствует в эфире дольше, чем время, заданное переменной LOSS_T
.
Ниже описаны основные условия, используемые для определения пропадания, нахождения и смены меток.
_first_fix
- срабатывает если (fixed_id == 0) && (id != 0)
.0
и тут появляется первая метка.fix
устанавливается в true;fixed_id
записывается id
;id
;rssi
;41046
._loss_id
- срабатывает если (fixed_id != 0) && (id != fixed_id)
.fix
устанавливается в false;fixed_id
не изменяется;0
;-128
;41047
._second_fix
- срабатывает если (fixed_id != 0) && (id != 0) && (fix == false)
.fix
устанавливается в true;fixed_id
записывается id
;id
;rssi
;41046
.![]() |
Схема. Часть 1 |
В самом начале программы, в ветке "+" условия on_start выполняется разовый пересчет одной из системных переменных. В этот блок можно было бы вынести все разовые расчеты или действия, которые необходимо произвести только после старта программы.
Далее, в блоке scan ble производится получение оперативных данных о метках. На этом этапе программа получает информацию о том, что пришли новые данные для обработки.
Блок функций, выделенный рамкой "OPTIONAL":
Самый простой вариант идентификации - по MAC-адресу. Для этого не требуется дополнительных вычислений. MAC-адрес известен еще в блоке scan ble.
Но если требуется получить ID из данных, которые передает датчик, то следует добавить такую конструкцию.
В условии check производится проверка и получение нужного ID. Если ID получен, то в блоке update id производится его обновление. Если же ID получен не был, то в блоке unset new_data сбрасывается флаг получения новых данных, полученный ранее в блоке scan ble.
Такой подход удобен для работы с iBeacon.
![]() |
Схема. Часть 2 |
Условие new_data позволяет подключить блок функций для обработки новой информации от метки.
Задача этого блока функций состоит в выборе метки с самым мощным уровнем сигнала.
В блоке compare id выполняется проверка на получение информации от текущей мощнейшей метки. Если новые данные от текущей самой мощной метки, то устанавливается флаг _update_rssi
.
В условии need init выполняется проверка на первый проход по этим функциям после включения. Если программа зашла в этот блок первый раз после включения, то без дальнейшего анализа производится переход к сохранению текущего ID и уровня сигнала.
В условии update rssi проверяется состояние флага _update_rssi
. Если он активен, то без дальнейшего анализа производится переход к сохранению текущего уровня сигнала.
В условии (rssi_tmp > rssi) производится проверка мощности сигнала новой метки и текущей мощнейшей. Если новая мощнее, то выполняется перезапись самой мощной метки. Иначе анализ данных прекращается.
Действие set id выполняет обновление данных об id, мощности и состоянии активности метки.
Следует отметить состояние активности - каждый раз когда обновляются данные от метки сбрасывается флаг _id_inactive
.
![]() |
Схема. Часть 3 |
Условие update activity timer периодически запускает процедуру проверки активности метки.
Действие clean inactive id выполняет:
_id_inactive
равно True_id_inactive
В блоке fix conditions контролируются условия _first_fix
, _loss_id
и _second_fix
. Они были ранее описаны в статье.
В блоке fix timers контролируются задержки для срабатывания условий _first_fix
, _loss_id
и _second_fix
. Описание переменных для настройки задержек приведено далее в статье, в разделе "Дополнительно".
Условие on fix выполняет следующие действия:
(все переменные были ранее описаны в статье ранее)
fix
устанавливается в true;fixed_id
записывается id
;id
;rssi
;41046
.Условие on loss выполняет следующие действия:
(все переменные были ранее описаны в статье ранее)
fix
устанавливается в false;fixed_id
не изменяется;0
;-128
;41047
.![]() |
Схема. Часть 4 |
В условии update rssi проверяется состояние флага _update_rssi
. Если он активен, то производится обновление текущей мощности метки.
Действие set rssi param обновляет текущую мощность в Пользовательском параметре CE №2.
Переменные, используемые для настройки:
FIRST_FIX_T
- таймаут фиксации условия _first_fix
(первый захват после включения).Не рекомендуется устанавливать значения меньше, чем по умолчанию, т.к. повышается вероятность зафиксировать не самую близкую метку.
SECOND_FIX_T
- таймаут для условия _second_fix
(смена идентификатора).Не рекомендуется устанавливать значения меньше, чем по умолчанию, т.к. это необходимо для корректной обработки событий смены идентификатора на сервере. Устройство должно последоватеьно отправить 0, а потом новый идентификатор, чтобы сервер зафиксировал смену.
LOSS_T
- таймаут для условия _loss_id
(сброс идентификатора).Не рекомендуется устанавливать значение менее 30000 мс.
Пользовательский параметр CE №1 - последние 4 байта MAC-адреса зафиксированной метки (или другое содержимое переменной fixed_id).
Пользовательский параметр CE №2 - RSSI уровень сигнала от метки в dBm.
Всегда отрицательная величина. Чем больше значение, тем мощнее сигнал.
Код | Описание |
---|---|
41046 |
Событие захвата новой метки |
41047 |
Событие потери метки |