Руководство для iot vega server

Обновлено Обновлено: 09.11.2022
Опубликовано Опубликовано: 26.05.2019

VEGA Server — программное обеспечение для приема данных из различных устройств. Например, вместе с Pulse его можно использовать для получения и отображения показаний водосчетчиков, электросчетчиков, счетчиков газа с импульсными выходами.

Дистрибутив сервера распространяется как deb-пакет, поэтому установка будет выполняться на Linux Ubuntu. Инструкция также будет работать для Debian.

Настройка VEGA Server
Использование MariaDB / MySQL
    Установка MariaDB
    Создание базы и пользователя
    Настройка библиотек IOT VEGA для работы с mysql
    Настройка VEGA Server для работы с mysql
Использование Admin Tool
    Установка веб-сервера
    Установка Admin Tool
Использование Pulse
Настройка IotVegaNotifier
Обновление
    IOT VEGA Server
    IOT Vega Pulse
    Admin Tool
Дополнительные настройки
    Смена пароля root
    Вход на веб из вне

Установка и запуск VEGA Server

Переходим на страницу iotvega.com/product/server и копируем ссылку на IOT Vega Server для Linux:

Копируем ссылку на IOT Vega Server для Linux

Скачиваем архив на сервере:

wget «https://iotvega.com/content/ru/soft/server/IOT%20Vega%20Server%20(linux)%20v1.2.1.tar.gz»

* так как в пути есть спецсимволы, необходимо адрес вставить в кавычки. В данном примере скачивается версия 1.2.1.

Распаковываем архив:

tar -xvf IOT Vega Server (linux) v*.tar.gz

* также обратите внимание, что из-за пробелов в названии необходимо ставить экраны ().

Переходим в каталог с установочным пакетом:

cd IOT Vega Server (linux) v1.2.1/x64/

* в моем примере используется 64-х битная система. Посмотреть версию используемой системы можно командой uname -i

Выполняем установку:

dpkg -i iot-vega-server-1.2.1.deb

Открываем на редактирование файл конфигурации:

vi /opt/iot-vega-server/settings.conf

Редактируем IP-адрес, на котором сервис должен работать:

ip=192.168.1.10

* в данном примере сервер будет слушать на адресе 192.168.1.10.

Запускаем сервер:

/opt/iot-vega-server/iot-vega-server.sh

Мы должны увидеть сообщение об успешном запуске:

INFO: Table queuetransmit is cleaned
INFO: Table «bufMacDevParams» is cleared
WebSocketServer has opened. Port[8002]
UDP socket has opened. IP[192.168.1.10:8001]
DEBUG: UdpServer handler is started
INFO: DB-secure scaner started…
DEBUG [CDevicesCountInfo]: vega[0], totalNonVega[1000], usedNonVega[0]
INFO: DB-secure scaner successfully finished

Оставим консоль и подключимся новой (еще одной). В списке прослушиваемых портов должны появиться 8001 и 8002:

ss -tunlp | grep 800[1,2]

udp  UNCONN  0  0  192.168.1.62:8001  *:*  users:((«iot-vega-server»,pid=4381,fd=13))
tcp  LISTEN  0  50  :::8002  :::*  users:((«iot-vega-server»,pid=4381,fd=6))

Для автозапуска сервиса меняем права скрипту в init.d:

chmod +x /etc/init.d/iot-vega-server

chown root:root /etc/init.d/iot-vega-server 

Разрешаем автозапуск сервиса и стартуем его:

systemctl enable iot-vega-server —now

Для проверки работы, можно перезагрузить сервер и после загрузки проверить состояние службы:

systemctl status iot-vega-server

Хранение данных в MariaDB / MySQL

По умолчанию, данные хранятся в своей внутренней базе. Для работы с другой СУБД выполняем ряд действий, описанных ниже.

Установка MariaDB

Сначала установим ее:

apt install mariadb-server

Разрешаем автозапуск и запускаем:

systemctl enable mysql —now

Задаем пароль суперпользователю mysql:

mysqladmin -u root password

Создание базы и пользователя в СУБД

Заходим в оболочку SQL:

mysql -uroot -p

Создаем базу данных:

> CREATE DATABASE lorawan_server DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

* в данном примере создана база lorawan_server.

Создаем пользователя и даем ему полные права на созданную базу:

> GRANT ALL PRIVILEGES ON lorawan_server.* TO vega@localhost IDENTIFIED BY ‘vega123’ WITH GRANT OPTION;

* в данном примере создана учетная запись vega с паролем vega123.

Выходим из оболочки sql:

> q

Настройка библиотек IOT VEGA

Для работы с MySQL необходимо, чтобы все библиотеки или симлинки на них находились в каталоге /opt/iot-vega-server. Для проверки библиотек, переходим в каталог:

