+7(952) 531-56-65

out4ru@gmail.com

Процессорные модули » Статьи » Статья 15. Сборка OpenWRT для EV-iMX6UL-NANO

Статья 15. Сборка OpenWRT для EV-iMX6UL-NANO


Описание


В прошлый раз мы уже собирали OpenWRT для модулей на основе процессоров iMX287 (O4-iMX287-NANO) и NUC980 (O4-NUC980-NANO) сейчас рассмотрим установку системы OpenWRT на модули базирующиеся на популярном процессоре компании NXP семейства iMX6ULL и iMX6UL O4-IMX6UL-SODIMM, EV-iMX6UL-NANO, iMX6UL-M2. Данный процессор выделаяется отличной сбалансированностью цена/набор интерфейсов/производительность. 
Как всегда вам потребуется компьютер с операционной системой Linux, мы использовали Ubuntu 20.04 LTS. В этот раз установка будет еще проще. 
Установите необходимые пакеты 

sudo apt-get install git subversion build-essential libncurses5-dev ncurses-term gawk

Создадим каталог с произвольным названием, например openwrt

mkdir /home/USER/openwrt
cd /home/USER/openwrt/

вместо USER у вас будет ваше имя пользователя
Теперь склонируем репозиторий

git clone https://github.com/out4ru/openwrt-6ull.git

Перейдем в каталог

cd openwrt-imx6ull

Запустим пару скриптов, они обновят и установят пакеты

./scripts/feeds update  -a
./scripts/feeds install -a

запустим menuconfig и выберем в Target System процессор Freescale i.MX6UL, а в Target Profile нужный модуль 


перейдем в меню boot и выберем u-boot соотвествующий модулю



и выйдем, сохранив изменения.

Запустим процесс сборки.

make V=s

Если ваш процессоров в компьютере имеет число ядер больше чем одно, используйте параметр -j((число ядер * 2) +1). На Ryzen 9 3900X (12 ядер) это выглядит так

make -j25 V=s

Система загрузит все необходимые исходники и начнет сборку. В зависимости от производительности вашего компьютера сборка может длиться от 5 мин до часа.



По окончанию сборки в каталоге bin/targets/imx6ul/generic вы найдете каталог 

  • u-boot-ev-imx6ul-nano с загрузчиком u-boot.imx внутри, если выбрали вариант сборки модуля EV-iMX6UL-NANO
  • u-boot-ev-imx6ul-m2 с загрузчиком u-boot.imx внутри, если выбрали вариант сборки модуля EV-iMX6UL-M2 
  • u-boot-o4-imx6ul-sodimm с загрузчиком u-boot.imx внутри, если выбрали вариант сборки модуля O4-iMX6UL-SODIMM

и файлы (в зависимости от выбранного модуля в менюконфиг)
Ядро Линукс 
  • openwrt-imx6ul-ev-imx6ul-nano-zImage
  • openwrt-imx6ul-ev-imx6ul-m2-zImage
  • openwrt-imx6ul-o4-imx6ul-sodimm-zImage

Файл описания железа
  • openwrt-imx6ul-ev-o4-imx6ul-nano.dtb
  • openwrt-imx6ul-ev-imx6ul-m2.dtb
  • openwrt-imx6ul-o4-imx6ul-sodimm.dtb

и архив с собранной файловой системой OpenWRT
  • openwrt-imx6ul-ev-imx6ul-nano-rootfs.tar.gz
  • openwrt-imx6ul-ev-imx6ul-nano-rootfs.tar.gz
  • openwrt-imx6ul-o4-imx6ul-sodimm-rootfs.tar.gz

Этот комплект из четырех файлов (загрзчик, ядро, файл описания железа, архив с файловой системой) вам потребуется для записи в модуль с помощью утилиты MFGTools.
В конце данной статьи находится ссылка на архив с программой MFGTools и набором уже собранных файлов. Вы можете заменить их своими файлами. Внутри архива находится файл *.vbs скрипта, в котором вы можете изменить названия записываемых файлов, если по какой-то причине их переименуете:

