12月作为2017年的最后一个月,注定就是一个杂事繁忙的时间段。本来试图改完的代码,在无限期的紧急工作中,一步步退后了。但也不是没有收获。
第一点, 总结一下如何找到代码中出现的各种变量定义和调用的函数。
(1)变量:看到最上面的栏
其中HB,全称是header block,里面放置的是全局变量,除本process以外,其余的process也可以使用到。除了放置变量以外,它与.h文件有类似之处,负责声明include文件,负责声明函数,另外在OPNET中独特的是,也用来声明状态转移。
其中SV,全称是state variables,里面放置的是本process内可用的变量。它在界面上显示的是
但实际上,通过点击EditASCII,我们可以获得一个编程者常见的界面,我个人认为更方便一些。
其余的变量会在使用的部分定义,比如FB当中,或者某个状态的进入离开函数当中。
(2)函数的查找和子process的查找
我在最开始使用OPNET时,时常找不到一个代码应该在哪里写,甚至找不到这个函数到底是什么意思。
实际上,除了上次总结中提到的各类基础函数外,其余的函数(非OP开头的),如OMS开头、WLAN开头的函数,类似
都是在.h文件中定义的,OPNET除了提供基础函数以外,也给了很多方面使用的.h文件和.ex.c文件,只要调用了.h文件就可以使用这些扩展函数,具体函数里面是如何进行的,你可以查找ex.c文件。因为我水平比较次,一般情况下,我找不到一个函数在哪里定义了,我就看它的开头(_前面的字母),去OPNET安装文件夹下面直接搜索。一般都能找到。这个方法我还经常用于找packet格式上,而且有时候遇到没见过的协议,直接找名字也会获得帮助。所以多搜索是我万能的办法。
另外,关于childprocess问题,我最开始遇到的时候,感觉到了一个智商的暴击。点开wireless_lan_mac的我,深深地疑问,为什么802.11这么复杂的一个协议居然只有一个状态机???
然后起码一周以后,我才找到child process的入口。
点开有桃花源记的feel。这才是正确的802.11MAC,这才是有退避机制、有ACK、有RTS、有CTS的MAC啊。
(3) 关于代码在哪里写的问题
这个我觉得细节颇多,比如状态转移函数、状态进入和离开函数这些。但是《OPNET Modeler与网络仿真》这本书的第六章6.1写的很清楚明白。我觉得可以一看。
第二点, 我们总结一下到目前为止出现的各种错误细节,和一些经验备用。
(1) 通过远程中断,可以跨越process给到别人中断
/*在当前仿真事件预设一个远程中断*/ op_intrpt_schedule_remote(op_sim_time(),1,processID) |
(2) 关于定时中断
状态转移函数
#define PROGRESS_SCAN (op_intrpt_type() == OPC_INTRPT_SELF && op_intrpt_code() == WPANC_PROGRESS_SCAN_CODE) |
(3) 接收从下层到达的packet,并发送给上层,和关于如何接受上层到达的packet,参考802.15.4 wpan_mac_handle_wireless_pk、wlan_higher_layer_data_arrival等
(4) *compiler debug(对个人起到提醒作用,对其他人无用)
1. 发现undeclared identifier,一般在sv或hb以及本function内查找,分别对应process内的变量、全局变量和局部变量。如果没定义请添加
2. 注意声明外部文件,packet格式,子process,在file-下面对应列表内。并在hb中检查。
3. DCF提供尽力而为的服务,PCF提供有轮询的服务,需要AP,adhoc没有AP,所以按照DCF进行
所以所有PCF相关的内容都不需要。
4. NAV
虚拟载波监听是由网络分配矢量(Network AllocationVector,简称NAV)所提供。802.11的帧通常会包含一个duration位,用来预定一段介质使用时间。NAV本身就是一个计时器,用来指定预计要占用介质多少时间,以微秒为单位。工作站会将NAV设定为预计使用介质的时间,这包括完成整个处理必须用到的所有帧。其他工作站会由NAV值倒数至零。只要NAV的值不为零,代表介质处于忙的状态,此即虚拟载波监听功能。当NAV为零时,虚拟载波监听功能会显示介质处于闲置状态。
保持duration为0,因为process的运行会保证挨个开放传输。
5. fragment去除
原本为了packet太大,切碎使用,作为帧的一个位标识该帧有没有切碎。
6. ap_flag标识是否使能AP(Acess Point)
7. 查看了所有节点的bss identifier 都是0,可能也没有bss?
说明没有AP就没有bss
8. 选择也不重发,删掉wlan_transmit_frame_copy_ptr,也不要ACK
9. CTS-to-self删除CTS功能
10. 确定接收的物理层数据的格式
11. op_stat_write删掉了