Узлы Dynamic Driver

Чтобы U-Logic управляла устройством через драйвер, в программе собирается цепочка из узлов (блоков программы): подключение (Device Connection), device - command и device - response - listener. Что такое драйвер, подключение и транспорт и как они связаны — на странице «Dynamic Driver»; здесь — порядок действий и окна этих узлов.

Подключение и транспорты — узлы конфигурации: их нет в палитре, а на холсте они не видны. Создаются они из окон device - command и device - response - listener (кнопка «+» рядом с полем «Соединение»). Править их можно и оттуда (кнопка с карандашом), и во вкладке боковой панели «Узлы конфигураций». Один и тот же узел подключения выбирают и в device - command, и в device - response - listener: так ответ приходит «обратно» к тому же устройству, которому ушла команда. Ещё пять узлов проверяют транспорт напрямую, без драйвера: TCP Test, UDP Test, HTTP Test, SSH Test, Telnet Test.

Подписи полей даны так, как они показаны в окне: часть подписей в окне английская, их здесь не переводим. Примеры взяты с учебных подключений «Демо: …».

По шагам: подключить устройство и отправить команду

Зачем. Окна узлов описаны ниже по отдельности, а работать приходится цепочкой. Здесь — весь путь от пустой рабочей области до ответа устройства. Заранее нужны драйвер устройства (готовый или сохранённый в редакторе драйверов) и адрес с портом устройства.

  1. В палитре слева, в категории «Dynamic Driver», найдите device - command и перетащите его на рабочую область.

  2. Дважды щёлкните узел. Рядом с полем «Соединение» нажмите «+» — откроется окно подключения (Device Connection).

  3. В списке «Драйвер» выберите драйвер. Под списком появится его карточка. Если нужного драйвера нет, откройте окно заново после сохранения драйвера в редакторе.

  4. В списке «Транспорт» выберите способ связи, например «TCP».

  5. Рядом с полем «TCP Config» (подпись зависит от транспорта) нажмите «+». В открывшемся окне (настройки транспорта) впишите «Хост» и «Порт» устройства. В окне UDP адрес устройства вписывается в «Исходящий IP». Нажмите «Добавить».

  6. В окне подключения нажмите «Добавить». Подключение создано и выбрано в поле «Соединение».

  7. В списке «Команда» выберите команду, при необходимости заполните «Параметры команды» и нажмите «Готово» (окно узла).

  8. Перетащите на рабочую область device - response - listener и откройте его. В «Соединение» выберите то же подключение. В таблице «Типы ответов» отметьте нужные ответы и назначьте им выходы. Нажмите «Готово» (окно узла).

  9. Добавьте узлы inject и debug: inject соедините со входом device - command, debug — с выходом device - response - listener, на который назначен ответ.

  10. Нажмите «Развернуть», затем кнопку слева от inject.

Что вы увидите. Под device - command статус: сначала «IDLE», затем «Подключено». Когда устройство ответит, в боковой панели отладки появится сообщение с разобранным ответом (тип ответа — в msg.payload.type). Если вместо «Подключено» написано «Отключено» или текст ошибки, проверьте «Хост» и «Порт» и то, что у транспорта включено «Автоподключение».

Частые ошибки. Узлы привязаны к разным подключениям; после правки не нажато «Развернуть»; ответ ищут на выходе device - command. Полный список — в разделах про каждый узел ниже.

Device Connection: подключение драйвера к транспорту

Зачем. Одному драйверу нужен адрес, по которому он «говорит» с устройством. Подключение хранит эту пару: какой драйвер и каким способом связи. Все узлы, которые ссылаются на одно подключение, работают с одним и тем же устройством.

Чтобы открыть окно, в device - command или device - response - listener нажмите «+» рядом с полем «Соединение» (новое подключение) или кнопку с карандашом (правка выбранного).

../../_images/dd-connection.png

Окно Device Connection «Демо: звуковой процессор»: 1 — «Драйвер», 2 — «Транспорт», 3 — «Telnet Config», 4 — «Параметры драйвера», 5 — «Keep-Alive», 6 — «Driver Debug»

