RU

LoRaWAN

Пример на GitHub >>> (opens in a new tab)

Модель

🚩

Задача: Предположим, у вас есть модем, обеспечивающий соединение с сервером по протоколу LoRaWAN и передающий данные от счетчика импульсов Вега СИ-11. Все данные приходят в Base64 в следующем формате.

1. Пакет с текущими показаниями

РазмерОписание поляТип данных
1 байтТип пакета, для данного пакета == 1uint8
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 байтТип пакета, для данного пакета == 2uint8
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 };
}

После сохранения обработчика проверьте его работоспособность в режиме тестирования на некоторых типовых пакетах.

На вкладке Объекты выберите ваш модем.

Соотнесите входные и выходные параметры обработчика с аргументами, которые были созданы в модели.

Теперь при поступлении пакетов от устройства будет появляться информация по параметрам датчиков.