Skip to main content

Подключение UART4 в NapiLinux

· One min read
dmn
maintainer

Для подключения uart4 в NapiLinux необходимо:

✔️Создать папку /boot/overlay-user ✔️Положить в нее файл rk3308-uart4.dtbo ✔️Добавить строчку в файл /boot/uEnv.txt

user_overlays=rk3308-uart4 

✔️Перезагрузить систему ✔️Должно появиться устройство /dev/ttyS4

#napi #napioverlay #dts

Тестирование MQTT датчиков через Telegraf

· One min read
dmn
maintainer

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

Для того, чтобы было видно какие данные увидел телеграф, перенаправим вывод на экран.

Делаем файл telegtraf.conf.out в любом месте, но не в /etc/telegraf/telegraf.d (чтобы телеграф его по умолчанию не подхватывал)

[[outputs.file]]
files = ["stdout"]
data_format = "influx"

И тестируем командой

telegraf --config /etc/telegraf/telegraf.d/cl-203.conf --config /root/telegraf.conf.out --debug

Смотрим на экране данные

CL213E,host=napi-fearlessporcupine,sensor=CL213E,topic=sensors/CL213E/CO CO=0 1751463487564614267
CL213E,host=napi-fearlessporcupine,sensor=CL213E,topic=sensors/CL213E/CO2 CO2=410 1751463487605135529
CL213E,host=napi-fearlessporcupine,sensor=CL213E,topic=sensors/CL213E/PM25 PM25=248 1751463487605167843
CL213E,host=napi-fearlessporcupine,sensor=CL213E,topic=sensors/CL213E/RH RH=47.6 1751463487605195050
CL213E,host=napi-fearlessporcupine,sensor=CL213E,topic=sensors/CL213E/TC TC=24 1751463487605267960
CL213E,host=napi-fearlessporcupine,sensor=CL213E,topic=sensors/CL213E/DC DC=12.2 1751463487605276033

#telegraf #mqtt #napilinux

Настройка аутентификации Mosquitto по паролю

· One min read
dmn
maintainer

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

Создание файла паролей

Создаем файл паролей с помощью утилиты mosquitto_passwd:

mosquitto_passwd -c /etc/mosquitto/passwd user

После выполнения команды система запросит пароль для пользователя user.

Смена владельца файла

Меняем владельца файла на пользователя mosquitto:

chown mosquitto /etc/mosquitto/passwd

Конфигурация Mosquitto

Простейший конфиг для включения аутентификации:

allow_anonymous false
password_file /etc/mosquitto/passwd

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

Установка и тюнинг чистого Armbian

· 6 min read
dmn
maintainer

🔥 🔥 🔥 Эта статья устарела, у нас есть готовые образы Armbian в разделе "Скачать" 🔥 🔥 🔥

Тюнинг Armbian для работы с Napi и Сборщик-компакт

tip

Эта инструкция для продвинутых пользователи Linux, Вы можете скачать готовый образ, где уже проведены все операции, по ссылке: https://download.napilinux.ru/linuximg/napic/armbian-rockpi-s-snaphots/

Ставим чистый ARMbian для Rock Pi S

Скачайте образ по ссылке

https://download.napilinux.ru/linuximg/napic/armbian-napic-distrib/

или с сайта Armbian:

https://redirect.armbian.com/rockpi-s/Bookworm_current

Имя файла будет похоже на следующее - Armbian_23.5.2_Rockpi-s_bookworm_current_6.1.32.img.xz

Распаковать образ и записать образ на SD-карту

или

Загрузить NAPI c SD карты в NapiLinux, вставить флешку с распакованным файлом образа и записать имидж в NAND по инструкции

Загрузить ARMbian. Войти по SSH (Логин\Пароль root\1234)

При первой загрузке ARMbian задаст вопросы про язык, локаль, часовой пояс, дополнительного пользователя - надо пройти все эти вопросы (в подготовленном имидже мы уже все сделали).

Проводим тюнинг Armbian

Проведите обновление системы

apt update
apt upgrade