Set wshShell = CreateObject("WScript.shell")
wshShell.run "mfgtool2.exe -c ""linux"" -l ""SDCard"" -s ""board=sabresd"" -s ""mmc=1"" -s ""zImage_file=openwrt-imx6ul-o4-imx6ul-sodimm-zImage"" -s ""rootfs_file=openwrt-imx6ul-o4-imx6ul-sodimm-rootfs"" -s ""dtb_file=openwrt-imx6ul-o4-imx6ul-sodimm"" "
Set wshShell = Nothing 

Параметр zImage_file указывает на имя ядра
Параметр rootfs_file указывает на имя архива с файловой системой
Параметр dtb_file указывает на файл описания железа
Обратите внимания, что имена файлов указываются без расширения (tar.gz, dtb)

Подключите плату к компьютеру с помощью USB кабеля, подайте питание, установите режим загрузки с USB интерфейса (дип переключателями). Если дип переключатели не предусмотрены на плате, то после запустите терминальную программу, прервите выполнение загрузчика u-boot нажатием любой кнопки и введите команды

mmc dev 1
mmc erase 0  1000
res

Первая команда установит текущим устройством микросхему памяти eMMC,  вторая команда затрет загрузочную область, третья выполнит сброс платы. Теперь модуль готов к записи файлов. Запустите vbs скрипт и нажмите кнопку старт. Через 1-2 минуты все файлы будут записаны и чем сигнализирует зеленый цвет индикатора прогресса записи. Отключаем USB кабель и нажимаем кнопку сброса на плате.

Готово!
Немного о том что собирается данной системой:
u-boot - мы взяли версию 2020.04 из вендорного репозитория https://github.com/Freescale
OpenWRT при сборке его устанавливает в /build_dir/target-arm_cortex-a7+neon_musl_eabi/
в него добавили свой defconfig-и
  • configs/o4-imx6ul-sodimm_defconfig 
  • configs/ev-imx6ul-m2_defconfig
  • configs/ev-imx6ul-nano_defconfig

Добавили борд файлы
  • board/out4/o4-imx6ul-sodimm
  • board/evodbg/ev-imx6ul-nano
  • board/evodbg/ev-imx6ul-m2

и добавили файлы конфигов
  • include/ev-imx6ul-nano.h
  • include/ev-imx6ul-m2.h
  • include/o4-imx6ul-sodimm.h
также каждому модулю соотвествует свой dts файл (из линукса они уже перекочевали в uboot)
  • arch/arm/dts/imx6ull-nano-evodbg.dts
  • arch/arm/dts/imx6ull-m2-evodbg.dts
  • arch/arm/dts/imx6ull-sodimm-out4.dts
В u-boot настроена работа с сетью, USB интерфейс, I2C интерфейс. 
Ядро Линукс. Используется ядро версии 4.19.
OpenWRT при сборке его устанавливает в /build_dir/target-arm_cortex-a7+neon_musl_eabi//linux-imx6ul/linux-4.19.123
Была попытка использовать свежее ядро 5.4 но оно не впечатлило, поэтому откатились на проверенное временем 4.19. Вы можете попробовать собрать любую версию, достаточно в makefile изменить номер версии и переименовать файл config-4.19 в то что вы планируете использовать (config-5.4 например). Возможно также придется немного подправить сам конфиг.

dts файлы модулей находятся по следующему пути

/linux-4.19.123/arch/arm/boot/dts/ev-o4-imx6ul-nano.dts
/linux-4.19.123/arch/arm/boot/dts/ev-imx6ul-m2.dts
/linux-4.19.123/arch/arm/boot/dts/o4-imx6ul-sodimm.dts

Файловая система собирает все то, напротив чего вы поставите галочки. 
Удачной сборки!