cd /opt/iot-vega-server/sqldrivers

Запускаем команду:

LD_LIBRARY_PATH=/opt/iot-vega-server/ ldd libqsqlmysql.so | grep «not found»

В моем случае был ответ такой:

        libssl.so.10 => not found
        libcrypto.so.10 => not found

… это означает, что симлинки libssl.so.10 и libcrypto.so.10 ведут на несуществующие файлы. Сначала удалим неправильные ссылки:

rm /opt/iot-vega-server/libssl.so.10

rm /opt/iot-vega-server/libcrypto.so.10

Теперь найдем правильное местоположение библиотек:

find {/usr/lib,/lib} -name «libssl*»

find {/usr/lib,/lib} -name «libcrypto*»

* в данном примере мы пытаемся найти нужные нам библиотеки в каталогах /lib и /usr/lib. В одном из них должны находиться нужные нам библиотеки.

После создадим правильные симлинки на существующие файлы. У меня получилось так:

ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 /opt/iot-vega-server/libssl.so.10

ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /opt/iot-vega-server/libcrypto.so.10

Снова запускаем проверку:

LD_LIBRARY_PATH=/opt/iot-vega-server/ ldd libqsqlmysql.so | grep «not found»

… команда ничего не должна вернут.

Настройка Вега сервера

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

vi /opt/iot-vega-server/settings.conf

Редактируем следующее:


[external_db]

useExternalDb=1

userExternalDb=vega
passwordExternalDb=vega123

useExternalDb указывает, использовать ли внешнюю базу данных; userExternalDb задает имя пользователя; passwordExternalDb — пароль для пользователя базы.

Перезапускаем демона vega:

systemctl restart iot-vega-server

Проверяем работу сервиса:

systemctl status iot-vega-server

* если сервис запускается с ошибкой, снова открываем конфигурационный файл /opt/iot-vega-server/settings.conf и задаем настройки подключения к базе под пользователем root.

Установка Admin Tool

Для управления сервером с помощью веб-интерфейса, ставим веб-сервер и Admin Tool.

Веб-сервер

В качестве веб-сервера достаточно установить NGINX. Для его установки вводим:

apt install nginx

Разрешаем автозапуск и стартуем сервис:

systemctl enable nginx —now

Для проверки работы сервера открываем браузер и переходим на страницу http://<IP-адрес сервера>/ — должна откыться страница приветствия NGINX:

Страница приветствия NGINX

Admin Tool

Заходим на тот же сайт iotvega.com/product/server и копируем ссылку на портал управления:

Копируем ссылку на IOT Vega Admin Tool

С помощью данной ссылки скачиваем архив на сервер:

wget «https://iotvega.com/content/ru/soft/server/IOT%20Vega%20Admin%20Tool%20V1.1.4_ru.zip»

* так как в пути есть спецсимволы, необходимо адрес вставить в кавычки. В данном примере скачивается версия 1.1.4.

Устанавливаем unzip для распаковки архива:

apt install unzip

Распаковываем архив:

unzip IOT Vega Admin Tool V*.zip

Переносим каталог с порталом к домашнюю директорию веб-сервера:

mv IOT Vega Admin Tool V1.1.4_ru/Admin Tool /var/www/html/admin

Открываем настройки административной консоли:

vi /var/www/html/admin/config.js

Задаем адрес, на котором слушает сервер:

const address_ws = ‘ws://192.168.1.10:8002’;

* в данном примере мы поменяли IP на 192.168.1.10 и порт на 8002. Адрес должен быть внутренним, если мы будем заходить на сервер по внутренней сети или внешним, если заходить будем из сети Интернет.

Открываем браузер и переходим по адресу http://<IP-адрес сервера>/admin/ — должна открыться страница входа в Admin Tool.

Вводим логин root и пароль 123 (по умолчанию; задаются в настройках Vega Server — файле /opt/iot-vega-server/settings.conf, опция password).

Установка Pulse

IOT Vega Pulse является клиентским веб-приложением. Оно нужно для отображения информации, которая была собрана сервером.

Для установки нам нужен веб-сервер. Его мы устанавливали на этапе, когда разворачивали Admin Tool. Теперь нам нужно просто скачать и распаковать портал Pulse.

Заходим на страницу iotvega.com/product/app и копируем ссылку на стабильную версию Pulse:

Копируем ссылку на стабильную версию Pulse

С помощью данной ссылки скачиваем архив на сервер:

wget https://iotvega.com/content/ru/soft/app/IOT%20Vega%20Pulse%20V1.1.9_ru.zip

Распаковываем скачанный архив:

unzip IOT Vega Pulse V1.1.9_ru.zip

* у нас должен быть установлен пакет unzip.

Переносим портал в каталог веб-сервера:

mv IOT Vega Pulse V1.1.9_ru/Pulse /var/www/html/pulse

