Ошибка при реализации setDisallowed setAllowed для Sumo и Veins?

#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) , доступный здесь .