Часть 2.
Чтобы продемонстрировать практическое примение процессорных модулей, мы рассмотрим процесс создания и настройки базовой станции (gateway) LoRaWAN, служащей посредником между LoRa датчиками класса A (только батарейное питание) и сервером приложений. Для этой цели, мы разработали печатную плату базовой станции на основе модуля EV-iMX6UL-NANO. Почему именно этот модуль - в требованиях было наличие двух Ethernet интерфейсов, 3G модема, WiFi и пары RS485 портов для связи с оборудованием. Модуль EV-iMX6UL-NANO полностью удовлетворял данным требованиям по интерфейсам, имеет мощный процессор архитектуры Cortex-A7 с частотой 800МГц, 512 МБайт памяти DDR3 и 4 ГБайта постоянной памяти eMMC. 
В качестве многоканального приемника LoRaWAN применен модуль RAK833 компании RAKwireless построенный на микросхеме SX1301 компании Semtech. 















Модуль приемника связан с процессорным модулем с помощью интерфейса SPI, 3G модем подключен с помощью USB интерфейса, к самому модему посредством мультиплексора подключается одна из двух симкарт. WiFi модуль также подключен по USB интерфейсу, использован модуль на микросхеме Realtek RTL8723BU. На этом же интерфейсе (USB0) сидит разъем USB для программирования модуля EV-iMX6UL-NANO. Перед процессом программирования питание WiFi модуля отключается с помощью перемычки, чтобы он не мешал. 
Два гальванически изолированных трансивера RS485 интерфейса ISO1500 компании Texas Instruments подключены к выводам UART-ов процессорного модуля. Для отображения служебной информации предусмотрен небольшой графический OLED индикатор  на базе микросхемы SSD1306, подключенный к I2C интерфейсу процессорного модуля.
Для питания базовой станции предусмотрен PoE модуль AG5300 компании Silvertel. Питание можем поступать по любому из Ethernet интерфейсов. Клемный соединитель позволяет подключить внешние (основной и резервный) источники напряжения 36-55В. 
Это в краткой форме то что касается аппаратной части изделия.
Для реализации программной части потребуется загрузчик, ядро, и файловая система OpenWRT. В файловой системе основой служит форвардер пакетов https://github.com/Lora-net/packet_forwarder
По неизвестной причине, в самой OpenWRT есть утилиты для работы с приемником SX1301, утилиты для тестирования и проверки стрессоустойчивости, но нет самого форвардера пакетов. Мы добавили его в систему, чтобы он компилировался вместе с основной файловой системой.


После окончания процесса сборки, файловую систему в распакованном виде можно найти по следующему пути:
/staging_dir/target-arm_cortex-a7+neon_musl_eabi/root-imx6ul/
В каталоге /usr/sbin мы видим собранные файлы форвардера пакетов (lora_pkt_fwd) и набор тестов и утилит для проверки.


Запишем все это в модуль и начнем настройку. Одним из важных моментов является аппаратный сброс модуля RAK833. В нашем случае он подключен к выводу GPIO3_IO10 модуля EV-iMX6UL-NANO. Простой скрипт настраивает вывод как выход и формирует  перепад 1->0 (активный уровень - низкий!)

echo 74 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio74/direction
echo 1 > /sys/class/gpio/gpio74/value
echo 0 > /sys/class/gpio/gpio74/value

команда test_loragw_spi  тестирует SPI интерфейс

root@OpenWrt:~# test_loragw_spi
Beginning of test for loragw_spi.c
data received (simple read): 48
End of test for loragw_spi.c
root@OpenWrt:~#

утилита util_spi_stress опять таки гоняет по нему данные 

