無線傳感器或者無線局域網仿真需要使用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);
    }