«Имя» — название подключения; по нему его выбирают в других узлах. Пишите, что за устройство: «Матрица в зале 1». Остальные поля сверху вниз:

  1. «Драйвер» — список драйверов контроллера. После выбора под списком появляется карточка: название, производитель, версия и описание драйвера.

  2. «Транспорт» — способ связи: TCP (по умолчанию), SSH, UDP, Telnet, HTTP, Local (loopback), RS232 (Embedded), IR (Embedded), Embedded (GPIO), WebSocket. Подробно — в разделе «Транспорты» ниже.

  3. Поле под «Транспортом» меняет подпись в зависимости от выбора: «TCP Config», «Telnet Config», «WS Config» и так далее. В нём выбирается готовая настройка транспорта; кнопка с карандашом открывает её окно, кнопка «+» создаёт новую. Адрес и порт устройства задаются именно там, а не в подключении.

  4. «Параметры драйвера» — значения, которые драйвер просит ввести: например, номер устройства или пароль. Каждая строка — «Имя» и «Значение»; значение может быть строкой, числом, логическим значением или взято из памяти программы (global, flow, переменная среды env). Кнопка «добавить» добавляет строку. При выборе драйвера в список подставляются параметры, которые он объявил, вместе со значениями по умолчанию. У драйвера на снимке параметров нет, поэтому список пуст. Откуда драйвер берёт параметры — на странице «Как написать драйвер».

  5. «Keep-Alive» («Периодически проверять соединение») — флаг, по умолчанию выключен. Когда он включён, под ним появляется «Интервал Keep-Alive» (по умолчанию 30, не меньше 1) в секундах. Что именно отправляется при проверке, решает драйвер; если драйвер проверку не предусматривает, флаг ничего не отправляет. Подробнее — «Расширенные возможности».

  6. «Driver Debug» («Логировать все команды и ответы») — флаг, по умолчанию выключен. Включайте на время наладки: так проще увидеть, что именно ушло на устройство и что оно вернуло.

Что вы увидите. После «Обновить» (в новом подключении — «Добавить») подключение появляется в списках «Соединение» узлов команды и ответов. Статус подключения показывают узлы, которые на него ссылаются (см. разделы ниже).

Частые ошибки.

  • В списке «Транспорт» выбран один тип, а настройка выбрана для другого. Поле настройки (3) относится к выбранному транспорту: сменили транспорт — выберите настройку заново.

  • Не нажали «Развернуть» после правки: узлы продолжают работать со старым подключением.

  • Одно подключение создали для двух разных устройств. Подключение — это одно устройство; для второго создайте отдельное.

Транспорты: как связаться с устройством

Настройка транспорта описывает, как именно контроллер связывается с устройством: адрес и порт, учётные данные, делимитер ответов. Она создаётся из окна подключения (поле под «Транспортом», кнопка «+»). Окно открывается поверх окна подключения и шире него.

Транспорт

Для чего

Главные поля

TCP

устройства с обменом по сетевому порту: матрицы, процессоры, проекторы

«Хост», «Порт», «Возвращать», «Делимитер», «Использовать TLS»

UDP

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

«Внешний порт», «Локальный порт», «Формат данных», «Исходящий IP»

HTTP

устройства и сервисы с веб-интерфейсом (HTTP/HTTPS)

«Метод», «Сервер», «Аутентификация», «Заголовки»

Telnet

устройства с консолью Telnet, в том числе с входом по логину и паролю

«Хост», «Порт», «Логин», «Пароль», выражения для входа

SSH

устройства с защищённой консолью

«Хост», «Порт», «Логин», «Пароль», «Ключ»

Local (loopback)

проверка драйвера без устройства: всё, что драйвер отправил, возвращается к нему

только «Название»

RS232

последовательный порт встроенного контроллера (RS232, RS485, RS422)

«Порт», «Mode», «Baud Rate», «Parity»

IR

инфракрасный порт встроенного контроллера

«IR Порт», «Контроллер»

Embedded (GPIO)

реле и входы встроенного контроллера

только «Название»

WebSocket

устройства и сервисы с постоянным соединением WebSocket

«URL», «Subprotocol», «Reconnect (мс)», «Heartbeat (мс)»

Что общего у разных транспортов:

  • «Имя» или «Название» — подпись настройки в списках. В окнах UDP, TCP, Local, RS232, IR, Embedded и WebSocket поле называется «Название», в Telnet, SSH и HTTP — «Имя».

  • Кнопка «Apply driver defaults» (вверху справа, видна не всегда) записывает в поля значения, которые драйвер считает правильными для своего устройства: порт, делимитер и так далее. Она видна, только если драйвер описал такие значения для выбранного транспорта; нажатие перезаписывает то, что было в полях. Как драйвер их задаёт — «Как написать драйвер».

  • Поля «Хост», «Порт», «Логин», «Пароль» (и «Сервер» у HTTP) принимают текст и значения других типов. Тип выбирается слева от поля, например flow, global или переменная среды env; тогда в поле пишется имя переменной. Подробнее — в разделе «Доступ к контексту U-Logic».

  • «Debug» («Отладочные сообщения») — флаг, по умолчанию выключен: транспорт пишет в отладку служебные сообщения. Включайте на время наладки.

  • «Автоподключение» (у Telnet и SSH — «Авто-подключение», «Подключаться при старте») — подключаться при запуске программы и после обрыва. У TCP включено по умолчанию.

  • «Интервал переподкл. (мс)» (по умолчанию 5000) — пауза между попытками подключиться после обрыва.

