📄 nwkm.nc
字号:
/* * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author Andre Cunha * */#include <Timer.h>#include "printfUART.h"module NWKM { //uses uses interface Leds; //MAC interfaces uses interface MLME_START; uses interface MLME_GET; uses interface MLME_SET; uses interface MLME_BEACON_NOTIFY; uses interface MLME_GTS; uses interface MLME_ASSOCIATE; uses interface MLME_DISASSOCIATE; uses interface MLME_ORPHAN; uses interface MLME_SYNC; uses interface MLME_SYNC_LOSS; uses interface MLME_RESET; uses interface MLME_SCAN; uses interface MCPS_DATA; uses interface Random;//provides provides interface Init; provides interface NLDE_DATA; //NLME NWK Management services provides interface NLME_NETWORK_FORMATION; provides interface NLME_NETWORK_DISCOVERY; provides interface NLME_START_ROUTER; provides interface NLME_JOIN; provides interface NLME_LEAVE; provides interface NLME_SYNC; /* provides interface NLME_PERMIT_JOINING; provides interface NLME_DIRECT_JOIN; provides interface NLME_RESET;*/ provides interface NLME_GET; provides interface NLME_SET; }implementation { nwkIB nwk_IB; uint8_t device_type = END_DEVICE; /*****************************************************//*************Neighbourtable Variables****************//*****************************************************/ //neighbour table array: neighbortableentry neighbortable[NEIGHBOUR_TABLE_SIZE]; //number of neigbourtable entries: uint8_t neighbour_count; //the index of the parents neighbortable entry uint8_t parent; /*****************************************************//****************ASSOCIATION Variables********************//*****************************************************/ //CURRENT NETWORK ADDRESS uint16_t networkaddress=0x0000; //COORDINATOR //address assignement variables uint8_t depth=0; uint8_t cskip=0; uint8_t cskip_routing=0; //neighbour table parent index uint8_t parent_index; //NON COORDINATOR //current pan characteristics uint16_t panid; uint8_t beaconorder; uint8_t superframeorder; //next child router address uint16_t next_child_router_address; uint8_t number_child_router=0x01; uint8_t number_child_end_devices=0x01;/*****************************************************//****************Integer Variables********************//*****************************************************/ uint8_t joined=0; uint8_t sync_loss=0; //uint8_t synchronizing=0; uint8_t syncwait; //USED AFTER DE SCAN //GIVE SOME TIME TO THE DEVICE TO SYNC WITH THE PARENT uint8_t received_beacon_count=0; uint8_t go_associate =0; PANDescriptor pan_des; uint32_t coordinator_addr[2];/******************************************************//*********NEIGHBOuRTABLE MANAGEMENT FUNCTIONS*********//******************************************************/ void init_nwkIB(); uint8_t check_neighbortableentry(uint8_t addrmode,uint32_t Extended_Address0,uint32_t Extended_Address1); void add_neighbortableentry (uint16_t PAN_Id,uint32_t Extended_Address0,uint32_t Extended_Address1,uint32_t Network_Address,uint8_t Device_Type,uint8_t Relationship); void update_neighbortableentry (uint16_t PAN_Id,uint32_t Extended_Address0,uint32_t Extended_Address1,uint32_t Network_Address,uint8_t Device_Type,uint8_t Relationship); uint8_t find_suitable_parent(); uint16_t Cskip(uint8_t d); uint16_t nexthopaddress(uint16_t destinationaddress,uint8_t d); void list_neighbourtable(); command error_t Init.init() { printfUART_init();//make the possibility to print init_nwkIB(); nwk_IB.nwkSequenceNumber=call Random.rand16(); return SUCCESS; } /*****************************************************************************************************/ /**************************************MLME-SCAN*******************************************************//*****************************************************************************************************/ event error_t MLME_SCAN.confirm(uint8_t status,uint8_t ScanType, uint32_t UnscannedChannels, uint8_t ResultListSize, uint8_t EnergyDetectList[], SCAN_PANDescriptor PANDescriptorList[]){//FAULT-TOLERANCE//the device channel scan ends with a scan confirm containing a list of the PANs (beacons received during the scan) int i; uint8_t max_lqi=0; uint8_t best_pan_index=0; networkdescriptor networkdescriptorlist[1]; //call Leds.redOff(); printfUART("4 rec scan\n", ""); //printfUART("MLME_SCAN.confirm %i\n", ScanType); if (ScanType == ORPHAN_SCAN) { printfUART("new scan \n", ""); call MLME_SCAN.request(PASSIVE_SCAN,0xFFFFFFFF,7); return SUCCESS; } if(ScanType == ED_SCAN) { for(i=0;i<ResultListSize;i++) { printfUART("ED SCAN %i %i\n", (0x0A + i),EnergyDetectList[i]); } return SUCCESS; } for (i=0; i<ResultListSize;i++) { /* printfUART("cord id %i", PANDescriptorList[i].CoordPANId); printfUART("CoordAddress %i", PANDescriptorList[i].CoordAddress); printfUART("LogicalChannel %i", PANDescriptorList[i].LogicalChannel); printfUART("SuperframeSpec %i", PANDescriptorList[i].SuperframeSpec); printfUART("lqi %i\n", PANDescriptorList[i].lqi); */ if(max_lqi < PANDescriptorList[i].lqi) { max_lqi =PANDescriptorList[i].lqi; best_pan_index = i; } } printfUART("SELECTED cord id %i", PANDescriptorList[best_pan_index].CoordPANId); printfUART("CoordAddress %i", PANDescriptorList[best_pan_index].CoordAddress); printfUART("LogicalChannel %i", PANDescriptorList[best_pan_index].LogicalChannel); printfUART("SuperframeSpec %i", PANDescriptorList[best_pan_index].SuperframeSpec); printfUART("lqi %i\n", PANDescriptorList[best_pan_index].lqi); /* coordinator_addr[0] = 0x00000001; coordinator_addr[1] = (uint32_t)PANDescriptorList[best_pan_index].CoordAddress; //pan_des = PANDescriptorList[best_pan_index]; //BUILD the PAN descriptor of the COORDINATOR //assuming that the adress is short pan_des.CoordAddrMode = SHORT_ADDRESS; pan_des.CoordPANId = PANDescriptorList[best_pan_index].CoordAddress; pan_des.CoordAddress0=0x00000000; pan_des.CoordAddress1=0x00000000; pan_des.LogicalChannel=PANDescriptorList[best_pan_index].LogicalChannel; //superframe specification field pan_des.SuperframeSpec = PANDescriptorList[best_pan_index].SuperframeSpec; pan_des.GTSPermit=0x01; pan_des.LinkQuality=0x00; pan_des.TimeStamp=0x000000; pan_des.SecurityUse=0; pan_des.ACLEntry=0x00; pan_des.SecurityFailure=0x00; */ printfUART("5 en sync %x \n", PANDescriptorList[best_pan_index].LogicalChannel); // the sync enables the TimerAsync events, in order to enable the synchronization with the PAN coordinator call MLME_SYNC.request(PANDescriptorList[best_pan_index].LogicalChannel,0); //The networkdescriptorlist must contain information about every network that was heard //make NetworkDescriptorList out of the PanDescriptorList printfUART("6 add neigh\n", ""); networkdescriptorlist[0].PANId=PANDescriptorList[best_pan_index].CoordPANId; networkdescriptorlist[0].LogicalChannel=LOGICAL_CHANNEL; networkdescriptorlist[0].StackProfile=0x00; networkdescriptorlist[0].ZigBeeVersion=0x01; networkdescriptorlist[0].BeaconOrder=7; networkdescriptorlist[0].SuperframeOrder=6; networkdescriptorlist[0].PermitJoining=1; add_neighbortableentry(networkdescriptorlist[0].PANId,0x00000000,0x00000000,PANDescriptorList[best_pan_index].CoordAddress,COORDINATOR,NEIGHBOR_IS_PARENT); signal NLME_NETWORK_DISCOVERY.confirm(1,networkdescriptorlist, NWK_SUCCESS); return SUCCESS;}/*****************************************************************************************************/ /**************************************MLME-ORPHAN****************************************************//*****************************************************************************************************/ event error_t MLME_ORPHAN.indication(uint32_t OrphanAddress[1], uint8_t SecurityUse, uint8_t ACLEntry){ return 0x0000; }/*****************************************************************************************************/ /**************************************MLME-RESET*****************************************************//*****************************************************************************************************/ event error_t MLME_RESET.confirm(uint8_t status){ return SUCCESS;}/*****************************************************************************************************/ /**************************************MLME-SYNC-LOSS*************************************************//*****************************************************************************************************/ event error_t MLME_SYNC_LOSS.indication(uint8_t LossReason){ ////printfUART("MLME_SYNC_LOSS.indication\n", ""); sync_loss = 1; syncwait=1; //signal NLME_SYNC.indication();/*printfUART("SL\n",""); call MLME_SCAN.request(ORPHAN_SCAN,0xFFFFFFFF,7);*/ return SUCCESS;}/*****************************************************************************************************/ /**************************************MLME-GTS*******************************************************//*****************************************************************************************************/ event error_t MLME_GTS.confirm(uint8_t GTSCharacteristics, uint8_t status){ return SUCCESS;}event error_t MLME_GTS.indication(uint16_t DevAddress, uint8_t GTSCharacteristics, bool SecurityUse, uint8_t ACLEntry){ return SUCCESS;}/*****************************************************************************************************/ /**************************************MLME-BEACON NOTIFY*********************************************//*****************************************************************************************************/ event error_t MLME_BEACON_NOTIFY.indication(uint8_t BSN,PANDescriptor pan_descriptor, uint8_t PenAddrSpec, uint8_t AddrList, uint8_t sduLength, uint8_t sdu[]){ uint32_t destinaddress[2]; printfUART("BN\n", ""); if (go_associate==1) { received_beacon_count++; printfUART("bn %i\n", received_beacon_count); if (received_beacon_count==5) { printfUART("sa \n", ""); go_associate=0; //call MLME_ASSOCIATE.request(pan_des.LogicalChannel,SHORT_ADDRESS,pan_des.CoordPANId,coordinator_addr,0x00,0x00); destinaddress[0]=0x00000000; destinaddress[1]=0x00000000; call MLME_ASSOCIATE.request(LOGICAL_CHANNEL,SHORT_ADDRESS,0x1234,destinaddress, set_capability_information(0x00,0x00,0x00,0x00,0x00,0x01),0); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -