Ошибка при попытке использовать отслеживание транспортных средств в Veins через интерфейс TraCI для SUMO

Я использую Veins3.0 с SUMO-0.21.0 и omnetpp4.4. Я пытался использовать команду отслеживание транспортных средств в TraCI/SUMO. Это описано здесь: http://sumo.dlr.de/wiki/TraCI/Change_GUI_State. Там вы можете прочитать, что Variable View ID Type of the value New Value для этой команды равно 0xa6 "View #0" string <vehicle id>.
Итак, я написал новую функцию в TraCICommandInterface.cc для отслеживания транспортного средства.

void TraCICommandInterface::setVehicleTracking(std::string nodeId) {
    uint8_t variableId = VAR_TRACK_VEHICLE;
    uint8_t variableType = TYPE_STRING;
    TraCIBuffer buf = connection.query(CMD_SET_GUI_VARIABLE, TraCIBuffer() << variableId << "View #0" << variableType << nodeId);
    ASSERT(buf.eof());
}

Я использовал некоторые константы из TraCIConstants.h

// track vehicle
#define VAR_TRACK_VEHICLE 0xa6
// command: set GUI variable
#define CMD_SET_GUI_VARIABLE 0xcc
// 8 bit ASCII string
#define TYPE_STRING 0x0C

Функция вызывается из TraCIMobility.h, что заполняет идентификатор узла getExternalID().

    void commandTrackVehicle(){
        getCommandInterface()->setVehicleTracking(getExternalId());
    }

Ошибка возникает, когда я вызываю commandTrackVehicle() из модуля автомобиля с mobility->commandTrackVehicle();.

Текст ошибки в SUMO:

error: tcpip::Storage::readIsSafe: want to read 1717063210 byte from Storage, but only 12 remaining

Кто-нибудь знает, как решить эту проблему или получить больше информации об ошибке? Спасибо.


person Alex    schedule 01.12.2015    source источник


Ответы (1)


Ваш код должен работать, если вы измените TraCIBuffer() << "View #0" на TraCIBuffer() << std::string("View #0").

Причина немного сложна:

API TraCI SUMO определяет свой тип данных string как

32-битная длина строки, за которой следует текст, закодированный как 8-битный ASCII.

Veins 3 имеет перегрузку для отправки std::string как строку, совместимую с TraCI. У него нет одного для типа данных указатель на байт (ы) (char*). То есть, если вы вставите char* (то, чем "View #0" является для компилятора) в Veins 3 TraCIBuffer, он не будет знать, как применить это специальное форматирование, запутав SUMO, отправив байт (который он пытается интерпретировать как 32). длина в битах с последующей попыткой прочитать столько байтов, сколько указывает «длина», и неудачей).

person Christoph Sommer    schedule 03.12.2015