Пять транспортов (TCP, UDP, Telnet, SSH и RS232) получают от устройства поток байтов, который нужно разрезать на отдельные сообщения. Для этого у них одни и те же четыре поля (у RS232 таймаут называется просто «Таймаут (мс)»), ниже они описаны один раз:

  • «Делимитер» — признак конца сообщения, например \r\n или \x0D\x0A. Подсказка окна: «Разделитель сообщений (пусто = отключено)». Если поле пусто, данные передаются драйверу по мере прихода.

  • «Таймаут делимитера (мс)» — через сколько миллисекунд передать драйверу неполное сообщение, если делимитера ещё нет. 0 (по умолчанию) — не передавать неполные. Для устройств без делимитера подойдёт небольшое значение, но тогда драйвер может получить обрывок ответа (см. «Ответы устройства»).

  • «Сохранять делимитер» — оставлять ли делимитер в конце сообщения. По умолчанию выключено.

  • «Размер буфера (KB)» — сколько данных транспорт накапливает, пока не найден делимитер (по умолчанию 64, от 1 до 10240).

Как делимитер и неполные ответы связаны с разбором ответов в коде драйвера — на странице «Ответы устройства».

TCP

Самый частый транспорт: устройство слушает порт, контроллер подключается к нему и держит соединение.

../../_images/dd-transport-tcp.png

Окно TCP-настройки: 1 — «Хост», 2 — «Порт», 3 — «Возвращать», 4 — «Делимитер», 5 — «Автоподключение», 6 — «Использовать TLS»

  1. «Хост» — адрес устройства. По умолчанию localhost; впишите адрес устройства в сети.

  2. «Порт» — порт устройства. Поле обязательное: пока оно пусто, оно подсвечено красным.

  3. «Возвращать» — в каком виде транспорт отдаёт драйверу полученные данные: «Байты (Buffer)» (по умолчанию) — для протоколов, где обмен идёт байтами; «Строка» — для текстовых протоколов. Выбирайте то, чего ждёт драйвер: оно описано в его документации.

  4. «Делимитер» — признак конца сообщения (см. выше).

  5. «Автоподключение» («Автоматически подключаться при запуске») — по умолчанию включено.

  6. «Использовать TLS» — шифровать соединение; при включении появляется выбор настройки TLS.

Ещё в окне: «Название» (вверху), «Интервал переподкл. (мс)», «Таймаут делимитера (мс)», «Сохранять делимитер», «Размер буфера (KB)», «Debug».

UDP

UDP не устанавливает соединения: контроллер отправляет пакеты на «Внешний порт» устройства и принимает ответы на «Локальный порт». Адрес устройства вписывается в поле «Исходящий IP».

../../_images/dd-transport-udp.png

Окно UDP-настройки: 1 — «Внешний порт», 2 — «Локальный порт», 3 — «Тип соединения», 4 — «IP версия», 5 — «Формат данных», 6 — «Исходящий IP»

  1. «Внешний порт» — порт, на который контроллер отправляет пакеты устройству.

  2. «Локальный порт» — порт, на котором контроллер ждёт ответ. Варианты: «Случайный (сервер отвечает на source port)», «Такой же как внешний (симметричный UDP)» (по умолчанию), «Указать вручную» (появляется поле «Номер локального порта»). Если устройство отвечает на тот порт, с которого пришёл запрос, подойдёт «Случайный»; если оно отвечает на фиксированный порт, выберите «Такой же как внешний» или укажите его вручную.

  3. «Тип соединения» — в списке доступен только «Unicast» (пакеты одному устройству).

  4. «IP версия» — «IPv4» или «IPv6».

  5. «Формат данных» — как данные передаются драйверу: «Строка (UTF8)» (по умолчанию), «Base64» или «Hex».

  6. «Исходящий IP» — адрес устройства, которому контроллер отправляет пакеты; ответы принимаются только с этого адреса. Если поле пусто, пакеты уходят широковещательно.

Ещё в окне: «Название» (вверху), «Делимитер» и три связанных с ним поля, «Автоподключение», «Debug».

HTTP

HTTP подходит для устройств и сервисов с веб-интерфейсом. Каждая команда драйвера превращается в запрос, а ответ возвращается драйверу.

../../_images/dd-transport-http.png

