-
Notifications
You must be signed in to change notification settings - Fork 14
source code analysis
以下源码分析仅剖析关键代码实现部分思路,部分细枝末节的代码看源码就行了。
此函数主要负责系统初始化,读取节点及进程模块相应参数。
- 读取节点属性,判断其为Hub还是Node。
- 读取协议版本参数用以处理不同协议。
若为Hub,则读取beacon和beacon2帧属性信息,调用wban_send_beacon_frame ()发送beacon帧;若为Node,则读取Connection Request帧属性信息。
最后初始化其他状态变量和注册统计变量。
读取系统本地时间,由于OPNET自带的统计量对于批量化操作和前期处理十分不便,所以该仿真平台借鉴了类Castalia的实现方式,采用文本文件存取相应的统计量。为了区分不同仿真参数对应的统计量,记录统计量的文件名最好是能随时间参数变化。但由于OPNET中不同节点在仿真过程中调用的是不同的进程,因此在对同一个文件进行读写操作时需特别注意对缓冲的处理,否则有可能出现记录信息不全的可能。对应此需求专门写了wban_log_file_init()这么一个函数。
用于对从物理层管道模块收到的包进行解析。
用于判断接收到的包是否为发送至本节点的,若不是则直接丢弃。在is_packet_for_me之前应检查ACK的包序列号是否为重复的包。由于在OPNET中自己节点发送出去的包自己也能接收。因此在此函数中需特别对环回包做处理。
由Hub创建beacon帧并广播之,被xx调用。
用于Hub创建beacon2帧及实现协议1中的MAP2动态分配算法。由于设置不同的Allocation Slot Length和WBAN DATA RATE会导致Node在接收到beacon2时所在的slot不一样,因此需要针对此自适应配置。
Hub在接收到Node发送的Connection Request帧时,读取相应的Allocation Length和User Priority域信息。最后调用wban_send_conn_assign_frame(allocation_length)将Connection Assignment帧送入管理队列。
Node接收到Hub发送的Connection Assignment帧时读取MAP1中的Interval Start和Interval End域信息。在每一个超帧阶段的开始由Increment Slot中断启动MAP1。
Node读取beacon帧信息并根据相应的信息做一些同步工作。最后调用wban_schedule_next_beacon
Node读取beacon2帧信息,当使用协议1时,Node还读取MAP2的相应起始slot信息。
用于在发送或者接收到beacon帧后设置超帧信息,如EAP1 Start, RAP1 Start, RAP1 End等时刻。如果是处于初始化阶段(init_flag标记),Node则向Hub发送Connection Request帧请求MAP1阶段的分配。
Node发送Connection Request帧至管理队列,在可以发送包的时候向Hub发送以请求MAP1中slot时隙数。
Hub发送Connection Assignment帧至管理队列,根据SF.current_first_free_slot及allocation_length处理MAP1阶段的时隙分配算法。
向I-ACK策略的包发送I-ACK帧,其他如L-ACK等暂未实现。通过phy_to_radio(frame_MPDU)直接发送至物理层管道,不经过MAC至PHY的接口函数控制,这个需要特别注意,尤其是涉及原子操作时。
MAC模块接收来自APP层发送的包并做适当解封装(包序列号及优先级)及封装(加上MAC Header)。随后送入MAC层数据子队列等待合适时机发送数据包。
处理各种中断。
OPC_INTRPT_STRM调用wban_parse_incoming_frame
BEACON_INTERVAL_CODE,一段超帧的结束,同时也是下一个超帧的开始(暂未考虑inactive superframe)。对于Hub,则在此统计Throughput统计量(是否有必要对Throughput统计量做调整?)。
超帧是以slot为单位往前推进的,对不不同Access Phases往往是通过slot的起始点来确定。这里暂时只对MAP1单独做了处理。
EAP1的起始入口,设置相关变量。
EAP1的结束处,重置相关变量。
RAP1的起始入口,设置相关变量。
用于Hub发送beacon2控制帧
非常重要的一个发包试探中断
CSMA用,CCA起始处用,
CCA时隙结束处
可以传输包的中断,由CSMA和MAP两部分组成。
ACK等待超时
Node发送Connection Request帧用,在wban_schedule_next_beacon函数中被调用,当已经获得MAP1的分配时隙时不再发送(如需改动可以从此入手)。
Hub发送Connection Assignment帧用,调用关系不明。
发送I-ACK用,调用关系不明
N-ACK策略的包发送完毕时需要重置相关变量。
仿真结束时刻对统计量的处理,写入文件等。
来自PHY层的统计量中断,用以指示信道忙闲情况及冲突与否。
解析接收到的数据包,如果在MAC Header中有捎带,则进一步读取其slotnum和user priority信息用以MAP2中的时隙分配。
解析接收到的I-ACK帧,重置相关变量。
发包函数总入口,管理除I-ACK包之外的包发送。
CSMA发包入口,调用wban_backoff_delay_set及产生自中断CCA_START
用以在slotted CSMA中获取CSMA slot起始处,目前并未采用。
根据不同user priority 设置相应的退避窗口计数值。
判断当前发的包是否越界,具体再细分为I-ACK及N-ACK等包。
MAC和PHY之间的接口层,另外还用做一些数据统计。
用以归一化MAC层数据帧,因为在协议中MAC数据帧映射至物理层时其中添加的不同比特位传输规则不一样,而OPNET无法模拟精确的物理层操作,仅能根据设定的WBAN DATA RATE速率传包,因此设计了这么一个MAC层到PHY的比特位归一化函数。
将数据包发送至物理层管道进程。
更新能量计算模块中对TX阶段的能量计算。
更新能量计算模块中对RX阶段的能量计算。
更新能量计算模块中对CCA阶段的能量计算。以RX的功率来计算。
更新能量计算模块中睡眠起始时间。
更新能量计算模块中睡眠结束时间。
判断当前子队列缓存情况,赞无太多实际用途。
用于获取子队列各种信息用,供其他函数调用。
获取数据子队列中的相应信息。
计算MAC数据帧转换到PHY后需要增加的比特数。