Хабрахабр

4G-роутер в роли универсального сервера для IoT


Роутеры серии ICR-3200 призваны заменить классическую связку: одноплатный компьютер + модем + роутер. Теперь можно запускать всю необходимую логику прямо на роутере. Благодаря мощному ARM-процессору, 512 МБ оперативной памяти и ~2ГБ встроенной флеш-памяти, на роутере можно даже запустить сервер nodejs!

Открытое окружение для сборки собственных программ и библиотеки C/C++ для работы с низкоуровневым аппаратным API также в наличии.
Функция глубокого сна позволит экономить энергию при работе от аккумулятора: роутер можно активировать только тогда, когда связь действительно необходима. Последовательные интерфейсы RS-232/485 также встроены в роутер и доступны сразу в операционной системе с полным root-доступом.

В статье мы разберем интересные функции устройства и попробуем на практике поработать с интерфейсом ввода-вывода из shell-скриптов.

Технические характеристики

Роутеры серии ICR-3200 выполнены на единой аппаратной платформе и представлены пятью моделями, различающимися диапазонами частот LTE, наличием Wi-Fi и геолокации (GNSS). Устройства позиционируются как замена связки одноплатного компьютера и роутера. Мощный процессор и большой объем оперативной памяти позволяет запускать ресурсоемкие пользовательские приложения прямо на роутере.

  • Процессор Cortex-A8 — тактовая частота 1 ГГц, архитектура 32 bit
  • 512 МБ RAM
  • Флеш-память от 1,5 до 4 ГБ — для хранения пользовательских данных
  • Порты ввода-вывода — интерфейсы RS-232/485 и цифровые порты ввода-вывода доступны для использования пользовательскими программами

Отдельно стоит модель ICR-3211B, работающая по стандарту LTE Cat. M1 (NB-IoT). Протокол LTE Cat. M1 был специально разработан для M2M-решений, имеет низкую скорость передачи данных (375 kb/s), а также большую дальность действия и повышенную стабильность в сложных условиях связи внутри помещений. Роутер имеет встроенный ионистор (суперконденсатор), позволяющий устройству работать короткое время после полного отключения питания.

Режим глубокого сна

Режим глубоко сна позволяет ввести роутер в состояние, когда все процессы заморожены и аппаратная часть отключены, для экономии энергии, при этом все функции устройства отключаются и со стороны оно будет выглядит полностью выключенным. Потребление энергии в таком режиме составляет не более 10 mW.


В режиме сна роутер почти не потребляет энергию и просыпается за 3 секунды

Разумеется, потребуется дополнительное время на регистрацию модема в сотовой сети, однако это существенно быстрее загрузки роутера с нуля. Когда потребуется разбудить роутер для передачи данных, он проснется за ~3 секунды. Такая опция полезна для систем с автономным питанием, большую часть времени находящихся в простое и активирующихся изредка, для выполнения активных действий, например сигнализации или блока резервирования.

Пробуждение и засыпание

Управление засыпанием и пробуждением происходит через модуль Sleep Mode.

Существует 2 способа управления режимом сна:

  • Через цифровой вход — в этом режиме роутером управляет внешнее устройство, например микроконтроллер. По сигналу LOW на цифровой вход роутер засыпает, а при получении HIGH — просыпается, или наоборот. Можно также настроить таймаут срабатывания для защиты от случайных переключений.
  • Через внутренний таймер — роутер отсчитывает время и просыпается/засыпает в нужное время. Это удобно использовать для выполнения разовых операций или загрузки данных за определенный период.


Интерфейс настройки режима глубоко сна

Функция «последний вздох»

Авария питания на удаленном объекте бывает особенно неприятной, потому что непонятно, из-за чего недоступна связь с объектом. Функция «Последний вздох» позволяет роутеру работать некоторое время после полного отключения питания и отправить сообщение о том, что произошла авария и резервное питание не включилось. Благодаря встроенному ионистору, ресурс которого значительно больше аккумуляторных батарей, он не требует обслуживания и замены. Это полезно для систем резервирования питания, в которых возможны сбои и важно отследить момент полной потери напряжения.


Роутер пошлет сигнал об аварии питания даже после полного отключения питания

Чтобы правильно отреагировать на событие потери питания, нужно как-то узнать об этом.
Текущее напряжение питания можно получить либо с помощью shell-команды status sys:

$ status sys
Firmware Version : 6.1.10 (2019-07-02)
Serial Number : ACZ1100000623519
Profile : Standard
RTC Battery : Ok
Supply Voltage : 12.3 V # ← напряжение питания
Temperature : 37 C # ← температура внутри корпуса
Time : 2019-08-16 16:21:18
Uptime : 0 days, 11 hours, 43 minutes