Окно HTTP-настройки: 1 — «Метод», 2 — «Сервер», 3 — «Использовать TLS», 4 — «Аутентификация», 5 — «Тайм-аут запроса (мс)», 6 — «Возвращать»

  1. «Метод» — «GET» (по умолчанию), «POST», «PUT», «DELETE», «HEAD» или «Установить через» (метод берётся из драйвера или сообщения).

  2. «Сервер» — базовый адрес устройства вместе с протоколом, например http://192.168.1.1. Протокол (http:// или https://) указывайте обязательно.

  3. «Использовать TLS» — шифровать соединение (HTTPS); при включении появляется выбор настройки TLS.

  4. «Аутентификация» — при включении выбирается тип («Базовая», «Digest», «Bearer») и вводятся имя и пароль (для Bearer — токен).

  5. «Тайм-аут запроса (мс)» — сколько ждать ответ; если поле пусто, используется значение по умолчанию.

  6. «Возвращать» — в каком виде возвращать ответ: «UTF-8» (по умолчанию), «Бинарные данные» или «JSON».

Ещё в окне:

  • «Полезная нагрузка» (для GET): «Игнорировать» (по умолчанию), «Добавить в запрос» или «Добавить в тело».

  • «Сохранять соединение», «Отправлять ошибки», «Небезопасный HTTP парсер» (разрешает нестандартные ответы).

  • «Проверять SSL сертификаты» (включено; если выключить, разрешаются самоподписанные сертификаты) и «Следовать переадресациям» (включено; если выключить, переадресация 301/302 запрещена).

  • «Заголовки» — список заголовков запроса; кнопка «добавить».

  • «Имя» — внизу окна.

Большинство значений (адрес, путь, заголовки) обычно задаёт драйвер; об этом — раздел «HTTP-драйверы» на странице «Расширенные возможности».

Telnet

Telnet — консоль устройства по сети. Если устройство требует вход, транспорт может выполнить его сам: достаточно заполнить «Логин» и «Пароль».

../../_images/dd-transport-telnet.png

Окно Telnet-настройки: 1 — «Хост», 2 — «Порт», 3 — «Логин», 4 — «Выражение для shell prompt», 5 — «Делимитер», 6 — «Авто-подключение»

  1. «Хост» — адрес устройства.

  2. «Порт» — порт Telnet; обычно 23.

  3. «Логин» — имя пользователя. Следом идёт «Пароль».

  4. «Выражение для shell prompt» — шаблон приглашения командной строки, по которому транспорт понимает, что вход завершён. Если устройство не показывает приглашения (аудио- и видеооборудование без интерактивной оболочки), оставьте поле пустым: ожидание приглашения тогда пропускается.

  5. «Делимитер» — признак конца сообщения (см. выше).

  6. «Авто-подключение» («Подключаться при старте»).

Ещё в окне: «Имя», «Пароль», «Выражение для логина» и «Выражение для пароля» (шаблоны, по которым транспорт узнаёт запросы логина и пароля; по умолчанию [Ll]ogin[: ]*$ и [Pp]assword[: ]*$), «Интервал переподкл. (мс)», «Автодобавлять окончание команды» (если выключено, команда отправляется как есть, без добавления \r\n), «Таймаут делимитера (мс)», «Сохранять делимитер», «Размер буфера (KB)», «Debug».

Предупреждение

Вход должен выполнять кто-то один: транспорт (когда заполнены «Логин» и «Пароль») или драйвер. Если вход настроен и там, и там, он выполнится дважды, и устройство может разорвать сеанс. Подробно — в разделе «Вход на устройство» страницы «Расширенные возможности».

SSH

SSH — защищённая консоль. Работает как Telnet, но вход можно выполнить по паролю или по ключу.

../../_images/dd-transport-ssh.png

Окно SSH-настройки: 1 — «Хост», 2 — «Порт», 3 — «Логин», 4 — «Ключ», 5 — «Shell prompt regex», 6 — «Делимитер»

  1. «Хост» — адрес устройства.

  2. «Порт» — порт SSH; обычно 22.

  3. «Логин» — имя пользователя. Следом идёт «Пароль».

  4. «Ключ» — имя файла ключа из папки uploads контроллера (в подсказке окна — «my_key»). Если указан ключ, вход идёт по нему вместо пароля. Как положить файл ключа в uploads — на странице «Порты» (SFTP пользователя, порт 22022). Если ключ защищён паролем, впишите его в поле «Passphrase».

  5. «Shell prompt regex» — шаблон приглашения командной строки после входа. Если поле оставить пустым, приглашение не ждут: после входа транспорт 3 секунды следит только за ошибками подключения и входа, и если их нет, считает соединение готовым. Для устройств с длинным приветствием, которое заканчивается символом >, уточните шаблон.

  6. «Делимитер» — признак конца сообщения (по умолчанию \n).

Ещё в окне: «Имя», «Пароль», «Passphrase» («Пароль для расшифровки ключа (если есть)»), «Интервал переподкл. (мс)», «Автодобавлять окончание команды» (если выключено, команда отправляется как есть, без добавления \n), «Таймаут делимитера (мс)», «Сохранять делимитер», «Размер буфера (KB)», «Авто-подключение», «Debug».

