Veins教程06 - Veins应用层详解
这篇教程来详细讲讲Veins中的应用层
打开src/veins/modules/application/traci
可知Veins的example为提供了两个应用层实现,分别是TraCIDemo11p
和TraCIDemoRSU11p
,查看这两个文件可知他们又同时继承自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: 记录接收的对应消息的数量
如果想创建新类型的消息,需要修改/创建相应的onXXX
,generatedXXX
,receivedXXX
,并且可能的需要修改populateWSM
。
TraCIDemo11p
这个是小车的应用层类型,如果前面几个基类读懂了,这个类型也比较简单
需要注意的是
- 在
onWSM
中,实现的功能是变色和延迟两秒后转发消息。 - 在
handlePositionUpdate
中,他实现的功能是,如果当前小车超过十秒钟没有移动,则认为是堵塞/车祸,因此给其他节点发送消息。
TraCIDemoRSU11p
这个相当于是个低配TraCIDemo11p
类型,主要内容只有转发消息。
HandleSelfMsg
其实是一个OMNet++的概念。通俗来说就是处理小车发送给自己的消息。小车给自己发送消息用到的是OMNet++提供的scheduleAt
函数,scheduleAt
函数相当于一个Timer函数,类似Node.js中的setTimeOut
,也就是在设定的时刻给自发送一个消息,并因此触发handleSelfMsg
。