root@OpenWrt:~# util_spi_stress
INFO: Starting LoRa concentrator SPI stress-test number 1
Cycle 0 > did 1000 R/W on an 8 bits reg with no error
Cycle 1 > did 1000 R/W on an 8 bits reg with no error
Cycle 2 > did 1000 R/W on an 8 bits reg with no error
Cycle 3 > did 1000 R/W on an 8 bits reg with no error
Cycle 4 > did 1000 R/W on an 8 bits reg with no error
Cycle 5 > did 1000 R/W on an 8 bits reg with no error
Cycle 6 > did 1000 R/W on an 8 bits reg with no error
Cycle 7 > did 1000 R/W on an 8 bits reg with no error
Cycle 8 > did 1000 R/W on an 8 bits reg with no error
Cycle 9 > did 1000 R/W on an 8 bits reg with no error
Cycle 10 > did 1000 R/W on an 8 bits reg with no error
Cycle 11 > did 1000 R/W on an 8 bits reg with no error
Cycle 12 > did 1000 R/W on an 8 bits reg with no error
Cycle 13 > did 1000 R/W on an 8 bits reg with no error
Cycle 14 > did 1000 R/W on an 8 bits reg with no error
Cycle 15 > did 1000 R/W on an 8 bits reg with no error
Cycle 16 > did 1000 R/W on an 8 bits reg with no error
Cycle 17 > did 1000 R/W on an 8 bits reg with no error
Cycle 18 > did 1000 R/W on an 8 bits reg with no error
Cycle 19 > did 1000 R/W on an 8 bits reg with no error
Cycle 20 > did 1000 R/W on an 8 bits reg with no error
Cycle 21 > did 1000 R/W on an 8 bits reg with no error
Cycle 22 > did 1000 R/W on an 8 bits reg with no error
Cycle 23 > did 1000 R/W on an 8 bits reg with no error
Cycle 24 > did 1000 R/W on an 8 bits reg with no error
Cycle 25 > did 1000 R/W on an 8 bits reg with no error
Cycle 26 > did 1000 R/W on an 8 bits reg with no error
Cycle 27 > did 1000 R/W on an 8 bits reg with no error
Cycle 28 > did 1000 R/W on an 8 bits reg with no error
Cycle 29 > did 1000 R/W on an 8 bits reg with no error
Cycle 30 > did 1000 R/W on an 8 bits reg with no error
Cycle 31 > did 1000 R/W on an 8 bits reg with no error
Cycle 32 > did 1000 R/W on an 8 bits reg with no error
Cycle 33 > did 1000 R/W on an 8 bits reg with no error
Cycle 34 > did 1000 R/W on an 8 bits reg with no error
Cycle 35 > did 1000 R/W on an 8 bits reg with no error
Cycle 36 > did 1000 R/W on an 8 bits reg with no error
^CCycle 37 > did 1000 R/W on an 8 bits reg with no error
INFO: Exiting LoRa concentrator SPI stress-test program
root@OpenWrt:~#

Команда test_loragw_reg прочитает регистры SX1301

root@OpenWrt:~# test_loragw_reg
Beginning of test for loragw_reg.c
Start of register verification
+++MATCH+++ reg number 0 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 1 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 2 read: 103 (67) default: 103 (67)
+++MATCH+++ reg number 3 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 4 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 5 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 6 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 7 read: 0 (0) default: 0 (0)
###MISMATCH### reg number 8 read: 201 (c9) default: 0 (0)
+++MATCH+++ reg number 9 read: 0 (0) default: 0 (0)
###MISMATCH### reg number 10 read: 138 (8a) default: 0 (0)
+++MATCH+++ reg number 11 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 12 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 13 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 14 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 15 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 16 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 17 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 18 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 19 read: 1 (1) default: 1 (1)
+++MATCH+++ reg number 20 read: 1 (1) default: 1 (1)
+++MATCH+++ reg number 21 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 22 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 23 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 24 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 25 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 26 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 27 read: 0 (0) default: 0 (0)
-------
+++MATCH+++ reg number 321 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 322 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 323 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 324 read: 0 (0) default: 0 (0)
+++MATCH+++ reg number 325 read: 0 (0) default: 0 (0)
End of register verification
IMPLICIT_PAYLOAD_LENGHT = 197 (should be 197)
FRAME_SYNCH_PEAK2_POS = 11 (should be 11)
PREAMBLE_SYMB1_NB = 49253 (should be 49253)
ADJUST_MODEM_START_OFFSET_SF12_RDX4 = 3173 (should be 3173)
IF_FREQ_1 = -1947 (should be -1947)
End of test for loragw_reg.c
root@OpenWrt:~#

Теперь начнем подготовку серверной части. Здесь приведена достаточно полная инструкция по настройке. В качестве сервера мы пока используем тот же компьютер с Ubuntu, на котором производили сборку OpenWRT. Установим требующиеся пакеты:

sudo apt install mosquitto mosquitto-clients redis-server redis-tools postgresql

Первым делом создадим и настроим базу данных PostgreSQL

out4@out4:~$ sudo -u postgres psql
psql (12.2 (Ubuntu 12.2-4))
Type "help" for help.
postgres=# create role chirpstack_as with login password 'dbpassword';
CREATE ROLE
postgres=# create role chirpstack_ns with login password 'dbpassword';
CREATE ROLE
postgres=# create database chirpstack_as with owner chirpstack_as;
CREATE DATABASE
postgres=# create database chirpstack_ns with owner chirpstack_ns;
CREATE DATABASE
postgres=# \c chirpstack_as
You are now connected to database "chirpstack_as" as user "postgres".
chirpstack_as=# create extension pg_trgm;
CREATE EXTENSION
chirpstack_as=# create extension hstore;
CREATE EXTENSION
chirpstack_as=# \q
out4@out4:~$

Доустановим в систему dirmngr и apt-transport-https

sudo apt install apt-transport-https dirmngr

Настроим ChirpStack репозиторий

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1CE2AFD36DBCCA00
sudo echo "deb https://artifacts.chirpstack.io/packages/3.x/deb stable main" | sudo tee /etc/apt/sources.list.d/chirpstack.list
sudo apt update

Устанавливаем ChirpStack Gateway bridge

sudo apt install chirpstack-gateway-bridge

Устанавливаем ChirpStack Network Server

sudo apt install chirpstack-network-server

Устанавливаем ChirpStack Application Server

sudo apt install chirpstack-application-server

Вот они 



В каждом из каталогов (chirpstack-application-server, chirpstack-gateway-bridge, chirpstack-network-server) имеется свой конфигурационный *.toml файл.

Если посмотреть содержимое директории /etc командой 

ls -la

то видно, что владельцами каталогов chirpstack-application-server, chirpstack-gateway-bridge, chirpstack-network-server являются пользователи appserver, gatewaybridge и т.п., которых у меня в системе нет. При попытках повторить инструкцию с сайта это вызывает множество ошибок. Поэтому, поступаем проще, создадим отдельный каталог, например Server

mkdir /home/out4/Server

В нем создадим еще три подкаталога 

mkdir /home/out4/Server/Bridge
mkdir /home/out4/Server/NetworkServer
mkdir /home/out4/Server/ApplicationServer

В них скопируем исполняемые файлы

cp /usr/bin/chirpstack-gateway-bridge  /home/out4/Server/Bridge
cp /usr/bin/chirpstack-application-server /home/out4/Server/ApplicationServer
cp /usr/bin/chirpstack-network-server  /home/out4/Server/NetworkServer

затем в режиме суперпользователя скопируем конфигурационные файлы

sudo su
cp /etc/chirpstack-network-server/chirpstack-network-server.toml /home/out4/Server/NetworkServer
cp /etc/chirpstack-gateway-bridge/chirpstack-gateway-bridge.toml /home/out4/Server
cp /etc/chirpstack-application-server/chirpstack-application-server.toml /home/out4/Server
exit

Изменим владельца  (разумеется, у вас будет свое имя пользователя вместо out4)

sudo chown -hR out4:out4 /home/out4/Server

И теперь любым редактором отредактируем конфигурационные файлы. Сначала сгенерируем ключ командой

out4@out4:/etc$ openssl rand -base64 32
RiG6zqGn5Ix9BSwTOFCSEvBTIIulDheMe1ApSdWEHkw=
out4@out4:/etc$

скопируем его и в файле chirpstack-application-server.toml найдем и внесем его в параметр jwt_secret

# JWT secret used for api authentication / authorization
# You could generate this by executing 'openssl rand -base64 32' for example
 jwt_secret="RiG6zqGn5Ix9BSwTOFCSEvBTIIulDheMe1ApSdWEHkw="

в этом же файле найдем параметр dsn и исправим его

#dsn="postgres://localhost/chirpstack_as?sslmode=disable"
dsn="postgres://chirpstack_as:dbpassword@localhost/chirpstack_as?sslmode=disable"