Предупреждение

Как и у Telnet, вход должен выполнять только транспорт или только драйвер: см. предупреждение выше.

Local (loopback)

Local не выходит в сеть: всё, что драйвер отправил, сразу возвращается к нему как полученное. Он нужен, чтобы проверить драйвер без устройства: адрес и порт не нужны. Пример — на странице «Примеры драйверов».

../../_images/dd-transport-local.png

Окно Local-настройки: 1 — «Название», 2 — «Debug»

  1. «Название» — подпись настройки в списках.

  2. «Debug» («Отладочные сообщения») — флаг для наладки.

Других полей в окне нет.

RS232

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

../../_images/dd-transport-rs232.png

Окно RS232-настройки: 1 — «Порт», 2 — «Mode», 3 — «Baud Rate», 4 — «Parity», 5 — «Делимитер», 6 — «Автоподключение»

  1. «Порт» — порт контроллера, к которому подключено устройство: от «A (COM1)» до «H (COM8)».

  2. «Mode» — режим порта: «RS232» (по умолчанию в окне), «RS485» или «RS422».

  3. «Baud Rate» — скорость обмена: 9600 (по умолчанию), 19200, 38400, 57600 или 115200.

  4. «Parity» — контроль чётности: «None» (по умолчанию), «Even» или «Odd».

  5. «Делимитер» — признак конца сообщения.

  6. «Автоподключение» — подключаться при запуске (по умолчанию включено).

Ещё в окне: «Название», «Data Bits» (8 или 7), «Stop Bits» (1 или 2), «Таймаут (мс)», «Сохранять делимитер», «Размер буфера (KB)», «Debug».

IR

Транспорт для инфракрасного порта: команды драйвера отправляются как ИК-сигналы. В том же окне блок «IR Learning» позволяет обучить контроллер кодам пульта.

../../_images/dd-transport-ir.png

Окно IR-настройки: 1 — «IR Порт», 2 — «Контроллер», 3 — «Автоподключение»

  1. «IR Порт» — порт, к которому подключён излучатель: от «A (IR1)» до «H (IR8)».

  2. «Контроллер» — какой контроллер отправляет сигнал: встроенный (по умолчанию) или удалённый; для удалённого появляется поле «IP адрес».

  3. «Автоподключение» — подключаться при запуске (по умолчанию включено).

Ещё в окне: «Название», «Debug» и блок «IR Learning». В нём выбирают драйвер («– Новый драйвер –») или вводят имя нового. Затем вписывают имя команды (например, power_on), нажимают «Обучить» и сохраняют драйвер кнопкой «Сохранить драйвер». Корзина удаляет драйвер. Коды можно загрузить из файла: перетащите файл в поле «Перетащите .sir, .eir или .lirc файл сюда» или нажмите «или нажмите для выбора».

Embedded (GPIO)

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

../../_images/dd-transport-gpio.png

Окно Embedded-настройки: 1 — «Название», 2 — «Автоподключение», 3 — «Debug»

  1. «Название» — подпись настройки в списках (по умолчанию «Embedded Controller»).

  2. «Автоподключение» — подключаться при запуске (по умолчанию включено).

  3. «Debug» — отладочные сообщения.

WebSocket

Постоянное двустороннее соединение с устройством или сервисом, который поддерживает WebSocket.

../../_images/dd-transport-websocket.png

Окно WebSocket-настройки: 1 — «URL», 2 — «Subprotocol», 3 — «Reconnect (мс)», 4 — «Heartbeat (мс)», 5 — «Headers (JSON)», 6 — «Автоподключение»

  1. «URL» — адрес вида ws://адрес:порт; для шифрованного соединения — wss://…, тогда ниже появляется выбор настройки TLS.

  2. «Subprotocol» — подпротокол, если устройство его требует; поле необязательное.

  3. «Reconnect (мс)» — пауза между попытками подключиться после обрыва (по умолчанию 3000).

  4. «Heartbeat (мс)» — как часто проверять соединение служебными сообщениями; 0 (по умолчанию) — не проверять.

  5. «Headers (JSON)» — дополнительные заголовки при подключении, например {"Authorization": "Bearer ..."}.

  6. «Автоподключение» — подключаться при запуске (по умолчанию включено).

Ещё в окне: «Название» и «Debug».

Что вы увидите после настройки любого транспорта. После «Обновить» (в новой настройке — «Добавить») окно закрывается, настройка выбрана в поле под «Транспортом», а после «Развернуть» контроллер пытается подключиться. Состояние показывают узлы device - command и device - response - listener (статус под узлом). Проверить транспорт отдельно от драйвера можно тестовыми узлами (раздел «Тестовые узлы» ниже).