Теперь вы можете ставить любые доступные пакеты в Armbian (Debian) программой apt install packet

Поставить рекомендуемые нами пакеты

telnet
mbpoll
snmpd
snmp
snmp-mibs-downloader
vim
cmake
pkg-config
plocate
gh
mosquitto
mosquitto-clients
python3-pip
python3-dev

Поместите данный список в файл packages.txt (nano packages.txt), выполните команду:

xargs apt-get -y install < packages.txt

Все пакеты должны установиться автоматически !

Теперь у вас есть утилита mbpoll для работы с modbus, pip3 - система установки пакетов для python3, средства для работы с git, средства для компилирования программ (понадобиться ниже).

Перегрузка при панике ядра

Заставим систему перегружаться при панике ядра (маловероятно, но все-таки)

Открыть файл /etc/sysctl.conf

Добавить или раскомментировать строчку

kernel.panic = 5

Сохранить файл

Добавление аппаратных интерфейсов

В Armbian (и других современных Linux) включение аппаратных и нестандартных интерфейсов (uart, i2c, spi) работает через систему подключаемых оверлеев (файлы в формате dtbo - device tree binary). Это бинарные файлы, которые компилируются из исходных текстовых файлов dts (data tree source).

В Armbian есть утилита, которая компилирует и добавляет оверлей из пользовательского файла dts.

Общий алгоритм такой. Нужно скачать или другим образом (через копи\паст) сформировать файл dts (название лучше делать по смыслу файла, например rk3308-spi2.dts) и далее выполнить команду

armbian-add-overlay <файл.dts>

Обязательно перегрузиться.

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

tip

Например, в NAPI не может работать одновременно UART1,2 и SPI2 а также UART3 и SPI1

Файлы dts для rk3308 (всех NAPI) доступны по ссылке: https://gitlab.nnz-ipc.net/pub/napilinux/kernel/-/tree/linux6.6/arch/arm64/boot/dts/rockchip/overlay

Список файлов

rk3308-console-on-uart0.dts
rk3308-console-on-uart1.dts
rk3308-console-on-uart2.dts
rk3308-i2c0.dts
rk3308-i2c1-ds1307.dts
rk3308-i2c1-ds3231.dts
rk3308-i2c1.dts
rk3308-i2c2.dts
rk3308-i2c3-m0.dts
rk3308-i2c3-m1.dts
rk3308-i2c3.dts
rk3308-pwm1.dts
rk3308-pwm2.dts
rk3308-pwm3.dts
rk3308-spi-spidev.dts
rk3308-spi1-spidev.dts
rk3308-spi2-spidev.dts
rk3308-uart0.dts
rk3308-uart1.dts
rk3308-uart2.dts
rk3308-uart3.dts
rk3308-usb-pcie-modem.dts
rk3308-usb20-host.dts
rk3308-w1-gpio.dts

rockpis-i2s-out.dts
rockpis-spdif-out.dts
rockpis-v11-spi2-waveshare35b-v2.dts

rockpis-v11-spi2-waveshare35c.dts
rockpis-v12-spi2-waveshare35b-v2.dts
rockpis-v12-spi2-waveshare35c.dts
i2c1-hym8563.dts

Из этого списка примерно понятно какие устройства могут быть добавлены.

tip

В Armbian устройства uart0 (консоль), uart1, uart2 добавлены по умолчанию.

Добавим поддержку UART3

tip

В "Сборщик-компакт" порт RS485 работает через UART3. Поэтому его надо добавить в ArmBian.

Создадим файл rk3308-uart3.dts (скопируем его содержания из файла по ссылке или ниже)

/dts-v1/;
/plugin/;

/ {
compatible = "rockchip,rk3308";

fragment@0 {
target = <&i2c3>;
__overlay__ {
status = "disabled";
};
};

fragment@1 {
target = <&spi1>;
__overlay__ {
status = "disabled";
};
};

fragment@2 {
target = <&uart3>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart3_xfer>;
};
};
};

Сохраним файл и выполним команду