сохраним файл. В файле chirpstack-network-server.toml аналогично изменим параметр dsn

#dsn="postgres://localhost/chirpstack_ns_ns?sslmode=disable"
dsn="postgres://chirpstack_ns:dbpassword@localhost/chirpstack_ns?sslmode=disable"

Разумеется, если вы использовали другой пароль и имя пользователя при создании базы данных, то вводить следует их.
Файл chirpstack-gateway-bridge.toml  пока не трогаем и ничего в нем не меняем.

Теперь создадим скрипт который будет запускать все это

cd /home/out4/Server
touch start_servers.sh
chmod +x start_servers.sh

Содержимое скрипта 

#!/bin/bash
./NetworkServer/chirpstack-network-server --config  /home/out4/Server/NetworkServer/chirpstack-network-server.toml &
./Bridge/chirpstack-gateway-bridge --config /home/out4/Server/Bridge/chirpstack-gateway-bridge.toml &
./ApplicationServer/chirpstack-application-server --config  /home/out4/Server/ApplicationServer/chirpstack-application-server.toml &

с помощью ключа --config мы указываем использовать свой *.toml файл, а не тот что находится в /etc/chirpstack-***
запускаем наш скрипт 

./start_server.sh

Если теперь зайти браузером на наш компьютер используя его IPADDRESS:8080 адрес то должна появится веб страница 


Логин/пароль по умолчанию admin/admin


Зайдем в раздел Gateways, пока он пуст. Осталось привязать базовую станцию к серверу.
В базовой станции есть скрипт update_gwid.sh который генерирует уникальный номер на основе MAC адреса


#!/bin/sh

# This script is a helper to update the Gateway_ID field of given
# JSON configuration file, as a EUI-64 address generated from the 48-bits MAC
# address of the device it is run from.
#
# Usage examples:
#       ./update_gwid.sh ./local_conf.json

iot_sk_update_gwid() {
    # get gateway ID from its MAC address to generate an EUI-64 address
    GWID_MIDFIX="FFFE"
    GWID_BEGIN=$(ip link show eth0 | awk '/ether/ {print $2}' | awk -F\: '{print $1$2$3}')
    GWID_END=$(ip link show eth0 | awk '/ether/ {print $2}' | awk -F\: '{print $4$5$6}')

    # replace last 8 digits of default gateway ID by actual GWID, in given JSON configuration file
    sed -i 's/\(^\s*"gateway_ID":\s*"\).\{16\}"\s*\(,\?\).*$/\1'${GWID_BEGIN}${GWID_MIDFIX}${GWID_END}'"\2/' $1

    echo "Gateway_ID set to "$GWID_BEGIN$GWID_MIDFIX$GWID_END" in file "$1
}

if [ $# -ne 1 ]
then
    echo "Usage: $0 [filename]"
    echo "  filename: Path to JSON file containing Gateway_ID for packet forwarder"
    exit 1
fi

iot_sk_update_gwid $1

exit 0

запустим его, указав в качестве параметра конфигурационный файл local_conf.json

 
root@OpenWrt:~# ./update_gwid.sh /etc/local_conf.json
Gateway_ID set to ce8e2cFFFE5f3546 in file /etc/local_conf.json
root@OpenWrt:~#

скрипт занесет сгенерированный уникальный номер в конфигурационный файл

root@OpenWrt:~# vi /etc/local_conf.json

{
/* Put there parameters that are different for each gateway (eg. pointing one gateway to a test server while the others stay in
/* Settings defined in global_conf will be overwritten by those in local_conf */
    "gateway_conf": {
        "gateway_ID": "ce8e2cFFFE5f3546"
    }
}

теперь надо отредактировать конфигурационный файл, дописав в конце файла секцию "gateway_conf", где также надо указать уникальный номер и IP адрес нашего сервера, на котором развернули chirpstack и порты


        "tx_lut_15": {
            /* TX gain table, index 15 */
            "pa_gain": 3,
            "mix_gain": 14,
            "rf_power": 27,
            "dig_gain": 0
        }
    },

    "gateway_conf": {
        "gateway_ID": "ce8e2cFFFE5f3546",
        /* change with default server address/ports, or overwrite in local_conf.json */
        "server_address": "192.168.1.195",
        "serv_port_up": 1700,
        "serv_port_down": 1700,
        /* adjust the following parameters for your network */
        "keepalive_interval": 10,
        "stat_interval": 30,
        "push_timeout_ms": 100,
        /* forward only valid packets */
        "forward_crc_valid": true,
        "forward_crc_error": false,
        "forward_crc_disabled": false
    }
} 