Частые ошибки.

  • Порт и адрес указаны для другого устройства или пусты: подключение не устанавливается, узел показывает «Отключено».

  • В UDP в «Исходящий IP» вписан адрес контроллера, а не устройства: пакеты уходят не туда, а ответы не принимаются.

  • «Возвращать» в TCP выбран «Строка», а драйвер ждёт байты (или наоборот): ответы не распознаются.

  • У устройства без делимитера не задан «Таймаут делимитера»: транспорт ждёт конец сообщения и ничего не отдаёт драйверу.

  • Для SSH в «Ключ» вписан путь вместо имени файла: достаточно имени файла из папки uploads.

  • Включены вход транспорта и вход драйвера одновременно — см. предупреждение у Telnet.

device - command: отправить команду

Зачем. Узел отправляет устройству команду из драйвера: «подать вход 2 на выход 1», «выключить звук». Какие команды есть и какие у них параметры, узел узнаёт у драйвера: вручную писать их не нужно. Узел находится в палитре, в категории «Dynamic Driver»; у него один вход и два выхода.

../../_images/dd-command.png

Окно device - command «Матрица: вход на экран»: 1 — «Имя», 2 — «Соединение», 3 — «Команда», 4 — «Параметры команды»

  1. «Имя» — подпись узла на холсте. Пишите, что узел делает: «Матрица: вход на экран».

  2. «Соединение» — выбор подключения (Device Connection); рядом кнопки правки и «+». Драйвер берётся из выбранного подключения.

  3. «Команда» — список команд драйвера. Список появляется после выбора соединения. Под ним показаны «Описание» команды и «Возвращает» (что команда возвращает; у многих команд «Нет информации о возвращаемом значении»).

  4. «Параметры команды» — поле на каждый параметр команды; подпись поля — имя параметра, а подсказка объясняет, что вводить: например, «input» — «Номер канала входа (0 — отключить выход)», «output» — «Номер канала выхода». Логические параметры выбираются из «True»/«False», перечисления — из списка. Если у команды нет параметров, показано «Нет параметров».

Внизу окна — кнопка справки (книга) и переключатель «Включено».

Как отправить. Узел срабатывает, когда на вход приходит любое сообщение: команда отправляется с параметрами из окна. Параметры и саму команду можно задать и сообщением:

Свойство сообщения

Что делает

msg.command

заменяет команду, выбранную в окне

msg.parameters

объект с параметрами; объединяется с параметрами из окна, значения из сообщения важнее

msg.connection

true — подключиться, false — отключиться; команда при этом не отправляется

msg.payload

не используется для команды; уходит на второй выход без изменений

Пример: сообщение {"command": "route", "parameters": {"input": 3}} отправит команду route с входом 3, а «output» возьмёт из окна.

Выходы.

  1. Статус соединения: msg.payload.status — connected, disconnected или error; msg.payload.error — описание ошибки; msg.payload.device — имя соединения.

  2. Сквозной: сообщение, которое пришло на вход, без msg.command и msg.parameters. Так можно запускать следующий шаг после отправки.

Ответ устройства из этого узла не выходит: его принимает device - response - listener.

Пример цепочки. Узел inject запускает отправку, device - command отправляет команду, к двум выходам подключены debug.

../../_images/flow-dd-command.png

Цепочка примера: inject «Вход 2 на экран» → device - command «Матрица: вход на экран» → debug «Статус соединения» (выход 1) и debug «Команда ушла» (выход 2); ниже device - response - listener «Матрица: ответы» → debug «Ответ матрицы»

Что вы увидите. После «Развернуть» нажмите кнопку слева от inject. Под узлом device - command появится статус соединения: сразу после «Развернуть» — «IDLE», затем «Подключено», «Отключено», «Статус: <код> - <текст>» или текст ошибки. В debug «Статус соединения» придёт состояние соединения, в debug «Команда ушла» — сообщение из inject. Ответ матрицы придёт в debug «Ответ матрицы» (см. следующий раздел). Если «Соединение» не выбрано, под узлом написано «Не настроено соединение» (красным), а если у подключения не выбран транспорт — «Не настроен транспорт». Команды, которые часто нужны панели, узел получает от кнопок интерфейса: см. «Команды устройствам и ответы».

Частые ошибки.

  • Список «Команда» пуст: не выбрано «Соединение» или у драйвера нет команд.

  • Ожидали увидеть ответ на выходе узла. Ответ приходит только в device - response - listener того же подключения.

  • msg.connection приходит вместе с командой: команда не отправится, узел только подключится или отключится.

device - response - listener: принять ответы

