无线传感器或者无线局域网仿真需要使用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);
    }