armbian-add-overlay rk3308-uart3.dts

Эта команда автоматически скомпилирует и добавит overlay для UART3 (/dev/ttyS3 в системе).

Проверить что все корректно скомпилировалось, можно проверив каталог /boot/overlay-user, там должен быть соответствующий файл rk3308-uart3.dtbo

root@napi-armbian:~# ls /boot/overlay-user/
rk3308-i2c3-m0.dtbo rk3308-spi2-spidev.dtbo rk3308-uart1.dtbo rk3308-uart3.dtbo
root@napi-armbian:~#

В файле /boot/armbianEnv.txt объявление устройства должно появиться в разделе user-overlays=

root@napi-armbian:~# cat /boot/armbianEnv.txt
verbosity=1
extraargs=swiotlb=1024
overlay_prefix=rk3308
fdtfile=rockchip/rk3308-rock-pi-s.dtb
rootdev=UUID=5ef25166-64ed-4920-8994-f233ab2771c7
rootfstype=ext4
console=serial
user_overlays=rk3308-uart3 rk3308-i2c3-m0 rk3308-spi2-spidev
ethaddr=02:AE:83:87:2D:A0
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u

Не забудьте перегрузиться !

Теперь должен корректно работать порт UART3, устройство - /dev/ttyS3. Чтобы проверить порт, нужно подсоединить к GPIO UART3 какое либо устройство.

Добавим поддержку SPI2

Особенности оверлея spi2 под ARMbian

Для того, чтобы в модуле NAPI работал SPI2, необходимо отключить uart1 и uart2. Так как в ARMbian они включены в основном файле дерева устройств, то в оверлее spi2 необходимо отключить явным образом uart1, uart2. Правильный файл dts для SPI2 приводим ниже.

  1. Сделайте файл rk3308-spi2-spidev.dts такого содержания:

/dts-v1/;
/plugin/;

/ {
compatible = "rockchip,rk3308";

fragment@0 {
target = <&spi2>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
spidev@0 {
compatible = "rohm,dh2228fv";
status = "okay";
reg = <0>;
spi-max-frequency = <10000000>;
};
};
};

fragment@1 {
target = <&uart1>;
__overlay__ {
status = "disabled";
};
};
fragment@2 {
target = <&uart2>;
__overlay__ {
status = "disabled";
};
};

};

  1. Выполните команду
armbian-add-overlay rk3308-spi2-spidev.dts

Эта команда автоматически скомпилирует и добавит overlay для SPI2.

  1. Перезагрузитесь. Должно появиться устройство /dev/spidev2.0
Нюансы NAPI

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

⚠️ Обратите внимание, что некоторые интерфейсы нельзя использовать одновременно. При использовании шины SPI2, необходимо отключить UART2 и UART1.

⚠️ Шина SPI1 в настоящий момент не работает, при необходимости подключения устройств по SPI, используйте SPI2.

tip

Установка системного и прикладного ПО

Установим утилиту modpoll

⚠️ Несмотря на то, что в системе присутствует практически такая же утилита mbpoll аргументы у них немного различаются. Мы можем давать примеры на основе утилиты modpoll, поэтому рекомендуем ее тоже установить.

Скачать архив командой

wget https://www.modbusdriver.com/downloads/modpoll.tgz

Распаковать полученный архив

https://www.modbusdriver.com/downloads/modpoll.tgz

Скопировать файл

cp modpoll/arm-linux-gnueabihf/modpoll /usr/bin/

Убедиться, что утилита доступна и запускается

modpoll -h

Скомпилируем mbusd

Mbusd - открытый шлюз Modbus RTU - Modbus TCP

Стянем исходный код с github

git clone https://github.com/3cky/mbusd.git mbusd.git

Проведем компилирование

cd mbusd.git
mkdir -p build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
sudo make install

Проверим, что пакет установился через команду mbusd

Настроим snmpd

Устройство начнет отдавать стандартную информацию о сбе по протоколу SNMP (в дальнейшем это можно использовать, добавив устройства в Zabbix).