Зачем. Устройство отвечает не сразу и не только на ваши команды: оно сообщает о событиях сам, а ответы приходят вразнобой. Узел принимает ответы драйвера и раздаёт их по выходам по типам: например, «ответ на коммутацию» идёт на один выход, «ошибка» — на другой. Дальше их разбирают другие узлы цепочки. Узел в палитре, категория «Dynamic Driver»; вход обычно не используется, число выходов задаётся в окне.

../../_images/dd-listener.png

Окно device - response - listener «Матрица: ответы»: 1 — «Соединение», 2 — «Выходы» («Количество выходов»), 3 — флажок типа ответа route, 4 — «Номер выхода» для route

  1. «Соединение» — то же подключение, что у device - command: ответы придут от того устройства, которому отправляются команды.

  2. «Выходы» — число выходов узла («Количество выходов»), от 1 до 20. Выходы появятся на узле после «Готово».

  3. Флажок в строке типа ответа. В таблице «Типы ответов» перечислены ответы, которые знает драйвер. Типы сгруппированы по категориям (на снимке — routing и diagnostic); у каждого — название, «Описание» и «Номер выхода».

  4. «Номер выхода» — куда отправлять ответ этого типа: «Нет» (по умолчанию) или «Выход 1», «Выход 2» и далее — до числа выходов из пункта 2.

Если столбец «Номер выхода» не виден, расширьте окно, потянув за его левый край.

Типы ответов

Таблица «Типы ответов» состоит из колонок «Тип ответа», «Описание» и «Номер выхода». Для драйвера на снимке типы такие:

Тип

Описание в окне

route

коммутация: отправлена (ack:false) или подтверждена устройством (ack:true)

routeError

устройство отклонило коммутацию (RES не равен 0)

routeTimeout

на коммутацию не пришёл ответ за время ожидания

reply

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

raw

нераспознанный текст от устройства

error

команда не отправлена: неверные параметры или переполнена очередь

Названия типов и описания приходят из драйвера, поэтому у другого драйвера список будет другим. Пока соединение не выбрано, в таблице написано «Выберите соединение». Если драйвер не описал типов ответов, показано «Нет доступных типов ответов».

Как пользоваться таблицей:

  1. Выберите «Соединение».

  2. Задайте число выходов.

  3. Для нужных типов отметьте флажок и выберите «Номер выхода»: каждому типу — свой выход, например route — «Выход 2», routeError — «Выход 3».

  4. Нажмите «Готово» и «Развернуть».

Под таблицей показываются счётчики «Выбрано ответов» и «Настроено выходов». Если несколько типов назначены на один выход, окно предупреждает: «Внимание! Несколько типов ответов назначены на один выход» и перечисляет типы. Если так и задумано — оставьте; иначе назначьте типам разные выходы.

Что приходит на выход. Сообщение уходит только на один выход, назначенный типу; на остальных выходах сообщения нет:

  • msg.payload — разобранный ответ; тип — в msg.payload.type;

  • msg.device — сведения о подключении: имя, драйвер, транспорт, адрес и порт устройства;

  • msg.originalMsg — исходное сообщение, которым была отправлена команда (если известно).

Если типу выход не назначен («Нет»), его сообщения приходят на первый выход.

Что вы увидите. Статус под узлом: «Подключено», «Отключено» или «Ошибка». В примере выше route назначен на «Выход 2», и debug «Ответ матрицы» подключён ко второму выходу: после команды в нём появляется разобранный ответ коммутации.

Как драйвер формирует типы и поля ответов — на странице «Ответы устройства». Как ответы используются в программе (фильтры, обновление элементов панели) — в разделе «device - response - listener» страницы «Команды устройствам и ответы».

Частые ошибки.

  • Ответы приходят все на первый выход: типам не назначены выходы («Нет») или не выбран нужный тип.

  • Уменьшили число выходов, а в таблице остались назначения на несуществующие выходы: такие ответы приходят на первый выход. Проверьте колонку «Номер выхода».

  • Узел привязан к другому подключению, чем device - command: ответы приходят от другого устройства или не приходят совсем.

  • Не нажали «Развернуть»: узел продолжает раздавать ответы по старой таблице.

Тестовые узлы: проверить транспорт без драйвера

Зачем. Прежде чем искать ошибку в драйвере, проверьте, что связь с устройством вообще работает: что устройство слышит контроллер и что именно оно отвечает. Тестовые узлы TCP Test, UDP Test, HTTP Test, SSH Test, Telnet Test отправляют данные напрямую через настройку транспорта, минуя драйвер, и показывают всё, что пришло в ответ. Они находятся в палитре, в категории «network»; у каждого один вход и один выход.

Все пять узлов устроены одинаково: окно содержит подпись «Имя», выбор настройки транспорта и формат вывода. Поэтому ниже один узел описан подробно, а различия — в таблице.

