以下都是个人理解!有更好见解可以提出,共同学习,共同进步!

MACA协议主要详细规则大家可以查看相关书籍。

我直接记录我自己的思路如下:设计节点,构建网络

一、节点模型

1.首先节点的设计,因为我主要想仿真MACA协议(MAC协议),因此简单将节点模型设计为如下图所示:

整个节点模型只有一个MAC层,数据包处理模块和接收机发射机。数据包处理模块和接收机发射机模块具体参数设置到后面调试再说。

虚线表示一个接收机的数据包收集线。

2.节点模型设置

A\interfaces-->node interfaces-->打开如下:

这里值得注意的是:因为需要接受数据包,一定需要设置altitude(天线)的高度,其单位是最初建立环境时的单位。我这里建立的是100KM*100KM的office环境,天线高度的单位因此是KM。

B\各个模块的包的传输速率需要统一,例如接收机和发射机

二、进程模型

然后就主要设计了MAC层的模块。此模块的进程模型如下图所示:

状态转移过程如下:

此协议主要有五个状态:空闲、竞争、等待数据、等待CTS、静默。(一般红色的非强制转移状态才是主要考虑的)

每个状态的执行过程应该是:入口代码、等待中断、中断到达、出口代码、执行转移条件的判断

A.当节点处于空闲状态时。

入口代码,需要初始化一些参数,比如需要将数据到达和CTS到达的事件重新重新初始化为未发生。因为当再一次回到空闲状态时,某些参数可能被改变,再一次从空闲状态转移便会出错。

有三种需要转移的情况:第一是当此节点有包发送并且没有接收到其他帧时,转移到竞争状态,准备发送数据。;第二是接收到发送给我自己的RTS,需要回CTS,然后发送数据;第三是接收到别人的RTS或者CTS,转移到退避状态;                                   (这里是流中断)

出口代码主要执行一些需要在这个状态执行的操作,为状态转移条件做准备。                                                                                 (展示空闲状态出口代码)

if(ARV_UP){queue_pk();//如果从src来的包,则将需要发送的包压入队列}
if(ARV_DOWN){rcv_pk_type();//如果是接收到的流,判断其包类型并执行一些操作}
//上述两个函数都是自己写的NO_FRAME=!(RCV_RTS||RCV_OTHER_RTS||RCV_OTHER_CTS);//判断转移条件

B.当节点处于竞争状态时。

入口代码。需要设置竞争等待时间(超过这个时间,则发生状态转移)

有三种种需要转移的情况。第一种等待时间超过并且信道空闲,那么发送RTS,转移到等待CTS状态。第二种在等待时间内接收到发送给自己的RTS,那么回一个CTS,转移到等待数据状态。第三种在等待时间内接收到其他的RTS和CTS,那么转移到静默状态。(这里等待时间是自中断、接收到其他数据包是流中断)

出口代码主要执行一些需要在这个状态执行的操作,为状态转移条件做准备。

C.当节点处于等待CTS状态时。

入口代码。需要设置等待CTS时间(超过这个时间,还没有等到CTS,则发生转移)

有一种需要转移的情况。当等待时间超过还没有接收到CTS,或者在等待过程中接收到CTS,则转移到空闲状态(这里等待时间是自中断,接收到CTS数据包是流中断。但这里不太可能接收到别人的CTS或者RTS,因为信道被占用)

出口代码。当流中断来临时,取消自中断。

D.当节点处于等待数据状态时。

入口代码。同理设置等待时间,等待时间超过,便抛出一个自中断。

有一种需要转移的情况。当等待时间超过还没有接收到数据时,或者在等待过程中接收到数据,则发生转移到空闲状态。(情况和等待CTS类似)

E.当节点处于静默状态。(这个状态我原本写错了)

(错误思路:当转移到这个状态时,设置静默时间作为一个自中断;当接收到其他RTS或者CTS流中断时,取消这个自中断///但是问题是,我已经收到其他RTS或者CTS才能转移到静默状态,我转移到这个状态可能接收不到其他RTS或者CTS了)

正确思路是:我在上一个状态收到RTS或者CTS流中断,转移到静默状态,并且设置一个静默时间。

此时有两种情况需要转移,第一是静默时间完毕,判断条件,转移到空闲状态;第二是接收到发送给自己的RTS,执行出口代码(发送CTS),判断条件,转移到等待数据状态。

F.每个节点都有默认转移。

当满足不了其他转移条件时,便执行默认转移。如果不写,容易发生意想不到的错误。因此每个状态都有默认转移。

如果不想默认转移项一直执行,在入口代码出限制即可。

如此,我的MAC协议进程模块便写好了。此刻注意一些参数的设置(为你的进程模块添加一些属性)。

比较重要的是如下图所示:

Interfaces--->process interfaces--->begsim intrpt 一般其改为enabled。(我之前忘记改了,就一直错)

begsim intrpt影响init状态的enter代码何时执行,如果是enabled,那么仿真一开始,即仿真0时刻,可以对process进行初始化,process被触发后,即执行init的enter代码。endsim intrpt如果仿真结束时,需要进行一些工作(如变量的收集,内存的释放等),则需要enable endsim intrpt。

三、中断及函数(只提及我用过的)

A.中断

1.流中断(直接给出用法)

#define UP_STREAM    0
#define DOWN_STREAM  1//define break for strm
#define ARV_UP   (op_intrpt_type()==OPC_INTRPT_STRM&&op_intrpt_strm()==UP_STREAM)
#define ARV_DOWN (op_intrpt_type()==OPC_INTRPT_STRM&&op_intrpt_strm()==DOWN_STREAM)

2.自中断

#define CONTEND_T     (op_intrpt_type()==OPC_INTRPT_SELF&&op_intrpt_code()==CONTEND_TIMEOUT)

op_intrpt_code()返回中断号,即第几个自中断。

B、函数(由于时间问题,只列出来并稍微解释,详细看OPNET自带文档)

op_pk_create()//创建一个包
op_ici_attr_set(iciptr,"frame_type",rts_frame);//为ici接口绑定属性

(不写了,用的时候查吧)

四、在调试过程中,产生的一些问题,以及一些解答和解决方案。

1.op_intrpt_code()和op_intrpt_strm()在同时都用于获取流中断的序号时,有什么区别?

2.opnet里面的执行过程为(事件----->触发中断----->进程执行)

比如:一般对于一个节点,收发数据包:触发流中断

等待超时 :触发自中断,进程内部状态转移,执行某些操作

3.ICI

将指定的ICI指针存储在数据包中,在数据包和ICI之间建立关联。(隐含就是一个数据包在不同时候可以绑定不同的ICI)

4.op_subq_pk_remove()

获得指向存储在指定位置的指定子队列中的数据包的指针,并从子队列中删除该数据包。

5.需要产生队列,mac层不能使用进程模块

6.写完后,运行,没有产生包??

写的时候上下包流没有匹配正确

7.产生包,但是很奇怪,只是发生了RTS,然后永远停留在CONTEND状态?

8.ODB调试经验

9.OPNET无线发送时,只有自己能收到自己的包,其他节点都收不到,可能是什么原因?

传输速率修改了

接收地址和目的地址也改了

传输功率也改了

最后发现是接收天线没设置。

10.<<< Program Abort >>>
Packet pointer is NIL.
T (0.00873242), EV (207), MOD (top.Office Network.node_2.mac_f), KP (op_pk_ici_set)???

不知道为啥,将begin intrpt设置为enable即可,然后就没有报错。(只是在0.03s)

当我换成0.1时,又报同样的错误

然后将产生包的时间间隔改成(0.001),就可以

跑出来,结果不对

然后是静默状态写错了。

基于MACA协议(MAC协议)的仿真来学习opnet的一些记录相关推荐

  1. 电脑发朋友圈软件!加人/发朋友圈/防撤回/定位等!ipad协议/mac协议/web协议实现

    可实现微信80%功能:支持62数据登录.扫码登录.收发朋友圈.查看朋友圈.微信建群.微信拉人进群.微信公众号阅读.微信消息收发.微信附近的人定位.微信添加好友.微信红包接收.微信防撤回.分享小程序.微 ...

  2. 无线传感网学习笔记(3)—— MAC协议 和 CSMA协议

    一.Medium Access Control protocol(媒质访问控制协议MAC) 1.概念:网络中的通信介质通常被大量节点共用,传输各自的数据包,而MAC协议负责协调网络中各个节点对共用介质 ...

  3. 无线传感器网络的MAC协议

    LAN的数据链路层 按功能划分为LLC和MAC 分解目的:分离与硬件相关/无关的部分,降低复杂度 LLC:与介质.拓扑无关 MAC:与介质.拓扑相关 数据链路层--MAC子层 负责对物理媒体的使用进行 ...

  4. 基于NS2的AODV协议的修改与仿真的实现

    最近在用ns2帮别人做移动自组网aodv协议的改进仿真实验,学习了路由仿真方面的不少知识,顺手记录下来. ns2的安装 查阅网上资料发现ns2可以在cygwin上安装,为了省事就用cygwin安装了n ...

  5. 2.2Ad Hoc 网络的MAC协议

    Ad Hoc 接入协议的分类 ⭐按照信道接入时握手协议的发起者可划分: (1)发方主动的信道接入协议: 由发送节点主动发起信道预约,大多数的信道接入协议属于此类,如MACA.MACAW等. (2)收方 ...

  6. 论文笔记-高速无人机网络MAC协议

    参考文献: 常扬, 陈建民, 马鹏飞. 高速无人机网络MAC协议设计与性能分析[J]. 无线电工程, 2011(03):27-30. 注意: 文中双引号斜体部分为引用论文原文 论文背景 需要一套快速展 ...

  7. Linux_网络_数据链路层协议 MAC帧/ARP协议 (以太网通信原理,MAC地址与IP地址的区分,MTU对IP/TCP/IP的影响,ARP协议及其通信过程)

    文章目录 1. 以太网(基于碰撞区与碰撞检测的局域网通信标准) 2. 以太网的帧格式(MAC帧) MAC地址,IP地址的区分 MTU MTU对IP协议的影响 MTU对TCP/UDP协议的影响 3.AR ...

  8. VX_Ipad协议和Mac协议

    个人微信号目前几种接入的办法和路线.主流的路线有如下几条: Web网页端:2017年后不再支持新号登录,仅支持老号,并且掉线严重,功能缺失严重. Xposed技术:在2019年6月份,微信官方在行业重 ...

  9. 信道划分介质访问控制ALOHA协议CSMA协议CSMA/CD协议轮询访问MAC协议

    注:最后有面试挑战,看看自己掌握了吗 文章目录 传输数据两种链路 点对点链路 广播式链路 介质访问控制 静态划分信道 动态划分信道 轮询访问介质访问控制 随机访问介质访问控制---所有用户都可以随机发 ...

最新文章

  1. html锚点(mao dian)--特殊的超链接
  2. 深入理解JVM虚拟机(二):垃圾回收机制
  3. Fusion组件库是如何支持多语言能力的
  4. rvm 安装后的补充工作:source $HOME/.profile
  5. 第三节:创建一个Vue实例,超简单
  6. 使用“/proc”系统调试多线程程序挂死的问题:
  7. 关于JS中和||用法技巧
  8. 流程DEMO-费用报销
  9. 无边框Button(WPF)
  10. 【在线仿真】Arduino WS2812b环形24颗霓虹灯动态效果显示
  11. 用于科学计算机的计算器特点是什么意思,科学计算器在线e
  12. Linux常见Bug解决方案
  13. 锚( Anchor Boxes)
  14. 企业电子招投标系统简介 招投标系统源码 定制化服务 二次开发 java招投标系统 招投标系统功能设计
  15. 记录下我磕磕碰碰的三个月找工作经历,绝对干货
  16. 虚拟的超级计算机和云计算,概念PK:云计算与高性能计算(HPC)
  17. 【操作系统之进程调度算法习题】
  18. Spoken English Practice(I'm gonna do something I never thought I'd be able to)
  19. Hive时间格式转换
  20. 小程序云开发请求云函数成功,但result为空/null的处理,四种问题处理方法汇总

热门文章

  1. 关于XMLHttpRequest的xhr.readyState和 xhr.status 的简单使用
  2. 项目管理资格认证PMP考前培训班
  3. 鸿蒙应用分身,应用分身怎么设置?按照这个步骤操作,分分钟即可搞定它
  4. 网站排名下降的原因,网站排名下降怎么办?
  5. 1 error and 0 warnings potentially fixable with the `--fix` option.
  6. Bootstrap系列之treeview实现菜单树
  7. 通过搜索引擎快速寻找漏洞
  8. 强化学习:Actor-Critic、SPG、DDPG、MADDPG
  9. python求均方根,python中函数的均方根
  10. linux硬件时间与系统时间不同步,Linux系统时钟和硬件时钟不一致