Редактируем файл /etc/snmp/snmpd.conf

Находим строку

agentaddress  127.0.0.1,[::1]

Меняем на строку

agentaddress  0.0.0.0,[::1]

Или выполняем команду

sed -i "s/agentaddress  127.0.0.1,[::1]/agentaddress  0.0.0.0,[::1]/g" /etc/snmp/snmpd.conf

Перезапускаем сервис snmpd

service snmpd restart

Убедиться, что он работает можно командой

service snmpd status

Добавим работу с GPIO через gpiod

К сожалению, по умолчанию в Armbian довольно старая версия gpiod, поэтому мы написали статью, как установить свежую версию gpiod и работать с командами пакета.

Как работать с gpio через систему sysfs можно прочитать по ссылке: https://developer.technexion.com/docs/using-gpio-from-a-linux-shell#using-legacy-sysfsbased-gpio

Добро пожаловать в техблог!

· One min read
dmn
maintainer

Это новый техблог для технических заметок и решений! 🎯

Раздел основан на материалах из Telegram канала t.me/napilab и находится в процессе наполнения.

Здесь будут публиковаться:

  • Быстрые техзаметки из Telegram канала
  • Решения проблем и troubleshooting
  • Полезные скрипты и автоматизация
  • Советы по работе с Linux и embedded устройствами

Отличие от основного блога новостей:

  • Основной блог - официальные новости, анонсы продуктов, выставки
  • Техблог - технические заметки, решения, quick tips

Пример использования:

  1. Скопируйте заметку из Telegram
  2. Создайте файл в папке techblog/
  3. Добавьте соответствующие теги
  4. Опубликуйте!

Работа со службами в NapiLinux/Armbian

· 6 min read
dmn
maintainer

Для остановки, запуска, перезапуска и проверки состояния служб необходимо знать как работать с сервисом systemd.

Службы под управлением сервиса systemd управляются через утилиту systemctl.

Общие параметры запуска


systemctl start|stop|restart|enable|disable|status <service>

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

  • systemctl stop telegraf остановит сервис telegraf
  • systemctl start telegraf запустит сервис telegraf
  • systemctl restart telegraf перезапустит сервис telegraf (следует выполнять, когда вы исправили конфиг)
  • systemctl start telegraf выведет статус сервиса telegraf

Даже остановив или запустив сервис - при перезагрузке системы, он не "вспомнит" последнее свое состояние.

Чтобы сервис запускался при загрузке следует его "включить" командой (на примере сервиса telegraf) systemctl enable telegraf, а чтобы сервис не запускался при загрузке, его следует "выключить" командой systemctl disable telegraf.

Рассмотрим несколько примеров.

Служба mbusd

Служба моста Modbus RTU - Modbus TCP mbusd перехватывает доступ к порту, на котором находятся датчики и невозможно прочитать датчик вручную. Допустим mbusd не работает как полагается и нам надо проверить отвечает датчик или нет.

Остановим mbusd

systemctl stop mbusd

Прочитаем датчики вручную

root@napi-rk3308b-s:~# modpoll -m rtu -b 115200 -a 2 -r 1 -c 1 /dev/ttyS3
modpoll 3.10 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright (c) 2002-2021 proconX Pty Ltd
Visit https://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: Modbus RTU, FC3
Slave configuration...: address = 2, start reference = 1, count = 1
Communication.........: /dev/ttyS3, 115200, 8, 1, even, t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, output (holding) register table

-- Polling slave... (Ctrl-C to stop)
[1]: 2
-- Polling slave... (Ctrl-C to stop)
[1]: 2
-- Polling slave... (Ctrl-C to stop)
[1]: 2
-- Polling slave... (Ctrl-C to stop)

Видим, что датчик читается и дело в настройках mbusd (внимательно проверяйте параметры порта !)

Включим, чтобы сервис mbusd стартовал при загрузке системы

systemctl enable mbusd

Служба telegraf

Если автоматически telegraf не читает датчик, то необзодимо его протетстировать в ручном режиме. Для этого остановим службу telegraf