запускаем форвардер пакетов

root@OpenWrt:~# lora_pkt_fwd
*** Beacon Packet Forwarder for Lora Gateway ***
Version: 0
*** Lora concentrator HAL library version info ***
Version: 0;
***
INFO: Little endian host
INFO: found global configuration file /etc/global_conf.json, parsing it
INFO: /etc/global_conf.json does contain a JSON object named SX1301_conf, parsing SX1301 parameters
INFO: lorawan_public 1, clksrc 1
INFO: no configuration for LBT
INFO: antenna_gain 0 dBi
INFO: Configuring TX LUT with 16 indexes
INFO: radio 0 enabled (type SX1257), center frequency 867500000, RSSI offset -166.000000, tx enabled 1, tx_notch_freq 129000
INFO: radio 1 enabled (type SX1257), center frequency 868500000, RSSI offset -166.000000, tx enabled 0, tx_notch_freq 0
INFO: Lora multi-SF channel 0>  radio 1, IF -400000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 1>  radio 1, IF -200000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 2>  radio 1, IF 0 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 3>  radio 0, IF -400000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 4>  radio 0, IF -200000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 5>  radio 0, IF 0 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 6>  radio 0, IF 200000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 7>  radio 0, IF 400000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora std channel> radio 1, IF -200000 Hz, 250000 Hz bw, SF 7
INFO: FSK channel> radio 1, IF 300000 Hz, 125000 Hz bw, 50000 bps datarate
INFO: /etc/global_conf.json does contain a JSON object named gateway_conf, parsing gateway parameters
INFO: gateway MAC address is configured to CE8E2CFFFE5F3546
INFO: server hostname or IP address is configured to "192.168.1.195"
INFO: upstream port is configured to "1700"
INFO: downstream port is configured to "1700"
INFO: downstream keep-alive interval is configured to 10 seconds
INFO: statistics display interval is configured to 30 seconds
INFO: upstream PUSH_DATA time-out is configured to 100 ms
INFO: packets received with a valid CRC will be forwarded
INFO: packets received with a CRC error will NOT be forwarded
INFO: packets received with no CRC will NOT be forwarded
INFO: found local configuration file /etc/local_conf.json, parsing it
INFO: redefined parameters will overwrite global parameters
INFO: /etc/local_conf.json does not contain a JSON object named SX1301_conf
INFO: /etc/local_conf.json does contain a JSON object named gateway_conf, parsing gateway parameters
INFO: gateway MAC address is configured to CE8E2CFFFE5F3546
INFO: packets received with a valid CRC will be forwarded
INFO: packets received with a CRC error will NOT be forwarded
INFO: packets received with no CRC will NOT be forwarded
INFO: [main] concentrator started, packet can now be received

INFO: Disabling GPS mode for concentrator's counter...
INFO: host/sx1301 time offset=(1594044948s:101975µs) - drift=-2099037353µs
INFO: Enabling GPS mode for concentrator's counter.

INFO: [down] PULL_ACK received in 2 ms
INFO: [down] PULL_ACK received in 1 ms
INFO: [down] PULL_ACK received in 1 ms

##### 2020-07-06 14:16:20 UTC #####
### [UPSTREAM] ###
# RF packets received by concentrator: 2
# CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
# RF packets forwarded: 0 (0 bytes)
# PUSH_DATA datagrams sent: 0 (0 bytes)
# PUSH_DATA acknowledged: 0.00%
### [DOWNSTREAM] ###
# PULL_DATA sent: 3 (100.00% acknowledged)
# PULL_RESP(onse) datagrams received: 0 (0 bytes)
# RF packets sent to concentrator: 0 (0 bytes)
# TX errors: 0
# BEACON queued: 0
# BEACON sent so far: 0
# BEACON rejected: 0
### [JIT] ###
# SX1301 time (PPS): 2424902
packet_forwarder-4.0.1/lora_pkt_fwd/src/jitqueue.c:442:jit_print_queue(): INFO: [jit] queue is empty
### [GPS] ###
# GPS sync is disabled
##### END #####