Открываем на редактирование конфигурационный файл Pulse:

vi /var/www/html/pulse/config.js

Задаем адрес, на котором слушает сервер:

const address_ws = ‘ws://192.168.1.10:8002’;

* в данном примере IP 192.168.1.10 и порт 8002.

Открываем браузер и переходим по адресу http://<IP-адрес сервера>/pulse/ — должна открыться страница входа в Pulse.

Вводим логин root и пароль 123 (по умолчанию; задаются в настройках Vega Server — файле /opt/iot-vega-server/settings.conf, опция password).

Настройка IotVegaNotifier

IOT Vega Notifier — программа для отправки оповещений по SIP. С ее помощью мы можем получить звонок или уведомление на телефон при возникновении тревожных событий.

Данный софт распространяется в виде контейнера docker и требует его установки в систему:

apt install docker.io

Разворачиваем приложение:

docker run -it -d —name iotveganotifier vegaabsolute/iotveganotifier:disco

Запускаем командную консоль внутри контейнера iotveganotifier:

docker exec -it iotveganotifier bash

Открываем на редактирование конфигурационный файл для IotVegaNotifier:

nano IotVegaNotifier/config.ini

Меняем настройки для подключения к серверу

[ws]
  #The address of the server WebSocket IotVega
address=ws://192.168.1.10:8002
  #The user of the server WebSocket IotVega
user=root
  #The user password
password=123

* мы должны указать адрес сервера VEGA, а также логин и пароль для подключения к нему. В данном примере у нас сервер с адресом 192.168.1.10; логин и пароль root 123 — те, что заданы по умолчанию.

После задаем настройки для SIP:

[sip]
  #Enabled sip to take voice messages
  #boolean
enabled=true
  #The host of the SIP
host=sip.siplink.pro
  #The user of the SIP
user=1234567890
  #The user password
password=passw0rd

* в данных настройках мы включаем поддержку SIP (enabled); указываем сервер, предоставляющий услугу телефонии (host); задаем логин и пароль на подключение аккаунта (user и password).

Закрываем редактор и перезапускаем сервис оповещений:

pm2 restart 0

Выходим из оболочки контейнера docker, нажав Ctrl + D.

Обновление 

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

mkdir /backup

IOT VEGA Server

При выходе новой версии сервера, можно обновить приложение стандартной установкой, в ходе которой будут внесены изменения в саму серверную часть и базу данных.

Перед обновлением необходимо сделать резервную копию базы данных и конфигурационного файла.

Создадим каталог для хранения архивов сервера:

mkdir /backup/server

а) В нашем примере мы используем базу MariaDB — соответственно, делаем дамп mysql:

mysqldump -v -uroot -p lorawan_server > /backup/server/mysqldump.lorawan_server.sql

б) Если же мы используем встроенную базу, просто копируем файл server.db:

cp /opt/iot-vega-server/server.db /backup/server/server.db

После резервирования базы данных, копируем конфигурационный файл:

cp /opt/iot-vega-server/settings.conf /backup/server/

Теперь можно загружать новую версию сервера:

wget «https://iotvega.com/content/ru/soft/server/IOT%20Vega%20Server%20(linux)%20v1.2.1.tar.gz»

Распаковываем архив:

tar -xvf IOT Vega Server (linux) v*.tar.gz

Переходим в каталог с установочным пакетом:

cd IOT Vega Server (linux) v1.2.1/x64/

* в моем примере используется 64-х битная система. Посмотреть версию используемой системы можно командой uname -i

Выполняем обновление:

dpkg -i iot-vega-server-1.2.1.deb

* обратите внимание, что процесс обновления не отличается от установки — система сама определит, что IOT VEGA Server установлен и обновит его.

IOT Vega Pulse

Копируем каталог с текущей версией в папку backup:

cp -r /var/www/html/pulse /backup/pulse.1.1.10

* где 1.1.10 — версия pulse, которая у нас используется в данный момент.

Скачиваем новую версию Vega Pulse:

wget https://iotvega.com/content/ru/soft/app/IOT%20Vega%20Pulse%20V1.1.11_ru.zip

* на момент обновления инструкции последняя версия была 1.1.11.

Если мы получим ошибку сертификата ERROR: cannot verify iotvega.com’s certificate, загружаем архив с добавлением опции —no-check-certificate:

wget —no-check-certificate https://iotvega.com/content/ru/soft/app/IOT%20Vega%20Pulse%20V1.1.11_ru.zip

Распаковываем скачанный архив:

unzip IOT Vega Pulse V1.1.11_ru.zip

Удаляем папку pulse с текущей версией программы:

rm -rf /var/www/html/pulse

Переносим портал в каталог веб-сервера:

mv IOT Vega Pulse V1.1.11_ru/Pulse /var/www/html/pulse

Возвращаем из резервной копии конфигурационный файл Pulse:

cp /backup/pulse.1.1.10/config.js /var/www/html/pulse/

Admin Tool

Процесс обновления Admin Tool схож с Pulse. Рассмотрим его по шагам.

Копируем каталог с текущей версией в папку backup:

cp -r /var/www/html/admin /backup/admin.1.1.4

* где 1.1.4 — версия admin tool, которая у нас используется в данный момент.

Скачиваем новую версию:

wget «https://iotvega.com/content/ru/soft/server/IOT%20Vega%20Admin%20Tool%20V1.1.5_ru.zip»

* на момент обновления инструкции последняя версия была 1.1.5.

Если мы получим ошибку сертификата ERROR: cannot verify iotvega.com’s certificate, загружаем архив с добавлением опции —no-check-certificate:

wget —no-check-certificate «https://iotvega.com/content/ru/soft/server/IOT%20Vega%20Admin%20Tool%20V1.1.5_ru.zip»

Распаковываем скачанный архив:

unzip IOT Vega Admin Tool V1.1.5_ru.zip

Удаляем папку admin с текущей версией программы:

rm -rf /var/www/html/admin

Переносим портал в каталог веб-сервера:

mv IOT Vega Admin Tool V1.1.5_ru/Admin Tool /var/www/html/admin

Возвращаем из резервной копии конфигурационный файл Pulse:

cp /backup/admin.1.1.4/config.js /var/www/html/admin/

Дополнительно

Разберем некоторые дополнительные настройки.

Смена пароля root

Это одна из первых вещей, которые нужно сделать. По умолчанию, логин с паролем root / 123 — это не безопасно и каждый сможет управлять сервером.

Открываем конфигурационный файл Vega Server:

vi /opt/iot-vega-server/settings.conf

Редактируем пароль пользователя root:

[root]
        # Login for super user
root=root
        # Password for super user (recommendation: change this password to your own)
password=newpassword

* где нужно поменять значение параметра password.

Перезапускать сервер не нужно. Заходим в Admin Tool и Pulse — проверяем, что теперь система пускает под новым паролем.

Вход на веб из вне

Необходимо, чтобы клиент (браузер) мог напрямую подключиться к серверу по порту tcp 8002. Для этого в конфигурационном файле Pulse или Admin Tool нужно задать параметр address_ws с использованием внешнего адреса, например:

const address_ws = ‘ws://90.156.242.197:8002’;

* в данном примере 90.156.242.197 — это мой внешний адрес. Вам необходимо задать свой.

Если сервер подключен к сети Интернет не напрямую, а через шлюз, необходимо пробросить порты 8001/UDP и 8002/TCP.

В системе Nekta есть интеграция с сетевым сервером IOT Vega Server компании Вега-Абсолют.

Данные от всех устройств, которые добавлены в IOT Vega Server, в режиме реального времени можно транслировать в ПО Nekta Cloud или Nekta Server.

Настройка передачи данных.

1. На сервере IOT Vega Server создать учетную запись с правами как на рисунке:

2. В Настройках компании во вкладке Сервисы настроить синхронизацию с IOT Vega Server. Для этого необходимо ввести «Логин» и «Пароль» от созданной учетной записи, «IP адрес» и «Порт», по которым осуществляется подключение к IOT Vega Server, Активировать сервис и нажать кнопку «Отправить». Особенности:

1. После настройки передачи данных, при добавлении устройств LoRaWan в Nekta, такие же устройства будут создаваться на IOT Vega Server. Если устройство на IOT Vega Server уже создано, то его название обновится.

2. Возможность получения данных с IOT Vega Server задается для учетной записи. Если созданы подкомпании, подобные настройки нужно применять для каждой из них. На сервере IOT Vega Server дополнительные настройки при этом не требуются.

Время на прочтение
10 мин

Количество просмотров 3K

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

Порядок действий для подключения к станции для её настройки:

1.     Подключить базовую станцию к POE-адаптеру;

2.     Подключить POE-адаптер к LAN разъему сетевого оборудования и подключить в сеть электропитания;

3.     Подключить базовую станцию к компьютеру по Ethernet; (или по USB)

4.     Убедиться, что станция получила IP-адрес от DHCP-сервера;

5.     Открыть программу PuTTY(или другом эмуляторе терминала), выполнить подключение по SSH по 22 порту на адрес станции

6.     Ввести в качестве логина root, а в качестве пароля – temppwd

7.     Программа Packet forwarder запускается автоматически при старте системы. Перед тем, как настраивать базовую станцию нужно завершить процесс Packet forwarder, набрав команду:

/etc/init.d/lora_watchdog stop

8.     Для изменения настроек необходимо в терминале набрать команду:

nano LoRa/packet_forwarder/lora_pkt_fwd/global_conf.json

9.     Листаем файл настроек вниз до строчки gateway_conf.

10.           В данном разделе нужно указать IP-адрес и UDP-порт сервера, указанные в файле настроек сервера settings.conf.

11.           После внесения изменений нажать ctrl+X – выход из файла. На предложенный вопрос о сохранении изменений нажать клавишу Y.

12.           После изменения настроек базовой станции необходимо снова запустить процесс отправки пакетов:

/etc/init.d/lora_watchdog start

Теперь станция может принимать пакеты.

Для хранения данных с оконечных устройств и дальнейших операции над них нужно развернуть сервер.

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

Скачать серверное ПО можно адресу.

В файле settings.conf нужно обратить внимание на следующие строки:

Параметр и значение по умолчанию

Комментарии

ip=127.0.0.1

Адрес сервера (по умолчанию свой)

root=root

Имя пользователя

password=123

Пароль пользователя

udpport=8001

Порт для передачи данных, должен совпадать с указанным на станции

После этого можно запустить файл iot-vega-server.exe и убедиться, что сервер работает.

О корректной работе сервера говорят строки UDP socket has opened и WebSocketServer has opened, а также отсутствие каких-либо сообщений об ошибках.

Также для просмотра данных с оконечных устройств и их настройки можно скачать веб-интерфейс AdminTool.

Скачать его можно по адресу

Для его настройки нужно зайти в файл confiоg.js и обратить внимание на следующую строку:

const address_ws = ‘ws://192.168.0.1:8002’;

Вместо адреса 192.168.0.1 нужно указать адрес вашего сервера, а вместо 8002 указать TCP-порт.

Далее нужно открыть файл index.html в браузере. В соответствующих полях нужно ввести имя и пароль, заданные в файле settings.conf. После этого появится главная страница сайта

Окно AdminTool

Окно AdminTool

Теперь, когда станция и сервер видят друг друга, и станция может посылать данные, пришедшие с оконечного устройства, можно настроить получение данных от оконечных устройств.

В качестве микроконтроллера для получения и передачи данных, полученных уже непосредственно от датчиков, была выбрана плата Arduino Uno. Для возможности передачи данных на частотах LoRa, необходимо подключить радио модуль RFM95W.
Антенну для 868-й частоты рекомендуется делать 82-83мм

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

Далее будет написан код для платы. В нём стоит обратить внимание на следующие строки:

1.     Аутефикационные реквизиты для устройств:

static const PROGMEM u1_t NWKSKEY[16] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3E };
static const u1_t PROGMEM APPSKEY[16] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3D };
static const u4_t DEVADDR = 0x00000013 ;

Тут нужно для каждого устройства написать свои реквизиты.

2.     Функция do_send, в которой мы отправляем сам контента так же именно здесь с ним нужно работать

void do_send(osjob_t* j){
    if (LMIC.opmode & OP_TXRXPEND) {
        Serial.println(F("OP_TXRXPEND, not sending"));
    } else {
        LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
        Serial.println(F("Packet queued"));
    }
}

Пример подключения:

3.     Интервал передачи данных

const unsigned TX_INTERVAL = 5;

Значение переменной задаёт время между отправкой пакетов в секундах.

4.     В методе setup() нужно инициировать датчик. Конкретная инструкция варьируется в зависимости от устройства.

До строки «Serial.println(F(«Packet queued»));» нужно присвоить переменной mydata нужные данные, то есть, используя методы при работы с датчиком. Методы Serial.println() и Serial.print() выводят их аргумент на последовательный порт, который можно прослушать с помощью PuTTY или редактора кода для Ардуино.

Не забудьте подключить библиотеки!

Листинг:

#include <lmic.h>
#include <hal/hal.h>
#include <SPI.h>

// LoRaWAN NwkSKey, network session key
// This is the default Semtech key, which is used by the prototype TTN
// network initially.
static const PROGMEM u1_t NWKSKEY[16] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3B };

// LoRaWAN AppSKey, application session key
// This is the default Semtech key, which is used by the prototype TTN
// network initially.
static const u1_t PROGMEM APPSKEY[16] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C };

// LoRaWAN end-device address (DevAddr)
static const u4_t DEVADDR = 0x00000012 ; // <-- Change this address for every node!

// These callbacks are only used in over-the-air activation, so they are
// left empty here (we cannot leave them out completely unless
// DISABLE_JOIN is set in config.h, otherwise the linker will complain).
void os_getArtEui (u1_t* buf) { }
void os_getDevEui (u1_t* buf) { }
void os_getDevKey (u1_t* buf) { }

static char mydata[] = "Hello, world!";
static osjob_t sendjob;

// Schedule TX every this many seconds (might become longer due to duty
// cycle limitations).
const unsigned TX_INTERVAL = 2;

