Veins教程06 - Veins应用层详解

这篇教程来详细讲讲Veins中的应用层

打开src/veins/modules/application/traci可知Veins的example为提供了两个应用层实现,分别是TraCIDemo11pTraCIDemoRSU11p,查看这两个文件可知他们又同时继承自src/veins/modules/application/ieee80211p/DemoBaseApplLayer。逐步网上查看,可知如下关系。

关系图

从上往下依次分析

BaseLayer

比较重要的几个函数是

  • initialize: 初始化函数,实例被创建时调用
  • handleMessage: 收到消息时被调用,判断消息类型并分发处理
  • handleSelfMsg: 如果消息是发给自己的selfMsg则用这个函数处理,selfMsg后面讲
  • handleUpperMsg: 如果消息是从上层传来,也就是发送消息,则用这个函数处理,不过这里没有实际的处理内容,后面讲的几个继承类也没有使用这个函数
  • handleLowerMsg: 如果消息是从下层传来,也就是接收消息,则用这个函数处理,不过这里没有实际的处理内容,后面讲的几个继承类也没有使用这个函数
  • sendUp: 向上层发送消息
  • sendDown: 向下层发送消息

如果想彻底搞懂消息发送流程,可以在这个类中插入断点用debug模式运行。

BaseApplLayer

继承自BaseLayer,可以看出这个类只重写了sendDelayedDown函数,内容是记录消息。

DemoBaseApplLayer

主要是重写BaseLayer的函数实现,还有几个新增的函数和属性,合起来讲,几个重要的是

  • populateWSM: 这是一个集中处理待发送消息的函数,给消息的属性赋值
  • onXXX: 收到对应类型消息的处理函数
  • curPosition: 记录当前的坐标
  • myId: 实例的ID
  • generatedXXX: 记录发送的对应消息的数量
  • receivedXXX: 记录接收的对应消息的数量

如果想创建新类型的消息,需要修改/创建相应的onXXXgeneratedXXXreceivedXXX,并且可能的需要修改populateWSM

TraCIDemo11p

这个是小车的应用层类型,如果前面几个基类读懂了,这个类型也比较简单

需要注意的是

  • onWSM中,实现的功能是变色和延迟两秒后转发消息。
  • handlePositionUpdate中,他实现的功能是,如果当前小车超过十秒钟没有移动,则认为是堵塞/车祸,因此给其他节点发送消息。

TraCIDemoRSU11p

这个相当于是个低配TraCIDemo11p类型,主要内容只有转发消息。

HandleSelfMsg

其实是一个OMNet++的概念。通俗来说就是处理小车发送给自己的消息。小车给自己发送消息用到的是OMNet++提供的scheduleAt函数,scheduleAt函数相当于一个Timer函数,类似Node.js中的setTimeOut,也就是在设定的时刻给自发送一个消息,并因此触发handleSelfMsg

评论