JSON up: {"stat":{"time":"2020-07-06 14:16:20 UTC","rxnb":2,"rxok":0,"rxfw":0,"ackr":0.0,"dwnb":0,"txnb":0}}
INFO: [up] PUSH_ACK received in 1 ms
INFO: [down] PULL_ACK received in 1 ms
INFO: [down] PULL_ACK received in 1 ms
INFO: [down] PULL_ACK received in 1 ms

INFO: Disabling GPS mode for concentrator's counter...
INFO: host/sx1301 time offset=(1594044948s:101015µs) - drift=-960µs
INFO: Enabling GPS mode for concentrator's counter.


##### 2020-07-06 14:16:50 UTC #####
### [UPSTREAM] ###
# RF packets received by concentrator: 0
# CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
# RF packets forwarded: 0 (0 bytes)
# PUSH_DATA datagrams sent: 1 (111 bytes)
# PUSH_DATA acknowledged: 100.00%
### [DOWNSTREAM] ###
# PULL_DATA sent: 3 (100.00% acknowledged)
# PULL_RESP(onse) datagrams received: 0 (0 bytes)
# RF packets sent to concentrator: 0 (0 bytes)
# TX errors: 0
# BEACON queued: 0
# BEACON sent so far: 0
# BEACON rejected: 0
### [JIT] ###
# SX1301 time (PPS): 62426531
packet_forwarder-4.0.1/lora_pkt_fwd/src/jitqueue.c:442:jit_print_queue(): INFO: [jit] queue is empty
### [GPS] ###
# GPS sync is disabled
##### END #####

JSON up: {"stat":{"time":"2020-07-06 14:16:50 UTC","rxnb":0,"rxok":0,"rxfw":0,"ackr":100.0,"dwnb":0,"txnb":0}}
INFO: [up] PUSH_ACK received in 1 ms
INFO: [down] PULL_ACK received in 1 ms
INFO: [down] PULL_ACK received in 1 ms
INFO: [down] PULL_ACK received in 1 ms

##### 2020-07-06 14:17:20 UTC #####
### [UPSTREAM] ###
# RF packets received by concentrator: 0
# CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
# RF packets forwarded: 0 (0 bytes)
# PUSH_DATA datagrams sent: 1 (113 bytes)
# PUSH_DATA acknowledged: 100.00%
### [DOWNSTREAM] ###
# PULL_DATA sent: 3 (100.00% acknowledged)
# PULL_RESP(onse) datagrams received: 0 (0 bytes)
# RF packets sent to concentrator: 0 (0 bytes)
# TX errors: 0
# BEACON queued: 0

И, вернувшись в веб интерфейс сервера привязываем базовую станцию.
1. В Network-servers нажав кнопку +ADD добавляем 


Подтверждаем, нажав ADD NETWOK-SERVER. Теперь заходим в Service-profile и нажимаем кнопку +CREATE. Заполняем поля, в выпадающем списке Network-server выбираем наш сервер созданный на предыдущем шаге


и жмем CREATE SERVICE-PROFILE
Теперь в разделе Gateways нажимаем +CREATE. Заполняем поля, в Gateway ID указываете уникальный номер, который сгенерил скрипт update_gwid.sh и который записан в конфигурационных файлах local_conf.json / global_conf.json, в выпадающем списке опять выбираем созданный нами Network-Server


и нажимаем CREATE GATEWAY снизу страницы


Если теперь зайти в созданный gateway, на вкладке LIVE LORAWAN FRAMES можно увидеть пакеты работающих рядом LoRaWAN датчиков


О датчиках, аппликейшенах немного позже

Быстрая доставка

Безопасная оплата

Гарантия качества