// Pin mapping
const lmic_pinmap lmic_pins = {
    .nss = 6,
    .rxtx = LMIC_UNUSED_PIN,
    .rst = 10,
    .dio = {2, 3, 4},
};
int counter = 0;
void onEvent (ev_t ev) {
    Serial.print(os_getTime());
    Serial.print(": ");
    switch(ev) {
        case EV_SCAN_TIMEOUT:
            Serial.println(F("EV_SCAN_TIMEOUT"));
            break;
        case EV_BEACON_FOUND:
            Serial.println(F("EV_BEACON_FOUND"));
            break;
        case EV_BEACON_MISSED:
            Serial.println(F("EV_BEACON_MISSED"));
            break;
        case EV_BEACON_TRACKED:
            Serial.println(F("EV_BEACON_TRACKED"));
            break;
        case EV_JOINING:
            Serial.println(F("EV_JOINING"));
            break;
        case EV_JOINED:
            Serial.println(F("EV_JOINED"));
            break;
        case EV_RFU1:
            Serial.println(F("EV_RFU1"));
            break;
        case EV_JOIN_FAILED:
            Serial.println(F("EV_JOIN_FAILED"));
            break;
        case EV_REJOIN_FAILED:
            Serial.println(F("EV_REJOIN_FAILED"));
            break;
            break;
        case EV_TXCOMPLETE:
            Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
            if(LMIC.dataLen) {
                // data received in rx slot after tx
                Serial.print(F("Data Received: "));
                Serial.write(LMIC.frame+LMIC.dataBeg, LMIC.dataLen);
                Serial.println();
            }
            // Schedule next transmission
            os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
            break;
        case EV_LOST_TSYNC:
            Serial.println(F("EV_LOST_TSYNC"));
            break;
        case EV_RESET:
            Serial.println(F("EV_RESET"));
            break;
        case EV_RXCOMPLETE:
            // data received in ping slot
            Serial.println(F("EV_RXCOMPLETE"));
            break;
        case EV_LINK_DEAD:
            Serial.println(F("EV_LINK_DEAD"));
            break;
        case EV_LINK_ALIVE:
            Serial.println(F("EV_LINK_ALIVE"));
            break;
         default:
            Serial.println(F("Unknown event"));
            break;
    }
}

void do_send(osjob_t* j){
    // Check if there is not a current TX/RX job running
    if (LMIC.opmode & OP_TXRXPEND) {
        Serial.println(F("OP_TXRXPEND, not sending"));
    } else {
        // Prepare upstream data transmission at the next possible time.
        LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
        Serial.println(F("Packet queued"));
    }
    // Next TX is scheduled after TX_COMPLETE event.
}

void setup() {
    Serial.begin(115200);
    Serial.println(F("Starting"));

    #ifdef VCC_ENABLE
    // For Pinoccio Scout boards
    pinMode(VCC_ENABLE, OUTPUT);
    digitalWrite(VCC_ENABLE, HIGH);
    delay(1000);
    #endif

    // LMIC init
    os_init();
    // Reset the MAC state. Session and pending data transfers will be discarded.
    LMIC_reset();

    // Set static session parameters. Instead of dynamically establishing a session
    // by joining the network, precomputed session parameters are be provided.
    #ifdef PROGMEM
    // On AVR, these values are stored in flash and only copied to RAM
    // once. Copy them to a temporary buffer here, LMIC_setSession will
    // copy them into a buffer of its own again.
    uint8_t appskey[sizeof(APPSKEY)];
    uint8_t nwkskey[sizeof(NWKSKEY)];
    memcpy_P(appskey, APPSKEY, sizeof(APPSKEY));
    memcpy_P(nwkskey, NWKSKEY, sizeof(NWKSKEY));
    LMIC_setSession (0x1, DEVADDR, nwkskey, appskey);
    #else
    // If not running an AVR with PROGMEM, just use the arrays directly 
    LMIC_setSession (0x1, DEVADDR, NWKSKEY, APPSKEY);
    #endif

    // Set up the channels used by the Things Network, which corresponds
    // to the defaults of most gateways. Without this, only three base
    // channels from the LoRaWAN specification are used, which certainly
    // works, so it is good for debugging, but can overload those
    // frequencies, so be sure to configure the full frequency range of
    // your network here (unless your network autoconfigures them).
    // Setting up channels should happen after LMIC_setSession, as that
    // configures the minimal channel set.
    LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI);      // g-band
    LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK,  DR_FSK),  BAND_MILLI);      // g2-band
        // Disable link check validation
    LMIC_setLinkCheckMode(0);

    // Set data rate and transmit power (note: txpow seems to be ignored by the library)
    LMIC_setDrTxpow(DR_SF7,14);

    // Start job
    do_send(&sendjob);
    //os_runloop_once();
}

