Я пытаюсь понять DDS и изучить его. Я тут и там читал учебники по OpenSplice DDS, и там меня что-то удивляет.
В этом уроке тьютор упоминает, что на странице 8 есть какая-то «магия», когда издатель и подписчик разъединяются, когда участники автоматически обнаруживаются.
Но что, если у меня есть участник на другом компьютере? Или, может быть, в другой стране?
Взгляните на этот пример издателя:
dds::Topic<TempSensorType> tsTopic("TempSensorTopic");
dds::DataWriter<TempSensorType> dw(tsTopic);
TempSensorTypets = {1, 26.0F, 70.0F, CELSIUS};
dw.write(ts);
и этот пример подписчика:
dds::Topic<TempSensorType> tsTopic("TempSensorTopic");
dds::DataReader<TempSensorType> dr(tsTopic);
dds::SampleInfoSeq info;TempSensorSeq data;
while (true)
{ dr.read(data, info);
for (inti =0; i < data.length(); ++i)
std::cout << data[i] << std::endl;sleep(1);
}
а также этот полный рабочий пример обоих (tspub.cpp
является издателем, и tssub.cpp
является подписчиком), я не понимаю, как люди могли подключиться удаленно. Как я могу подписаться на другую машину? Как я могу заставить этот хороший и простой пример работать удаленно?
Пожалуйста, спросите, если вам требуется дополнительная информация или детали.
Участники соединяются друг с другом посредством многоадресной рассылки UDP — имейте в виду, что это описано в стандарте, поэтому для полного и полного понимания прочитайте это. Это свободно доступно.
В спецификации определен только UDP, поэтому, если они используют альтернативную стратегию соединения (shmem, TCP, другое), то это будет зависеть от поставщика. Реализации RTI не общаются с реализациями OpenSplice через shmem (но они могут через петлю UDP).
Существует согласование, которое начинается с известных портов UDP.
Если две системы находятся в одной подсети и имеют многоадресную рассылку, они будут подключаться с помощью магии, описанной в стандарте. Это предполагает, что они имеют совместимые идентификаторы доменов, темы, типы и QoS.
Действительно: прочитайте стандарт.
Других решений пока нет …