网络模型:无线传感器网络,所有节点初始化时广播hello包。
节点模型:在OPNET自带的wlan_station_adv节点模型基础上进行改进,添加route模块。属性设置如下,wlan_mac_intf.destination_address <- broadcast,wlan_mac.Address <- Auto Assigned。
仿真结果:执行仿真运行无错误,想观察统计结果时发现没有结果可显示,这说明目的端接收不到数据包;当把destination_address改为Random或者固定地址后,仿真运行无错,也有统计结果显示,但是仍有一定量的数据包丢失。

调试纠错:
初步认定错误发生在在wlan_mac模块中,进一步跟踪调试发现,丢失数据报的原因在于执行wlan_physical_layer_data_arrival函数时,在if ((wlan_flags->rcvd_bad_packet == OPC_BOOLINT_ENABLED) || (accept == OPC_FALSE) ||(wlan_flags->collided_packet == OPC_BOOLINT_ENABLED))判断处进入内部代码段并最终执行了op_pk_destroy函数,说明该数据包因为在目的端与其他数据包冲突而导致丢失。仔细分析上述原因后,猛然发现,之所以broadcast模式下全部数据包均丢失,是因为source模块中的Packet Interarrival Time设置为constant类型,所有节点均在同一时间发包,导致所有数据包冲突;而random模式下冲突较少的原因是因为数据包不是广播形式发送,同一目的端同时接受多个数据包的概率减小了,故只有一定几率下才会冲突。

修正方法:
将Packet Interarrival Time设置为exponenetial类型即可,错开各节点的发包时间。