DDS Ключевые темы
В настоящее время я использую RTI DDS в системе, где у нас будет одна основная тема для нескольких элементов, например car topic
с несколькими vin
номера. Так как это дизайн, я пытаюсь сделать "keyed" topic
которая в основном является темой, в которой в качестве ключа выступает член (вроде как первичный ключ в базе данных), который в этом примере будет vin
каждой машины. Для реализации keyed topics
Я использую файл IDL, который выглядит следующим образом,
const string CAR_TOPIC = "CAR";
enum ALARMSTATUS {
ON,
OFF
};
struct keys {
long vin; //@key
string make;
ALARMSTATUS alarm;
};
Когда я запускаю файл IDL через rtigen
инструмент для создания файлов типа C,Java и т. д. из IDL, единственное, что я могу сделать, это запустить программу и посмотреть,
Writing keys, count 0
Writing keys, count 1 ...
а также
keys subscriber sleeping for 4 sec...
Received:
vin: 38
make:
alarm : ON
keys subscriber sleeping for 4 sec...
Received:
vin: 38
make:
alarm : ON ...
Таким образом, трудно понять, как работают ключевые темы и действительно ли они работают. Кто-нибудь есть какие-либо входные данные, что делать с файлами, созданными из файлов IDL, чтобы сделать программу более функциональной? Также я никогда не вижу тему CAR
поэтому я не уверен, что использую правильный синтаксис, чтобы установить тему для DDS.
1 ответ
Когда вы говорите "единственное, что я могу сделать, это запустить программу", неясно, что такое "программа". Я не распознаю точный вывод, который вы даете, поэтому вы корректировали код сгенерированного примера?
В любом случае, отвечая на некоторые ваши замечания:
Таким образом, трудно понять, как работают ключевые темы и действительно ли они работают.
Концепция ключей наиболее отчетливо видна, когда в вашем DataReader одновременно присутствуют значения для нескольких экземпляров (то есть разных значений ключей). Это сравнимо с наличием таблицы базы данных, содержащей несколько строк одновременно. Таким образом, чтобы продемонстрировать концепцию ключа, вам нужно будет присвоить различные значения ключевым полям на стороне DataWriter и write()
Полученные образцы. Это не происходит по умолчанию в сгенерированных примерах, поэтому для достижения этой цели вам нужно настроить код.
На стороне DataReader вам необходимо убедиться, что несколько значений остаются сохраненными, чтобы продемонстрировать эффект. Это означает, что вы не должны делать take()
(что похоже на "деструктивное чтение"), но read()
, Таким образом, число значений в вашем DataReader будет расти в соответствии с количеством различных значений ключей, которые вы написали.
Обратите внимание, что в реальной жизни у вас не должно быть постоянно растущего числа значений ключей, точно так же, как вы не хотите, чтобы таблица базы данных содержала постоянно растущее число строк.
Также я никогда не вижу тему CAR, поэтому я не уверен, что использую правильный синтаксис для установки темы для DDS.
Проверьте кусок кода, который создает тему. Имя метода зависит от языка, который вы используете, но должно иметь что-то вроде create_topic()
в этом. Вторым параметром этого вызова является название темы. В общем, константа IDL CAR_TOPIC
что вы определили не будет автоматически использоваться в качестве названия темы, вы должны указать это в коде.
В зависимости от того, какой пример вы используете, вы можете попробовать -h
чтобы получить дополнительные флаги для использования. Возможно, вы сможете увеличить детализацию, чтобы увидеть имя создаваемой темы, или установить имя темы вне командной строки.
Если вы хотите проверить название темы в вашей системе, вы можете использовать rtiddsspy
смотреть поток данных. Его вывод включает в себя названия тем, которые он обнаруживает.