#omnet #veins #sumo
#omnet #вены #sumo
Вопрос:
Я пытаюсь реализовать команду TraCi для сценария mysumo (traci.lane.setDisallowed) при использовании veins. Я создал новую команду в TraciCommandInterface.cpp как:
void TraCICommandInterface::Lane::setDisallowed(std::list<std::string> disallowedClasses)
{
TraCIBuffer buf = connection->query(CMD_SET_LANE_VARIABLE, TraCIBuffer() << LANE_DISALLOWED << laneId << TYPE_STRINGLIST << disallowedClasses);
ASSERT(buf.eof());
}
и вызывается как:
std::list<std::string> disallowedClasses = {"all"};
if (simTime()==20) {
TraCICommandInterface* cInt = getCommandInterface();
cInt->lane("ed_1_0").setDisallowed(disallowedClasses);
}
Проблема в том, что я получаю ошибку:
Ответ с ошибкой на команду 0xc3: неправильная позиция в RequestMessage после отправки команды 195. Ожидаемая длина команды составляла 38, но было прочитано 18 байт.
Что-то не так с тем, как я реализовал команду? Есть предложения, почему возникают эти проблемы?
Ответ №1:
Начиная с версии Veins 5.0, TraCIBuffer
имеет только несколько перегрузок для типов данных C , в частности для std::string
, simtime_t
, и TraCICoord
(см. Здесь ). Все остальные типы отправляются как сохраненные в памяти (путем приведения к char*
) (см. Здесь ) — конечно, не очень хорошая идея std::list
.
Для копирования / вставки кода для сериализации a std::list<std::string>
в двоичный двоичный объект, представляющий TYPE_STRINGLIST
ожидаемые SUMO / TraCI, см. Код TraCICommandInterface::Vehicle::changeVehicleRoute(const std::list<std::string>amp; edges)
, доступный здесь .