void loop() {
    os_runloop_once();
}

Этот код есть шаблоном для конкретного устройства. В нём вам нужно исправить несколько строк кода в зависимости от датчика и настроек устройств на сервере.

Пример для датчика освещения:

#include <lmic.h>
#include <hal/hal.h>
#include <SPI.h>
#include <stdlib.h>

#define PIN_DIGITAL_RAIN_SENSOR 7

// LoRaWAN NwkSKey, network session key
static const PROGMEM u1_t NWKSKEY[16] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3E };

// LoRaWAN AppSKey, application session key
static const u1_t PROGMEM APPSKEY[16] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3D };

// LoRaWAN end-device address (DevAddr)
static const u4_t DEVADDR = 0x00000013 ; 

void os_getArtEui (u1_t* buf) { }
void os_getDevEui (u1_t* buf) { }
void os_getDevKey (u1_t* buf) { }

static char mydata[] = "Packet# 00";
//static char mydata[] = "123456789012345678901234567890123456789012345678901";//51 - доставляет, 52 - отправляет пустое сообщение, 53 - не отправляет
static osjob_t sendjob;

// Schedule TX every this many seconds (might become longer due to duty
// cycle limitations).
const unsigned TX_INTERVAL = 5;

// Pin mapping
const lmic_pinmap lmic_pins = {
    .nss = 6,
    .rxtx = LMIC_UNUSED_PIN,
    .rst = 10,
    .dio = {2, 3, 4},
};

void onEvent (ev_t ev) {
    Serial.print(os_getTime());
    Serial.print(": ");
    switch(ev) {
        case EV_SCAN_TIMEOUT:
            Serial.println(F("EV_SCAN_TIMEOUT"));
            break;
        case EV_BEACON_FOUND:
            Serial.println(F("EV_BEACON_FOUND"));
            break;
        case EV_BEACON_MISSED:
            Serial.println(F("EV_BEACON_MISSED"));
            break;
        case EV_BEACON_TRACKED:
            Serial.println(F("EV_BEACON_TRACKED"));
            break;
        case EV_JOINING:
            Serial.println(F("EV_JOINING"));
            break;
        case EV_JOINED:
            Serial.println(F("EV_JOINED"));
            break;
        case EV_RFU1:
            Serial.println(F("EV_RFU1"));
            break;
        case EV_JOIN_FAILED:
            Serial.println(F("EV_JOIN_FAILED"));
            break;
        case EV_REJOIN_FAILED:
            Serial.println(F("EV_REJOIN_FAILED"));
            break;
            break;
        case EV_TXCOMPLETE:
            Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
            if(LMIC.dataLen) {
                // data received in rx slot after tx
                Serial.print(F("Data Received: "));
                Serial.write(LMIC.frame+LMIC.dataBeg, LMIC.dataLen);
                Serial.println();
            }
            // Schedule next transmission
            os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
            break;
        case EV_LOST_TSYNC:
            Serial.println(F("EV_LOST_TSYNC"));
            break;
        case EV_RESET:
            Serial.println(F("EV_RESET"));
            break;
        case EV_RXCOMPLETE:
            // data received in ping slot
            Serial.println(F("EV_RXCOMPLETE"));
           
            break;
        case EV_LINK_DEAD:
            Serial.println(F("EV_LINK_DEAD"));
            break;
        case EV_LINK_ALIVE:
            Serial.println(F("EV_LINK_ALIVE"));
            break;
         default:
            Serial.println(F("Unknown event"));
            break;
    }
}

String tempstr="";
void do_send(osjob_t* j){
    // Check if there is not a current TX/RX job running
    if (LMIC.opmode & OP_TXRXPEND) {
        Serial.println(F("OP_TXRXPEND, not sending"));
    } else {
        int sensorValue = digitalRead(PIN_DIGITAL_RAIN_SENSOR); // Считываем данные с цифрового порта
        
        tempstr = "IsDark?: " + String(sensorValue);
        tempstr.toCharArray(mydata, 20);
        
        Serial.println(F("Packet queued"));
        Serial.print(F("Sent payload: "));
        Serial.println(mydata);
        
        LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
    }
    // Next TX is scheduled after TX_COMPLETE event.
}

