Отправка сообщения, когда автомобиль покидает симуляцию

Использую OMNeT ++ - 4.6, сумо-0.22.0 и Veins-4a2.

В моем моделировании каждый узел создает сообщение, сохраняет его в своем буфере и после некоторой задержки отправляет все свои сообщения. Я сделал два таймера, чтобы указать задержку созданных и отправленных сообщений. Таким образом, отправленное сообщение может быть получено другим узлом или получателем, которым является RSU.

Моя симуляция заканчивается, когда все узлы достигают места назначения в соответствии с указанным путем в файле .rou.xml. Каждый узел покидает симуляцию в определенное время.

Цель моего сценария состоит в том, что каждый узел отправляет все сохраненные сообщения при выходе из моделирования, и они должны быть получены адресатом, которым в моем случае является RSU.

Может кто-нибудь сказать мне, как я могу это сделать, используя self-message () или другое решение?


person Fariha    schedule 20.03.2017    source источник
comment
Возможный дубликат Дождитесь получения ACK в finish () функция в венах   -  person Christoph Sommer    schedule 22.03.2017
comment
Есть ли на этот вопрос ответ?   -  person Julian Heinovski    schedule 22.07.2018


Ответы (1)


Начните изучать TraciScenarioManager и TraciCommandInterface выяснить, как осуществляется связь с SuMO. Затем проверьте документацию по протоколу TraCI, чтобы узнать, можно ли и как получить уведомление, когда транспортное средство находится в конце своего маршрута или чтобы узнать время, когда транспортное средство будет там, чтобы вы могли запланировать собственное сообщение на это время. Когда вы получите это уведомление, вы можете отправить все сообщения, которые вы сохранили, а затем продолжить симуляцию, которая должна удалить соответствующий узел.

Я не думаю, что есть метод, который поддерживает такое уведомление прямо сейчас, но когда вы знаете необходимые части протокола, добавление этой функции к модулям должно быть довольно простым.

person Julian Heinovski    schedule 20.03.2017
comment
Еще раз спасибо за ответ. Я проверю все, что вы мне сказали, но у меня есть вопрос: я пытался отправить сообщения, хранящиеся в функции finish (), поскольку каждый узел, покидающий симуляцию, выполняет ее. Сохраненные сообщения отправляются, но они не принимаются адресатом, поэтому, когда я получу уведомление, как вы сказали, как я могу заставить узел ждать, пока не получит ACK, поскольку он также отправит сообщения, а затем выйдет из моделирования, и сообщения будут не получится? - person Fariha; 20.03.2017
comment
Метод finish () - это последний метод, который модуль / компонент / узел когда-либо выполнял после завершения моделирования, поэтому ваши сообщения могут быть отправлены, но handleMessage никогда не будет вызываться ни для одного получателя. Вам нужно будет использовать такие вещи, как LifecycleManager, чтобы определить жизненный цикл узла и выполнить отправку всех буферизованных сообщений, когда жизненный цикл конкретного узла закончится. Отправлять их в finish () определенно неправильно. Собирать только окончательную статистику и (возможно) удалять запущенные таймеры внутри finish (). - person Michael Kirsche; 21.03.2017
comment
Спасибо за ваш ответ и за эту идею. Я пытаюсь выполнить поиск по Lifecycle Listner, но не нашел примеров, показывающих, как мы можем его использовать. Если вы знаете, как я могу использовать его с handleMessage () в BaseWaveApplLayer () в Veins, или если вы знаете такой веб-сайт с примерами, не могли бы вы прислать их мне, пожалуйста? Это мне очень поможет. - person Fariha; 21.03.2017
comment
Я не уверен, включает ли Veins концепцию LifeCycleListener / Manager. Это концепция INET, где (например) можно отслеживать статус узла (или интерфейса). Если вы не используете Veins с INET, вам, вероятно, придется определить свои собственные механизмы с сигналами (отключение узла) и, возможно, слушателями. - person Michael Kirsche; 21.03.2017