systemctl stop telegraf

Прочтем датчик вручную, запустив telegraf с параметром --test

Тестирование Telegraf в ручном режиме


В данном примере мы читаем два конфига: один общий (1), другой конфиг датчика (2)

root@napi-rk3328:~# telegraf --test --config /etc/telegraf/telegraf.conf --config /data/active/Elemy_ATS-1240_smtp.conf
2024-03-19T15:02:22Z I! Loading config: /etc/telegraf/telegraf.conf
2024-03-19T15:02:22Z I! Loading config: /data/active/Elemy_ATS-1240_smtp.conf
2024-03-19T15:02:22Z I! Starting Telegraf 1.29.5 brought to you by InfluxData the makers of InfluxDB
2024-03-19T15:02:22Z I! Available plugins: 241 inputs, 9 aggregators, 30 processors, 24 parsers, 60 outputs, 6 secret-stores
2024-03-19T15:02:22Z I! Loaded inputs: snmp
2024-03-19T15:02:22Z I! Loaded aggregators:
2024-03-19T15:02:22Z I! Loaded processors:
2024-03-19T15:02:22Z I! Loaded secretstores:
2024-03-19T15:02:22Z W! Outputs are not used in testing mode!
2024-03-19T15:02:22Z I! Tags enabled: host=napi-rk3328
2024-03-19T15:02:24Z W! DeprecationWarning: Value "agent_host" for option "agent_host_tag" of plugin "inputs.snmp" deprecated since version 1.29.0 and will be removed in : set to "source" for consistent usage across plugins or safely ignore this message and continue to use the current value
> snmp,agent_host=87.245.206.187,host=napi-rk3328,name=ATS1204 uptime=345564141i 1710860544000000000
> ATS1204,agent_host=87.245.206.187,elmAtsPowerInputIndex=0,host=napi-rk3328,index=0,name=ATS1204 elmAtsPowerInputFault=0i,elmAtsPowerInputFreqence=5002i,elmAtsPowerInputIsActive=1i,elmAtsPowerInputIsNormal=1i,elmAtsPowerInputVoltage=226i 1710860546000000000
> ATS1204,agent_host=87.245.206.187,elmAtsPowerInputIndex=1,host=napi-rk3328,index=1,name=ATS1204 elmAtsPowerInputFault=0i,elmAtsPowerInputFreqence=5002i,elmAtsPowerInputIsActive=0i,elmAtsPowerInputIsNormal=1i,elmAtsPowerInputVoltage=226i 1710860546000000000
> ATS1204,agent_host=87.245.206.187,elmAtsPowerOutputIndex=0,host=napi-rk3328,index=0,name=ATS1204 Amp_output=50i,Cos-ph=782i,Volt-ampere-reactive=114i,Watt=90i,uetAstPowerOutputHasVolt=1i 1710860547000000000
root@napi-rk3328:~#

Проверка статуса службы

Проверить запущена ли служба можно командой systemctl status <service>

Проверим запущен ли и в каком статусе сервис telegraf

root@napi-rk3328:~# systemctl status telegraf
● telegraf.service - Telegraf
Loaded: loaded (/lib/systemd/system/telegraf.service; enabled; preset: disabled)
Active: active (running) since Sat 2024-03-16 09:35:50 +05; 3 days ago
Docs: https://github.com/influxdata/telegraf
Main PID: 415 (telegraf)
Tasks: 13 (limit: 2278)
Memory: 174.9M
CGroup: /system.slice/telegraf.service
├─415 /usr/bin/telegraf -config /etc/telegraf/telegraf.conf -config-directory /data/active
└─488 /usr/bin/dbus-daemon --syslog --fork --print-pid 4 --print-address 6 --session

Проверим в каком статусе сервис mbusd

Ошибка сервиса mbusd

