UniSet 2.44.3
Содержание директории UNetUDP
Директория графа зависимостей UNetUDP:
UNetUDP

Директории

 
tests

Файлы

 
MulticastTransport.h
 
UDPPacket.h
 
UDPTransport.h
 
UNetExchange.h
 
UNetLogSugar.h
 
UNetReceiver.h
 
UNetSender.h
 
UNetTransport.h

Подробное описание

  • Общее описание
  • Конфигурирование UDP
  • Конфигурирование Multicast
  • Резервный канал связи
  • Регулирование частоты посылки
  • Пауза между посылкой пакетов
  • Статистика работы канала
  • Управление обменом
  • HTTP API

Общее описание

Обмен построен на основе протокола UDP. Основная идея заключается в том, что каждый узел на порту равном своему ID посылает в сеть UDP-пакеты содержащие данные считанные из локальной SM. Формат данных - это набор пар [id, value]. Другие узлы принимают их. Помимо этого данный процесс запускает "получателей" по одному на каждый (другой) узел и ловит пакеты от них, сохраняя данные в SM. При этом "получатели" работают на одном потоке с использованием libev (см. UNetReceiver).

В текущей версии поддерживается два протокола для обмена: broadcast udp и multicast. Какой использовать протокол определяется в настроечной секции параметром unet_transport="broadcast" или unet_transport="multicast". По умолчанию "broadcast".

<UNetExchange name=".." unet_transport="broadcast" />

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

При своём старте процесс считывает из секции <nodes> список узлов которые необходимо "слушать", а также параметры своего узла. Открывает по потоку приёма на каждый узел и поток передачи данных от своего узла. Помимо этого такие же потоки для резервных каналов, если они включены (см. Резервный канал связи).

Конфигурирование UDP

По умолчанию при считывании используется unet_broadcast_ip (указанный в секции <nodes>) и id узла - в качестве порта. Но можно переопределять эти параметры, при помощи указания unet_port и/или unet_broadcast_ip, для конкретного узла (<item>).

<nodes port="2809" unet_broadcast_ip="192.168.56.255">
<item ip="127.0.0.1" name="LocalhostNode" textname="Локальный узел" unet_ignore="1" unet_port="3000" unet_broadcast_ip="192.168.57.255">
<iocards>
...
</iocards>
</item>
<item ip="192.168.56.10" name="Node1" textname="Node1" unet_port="3001"/>
<item ip="192.168.56.11" name="Node2" textname="Node2" unet_port="3002"/>
</nodes>

Параметры буфера приёма

Буфер для приёма сообщений можно настроить параметром recvBufferSize="1000" в конфигурационной секции или аргументом командной строки --prefix-recv-buffer-size sz

Максимальное число сообщений вычитываемых из сети за один раз настраивается параметром recvMaxAtTime="5" или --prefix-recv-max-at-time num

Примечание: Имеется возможность задавать отдельную настроечную секцию для "списка узлов" при помощи параметра --prefix-nodes-confnode name. По умолчанию настройка ведётся по секции <nodes>

Отключение sender

Чтобы отключить запуск "sender", можно указать nosender="1" в <item> конкретного узла или непосредственно в настройках <UNetExchange nosender="1" ...>

Конфигурирование Multicast

По умолчанию при считывании используется 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="..".

TTL и параметры сокета

Для посылающего процесса можно определить параметр 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.

Пример конфигурации

<nodes port="2809" unet_broadcast_ip="192.168.56.255" unet_multicast_ip="224.0.0.1" unet_multicast_iface="net1">
<item ip="127.0.0.1" name="LocalhostNode" textname="Локальный узел" unet_ignore="1">
<iocards>
...
</iocards>
</item>
<item id="3001" ip="192.168.56.10" name="Node1" textname="Node1"
unet_multicast_ip="224.0.0.1"
unet_multicast_iface="192.168.1.1"
unet_multicast_port2="3031"
unet_multicast_ip2="225.0.0.1"
unet_multicast_iface2="192.168.2.1">
...
</item>
<item id="3002" ip="192.168.56.11" name="Node2" textname="Node2"
unet_multicast_ip="224.0.0.2"
unet_multicast_iface="192.168.1.2"
unet_multicast_port2="3032"
unet_multicast_ip2="225.0.0.2"
unet_multicast_iface2="eth0">
...
</item>
</nodes>

Резервный канал связи

В текущей реализации поддерживается возможность обмена по двум подсетям (Ethernet-каналам). Она основана на том, что для каждого узла помимо основного "читателя", создаётся дополнительный "читатель" слушающий другой ip-адрес и порт. А также для локального узла создаётся дополнительный "писатель", который посылает данные в (указанную) вторую подсеть.

Включение второго канала

Для того чтобы задействовать второй канал, достаточно объявить в настройках переменные unet_broadcast_ip2. А также в случае необходимости для конкретного узла можно указать unet_broadcast_ip2 и unet_port2. Или в случае multicast unet_multicast_ip2 и unet_multicast_port2.