void setup() {
    Serial.begin(115200);
    Serial.println(F("Starting"));

    #ifdef VCC_ENABLE
    // For Pinoccio Scout boards
    pinMode(VCC_ENABLE, OUTPUT);
    digitalWrite(VCC_ENABLE, HIGH);
    delay(1000);
    #endif

    // LMIC init
    os_init();
    // Reset the MAC state. Session and pending data transfers will be discarded.
    LMIC_reset();

    // Set static session parameters. Instead of dynamically establishing a session
    // by joining the network, precomputed session parameters are be provided.
    #ifdef PROGMEM
    // On AVR, these values are stored in flash and only copied to RAM
    // once. Copy them to a temporary buffer here, LMIC_setSession will
    // copy them into a buffer of its own again.
    uint8_t appskey[sizeof(APPSKEY)];
    uint8_t nwkskey[sizeof(NWKSKEY)];
    memcpy_P(appskey, APPSKEY, sizeof(APPSKEY));
    memcpy_P(nwkskey, NWKSKEY, sizeof(NWKSKEY));
    LMIC_setSession (0x1, DEVADDR, nwkskey, appskey);
    #else
    // If not running an AVR with PROGMEM, just use the arrays directly 
    LMIC_setSession (0x1, DEVADDR, NWKSKEY, APPSKEY);
    #endif

    // Set up the channels used by the Things Network
    LMIC_setupChannel(0, 868900000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(1, 869100000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI);      // g-band
    LMIC_setupChannel(2, 864100000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(3, 864300000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(4, 864500000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(5, 864700000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(6, 864900000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(7, 866100000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(8, 866300000, DR_RANGE_MAP(DR_FSK,  DR_FSK),  BAND_MILLI);      // g2-band

    // Disable link check validation
    LMIC_setLinkCheckMode(0);

    // Set data rate and transmit power (note: txpow seems to be ignored by the library)
    LMIC_setDrTxpow(DR_SF7,14);

    // Start job
    do_send(&sendjob);
}

void loop() {
    os_runloop_once();
}
  • 1
  • 2 ШАГ 1: Подготовка программного обеспечения
  • 3 ШАГ2: Продолжение подготовки ПО
  • 4 ШАГ3:
  • 5 ШАГ4:

ШАГ 1: Подготовка программного обеспечения

 «>http://iotvega.com/-&gt;

    Раздел СОФТ> SERVER->IOT Vega Server v1.0.4 для Windows
     Описание IOT Vega Server rev04.pdf стр.6 ->меняем file: settings.conf
        ip: server
        udp: для БС
        tcp: для AdminTools
    СОФТ> SERVER-> Admin Tool v1.0.3-> index.html
        login: root
        password: 123

         ws://89.189.183.233:8002 (local:127.0.0.1) (TCP –порт для приложений)

ШАГ2: Продолжение подготовки ПО

«>http://iotvega.com/-&gt;

 Раздел ОБОРУДОВАНИЕ> БС-2-> Руководство по эксплуатации

Для

 PuTTY или Terminal 1.9b ->Подключение по SSH IP:22, по Telnet IP:23 или по USB to COM port
 login: root
 password: temppwd
 STOP: /etc/init.d/lora_watchdog stop
 EDIT: nano LoRa/packet_forwarder/lora_pkt_fwd/global_conf.json
 «gateway_conf»: 
 {«gateway_ID»: «0000e8eb11416581»,
 /* change with default server address/ports, or overwrite in local_conf.json */
 «server_address»: «192.168.0.100», (Ipser- целевой адрес сервера)
 «serv_port_up»: 8001, (UDP – порт, только для связи с БС1/2)
 «serv_port_down»: 8001,
 /* adjust the following parameters for your network */
 «keepalive_interval»: 10,
 «stat_interval»: 30,
 «push_timeout_ms»: 100,
 /* GPS configuration */
 «gps_tty_path»: «/dev/ttyO1»,
 /* forward only valid packets */
 «forward_crc_valid»: true,
 «forward_crc_error»: false,
 «forward_crc_disabled»: false 
 START: /etc/init.d/lora_watchdog stop

Изменить и скопировать данные выделенные красным

ШАГ3:

 

  Gateways-> «+» -> gateway_ID> 0000e8eb11416581 
  Devices-> «+» -> Заполнить необходимые поля для OTAA или ABP
 информацию скопировать из 
 Vega LoRaWAN Configurator ver.1.0.3
Или считать QR-код с крышки СИ-11/13
Переписать данные с PCB СИ-11/13 вручную.

ШАГ4:

Проверить, что запущен SERVER (DOS окно и корректно открыт IPserv:PORT) 

Включена ли БС-1/2 (ping: IPbs ≠ IPserv)
Нажать кнопку JOIN на СИ-11/13 (увидеть JOIN пакет на сервере)
Открыть ADMINTOOL Gateways (просмотр Latency <65k)

Открыть ADMINTOOL Devices (просмотр LOG диалога с сервером)

Понравилась статья? Поделить с друзьями:
  • Гроприносин сироп для детей купить инструкция
  • Руководство главного управления мчс россии по амурской области
  • Препарат топаз инструкция по применению цена
  • Опель кадет 1984 руководство по эксплуатации
  • Аст 001 аппарат системной терапии инструкция