LoRaWAN
Пример на GitHub >>> (opens in a new tab)
Модель
Задача: Предположим, у вас есть модем, обеспечивающий соединение с сервером по протоколу LoRaWAN и передающий данные от счетчика импульсов Вега СИ-11. Все данные приходят в Base64 в следующем формате.
1. Пакет с текущими показаниями
Размер | Описание поля | Тип данных |
---|---|---|
1 байт | Тип пакета, для данного пакета == 1 | uint8 |
1 байт | Заряд батареи, % | uint8 |
1 байт | Значения основных настроек (битовое поле) | uint8 |
4 байта | Время снятия показаний, передаваемых в данном пакете (unixtime UTC) | uint32 |
1 байт | Температура, ⁰С | int8 |
4 байта | Показания на входе 1 (в зависимости от типа - число импульсов, либо состояние 0 – разомкнут, 1 - замкнут) | uint32 |
4 байта | Показания на входе 2 (в зависимости от типа - число импульсов, либо состояние 0 – разомкнут, 1 - замкнут) | uint32 |
4 байта | Показания на входе 3 (в зависимости от типа - число импульсов, либо состояние 0 – разомкнут, 1 - замкнут) | uint32 |
4 байта | Показания на входе 4 (в зависимости от типа - число импульсов, либо состояние 0 – разомкнут, 1 - замкнут) | uint32 |
2. Пакет “тревога”
Размер | Описание поля | Тип данных |
---|---|---|
1 байт | Тип пакета, для данного пакета == 2 | uint8 |
1 байт | Заряд батареи, % | uint8 |
1 байт | Значения основных настроек (битовое поле) | uint8 |
1 байт | Номер входа, на котором зафиксирована тревога | uint8 |
4 байта | Время формирования пакета (unixtime UTC) | uint32 |
4 байта | Текущие показания на входе 1 (в зависимости от типа - число импульсов, либо состояние 0 – разомкнут, 1 - замкнут) | uint32 |
4 байта | Текущие показания на входе 2 (в зависимости от типа - число импульсов, либо состояние 0 – разомкнут, 1 - замкнут) | uint32 |
4 байта | Текущие показания на входе 3 (в зависимости от типа - число импульсов, либо состояние 0 – разомкнут, 1 - замкнут) | uint32 |
4 байта | Текущие показания на входе 4 (в зависимости от типа - число импульсов, либо состояние 0 – разомкнут, 1 - замкнут) | uint32 |
Расшифровка битового поля «Значения основных настроек»
Бит | Значение |
---|---|
0 бит | Тип активации 0 - OTAA, 1 – ABP |
1, 2, 3 биты | Период выхода на связь: |1 == 0|2==0|3==0| - 5 минут |1 == 1|2==0|3==0| - 15 минут |1 == 0|2==1|3==0| - 30 минут |1 == 1|2==1|3==0| - 1 час |1 == 0|2==0|3==1| - 6 часов |1 == 1|2==0|3==1| - 12 часов |1 == 0|2==1|3==1| - 24 часа |
4 бит | Тип первого входа: 0 – импульсный, 1 - охранный |
5 бит | Тип второго входа: 0 – импульсный, 1 - охранный |
6 бит | Тип третьего входа: 0 – импульсный, 1 - охранный |
7 бит | Тип четвертого входа: 0 – импульсный, 1 - охранный |
В полях, состоящих из нескольких байт, используется порядок следования LE (little-endian - от младшего к старшему).
Для подключения модема к платформе создайте для него модель LoRaWAN.
В шаблонной модели LoRaWan есть только базовые параметры.
Разбор данных необходимо произвести в обработчике, а параметры создать в модели дополнительно.
Подробнее о формировании аргументов LoRaWAN >>>
Посмотрите превью объекта с моделью, которую вы создали, нажав кнопку Показать превью.
При желании выберите иконку для отображения объекта на карте или загрузите свое изображение.
Модель для импорта >>> (opens in a new tab)
Объект
Создайте объект для вашего модема. Выберите модель, которую только что создали. Затем введите идентификатор устройства DevEUI. Укажите имя объекта.
После сохранения откроется инструкция по настройке устройства на платформу.
Перейдите на вкладку Редактирование. Выберите частотный план Frequency plan. Укажите ключ приложения AppKey и идентификатор шлюза Gateway Id. Также в разделе Координаты вы можете указать конкретную геопозицию модема, прописав широту и долготу, или выбрать точку на карте. Тогда он будет стационарно отображаться на карте даже при отсутствии координат в пакете данных.
Подключение
Для подключения модема к платформе в его конфигураторе Packet Forwarder укажите следующие настройки:
{
"gateway_conf": {
"gateway_ID": "<Gateway EUI>",
"server_address": "dev.rightech.io",
"serv_port_up": 1700,
"serv_port_down": 1700
}
}
Убедитесь, что после сохранения настроек данные от устройства присылаются и отображаются в интерфейсе.
Подробнее о подключении устройств >>>
Обработчики
Для разбора данных, полученных от устройства по протоколу LoRaWAN, воспользуйтесь обработчиком.
Создайте новый обработчик.
Напишите код вашего обработчика, который принимает данные из payload на вход, а на выходе возвращает значения от датчика.
const EVENT_PACKET = 1;
const EVENT_ALARM = 2;
/**
* Check if n-th bit set for number
* @param value {number} number value
* @param bit {number} bit position
*/
function bit(value, bit) {
return (value & (1 << bit)) !== 0;
}
/**
* Parse Vega SI-11 Payload
* https://en.iotvega.com/product/si11
*
* ```
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8-11 | 12-15 | 16-19 | 20-23
* 1 - EVENT_PACKET | type | bat | cfg | timestamp | t | in[0] | in[1] | in[2] | in[3]
* 2 - EVENT_ALARM | type | bat | cfg | i | timestamp | in[0] | in[1] | in[2] | in[3]
*
* ```
* @param payload {string} base64 encoded payload
*/
export function process(payload) {
const data = ric.base64.decode(payload);
let offset = 0;
/* - option 1 - parse binary payload from raw byte array */
const bytes = new Uint8Array(data.buffer);
const evtype = bytes[offset++];
const battery = bytes[offset++];
const configByte = bytes[offset++];
const config = {
activation: bit(configByte, 0) ? "abp" : "otaa",
inputs: [
+bit(configByte, 4),
+bit(configByte, 5),
+bit(configByte, 6),
+bit(configByte, 7),
],
};
const evin = evtype === EVENT_ALARM ? bytes[offset++] : undefined;
/* - option 2 - use JS `DataView` interface (like Node's `Buffer`) */
const evtime = data.getUint32(offset, true) * 1000;
offset += 4;
const temperature =
evtype === EVENT_PACKET ? data.getInt8(offset++) : undefined;
const inputs = [];
for (let i = 0; i < 4; i++) {
inputs[i] = data.getUint32(offset, true);
offset += 4;
}
return { evtype, battery, config, evin, evtime, temperature, inputs };
}
После сохранения обработчика проверьте его работоспособность в режиме тестирования на некоторых типовых пакетах.
На вкладке Объекты выберите ваш модем.
Соотнесите входные и выходные параметры обработчика с аргументами, которые были созданы в модели.
Теперь при поступлении пакетов от устройства будет появляться информация по параметрам датчиков.