我正在尝试获取车辆ID,如下所示:
mobility = TraCIMobilityAccess().get(getParentModule());
assert(mobility);
traci = mobility->getCommandInterface();
traciVehicle = mobility->getVehicleCommandInterface();
cout<< mobility->getExternalId();
但是它返回无效的车辆ID。怎么了?
请帮助我解决此问题。谢谢。
答案 0 :(得分:1)
无效的车辆ID 是什么意思?相符使用的是获取标识符的方式。如果是这样,您可以指定您希望将其用作标识符吗? (从[1]开始的omnet的?) 由于SUMO的ID与omnet中一个显而易见的ID(创建顺序)不同,您可以添加以下内容以获得自己的ID(与omnet的ID相匹配): 在您的 TraCIDemo11p 的“ .h ”文件中,添加您的ID:
protected:
int your_id;//added
TraCIDemo11p 的“ .c ”文件中,会影响ID中的索引:
if (stage == 0) {
...
your_id = getParentModule()->getIndex();//added
...
下一步,在您要验证语句的位置,添加以下内容:
EV << "My SUMO id = " << mobility->getExternalId() << endl;
EV << "My VEINS id = " << your_id /*or just : getParentModule()->getIndex()*/<< endl;
我希望这会有所帮助。
答案 1 :(得分:0)
您可以在FindModlue::findHost()
的{{1}}中尝试DemoBaseApplLayer::initialize(int stage)
:
DemoBaseApplLayer.cc
它将首先返回主机模块,然后使用EV << FindModule<BaseMobility*>::findHost(getParentModule())->getId() << endl;
函数获取其ID。
为了更好地理解:
首先,您可以运行模拟以查看整个模拟的索引,并且会像这样: Simulation information in veins
从图中可以看出,每个对象都分配有一个数字,例如getId()
具有ID node[0]
,此外,每个子模块还分配有ID号,例如
7
id = 7
node[0]
id = 8 appl
id = 9 nic
id = 10 所有这些ID(7,8,9,10)都指向veinsmobility
,这意味着您可以使用这些ID来识别特定的汽车。
在默认的node[0]
中,您可以找到
DemoBaseApplLayer.cc
和
mac = FindModule<DemoBaseApplLayerToMac1609_4Interface*>::findSubModule(getParentModule());
在初始化函数myId = mac->getMACAddress();
中。
因此,您已经可以使用void DemoBaseApplLayer::initialize(int stage)
作为车辆ID。
顺便说一句,您获得myId
和18
的车辆ID的原因是,返回的模块可能只是主机模块和子模块,例如20
用于18
,而node[*]
用于其20
子模块。