Логика переключения каналов

Переключение между "каналами" происходит по следующей логике:

  1. При старте включается только первый канал. Второй канал работает в режиме "пассивного" чтения. Т.е. все пакеты принимаются, но данные в SharedMemory не сохраняются.
  2. Если во время работы пропадает связь по первому каналу, идёт переключение на второй канал. Первый канал переводится в "пассивный" режим, а второй канал переводится в "нормальный" (активный) режим.
  3. Далее работа ведётся по второму каналу, независимо от того, что связь на первом канале может восстановиться. Это сделано для защиты от постоянных перескакиваний с канала на канал.
  4. Работа на втором канале будет вестись, пока не пропадёт связь на нём. Тогда будет попытка переключиться обратно на первый канал и так "по кругу".

В свою очередь "писатели" (если они не отключены) всегда посылают данные в оба канала.

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

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

  • prefix_sendfactor="N" - где N>1 задаёт "делитель" относительно sendpause определяющий с какой частотой информация о данном датчике будет посылаться. Например N=2 - каждый второй цикл, N=3 - каждый третий и т.п.

При загрузке все датчики (относящиеся к данному процессу) разбиваются на группы пакетов согласно своей частоте посылки. При этом внутри одной группы датчики разбиваются по пакетам согласно заданному максимальному размеру пакета (см. конструктор класса 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.

Примечание: В случае необходимости управления и приёмом и передачей одновременно, можно просто указать один и тот же управляющий датчик.

HTTP API

UNetExchange поддерживает HTTP API для мониторинга и управления. API доступен при запуске с флагами:

--activator-run-httpserver --activator-httpserver-port 8080

Базовый URL

http://host:port/api/v2/UNetExchange/

Endpoints

GET /api/v2/UNetExchange/

Возвращает общую информацию об объекте.

{
"name": "UNetExchange",
"id": 5001,
"extensionType": "UNetExchange",
"LogServer": { ... }
}

GET /api/v2/UNetExchange/help

Возвращает список доступных команд API.

{
"help": [
{"command": "status", "description": "Overall status"},
{"command": "receivers", "description": "Receivers list"},
{"command": "senders", "description": "Senders list"},
{"command": "getparam", "description": "Read runtime parameters (name=steptime|maxHeartBeat|activated|no_sender)"},
{"command": "setparam", "description": "Set runtime parameters (steptime=..&maxHeartBeat=..)"}
]
}

GET /api/v2/UNetExchange/status

Возвращает общий статус обмена, включая информацию о receivers и senders.

{
"receivers": [...],
"senders": [...]
}

GET /api/v2/UNetExchange/receivers

Возвращает список всех receivers с их статусом.

Параметры:

  • node (опционально) - фильтр по имени узла
{
"receivers": [
{
"transport": "192.168.1.100:3000",
"mode": "ACTIVE",
"recvOK": true,
"receivepack": 12345,
"lostPackets": 0,
"cacheMissed": 0,
"params": {
"recvTimeout": 5000,
"prepareTime": 2000,
"lostTimeout": 5000,
"recvpause": 10,
"updatepause": 100
},
"stats": {
"recvCount": 50000,
"upTime": 3600000
}
}
]
}

GET /api/v2/UNetExchange/senders

Возвращает список всех senders с их статусом.

Параметры:

  • node (опционально) - фильтр по имени узла
{
"senders": [
{
"transport": "192.168.1.255:3000",
"sendpause": 150,
"packsendpause": 5,
"packsendpauseFactor": 1,
"packs": [
{
"sendfactor": 1,
"packs": 2,
"acount": 100,
"dcount": 50
}
]
}
]
}

GET /api/v2/UNetExchange/getparam

Получение значений параметров.

Параметры передаются в формате name=param1&name=param2.

Доступные параметры:

  • steptime - период основного цикла (мс)
  • maxHeartBeat - максимальное значение heartbeat
  • activated - статус активации (только чтение)
  • no_sender - флаг отключения sender (только чтение)

Пример запроса:

GET /api/v2/UNetExchange/getparam?name=steptime&name=maxHeartBeat

Ответ:

{
"result": "OK",
"params": {
"steptime": 150,
"maxHeartBeat": 3
}
}

GET /api/v2/UNetExchange/setparam

Установка значений параметров (если включено httpEnabledSetParams).

Параметры передаются в формате param=value&param2=value.

Доступные параметры:

  • steptime - период основного цикла (мс)
  • maxHeartBeat - максимальное значение heartbeat

Пример запроса:

GET /api/v2/UNetExchange/setparam?steptime=200&maxHeartBeat=5

Ответ:

{
"result": "OK",
"updated": {
"steptime": 200,
"maxHeartBeat": 5
}
}

Примечание: По умолчанию setparam отключён. Для включения необходимо установить параметр httpEnabledSetParams="1" в конфигурации UNetExchange.