root@napi-rk3328:~# systemctl status mbusd
× mbusd.service - Modbus TCP to Modbus RTU (RS-232/485) gateway.
Loaded: loaded (/lib/systemd/system/mbusd.service; enabled; preset: disabled)
Active: failed (Result: exit-code) since Sat 2024-03-16 09:35:51 +05; 3 days ago
Duration: 19ms
Process: 497 ExecStart=/usr/bin/mbusd -d -c /etc/mbusd/mbusd.conf (code=exited, status=5)
Main PID: 497 (code=exited, status=5)

Notice: journal has been rotated since unit was started, output may be incomplete.
root@napi-rk3328:~#


Видно, что сервис не запущен.

Сервис может быть не запущен, потому что остановлен или потому что не смог прочитать конфиг. Узнать подробнее, что случилось с сервисом можно командой journalctl -u <service>

Например, если сервис mbusd не запущен и записей по нему нет, вывод будет такой

root@napi-rk3328:~# journalctl -u mbusd
-- No entries --
root@napi-rk3328:~#

При неудачной попытке запуска сервиса вывод будет такой

Подробная ошибка mbusd

root@napi-rk3328:~# systemctl start mbusd
root@napi-rk3328:~# journalctl -u mbusd
Mar 19 20:16:23 napi-rk3328 systemd[1]: Started Modbus TCP to Modbus RTU (RS-232/485) gateway..
Mar 19 20:16:23 napi-rk3328 mbusd[25420]: 19 Mar 2024 20:16:23 conn_init(): can't open tty device /dev/ttyS3 (Input/output error)
Mar 19 20:16:23 napi-rk3328 systemd[1]: mbusd.service: Main process exited, code=exited, status=5/NOTINSTALLED
Mar 19 20:16:23 napi-rk3328 systemd[1]: mbusd.service: Failed with result 'exit-code'.
Mar 19 20:16:24 napi-rk3328 systemd[1]: mbusd.service: Scheduled restart job, restart counter is at 1.
Mar 19 20:16:24 napi-rk3328 systemd[1]: Stopped Modbus TCP to Modbus RTU (RS-232/485) gateway..
Mar 19 20:16:24 napi-rk3328 systemd[1]: Started Modbus TCP to Modbus RTU (RS-232/485) gateway..
Mar 19 20:16:24 napi-rk3328 mbusd[25421]: 19 Mar 2024 20:16:24 conn_init(): can't open tty device /dev/ttyS3 (Input/output error)
Mar 19 20:16:24 napi-rk3328 systemd[1]: mbusd.service: Main process exited, code=exited, status=5/NOTINSTALLED
Mar 19 20:16:24 napi-rk3328 systemd[1]: mbusd.service: Failed with result 'exit-code'.

Мониторинг процессов через ps

Есть еще один способ понять запущен процесс или нет. Бывает, Вы можете не знать имя службы до конца, но запущен ли процесс понять можно.

Команда ps из под root выводит список всех процессов, поэтому командой

ps | grep <process>

в некоторых системах нужно запускать

ps ax | grep <process>

Можно узнать а работает ли процесс и какой у него PID.

Узнаем, работает ли у нас telegraf (да, работает pid=415)

root@napi-rk3328:~# ps ax | grep telegraf
415 ? SLsl 139:23 /usr/bin/telegraf -config /etc/telegraf/telegraf.conf -config-directory /data/active
25487 pts/0 S+ 0:00 grep telegraf

Узнаем, работает ли у нас mbusd (нет не работает, его нет в списке процессов)

root@napi-rk3328:~# ps ax | grep mbusd
25516 pts/0 S+ 0:00 grep mbusd
root@napi-rk3328:~#

Если мы не знаем как называется сервис, но знаем хоть начало названия, все равно ps покажет запущен или нет процесс по любому шаблону, например по шаблону "tele".

root@napi-rk3328:~# ps ax | grep tele
415 ? SLsl 139:31 /usr/bin/telegraf -config /etc/telegraf/telegraf.conf -config-directory /data/active
25527 pts/0 S+ 0:00 grep tele
root@napi-rk3328:~#

Но в целом, это уже метод "последней надежды", пользуйтесь systemctl.

P.S. В Ubuntu также есть команда service