|
UniSet 2.44.3
|

Директории | |
| tests | |
Файлы | |
| MulticastTransport.h | |
| UDPPacket.h | |
| UDPTransport.h | |
| UNetExchange.h | |
| UNetLogSugar.h | |
| UNetReceiver.h | |
| UNetSender.h | |
| UNetTransport.h | |
Обмен построен на основе протокола UDP. Основная идея заключается в том, что каждый узел на порту равном своему ID посылает в сеть UDP-пакеты содержащие данные считанные из локальной SM. Формат данных - это набор пар [id, value]. Другие узлы принимают их. Помимо этого данный процесс запускает "получателей" по одному на каждый (другой) узел и ловит пакеты от них, сохраняя данные в SM. При этом "получатели" работают на одном потоке с использованием libev (см. UNetReceiver).
В текущей версии поддерживается два протокола для обмена: broadcast udp и multicast. Какой использовать протокол определяется в настроечной секции параметром unet_transport="broadcast" или unet_transport="multicast". По умолчанию "broadcast".
В зависимости от заданного протокола, будут использованы те или иные настройки.
При своём старте процесс считывает из секции <nodes> список узлов которые необходимо "слушать", а также параметры своего узла. Открывает по потоку приёма на каждый узел и поток передачи данных от своего узла. Помимо этого такие же потоки для резервных каналов, если они включены (см. Резервный канал связи).
По умолчанию при считывании используется unet_broadcast_ip (указанный в секции <nodes>) и id узла - в качестве порта. Но можно переопределять эти параметры, при помощи указания unet_port и/или unet_broadcast_ip, для конкретного узла (<item>).
Буфер для приёма сообщений можно настроить параметром recvBufferSize="1000" в конфигурационной секции или аргументом командной строки --prefix-recv-buffer-size sz
Максимальное число сообщений вычитываемых из сети за один раз настраивается параметром recvMaxAtTime="5" или --prefix-recv-max-at-time num
Примечание: Имеется возможность задавать отдельную настроечную секцию для "списка узлов" при помощи параметра --prefix-nodes-confnode name. По умолчанию настройка ведётся по секции <nodes>
Чтобы отключить запуск "sender", можно указать nosender="1" в <item> конкретного узла или непосредственно в настройках <UNetExchange nosender="1" ...>
По умолчанию при считывании используется unet_multicast_ip и id узла - в качестве порта. Но можно переопределять эти параметры, при помощи указания unet_multicast_port и/или unet_multicast_ip, у конкретного узла (<item>).
При этом в параметре unet_multicast_ip должен быть задан адрес multicast-группы на которую будет подписываться каждый receiver и в которую будет писать соответствующий sender.
По умолчанию для подключения к группе используется интерфейс ANY, но параметром unet_multicast_iface="192.168.1.1" можно задать интерфейс через который ожидаются multicast-пакеты. Поддерживается текстовое задание интерфейса в виде unet_multicast_iface="eth0"
Для указания ip для sender используется параметр unet_multicast_sender_ip="..", если он не задан, будет использован unet_multicast_iface="..".
Для посылающего процесса можно определить параметр unet_multicast_ttl задающий время жизни multicast пакетов. По умолчанию ttl=1. А также определить ip для сокета параметром unet_multicast_iface. Можно задавать текстовое название интерфейса unet_multicast_iface="eth0", при этом в качестве ip будет взят первый ip-адрес из привязанных к указанному интерфейсу.
В данной реализации поддерживается работа в два канала. Соответствующие настройки для второго канала имеют индекс "2": unet_multicast_ip2, unet_multicast_port2, unet_multicast_iface2
Чтобы отключить запуск "sender", можно указать nosender="1" в <item> конкретного узла или непосредственно в настройках <UNetExchange nosender="1" ...>
В корневой секции <nodes..> можно задавать значения по умолчанию используемые для всех узлов: unet_multicast_ip, unet_multicast_iface, unet_multicast_sender_ip.
В текущей реализации поддерживается возможность обмена по двум подсетям (Ethernet-каналам). Она основана на том, что для каждого узла помимо основного "читателя", создаётся дополнительный "читатель" слушающий другой ip-адрес и порт. А также для локального узла создаётся дополнительный "писатель", который посылает данные в (указанную) вторую подсеть.
Для того чтобы задействовать второй канал, достаточно объявить в настройках переменные unet_broadcast_ip2. А также в случае необходимости для конкретного узла можно указать unet_broadcast_ip2 и unet_port2. Или в случае multicast unet_multicast_ip2 и unet_multicast_port2.
Переключение между "каналами" происходит по следующей логике:
В свою очередь "писатели" (если они не отключены) всегда посылают данные в оба канала.
Данный механизм позволяет регулировать частоту посылки данных для каждого датчика. Суть механизма заключается в том, что для каждого датчика можно задать свойство:
При загрузке все датчики (относящиеся к данному процессу) разбиваются на группы пакетов согласно своей частоте посылки. При этом внутри одной группы датчики разбиваются по пакетам согласно заданному максимальному размеру пакета (см. конструктор класса UNetSender).
Параметр --prefix-packsendpause или packsendpause в настройках позволяет задать паузу (в миллисекундах) между посылками пакетов, если итоговых пакетов с данными больше чем 1.
При этом параметр --prefix-packsendpause-factor или packsendpauseFactor позволяет указать, что необходимо делать паузы не между каждым пакетом, а через каждый N пакет.
По умолчанию packsendpause=5 миллисекунд.
Для возможности мониторинга работы имеются счётчики, которые можно привязать к датчикам, задав их для соответствующего узла в секции <nodes> конфигурационного файла.
| Параметр | Описание |
|---|---|
| unet_lostpackets_id | Общее количество потерянных пакетов с данным узлом (суммарно по обоим каналам) |
| unet_lostpackets1_id | Количество потерянных пакетов с данным узлом по первому каналу |
| unet_lostpackets2_id | Количество потерянных пакетов с данным узлом по второму каналу |
| unet_respond_id | Наличие связи хотя бы по одному каналу |
| unet_respond1_id | Наличие связи по первому каналу |
| unet_respond2_id | Наличие связи по второму каналу |
| unet_numchannel_id | Номер текущего активного канала |
| unet_channelswitchcount_id | Количество переключений с канала на канал |
Для возможности внешнего управления приёмом и посылкой имеется возможность задать специальный датчик, позволяющий включать или отключать обмен. При этом датчики задаются отдельно для управления приёмом и для управления посылкой. Датчики прописываются в соответствующей секции <nodes> конфигурационного файла.
| Параметр | Описание |
|---|---|
| unet_recvmode_id | Датчик управления приёмом сообщений |
| unet_sendmode_id | Датчик управления посылкой сообщений |
Полный перечень возможных значений см. UNetReceiver::Mode и UNetSender::Mode.
Примечание: В случае необходимости управления и приёмом и передачей одновременно, можно просто указать один и тот же управляющий датчик.
UNetExchange поддерживает HTTP API для мониторинга и управления. API доступен при запуске с флагами:
Возвращает общую информацию об объекте.
Возвращает список доступных команд API.
Возвращает общий статус обмена, включая информацию о receivers и senders.
Возвращает список всех receivers с их статусом.
Параметры:
Возвращает список всех senders с их статусом.
Параметры:
Получение значений параметров.
Параметры передаются в формате name=param1&name=param2.
Доступные параметры:
Пример запроса:
Ответ:
Установка значений параметров (если включено httpEnabledSetParams).
Параметры передаются в формате param=value¶m2=value.
Доступные параметры:
Пример запроса:
Ответ:
Примечание: По умолчанию setparam отключён. Для включения необходимо установить параметр httpEnabledSetParams="1" в конфигурации UNetExchange.