获取车辆ID

时间:2019-09-29 07:47:26

标签: omnet++ veins

我正在尝试获取车辆ID,如下所示:

mobility = TraCIMobilityAccess().get(getParentModule());
assert(mobility);
traci = mobility->getCommandInterface();
traciVehicle = mobility->getVehicleCommandInterface();
cout<< mobility->getExternalId();

但是它返回无效的车辆ID。怎么了?

请帮助我解决此问题。谢谢。

2 个答案:

答案 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。


顺便说一句,您获得myId18的车辆ID的原因是,返回的模块可能只是主机模块和子模块,例如20用于18,而node[*]用于其20子模块。