../../_images/dd-test-tcp.png

Окно TCP Test: 1 — «Имя», 2 — «TCP Config», 3 — «Формат вывода», 4 — «Сырые данные»

  1. «Имя» — подпись узла на холсте.

  2. «TCP Config» — выбор настройки транспорта, которую нужно проверить; рядом кнопки правки и «+». Для других узлов поле называется «UDP Config», «HTTP Config», «SSH Config», «Telnet Config».

  3. «Формат вывода» — в каком виде узел отдаёт полученные данные в msg.payload: «Строка (по умолчанию)», «JSON (если возможно)» или «HEX». Действует у SSH Test и HTTP Test. У TCP Test, UDP Test и Telnet Test в msg.payload приходят данные такими, какими их отдал транспорт, и формат на них не влияет.

  4. «Сырые данные» — флажок (включён по умолчанию): данные передаются необработанными, без преобразования по «Формату вывода». Есть только у TCP, UDP и Telnet; необработанные данные приходят и в msg.rawData.

Окна остальных узлов — на снимках ниже; на них те же поля.

../../_images/dd-test-udp.png

Окно UDP Test: 1 — «Имя», 2 — «UDP Config», 3 — «Формат вывода», 4 — «Сырые данные»

../../_images/dd-test-http.png

Окно HTTP Test: 1 — «Имя», 2 — «HTTP Config», 3 — «Формат вывода»

../../_images/dd-test-ssh.png

Окно SSH Test: 1 — «Имя», 2 — «SSH Config», 3 — «Формат вывода»

../../_images/dd-test-telnet.png

Окно Telnet Test: 1 — «Имя», 2 — «Telnet Config», 3 — «Формат вывода», 4 — «Сырые данные»

Что отличается:

Узел

Поля окна

Что отправляет msg.payload

Что приходит в msg.topic

Что ещё в сообщении на выходе

TCP Test

«TCP Config», «Формат вывода», «Сырые данные»

данные для устройства; объект уходит как JSON-строка

tcp_data — данные, tcp_event — событие соединения

msg.rawData, msg.connection, msg.timestamp, msg.error

UDP Test

«UDP Config», «Формат вывода», «Сырые данные»

пакет UDP

udp_data, udp_event

msg.rawData, msg.connection, msg.timestamp, msg.error

HTTP Test

«HTTP Config», «Формат вывода»

тело запроса; метод, адрес, путь и заголовки можно передать в msg.method, msg.url, msg.path, msg.headers

http_data — ответ, http_event — ошибка

msg.raw (полный ответ, включая код состояния и заголовки), msg.timestamp, msg.error

SSH Test

«SSH Config», «Формат вывода»

команда или данные для консоли

ssh_data, ssh_event

msg.rawData, msg.connection, msg.timestamp; у ssh_event в msg.payload.event — connected, disconnected или error

Telnet Test

«Telnet Config», «Формат вывода», «Сырые данные»

команда или данные для консоли

telnet_data, telnet_event

msg.rawData, msg.connection, msg.timestamp, msg.error; у события в msg.payload.event — connected, disconnected или error

Пример цепочки. Узел inject отправляет строку STATUS?, TCP Test передаёт её устройству, debug показывает ответ.

../../_images/flow-dd-test.png

Цепочка примера: inject «Отправить запрос» (строка STATUS?) → TCP Test → debug «Что ответило»

Что вы увидите. После «Развернуть» нажмите кнопку слева от inject. В боковой панели отладки появится сообщение: в msg.payload — ответ устройства (у TCP Test — в том виде, в каком его отдал транспорт, см. «Сырые данные» выше), в msg.topic — tcp_data. Сообщения с tcp_event приходят при подключении, отключении и ошибках. Если нет ни ответа, ни событий, транспорт не подключён: проверьте адрес, порт и сеть.

Частые ошибки.

  • Ждёте, что узел вызовет команду драйвера. Тестовые узлы работают без драйвера: они отправляют ровно то, что в msg.payload, и не добавляют окончание команды, если его не добавляет сам транспорт (флаг «Автодобавлять окончание команды»).

  • Выбрана настройка другого типа: у каждого узла выбор только своего транспорта (в TCP Test — «TCP Config»).

  • Устройство принимает только одно соединение, а им уже пользуется драйвер: тест не подключится. Проверяйте транспорт, пока драйвер не использует это устройство.

  • Данные ушли, а ответ пустой или непонятный: у SSH Test и HTTP Test смените «Формат вывода» на «HEX» — так видны управляющие байты. У TCP Test, UDP Test и Telnet Test формат не действует: смотрите msg.rawData и в настройке транспорта проверьте «Возвращать» (TCP) или «Формат данных» (UDP).

Что дальше