Контроль СИЗ по BLE биконам

Есть 32 типа СИЗов. Один человек может иметь не более 1 СИЗа каждого типа.

В персональной метке хранится Список СИЗов для этого человека и идентификаторы биконов этих СИЗов. Списком управляет сервер.

Метка периодически (30с) сканирует биконы, фиксирует найденные из Списка. И отправляет их в сенсоре в виде битовой карты по типам СИЗов.

Тип СИЗа – число 0..31, соответствует позиции битового поля в сенсоре. Смысл типа знает только сервер. Рекомендуется назначать часто используемым СИЗам меньший тип, для уменьшения размера данных в сенсоре.

Идентификатор бикона – MAC-адрес. Бикон сам по себе не имеет типа, привязка хранится на сервере (и в Списке). Поэтому бикон не нуждается в настройке.

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

Привязка СИЗ

При привязке СИЗ к бикону нужно узнать MAC бикона. Для этого можно приложить его к сервисной метке. Метку настроить на частый опрос биконов и смотреть (через UWB) сенсор EVT_BEACONS (-19) – в нем биконы отсортированы по PathLoss, так что первый ближайший, и учитывать его, если он недавний и PathLoss выше порога.

Сенсор SIZ

Передает найденные СИЗ. См. CBOR Sensors encoding, сенсор SIZ (-20).

Опрос биконов должен быть разрешен Супервизором SUPERVISOR subsystem, параметр /node/mode#Scan=auto. Периодичность опроса задается отдельно в модуле BEACONS scanning, filtering, парсет /ble/brate. Фильтрация биконов /ble/brate#Filter не влияет на опрос СИЗов. Также СИЗ-биконы не учитываются в сенсоре EVT_BEACONS(-19).

Конфигурация модуля

/siz/siz

Параметры сканирования биконов

Параметр

Значения

CBOR map value type

Описание

Mode

off, on

bool

Режим опроса СИЗ. Сенсор SIZ (при Send=Auto) отправляется, если Mode=on и /siz/bmap не пустой

BatLevel_mv

uint32

int

Порог недостатка напряжения питания бикона, мВ (для передачи состояния батареи в сенсоре SIZ)

/siz/bmap

Парсет-массив, список биконов по типам СИЗов. Массив содержит 32 записи, номер записи (key) соответствует типу СИЗа.

Параметр

Значения

CBOR map value type

Описание

MAC

eui48

byte_string[6]

MAC-адрес бикона (BLE device address)

Att_dB

uint8

int

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

Примеры использования через CoBench:

GET /siz/bmap – запрос всех непустых записей

GET /siz/bmap N – запрос записи для типа N

PUT /siz/bmap N#MAC=12-34-56-78-AB-CD Att_dB=40 – добавление/изменение записи для типа N

PUT /siz/bmap del 2 – удаление записи для типа N

PUT /siz/bmap clear – удаление всех записей

Bulk-конфигурация

Возможно чтение (GET) и загрузка (PUT) парсета целиком в виде бинарного образа. Для парсет-массивов образ содержит только непустые записи (строки массива).

Надо опрашивать соответствующий ресурс с Query Option blob. Образ передается в payload CoAP-пакета.

Образ содержит заголовок и данные. В заголовке содержатся идентификатор структуры парсета FieldsSignature и контрольная сумма CRC32. Расчет контрольной суммы см. TAGZONES subsystem (в конце)

FieldsSignature нужен для контроля правильности структуры парсета.

CRC32 нужна для контроля целостности образа при CoAP Block Transfer. Образ собирается в устройстве по мере прихода блоков и в конце применяется целиком с контролем целостности. Для сбора образа используется глобальный буфер, так что образ может быть искажен при параллельном доступе с нескольких клиентов.

Для парсета /siz/bmap образ имеет следующий вид (siz_bmap_blob_t):

typedef struct __attribute__((packed)) {
    uint32_t FieldsSignature; /// for /siz/bmap must be 0xFD00E35D
    uint32_t CRC32;           /// cyg_ether_crc32() of following bytes
} parset_blob_header_t;

typedef struct __attribute__((packed)) {
    uint8_t idx;    /// index in array, equals to SIZ type
    uint8_t MAC[6]; /// beacon BLE device address, MSB first
    uint8_t Att_dB; /// max allowable BLE signal attenuation from beacon
} siz_bmap_record_t;

typedef struct __attribute__((packed)) {
    parset_blob_header_t header;
    siz_bmap_record_t records[N]; /// 0 <= N <=31
} siz_bmap_blob_t;

Примеры использования через CoBench (file_name можно оставлять пустым, будет запрошено через GUI):

GET /siz/bmap blob – запрос образа парсета, печать в HEX

GET /siz/bmap blob#>file_name – запрос образа парсета, сохранение в file_name

GET /siz/bmap blob#<file_name – запрос образа парсета, сравнение с file_name

PUT /siz/bmap blob#<file_name – передача образа парсета из file_name

PUT /siz/bmap blob#<<file_name – передача образа парсета из file_name с пересчетом CRC32

Для очистки конфигурации можно загрузить образ со всеми пустыми записями, но проще отправить PUT /siz/bmap clear