
arm studio build
src/multicast.cpp
- Committer:
- alan1974
- Date:
- 2019-01-18
- Revision:
- 14:fc836a5a5d2f
- Child:
- 17:74d60177c6b6
File content as of revision 14:fc836a5a5d2f:
#include "mbed.h" #include "dot_util.h" #include "mDot.h" #include "RadioEvent.h" #include "ChannelPlans.h" #include "Lora.h" #include "multicast.h" extern uint8_t nodeState; //OTAA keys extern uint8_t app_eui[]; extern uint8_t app_key[]; //arrays to hold OTAA keys std::vector<uint8_t> netwrk_address_OTAA; std::vector<uint8_t> netwrk_session_key_OTAA; std::vector<uint8_t> data_session_key_OTAA; uint32_t downcounter_OTAA; uint32_t upcounter_OTAA; //local uint8_t frags_old_nmb = 0; uint8_t frags_missing_cnts = 0; uint8_t frags_nmb_sending = 0; //# of frags to be send uint8_t frags_size = 0; //size of each frag to be sent uint32_t frag_missd = 0; //======================================================================================================== //save_OTAA_session // save OTAA session parameters //======================================================================================================== void save_OTAA_session_keys() { netwrk_address_OTAA = dot->getNetworkAddress(); logInfo(" OTAA devAddr %s", mts::Text::bin2hexString(netwrk_address_OTAA).c_str()); netwrk_session_key_OTAA = dot->getNetworkSessionKey(); logInfo(" OTAA network session key %s", mts::Text::bin2hexString(netwrk_session_key_OTAA).c_str()); data_session_key_OTAA = dot->getDataSessionKey(); logInfo(" OTAA app session key %s", mts::Text::bin2hexString(data_session_key_OTAA).c_str()); } //======================================================================================================== //change radio class to class C or class A // bClass_C:true => change class C credentials // :false=> change class A credentials // sClass contains class C credentials // returns true if class change OK //======================================================================================================== bool multicast_change_class(class_switch *sClass) { if (sClass->bClassC) { uint8_t joined = dot->getNetworkJoinStatus(); //are we joined to Lorawan? if (!joined){ printf("\r\n cannot change radio class unless already joined"); return false; //don't switch if not joined } downcounter_OTAA = dot->getDownLinkCounter(); //save frame counters before switching upcounter_OTAA = dot->getUpLinkCounter(); dot->setDownLinkCounter(0);//do all nodes need to reset, else reject packts with high DownlinkCounter values? //load ABP keys into arrays std::vector<uint8_t> dev_adr; std::vector<uint8_t> nwky; std::vector<uint8_t> dataky; bool bKeyOk = true; uint8_t indx; //set ABP keys for (indx =0; indx < sizeof(sClass->devAdr);indx++) dev_adr.push_back(sClass->devAdr[indx]); for (indx =0; indx < sizeof(sClass->key_nsk);indx++) nwky.push_back(sClass->key_nsk[indx]); for (indx =0; indx < sizeof(sClass->key_aps);indx++) dataky.push_back(sClass->key_aps[indx]); //set ABP keys printf("\r\nsetting ABP network address %s\r\n", mts::Text::bin2hexString(dev_adr).c_str()); if (dot->setNetworkAddress(dev_adr) != mDot::MDOT_OK){ printf(" failed to set key\r\n"); bKeyOk = false; } printf("\r\nsetting ABP network session key %sr\n", mts::Text::bin2hexString(nwky).c_str()); if (dot->setNetworkSessionKey(nwky) != mDot::MDOT_OK){ printf(" failed to set key\r\n"); bKeyOk = false; } printf("\r\nsettomg ABP data session key %sr\n", mts::Text::bin2hexString(dataky).c_str()); if (dot->setDataSessionKey(dataky) != mDot::MDOT_OK){ printf(" failed to set key\r\n"); bKeyOk = false; } if (!bKeyOk) return false; if (dot->setClass("C") == mDot::MDOT_OK){ printf("\r\n set network mode to class C\r\n"); return true; } else{ printf("\r\n FAILED to set network mode to class C\r\n"); return false; } } //if Class C else{ //change back to OTAA printf("\r\nchanging network address to OTAA device address %s\r\n", mts::Text::bin2hexString(netwrk_address_OTAA).c_str()); if (dot->setNetworkAddress(netwrk_address_OTAA) != mDot::MDOT_OK) { printf("\r\nfailed to set network device address to %s", mts::Text::bin2hexString(netwrk_address_OTAA).c_str()); } printf("\r\nchanging network session key to OTAA device key %s", mts::Text::bin2hexString(netwrk_session_key_OTAA).c_str()); if (dot->setNetworkSessionKey(netwrk_session_key_OTAA) != mDot::MDOT_OK) { printf("\r\nfailed to set network session key to %s", mts::Text::bin2hexString(netwrk_session_key_OTAA).c_str()); } printf("\r\nchanging data session key to OTAA device data key %s", mts::Text::bin2hexString(data_session_key_OTAA).c_str()); if (dot->setDataSessionKey(data_session_key_OTAA) != mDot::MDOT_OK) { printf("\r\nfailed to set data session key to %s", mts::Text::bin2hexString(data_session_key_OTAA).c_str()); } dot->setDownLinkCounter(downcounter_OTAA); //restore frame counters before switching dot->setUpLinkCounter(upcounter_OTAA); if (dot->setClass("A") == mDot::MDOT_OK){ printf("\r\nset network mode to class A"); return true; } else{ printf("\r\n FAILED set network mode to class A"); return false; } } } /* //======================================================================================================== //multicast_cmd_process() //process a rx incoming multicast packet //======================================================================================================== void multicast_cmd_process(std::vector<uint8_t> rx_packet){ uint8_t i; uint8_t rxLen = rx_packet.size(); printf("\r\n**********************************************"); printf("\r\nmulticast cmd len, %d, data: ",rxLen); for (i=0; i< rxLen;i++)printf(" %x",rx_packet[i]); printf("\r\n"); uint8_t mCmd = rx_packet[0]; switch (mCmd){ case MULTICAST_CMD_SPOOF: printf("\r\nmulticast to change to spoof mode: cmd#: %d",mCmd); multicast_change_creds(true); //change credentials to NodeX nodeState = STATE_SPOOF; break; case MULTICAST_CMD_GOTOCLASSC: nodeState = STATE_MULTICAST_ACK_RCVD; frags_missing_cnts = 0; printf("\r\nmulticast to change to class c: cmd#: %d",mCmd); frags_nmb_sending = rx_packet[1]; //# of frags to be sent frags_size = rx_packet[2]; //size of each frag to be sent frag_missd = 0xffffffff; //preload to all frags missed printf(" frags2BeRcvd: %d frag_size(bytes): %d",frags_nmb_sending,frags_size); break; case MULTICAST_CMD_GOTOCLASSA: printf("\r\nmulticast to change back to class A: cmd#: %d",mCmd); multicast_change_creds(false); //change credentials to OTAA nodeState = STATE_CLASSA; break; case MULTICAST_CMD_SENDFRAGDATA: //send the frag multicast info status printf("\r\nmulticast send frag data: cmd#: %d",mCmd); nodeState = STATE_MULTICAST_FRAG_INFO; break; } //switch printf("\r\n **********************************************\r\n"); } //======================================================================================================== //multicast_cmd_process() //process a rx incoming multicast packet //missing frags are a bit location in uint32_t frag_missd; a bit location = 1 => missing frag //======================================================================================================== void multicast_data_process(std::vector<uint8_t> rx_packet){ uint8_t i; uint8_t rxLen = rx_packet.size(); uint8_t frag_nmb = rx_packet[0]; printf("\r\n**********************************************"); printf("\r\n frag nmb: %d",frag_nmb); frag_missd = frag_missd &~(1UL << (frag_nmb-1)); printf(" missdd frag bit pattern: %x,",frag_missd); if (frag_nmb > frags_old_nmb+1) frags_missing_cnts++; printf("\n\rmulticast data rcvd, len: %d,missing frag cnt: %d ",rxLen,frags_missing_cnts); printf("\r\ndata: "); for (i=1; i< rxLen;i++)printf(" %x",rx_packet[i]); printf("\r\n"); printf("\r\n**********************************************\r\n"); frags_old_nmb = frag_nmb; if (frag_nmb == frags_nmb_sending){ printf("last frag rcvd, changing to classA"); multicast_change_creds(false); //change credentials to OTAA nodeState = STATE_CLASSA; } } */