1..怎样在mac层获取pipeline stage中计算出来的某些参数的数值,如接受功率的数值?
可以用pwr = op_td_get_dbl(pkptr,OPC_TDA_RA_RCVD_POWER).
2..我对某个pipeline函数做了一点修改然后以另外一个名字存了一下,但是在模块中却不能把原来的pipeline函数改成重新命名的pipeline函数,这是怎么回事啊?
修改后的文件名要与函数名相同,(不明白这句话?)然后得用OPNET自带的EXTERNAL INTERFACE提供的工具编译就好了。
3.
在OPNET模型中,当包被传送到发送器请求发送后,实际中的情况是包将立即被发送到通信信道上进行传输,因此OPNET必须对通信信道进行建模,也就是在模型中要实现物理层的特征,以便将信道对包产生的传输效果考虑进整个网络模型。opnet将信道对包产生的传输效果建模为若干个计算阶段(成为pipeline stage),最终来判断该包是否能被接收到。
点对点链路的pipeline 模型:
有四个缺省的pipeline stage组成,具体描述如下:‘
1 传输时延阶段:dpt_txdel.ps.c (OPNET中缺省的pipelinestage模型文件后缀名为.ps.c,经过编译后形成的目标文件后缀名为.ps.o)
传输时延描述的是第一个比特发送时间到最后一个比特发送时间之间的时间间隔。
计算方法:
从包里读取传输该包的信道的标志号(ID);
tx_ch_obid = op_td_get_int (pkptr,OPC_TDA_PT_TX_CH_OBJID);
有了信道ID后,即可读取信道的数据速率;
Op_ima_obj_attr_get(tx_ch_obid,“data rate”,&tx_drate);
读取包的长度:pklen= op_pk_total_size_get(pkptr);
传输时延=包长/数据速率:tx_delay= pkptr/tx_drate;
把计算而得的传输时延值写到包的TDA(transmission data attribute)里:
Op_td_set_dbl (pkptr,OPC_TDA_PT_TX_DALAY,tx_dalay);
2 传播时延阶段:dpt_propdel.ps.c
传播实验描述的是第一个比特开始发送时间到第一个比特到达时间之间的时间间隔。
计算方法:
从包里读取传输该包的链路标志号(ID):
Link_objid = op_td_get_int (pkptr,OPC_TDA_PT_LINK_OBJID);
有了链路ID,即可读取链路的“delay”属性值;
Op_ima_obj_attr_get (link_objid,”delay”,&prop_delay);
把该传播时延值写进包的TDA中;
Op_td_set_dbl (pkptr,OPC_TDA_PT_PROP_DELAY,prop_delay);
3误码数目分配阶段:dpt_error.ps.c
计算方法:
读取链路标志号(ID):
Link_objid = op_td_get_int (pkptr,OPC_TDA_PT_LINK_OBJID);
读取链路的误码率“ber”属性值,即单个比特可能误码的概率:
Op_ima_obj_attr_get (link_objid,”ber”,&pe)
读取包长:
Seg_size = op_pk_total_size_get (pkptr);
计算“正好发生k个比特误码”的概率P(k),那么可以得到“至多发生k个比特误码”的概率P=P(0)+P(1)+…..+P(K);
产生一个在{0,1}内平均分布的随机数r: r = op_dist_uniform(1.0);
如果随机数r小于等于“至多发生k个比特误码”的概率P,那么就“认定”K就是这个包在信道上传输的误码数目;
如果r大于p,那么就将k的值加1,反复计算以得到算法能够接受的误码数目;
将误码数目写进包的TDA里。
Op_td_set_int (pkptr,OPC_TDA_PT_NUM_ERRORS,((int)num_errs))
4 纠错阶段:dpt_ecc.ps.c
计算方法:读取接收器的标志号(ID)
Rx_obid = op_td_get_int (pkptr,OPC_TDA_PT_RX_OBJID);
读取接收器能纠正的误码数目门限值“ecc threshold”属性值;
Op_ima_obj_attr_get (rx_obid,”ecc threshold”,&ecc_thresh)
读取包的长度:pklen= op_pk_total_size_get (pkptr);
读取前面计算的错误数目:
Num_errs = op_td_get_int (pkptr,OPC_TDA_PT_NUM_ERRORS);
将错误数目与纠错门限“eccthreshold”比较,判断该包是否能被正确接收;
Accept = ((((double)num_errs)/pklen)<=ecc_thresh)?OPC_TRUE:OPC_FALSE;
将判断结果写进包的TDA中:
Op_td_set_int (pkptr,OPC_TDA_PT_PK_ACCEPT,accept);