Проект представляет собой аппаратно-программный комплекс для приема, обработки и визуализации данных с системы весогабаритного контроля (СВК).
Система непрерывно принимает XML-пакеты от внешнего измерительного оборудования по TCP-соединению, анализирует их на наличие нарушений (перевеса или негабарита) и транслирует соответствующие предупреждения (с указанием типа нарушения и госномера) на информационное веб-табло (фронтенд) практически в реальном времени.
Система построена на базе Node.js и состоит из двух основных серверных процессов и клиентской части:
tcp2.js) — обеспечивает прием данных от дорожного оборудования, их парсинг и бизнес-логику определения нарушений.http2.js) — предоставляет статические файлы для веб-табло и панели администратора, а также обрабатывает POST-запросы от админки для сохранения настроек в JSON-файлы.main.html — информационное табло (клиентская часть), постоянно опрашивающая сервер для получения актуального состояния нарушений.setting.html — панель администратора для настройки отображаемых текстов, стилей и задержек.Связь между TCP и HTTP серверами (а также фронтендом) осуществляется через общие JSON-файлы (setting1.json, setting2.json, settingopenhtml.json), которые выступают в роли примитивной базы данных и механизма IPC (Inter-Process Communication).
tcp2.js)7071<?xml ...> и </Record>).xml2js.WeightSign, ThrustSign, LengthSign, WidthSign, HeightSign.PlatformId.TrackStateNumber.PlatformId == 1 (фильтрация по конкретному направлению), проверяет флаги нарушений.WeightSign == 'true' или LengthSign == 'true'), сервер формирует текст оповещения (например "Перегруз Негабарит о123тс77").setting2.json (индекс массива 5).settingopenhtml.json на Html: '0' — это сигнализирует фронтенду о необходимости показать тревогу.setTimeout), который по истечении заданного времени (например, 20-45 секунд) вернет состояние в Html: '1' (режим ожидания).http2.js)3021 (с помощью Express.js)./ инициализирует загрузку табло (main.html)./setting загружает панель администратора (setting.html)./setting1/ — принимает конфигурацию "нормального" режима (шрифты, цвета, текст ожидания) и сохраняет в setting1.json./setting2/ — принимает конфигурацию режима "тревоги" (разметка, шаблон стилей для текста ошибки) и сохраняет в setting2.json./restart/ — выполняет команду pm2 restart tcp.js (похоже, опечатка в коде, так как файл называется tcp2.js, а не tcp.js) для жесткого перезапуска TCP сервера из веб-интерфейса и сбрасывает статус на Html: '1'.main.html)setInterval) делает запрос к файлу settingopenhtml.json:
Html == "1": Загружает setting1.json и выводит дефолтный текст без нарушений (например, "ВЕДЕТСЯ ВЕСОГАБАРИТНЫЙ КОНТРОЛЬ").Html == "0": Загружает setting2.json и выводит информацию о нарушителе и типе нарушения (например "ПЕРЕГРУЗ к354ес29").setting.html)http2.js через Ajax POST запросы.tcpClient.js)127.0.0.1:7071.xml.xml и отправляет его в сокет.Файл setting1.json нужен для хранения настроек и готового HTML-кода экрана "по умолчанию" (режима ожидания) для придорожного информационного табло.
Вот как он работает в общей архитектуре:
setting.html) задает стандартный текст, который должен отображаться на табло, когда всё в порядке (например, "ВЕДЕТСЯ ВЕСОГАБАРИТНЫЙ КОНТРОЛЬ"). Там же он выбирает размер шрифта, цвет текста и расположение.http2.js) принимает эти данные, генерирует из них готовые HTML-теги с нужными CSS-стилями и записывает их в массив внутри setting1.json.main.html) делает запросы к серверу каждую секунду. Если система находится в спокойном состоянии (другой файл settingopenhtml.json отдает флаг Html: "1"), табло просто считывает из setting1.json заготовленный HTML-код и выводит его на экран.Таким образом, этот файл выступает в роли примитивной базы данных, которая мгновенно передаёт внешний вид и содержимое экрана "без нарушений" от панели администратора к клиентскому табло.
setting1.json — Хранит массив с закешированной HTML строкой для 1 экрана, а также сырые настройки цвета и текста.setting2.json — Хранит шаблоны HTML тегов (string1, string2) и сгенерированную готовую HTML строку для 2 экрана (string5), а также таймаут (set2Time1).setting3.json — Хранит словари типов нарушений: {"string1":"Перегруз"} и {"string2":"Негабарит"}.settingopenhtml.json — Глобальный флаг состояния переключения экранов. Хранит объект вида [{"Html":"1"}]. 1 = экран ожидания, 0 = экран нарушения.xml.xml)Содержит корень <Record>, в котором:
<RecordInfo> (Информация о месте, времени, оборудовании)<VehicleInfo> (Госномера: TrackStateNumber, PlatformId)<TrackBaseMeasurements> (Осевые нагрузки, масса, флаги WeightSign, ThrustSign)<LengthMeasurements> (Длина, флаг LengthSign)<WidthMeasurements> (Ширина, флаг WidthSign)<HeightMeasurements> (Высота, флаг HeightSign)tcp2.js порт 7071.tcp2.js парсит XML пакет.WeightSign=='true' и т.д.).PlatformId==1) и есть нарушение, tcp2.js:
Перегруз Негабарит <номер авто>.setting2.json.setting2.json.0 в settingopenhtml.json.settingopenhtml.json в 1.main.html (открытый в браузере придорожного табло), во время очередного ежемсекундного тика считывает settingopenhtml.json, видит там 0.main.html считывает setting2.json и выводит сгенерированную красную строку с нарушением на экран табло.tcp2.js возвращает в settingopenhtml.json значение 1.main.html видит 1, считывает setting1.json и возвращает стандартную желтую надпись на экран.Основано на файле README.md.
zypper (SUSE / openSUSE))nodejs, npm, pm2gcc-c++sudo zypper in nodejs npm gcc-c++
npm install
sudo npm install pm2 -g
sudo pm2 startup
sudo pm2 start tcp2.js
sudo pm2 start http2.js
sudo pm2 save
http://<IP-сервера>:3021/http://<IP-сервера>:3021/setting7071.socket.io уже установлена, но закомментирована в коде).main.html вставляются через innerHTML без экранирования, что открывает вектор для XSS-атак (выполнение скриптов), если в XML придет вредоносный госномер.http2.js внутри HTTP-обработчика /restart/ запускается процесс exec("pm2 restart tcp.js"), но рабочий файл называется tcp2.js - это может приводить к ошибкам функционала перезагрузки из панели управления.str += data, проверка конца XML по data.toString().split(...) на части пакета может быть некорректной в сложных сетевых условиях, лучше использовать полноценный буфер до обнаружения </Record>.