Клиент MQTT подписывает данные от издателя RTI DDS

Можно ли заставить Mosquito Mqtt и RTI DDS общаться друг с другом?

Я хочу, чтобы мой подписчик Mqtt подписывался на данные от издателя DDS или наоборот.


person user10075116    schedule 13.07.2018    source источник


Ответы (2)


Нет, вам придется написать свой собственный бридж

person hardillb    schedule 13.07.2018
comment
Спасибо за ответ. Просто чтобы уточнить, я создал код C++, который будет вызывать моего издателя/подписчика dds в зависимости от случая, как показано ниже: Mqtt sub-> Mqtt Publisher -> [Код C++ (dds pub/sub)] -> DDS Publisher. Это верно? - person user10075116; 15.07.2018
comment
Нет... MQTT-издатель отправляет, MQTT-подписчик получает, формат преобразует данные в тип DDS, а затем публикует их в домене DDS для получения подписчиком DDS. Вы, кажется, перепутали «pub» и «sub» или ваши стрелки назад. В обратном порядке издатель DDS пишет, подписчик читает и форматирует данные в сообщение MQTT, публикует его, а подписчик MQTT получает. Это не так сложно, как кажется, если вы понимаете обе методологии. - person rip...; 18.07.2018
comment
Большое спасибо за ответ. Да, я ошибся, стрелки перепутаны. Я добился того, чего хотел, написав простой код C++ в коде подписчика DDS, который при подписке на данные публикует данные в клиенте подписчика MQtt. :) - person user10075116; 18.07.2018

Я перемещаю свой комментарий из ответа hardilib в его собственный ответ, а не оставляю его в комментариях.

  • У вас есть очередь MQTT, в которой есть издатели и подписчики.
  • У вас есть тема DDS, в которой есть DataWriters и DataReaders.

Чтобы «DDS DataWriter мог общаться с подписчиком MQTT» или «издатель MQTT мог общаться с DDS DataReaders», вам необходимо реализовать приложение-мост, которое:

1) Подписывается на очередь сообщений MQTT (или тему DDS).

2) Преобразует («изменяет формат») данные из объекта сообщения MQTT (или образца DDS) в образец DDS (или объект сообщения MQTT).

3) Записывает данные в тему DDS с помощью настроенного экземпляра DDS DataWriter (или записывает данные в очередь сообщений MQTT).

Если две инфраструктуры эффективно используют один и тот же тип данных (определенный в IDL или около того), то все просто.

В лучшем случае вы можете реализовать класс, который имеет все необходимые методы, чтобы действовать как экземпляр сообщения (возвращаемый средством чтения MQTT или написанный средством записи MQTT), так и пример экземпляра типа DDS (который может быть принят). с помощью DataWriter или DataReader) одновременно. В этом случае вы ожидаете DataReader, пока не получите новый образец, и немедленно вызываете средство записи MQTT с полученными образцами. Или вы ожидаете в очереди MQTT, принимаете входящие сообщения, а затем немедленно вызываете DataWriter для записи сообщения MQTT, которое вы только что получили, используя DDS DataWriter.

В худшем случае это совершенно разные типы, и в этом случае вам нужно написать пару методов перевода, которые понимают структуру как того, что было прочитано, так и того, что нужно записать.

Реальность будет где-то посередине. Становится сложнее, если тип MQTT просто определен как просто «строка ascii» переменной длины, и в этом случае ваши методы перевода должны иметь возможность маршалировать (сериализовать/десериализовать) данные в DDS и из него.

person rip...    schedule 21.08.2018