opnet如何进⾏C语⾔编程,OPNET学习⼩记(五)
最近⼀直在研究⽆线环境下两个节点的单⼯通信,和有线通信⼀样还是数字喷泉码,我就是想在发端⽣成⼀定数量的数据包,然后经过删除信道后在收端统计最终收到的包数,并将接收到的包的数据读出后解码。看似没什么难度还是浪费了我⼀周多的时间,我感觉⾃⼰主要卡在以下三个地⽅:
问题1:如何确定收端数据包已经接收完毕?
这是⾮常必要的,不然没法计算最终收到的包数。
我最初的想法是在发端设⼀个全局变量pk_count=10,假设发端⼀共发10个包,每发⼀次,pk_count--,这样的话当pk_count减为0时就意味着数据包已经发完,接收端就可以统计最终收到的包数了。但仿真试了⼀下发现不可⾏,因为发端发完了并不意味着收端也收完了,毕竟还有⼀定的传输和处理延时,可能最后的⼏个包还在收端排队着呢。
此路不通只好再想办法了,⼀个新的idea就是当且仅当满⾜pk_count=0
&&
op_strm_empty(IN_STRM) &&
信道空闲的条件时认为数据包已经接收完毕,那么如何判断信道空闲呢?关于这个问题,我之前CSMA中仿真过,就是在收发通信机之间画⼀条统计线,然后调⽤op_stat_local_read()读取信道状态。按理说问题到这⼉就解决了,可是新的问题⼜来了:⽆线怎么画统计线?我在百思论坛搜了⼀下,也有⼈问类似的问题,知道在⽆线环境中也是可以画统计线的,但具体怎么操作说实话没太看懂Orz……我试着在接收节点模型中添加了⼀个channel_test节点与收信机⽤统计线相连来读取信达状态,虽然仿真的时候没报错,但是仿真完了发现这个统计线加了和不加没什么区别,还是没法准确判断数据包全部接收完没有~~~~~~~~~
学编程学什么语言更好折腾了好久实在没招了,师兄帮忙吧……师兄的建议是:设置⼀个定时中断,每隔⼏秒触发⼀次⾃中断后判断是否有数据包到达,有的话取消中断继续执⾏程序,否则条件转移到下⼀个状态。顿时茅塞顿开~~~回去试了⼀下,折腾了我好⼏天的问题瞬间解决!所以说师兄还是很⽜的,多念两年书就是不⼀样~~~
这就是定时中断的那⼏⾏程序~~~
对了,还有⼀个unsolved
problem:在我这个程序⾥定时的时间常数30的单位是秒还是毫秒?有⼀点⽐较诡异的是如果我把定时时间设为2,只读⼀个数据包就判断接收完毕了,只有设置的⼤⼀点⼉才能确保所有数据包都接收结
束。这是怎么回事⼉呢?按理说只要能读出⼀个数据包说明这个定时间隔就是合理的啊……想不明⽩,纠结ing……
问题2:如何在接收到⼀定量(即能保证成功译码的数据包量)的数据包后终⽌仿真?
这个问题估计⼤家的第⼀反应都是采⽤仿真结束中断的办法吧。但是我没⽤过仿真结束中断,⽽且对于我这种菜鸟级别的⼈来说,每次新接触OPNET⾥的某个技术、哪怕只是⼀个函数我都要出很多错,然后费很⼤功夫去解决。所以为了省事⼉,我改⽤c语⾔跳出程序的办法来结束仿真。先试的是return,因为按理说只要遇到return整个程序就会跳出,可使⽤了return后仿真报错,说什么void类型的程序不能有返回值,⽽且函数输⼊输出不匹配,我对这种问题最没耐⼼解决了,直接换break,结果发现break只能跳出⼀部分程序,当有新的数据包达到时还是会执⾏仿真的……
啊啊啊~~~~~~没招了,还是⽤endsim吧,在⽹上⼀顿查资料,然后再在⾃⼰的进程模型中修改,好像也没那么难……居然⼀次性仿真通过,问题解决了!
问题3:如何在⽆线链路中设置删除信道?
这个问题我认为最难解决了,我⼏乎把14个管道阶段程序都看了⼀遍,每个阶段具体做什么、实现什么功能也基本了然于⼼了,可就是不知道怎么修改管道程序。
重新整理⼀下思路:14个管道阶段与误码有关的主要有6个阶段,分别是:bkgnoise、inoise、snr、ber、error、ecc。先是计算bkgnoise和inoise,这两个阶段计算的结果⼜是snr计算的基础,snr计算存储好后⼜在ber阶段读出来计算ber,ber对error阶段错误的分配有影响,⽽error阶段计算的error_num⼜决定了该包能否被接收。纵观整个管道阶段模型,可以被修改的管道只有bkgnoise和error两个阶段,其中bkgnoise阶段影响其值⼤⼩的⽆⾮就那么⼏个参数:布尔曼常数、环境温度和rx_noisefig,布尔曼常数基本是不怎么改的,环境温度的话管道函数⾥设为290,想要噪声⼤点⼉的话可以取⼀个更⼤的数(个⼈认为),rx_noisefig是在⽆线接收机属性⾥⾃⼰设
的,rx_noisefig=1.0时噪声最⼩,逐渐增⼤其值时噪声逐渐增⼤。通过适当增⼤噪声理论上应该是可以产⽣合适的丢包率的,但我感觉这样太⿇烦⽽且不好设置丢包率,⼲脆就在error错误分配阶段改了,直接产⽣⼀个0到1之间的随机数r,如果r>=0.2,error_num=0,否则error_num=1。这样的话就算设置丢包率为0.2的删除信道了,就是不太规范~~~~
问题解决完了,show⼀下最终的仿真成果:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论