📄 nwkm.nc
字号:
//send the data //ack call MCPS_DATA.request(SHORT_ADDRESS, panid, srcadd, SHORT_ADDRESS, panid, route_destination_address, (NsduLength + 8), MSDU,1,set_txoptions(1,0,0,0)); } else { //route up to parent atomic{ route_destination_address[0]=0x00000000; route_destination_address[1]=neighbortable[parent].Network_Address; //ack call MCPS_DATA.request(SHORT_ADDRESS, panid, srcadd, SHORT_ADDRESS, panid, route_destination_address, (NsduLength + 8), MSDU,1,set_txoptions_upstream(1,0,0,0,1)); } } } return SUCCESS;}/*************************************************************//*******************NLME IMPLEMENTATION***********************//*************************************************************//*************************************************************//*******************NLME - START - ROUTER*********************//*************************************************************///This primitive allows the NHL of a ZigBee Router to initialize or change its superframe configuration.//p171 and 210command error_t NLME_START_ROUTER.request(uint8_t BeaconOrder, uint8_t SuperframeOrder, bool BatteryLifeExtension,uint32_t StartTime){ //printfUART("NLME_START_ROUTER.request\n", ""); device_type = ROUTER; if(TYPE_DEVICE == ROUTER) { //assign current BO and SO beaconorder = BeaconOrder; superframeorder = SuperframeOrder; call MLME_SET.request(MACBEACONORDER, (uint8_t *)&BeaconOrder); call MLME_SET.request(MACSUPERFRAMEORDER, (uint8_t *)&SuperframeOrder); //******************************************************* //***********SET PAN VARIABLES*************************** depth=DEVICE_DEPTH; nwk_IB.nwkAvailableAddresses=AVAILABLEADDRESSES; nwk_IB.nwkAddressIncrement= ADDRESSINCREMENT; nwk_IB.nwkMaxChildren=MAXCHILDREN; //number of children a device is allowed to have on its current network nwk_IB.nwkMaxDepth=MAXDEPTH; //the depth a device can have nwk_IB.nwkMaxRouters=MAXROUTERS; cskip = Cskip(depth); cskip_routing = Cskip(depth -1); nwk_IB.nwkNextAddress = networkaddress + (cskip * nwk_IB.nwkMaxRouters) + nwk_IB.nwkAddressIncrement; next_child_router_address = networkaddress +((number_child_router-1) * cskip) +1; number_child_router++; printfUART("cskip %d\n", cskip); printfUART("C %d D %d r %d\n", MAXCHILDREN,MAXDEPTH,MAXROUTERS); // command error_t request(uint32_t PANId, uint8_t LogicalChannel, uint8_t BeaconOrder, uint8_t SuperframeOrder,bool PANCoordinator,bool BatteryLifeExtension,bool CoordRealignment,bool SecurityEnable); call MLME_START.request(panid,LOGICAL_CHANNEL,BeaconOrder, SuperframeOrder, 0, 0,0,0,StartTime); } else { signal NLME_START_ROUTER.confirm(NWK_INVALID_REQUEST); } return SUCCESS;}/*************************************************************//******************NLME - NETWORK - FORMATION*****************//*************************************************************///This primitive allows the NHL to request to start a ZigBee network with itself as the coordinator//Page 167-169command error_t NLME_NETWORK_FORMATION.request(uint32_t ScanChannels, uint8_t ScanDuration, uint8_t BeaconOrder, uint8_t SuperframeOrder, uint16_t PANId, bool BatteryLifeExtension){ uint8_t v_temp[6]; v_temp[0] = 0x06; device_type = COORDINATOR; //device_type = ROUTER; call MLME_SET.request(MACMAXBEACONPAYLOADLENGTH,v_temp); //protocol ID v_temp[0] = 0x00; //uint8_t nwk_payload_profile_protocolversion(uint8_t stackprofile,uint8_t nwkcprotocolversion) v_temp[1] = nwk_payload_profile_protocolversion(0x00,0x00); //uint8_t nwk_payload_capacity(uint8_t routercapacity,uint8_t devicedepth,uint8_t enddevicecapacity) v_temp[2] = nwk_payload_capacity(0x01,0x00,0x01); //TX OFFSET (3 bytes) v_temp[3] = 0x56; v_temp[4] = 0x34; v_temp[5] = 0x12; call MLME_SET.request(MACBEACONPAYLOAD,v_temp); ////printfUART("NLME_NETWORK_FORMATION.request\n", ""); //perform an energydetection scan //perform an active scan //and select a suitable channel //panid must be less than or equal to 0x3fff //assign current panid panid=PANId; //assign current BO and SO beaconorder = BeaconOrder; superframeorder = SuperframeOrder; call MLME_SET.request(MACBEACONORDER, (uint8_t *)&BeaconOrder); call MLME_SET.request(MACSUPERFRAMEORDER, (uint8_t *)&SuperframeOrder); v_temp[0] = (uint8_t)(PANId >> 8); v_temp[1] = (uint8_t)PANId; call MLME_SET.request(MACPANID, v_temp); //static assignement of the coordinator address networkaddress=0x0000;//Network address of the ZC of a network always 0x0000; //////printfUART("setting short addr: %i\n", networkaddress); v_temp[0] = (uint8_t)(networkaddress >> 8); v_temp[1] = (uint8_t)(networkaddress); call MLME_SET.request(MACSHORTADDRESS,v_temp); //******************************************************* //***********SET PAN VARIABLES*************************** //nwk_IB.nwkNextAddress=networkaddress+0x0001; depth=DEVICE_DEPTH; nwk_IB.nwkAvailableAddresses=AVAILABLEADDRESSES; nwk_IB.nwkAddressIncrement= ADDRESSINCREMENT; nwk_IB.nwkMaxChildren=MAXCHILDREN; //number of children a device is allowed to have on its current network nwk_IB.nwkMaxDepth=MAXDEPTH; //the depth a device can have nwk_IB.nwkMaxRouters=MAXROUTERS; cskip = Cskip(depth); cskip_routing = Cskip(depth -1 ); nwk_IB.nwkNextAddress = networkaddress + (cskip * nwk_IB.nwkMaxRouters) + nwk_IB.nwkAddressIncrement; next_child_router_address = networkaddress +((number_child_router-1) * cskip) +1; number_child_router++; printfUART("cskip %d\n", cskip); printfUART("C %d D %d r %d\n", MAXCHILDREN,MAXDEPTH,MAXROUTERS); call MLME_START.request(PANId, LOGICAL_CHANNEL,BeaconOrder ,SuperframeOrder,1,0,0,0,0); return SUCCESS;} /*************************************************************//***************NLME - NETWORK - DISCOVERY *******************//*************************************************************///This primitive allows the next higher layer to request that the NWK layer discover networks currently operating within the POS.//p164 and 210command error_t NLME_NETWORK_DISCOVERY.request(uint32_t ScanChannels, uint8_t Scanduration){ //ISSUE an MLME_SCAN.request to find the available networks //Temporary descover of the network //Channel Scan is not working properly //manually assign the network descriptor /* networkdescriptor networkdescriptorlist[1];*/ printfUART("2 lauch passive scan\n", ""); //The networkdescriptorlist must contain information about every network that was heard //make NetworkDescriptorList out of the PanDescriptorList call MLME_SCAN.request(PASSIVE_SCAN,0xFFFFFFFF,7);/* networkdescriptorlist[0].PANId=0x1234; 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; //temporary assignement on the neighbout table of the suitable PAN coordinator if (DEVICE_DEPTH == 0x01) add_neighbortableentry(networkdescriptorlist[0].PANId,D1_PAN_EXT0,D1_PAN_EXT1,D1_PAN_SHORT,COORDINATOR,NEIGHBOR_IS_PARENT); if (DEVICE_DEPTH == 0x02) add_neighbortableentry(networkdescriptorlist[0].PANId,D2_PAN_EXT0,D2_PAN_EXT1,D2_PAN_SHORT,COORDINATOR,NEIGHBOR_IS_PARENT); if (DEVICE_DEPTH == 0x03) add_neighbortableentry(networkdescriptorlist[0].PANId,D3_PAN_EXT0,D3_PAN_EXT1,D3_PAN_SHORT,COORDINATOR,NEIGHBOR_IS_PARENT); if (DEVICE_DEPTH == 0x04) add_neighbortableentry(networkdescriptorlist[0].PANId,D4_PAN_EXT0,D4_PAN_EXT1,D4_PAN_SHORT,COORDINATOR,NEIGHBOR_IS_PARENT); signal NLME_NETWORK_DISCOVERY.confirm(1,networkdescriptorlist, NWK_SUCCESS);*/ return SUCCESS;}/*************************************************************//************************NLME - JOIN**************************//*************************************************************///This primitive allows the NHL to request to join a network either through association.//p173 and 210command error_t NLME_JOIN.request(uint16_t PANId, bool JoinAsRouter, bool RejoinNetwork, uint32_t ScanChannels, uint8_t ScanDuration, uint8_t PowerSource, uint8_t RxOnWhenIdle, uint8_t MACSecurity){ //Assume we have selected a suitable parent and all previous conditions were true uint32_t destinaddress[2]; printfUART("9 find parent\n", ""); //list_neighbourtable(); parent_index = find_suitable_parent(); panid = PANId; //printfUART("NLME_JOIN %i %i\n", parent_index,panid); if(parent_index == 0) { signal NLME_JOIN.confirm(PANId,NWK_NOT_PERMITTED); } else { //assign the true value to parent index parent_index = parent_index - 1; //destinaddress[0]=neighbortable[parent_index].Extended_Address0; //destinaddress[1]=neighbortable[parent_index].Extended_Address1; //verificar o endere鏾 do pan coordinator destinaddress[0]=0x00000000; destinaddress[1] = neighbortable[parent_index].Network_Address; /* if (DEVICE_DEPTH == 0x01) destinaddress[1]=D1_PAN_SHORT; if (DEVICE_DEPTH == 0x02) destinaddress[1]=D2_PAN_SHORT; if (DEVICE_DEPTH == 0x03) destinaddress[1]=D3_PAN_SHORT; if (DEVICE_DEPTH == 0x04) destinaddress[1]=D4_PAN_SHORT; */ printfUART("10 associate to %i\n", destinaddress[1]); //set_capability_information(uint8_t alternate_PAN_coordinator, uint8_t device_type, uint8_t power_source, uint8_t receiver_on_when_idle, uint8_t security, uint8_t allocate_address) if (JoinAsRouter == 0x01) call MLME_ASSOCIATE.request(LOGICAL_CHANNEL,SHORT_ADDRESS,PANId,destinaddress, set_capability_information(JoinAsRouter,0x01,PowerSource,RxOnWhenIdle,MACSecurity,0x01),0); else { printfUART("11 go ass\n", ""); coordinator_addr[0]=0x00000000; coordinator_addr[1] = neighbortable[parent_index].Network_Address; //BUILD the PAN descriptor of the COORDINATOR //assuming that the adress is short pan_des.CoordAddrMode = SHORT_ADDRESS; pan_des.CoordPANId = panid; pan_des.CoordAddress0=0x00000000; pan_des.CoordAddress1=(uint32_t)neighbortable[parent_index].Network_Address; pan_des.LogicalChannel=neighbortable[parent_index].Logical_Channel; //superframe specification field //pan_des.SuperframeSpec = neighbortable[parent_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; received_beacon_count=0; go_associate=1; //call MLME_ASSOCIATE.request(LOGICAL_CHANNEL,SHORT_ADDRESS,PANId,destinaddress, set_capability_information(JoinAsRouter,0x00,PowerSource,RxOnWhenIdle,MACSecurity,0x01),0); } } return SUCCESS;}/*************************************************************//************************NLME - LEAVE*************************//*************************************************************///This primitive allows the NHL to request that it or another device leaves the network//page 181-183command error_t NLME_LEAVE.request(uint32_t DeviceAddress[],bool RemoveChildren, bool MACSecurityEnable){ uint32_t devaddr[2]; ////printfUART("NLME_LEAVE.request\n", ""); if (DeviceAddress == 0)//child asked to leave { if(RemoveChildren == 0)//implemented like it is always 0 { //send leave request command frame: RemoveChildren subfield=0 of the command option field of the command frame payload //call MCPS_DATA.request(uint8_t SrcAddrMode, uint16_t SrcPANId, uint8_t SrcAddr[], uint8_t DstAddrMode, uint16_t DestPANId, uint8_t DstAddr[], uint8_t msduLength, uint8_t msdu[],uint8_t msduHandle, uint8_t TxOptions); devaddr[0]=neighbortable[parent].Extended_Address0; devaddr[1]=neighbortable[parent].Extended_Address1; call MLME_DISASSOCIATE.request(devaddr,0x02,0); } else { //send leave request command frame: RemoveChildren subfield=1 //try to remove the children, call NLME_LEAVE.request(uint32_t DeviceAddress[]=address of child,bool RemoveChildren, bool MACSecurityEnable) //call MCPS_DATA.request(uint8_t SrcAddrMode, uint16_t SrcPANId, uint8_t SrcAddr[], uint8_t DstAddrMode, uint16_t DestPANId, uint8_t DstAddr[], uint8_t msduLength, uint8_t msdu[],uint8_t msduHandle, uint8_t TxOptions); } } else//parent forced a child to leave { //if(check_neighbortableentry(DeviceAddress[0], DeviceAddress[1]) == 0) //{ // signal NLME_LEAVE.confirm(DeviceAddress,NWK_UNKNOWN_DEVICE); // //call MCPS_DATA.request(uint8_t SrcAddrMode, uint16_t SrcPANId, uint8_t SrcAddr[], uint8_t DstAddrMode, uint16_t DestPANId, uint8_t DstAddr[], uint8_t msduLength, uint8_t msdu[],uint8_t msduHandle, uint8_t TxOptions); //} } return SUCCESS;}/*************************************************************//************************NLME - SYNC**************************//*************************************************************///This primitive allows the NHL to synchronize or extract data from its ZigBee coordinator or router//page 186-187command error_t NLME_SYNC.request(bool Track){ return SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -