无线传感器或者无线局域网仿真需要使用wlan_mac模块作为链路层协议,在定义大量节点的时候如果手工设置每个节点的wlan_mac.Address属性(mac地址)是一件很麻烦的事情,而wlan_mac模块对该属性提供了一个Auto Assigned值(Auto Assigned=-2),但在实际的仿真中发现,设置为Auto Assigned的节点并没有自行设置有效的mac地址,而是仍为-2,此时源节点只能设置目的地址为Broadcast(-1)或者Random(-2)。
综上所述,本人想出了一个方法,将wlan_mac.Address属性与name属性取值相等,,而在添加节点的时候,节点的name属性是自动递增的,例如添加节点”1”后,下一个添加的节点名为”2”。这样就避免了手工设置的麻烦,具体如下:
在wlan_mac模块中的init函数中添加如下命令:
/* Determine the assigned MAC address. */
op_ima_obj_attr_get (my_objid, "Address", &my_address);
//*************************************************************************
if (my_address == AUTO_ASSIGNED)
{
op_ima_obj_attr_get (my_node_objid, "name", my_node_name);
my_address = name_aoti (my_node_name);
op_ima_obj_attr_set (my_node_objid, "Wireless LAN MAC Address", my_address);
}
//*************************************************************************
/* Obtain an address handle for resolving WLAN MAC addresses. */
oms_aa_handle = oms_aa_address_handle_get ("MAC Addresses", "Address");
其中,在SV中定义my_node_name为int型变量,在HB中定义AUTO_ASSIGNED为-2。该代码定义:如果读出的my_address为-2,说明mac层地址仍未设置,则在此将其设置为节点name值,否则不做任何动作。
同理,在其他需要使用mac层地址的协议层中的初始化部分,添加如下代码:
if (my_node_addr == AUTO_ASSIGNED)
{
op_ima_obj_attr_get (op_topo_parent (op_id_self ()), "name", my_node_name);
my_node_addr = name_aoti (my_node_name);
op_ima_obj_attr_set (op_topo_parent (op_id_self ()), "Wireless LAN MAC Address", my_node_addr);
}
注意:
1.在wlan_mac_intf层,同样需要使用到mac_address,但只在wait阶段需要对该属性进行读写,所以并不会读到错误的值,可以不管。
2.name_aoti函数:
static int name_aoti (char *name)
{
int num = 0;
char *tmp = name;
FIN (name_aoti);
while (*tmp != '\0')
{
num = num * 10 + *tmp - '0';
tmp++;
}
FRET (num);
}