Либо с помощью аппаратного Unix I/O control (ioctl) и программы на C/C++ или другом языке.
В таблице показаны адреса нужных аппаратных регистров. Текущее напряжение питания возвращается в виде целого числа, в милливольтах. Использование низкоуровневого API предпочтительнее shell-скриптов в данном случае для более быстрой реакции. Подробная информация о работе с аппаратной частью доступна в руководстве разработчика.


Запрос ioctl, отдающий текущее напряжение питания.

Последовательные интерфейсы

В роутер встроены два последовательных интерфейса: RS-232 и RS-485. Они позволяют подключать периферийные устройства напрямую к роутеру, без использования дополнительной обвязки. При этом на роутере может быть запущен полноценный сервер Node-RED или Nodejs, что позволяет обойтись одним устройств для разворачивания простой системы автоматизации, без дополнительных компьютеров и контроллеров.

По умолчанию оба интерфейса доступны для работы как стандартные serial-устройства в Linux:

ls -la /dev/ttyS*
crw------- 1 root root 251, 0 Jan 1 1970 /dev/ttyS0 # ← порт rs-232
crw------- 1 root root 251, 1 Jan 1 1970 /dev/ttyS1 # ← порт rs-485 crw------- 1 root root 251, 5 Jan 1 1970 /dev/ttyS5 # ← не разведен

Все стандартные библиотеки будут поддерживать эти устройства без дополнительных настроек, в том числе модуль Modbus-RTU2TCP и другие.

Пользовательские модули

Функциональность устройства можно расширить с помощью пользовательских модулей: это упрощенный вариант пакетов, только без пакетного менеджера. Весь список доступных модулей имеется на сайте https://advantech-bb.cz/products/software/user-modules.

Модули устанавливаются вручную, с помощью загрузки файла пакета через веб-интерфейс:

Вот некоторые интересные из них: На текущий момент доступны 73 модуля.

  • Node-RED — популярный инструмент для объединения различных промышленных протоколов в целостную систему
  • Nodejs — полноценный сервер nodejs. Большой объем оперативной памяти и мощный процессор позволяет запускать ресурсоемкие приложения прямо на роутере!
  • Python2/3
  • Веб-shell — позволяет работать в консоли через браузер.
  • Azure IoT SDK Python — набор инструментов для разработки программ под Microsoft Azure IoT Hub.

Так как прошивка роутеров открыта, разработчики могут писать собственные модули, в том числе и с веб-интерфейсом. Справочные материалы доступны в руководстве по написанию модулей и и разделе для разработчиков на веб-сайте компании. Для удобства сборки пакетов доступно готовое окружение для кросс-компиляции.

Аппаратные ресурсы через shell-скрипты

Для простых задач автоматизации удобно использовать shell-скрипты, из которых можно управлять световой индикацией и получать/задавать состояние цифровых пинов.

Например, индикация передачи данных — частое мигание, попытка подключения — редкое мигание, простой — горит непрерывно. Световой индикацией удобно показывать текущее состояние выполнения команд. На вход она принимает только один аргумент — тип мигания светодиодом. Рассмотрим команду led.

# led
led on|off|fast|slow

Вот как это выглядит в реальной жизни:

Your browser does not support HTML5 video.

Демонстрация режимов работы пользовательского индикатора через shell-команды

Для работы с цифровыми пинами используется команда io.

$ io
Usage: io [get <pin>] | [set <pin> <value>] io set out0 1 # Установить цифровой выход OUT0 в состояние 1 (LOW)
io get bin0 # Получить значение цифрового входа BIN0

Важно помнить, что логика в данном случае инвертированная. Соответственно 1=LOW, 0=HIGH. Используя команду io мы можем легко работать с цифровыми пинами из bash-скриптов и строить простую логику для автоматизации и управления.

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

#!/bin/bash
while true
do [ $(io get bin0) -eq 0 ] && led fast || led on
done

Принцип работы скрипта прост: если BIN0 в состоянии 0, то диод горит часто, иначе горит непрерывно. Вот как это выглядит вживую:

Your browser does not support HTML5 video.

Демонстрация работы bash-скрипта, отображающего состояние цифрового входа с помощью индикатора.

Несмотря на примитивность этого скрипта, он наглядно показывает, как в одну строчку, без дополнительного ПО, библиотек и настроек можно получать входные данные с цифровых входов и реагировать на них.

Ссылки

  • В данной статье не затрагиваются сетевые функции роутеров, такие как балансировка, failover, VPN и прочее, так как все эти темы уже разобраны в другой нашей статье: Промышленные 4G-роутеры SmartMotion.
  • Пример применения роутера ICR-3211B есть в нашей первой статье: Привет, Хабр, мы Advantech.
  • Ознакомиться с ценами на продукцию можно в общем онлайн-магазине. Собственный сайт на русском еще не готов.
Теги
Показать больше

Похожие статьи

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть