arm studio build

Dependencies:   libxDot-mbed5

Committer:
alan1974
Date:
Fri Jan 25 01:46:26 2019 +0000
Revision:
17:74d60177c6b6
Parent:
14:fc836a5a5d2f
Child:
18:d95e1a2c4303
success full mcast of blestack code to xdot (but no xfr to proc yet)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alan1974 14:fc836a5a5d2f 1 #include "mbed.h"
alan1974 14:fc836a5a5d2f 2 #include "dot_util.h"
alan1974 14:fc836a5a5d2f 3 #include "mDot.h"
alan1974 14:fc836a5a5d2f 4 #include "RadioEvent.h"
alan1974 14:fc836a5a5d2f 5 #include "ChannelPlans.h"
alan1974 14:fc836a5a5d2f 6 #include "Lora.h"
alan1974 14:fc836a5a5d2f 7 #include "multicast.h"
alan1974 14:fc836a5a5d2f 8
alan1974 14:fc836a5a5d2f 9
alan1974 14:fc836a5a5d2f 10 extern uint8_t nodeState;
alan1974 14:fc836a5a5d2f 11 //OTAA keys
alan1974 14:fc836a5a5d2f 12 extern uint8_t app_eui[];
alan1974 14:fc836a5a5d2f 13 extern uint8_t app_key[];
alan1974 14:fc836a5a5d2f 14
alan1974 14:fc836a5a5d2f 15 //arrays to hold OTAA keys
alan1974 14:fc836a5a5d2f 16 std::vector<uint8_t> netwrk_address_OTAA;
alan1974 14:fc836a5a5d2f 17 std::vector<uint8_t> netwrk_session_key_OTAA;
alan1974 14:fc836a5a5d2f 18 std::vector<uint8_t> data_session_key_OTAA;
alan1974 14:fc836a5a5d2f 19 uint32_t downcounter_OTAA;
alan1974 14:fc836a5a5d2f 20 uint32_t upcounter_OTAA;
alan1974 14:fc836a5a5d2f 21
alan1974 14:fc836a5a5d2f 22 //local
alan1974 14:fc836a5a5d2f 23 uint8_t frags_old_nmb = 0;
alan1974 14:fc836a5a5d2f 24 uint8_t frags_missing_cnts = 0;
alan1974 14:fc836a5a5d2f 25 uint8_t frags_nmb_sending = 0; //# of frags to be send
alan1974 14:fc836a5a5d2f 26 uint8_t frags_size = 0; //size of each frag to be sent
alan1974 14:fc836a5a5d2f 27 uint32_t frag_missd = 0;
alan1974 14:fc836a5a5d2f 28 //========================================================================================================
alan1974 17:74d60177c6b6 29 // save_OTAA_session session parameters
alan1974 14:fc836a5a5d2f 30 //========================================================================================================
alan1974 14:fc836a5a5d2f 31 void save_OTAA_session_keys()
alan1974 14:fc836a5a5d2f 32 {
alan1974 17:74d60177c6b6 33 printf("\r\n saving OTAA session keys --------------------------------- \r\n");
alan1974 14:fc836a5a5d2f 34 netwrk_address_OTAA = dot->getNetworkAddress();
alan1974 14:fc836a5a5d2f 35 logInfo(" OTAA devAddr %s", mts::Text::bin2hexString(netwrk_address_OTAA).c_str());
alan1974 14:fc836a5a5d2f 36 netwrk_session_key_OTAA = dot->getNetworkSessionKey();
alan1974 14:fc836a5a5d2f 37 logInfo(" OTAA network session key %s", mts::Text::bin2hexString(netwrk_session_key_OTAA).c_str());
alan1974 14:fc836a5a5d2f 38 data_session_key_OTAA = dot->getDataSessionKey();
alan1974 14:fc836a5a5d2f 39 logInfo(" OTAA app session key %s", mts::Text::bin2hexString(data_session_key_OTAA).c_str());
alan1974 14:fc836a5a5d2f 40 }
alan1974 14:fc836a5a5d2f 41 //========================================================================================================
alan1974 14:fc836a5a5d2f 42 //change radio class to class C or class A
alan1974 14:fc836a5a5d2f 43 // bClass_C:true => change class C credentials
alan1974 14:fc836a5a5d2f 44 // :false=> change class A credentials
alan1974 14:fc836a5a5d2f 45 // sClass contains class C credentials
alan1974 14:fc836a5a5d2f 46 // returns true if class change OK
alan1974 14:fc836a5a5d2f 47 //========================================================================================================
alan1974 14:fc836a5a5d2f 48 bool multicast_change_class(class_switch *sClass)
alan1974 14:fc836a5a5d2f 49 {
alan1974 14:fc836a5a5d2f 50 if (sClass->bClassC)
alan1974 14:fc836a5a5d2f 51 {
alan1974 14:fc836a5a5d2f 52 uint8_t joined = dot->getNetworkJoinStatus(); //are we joined to Lorawan?
alan1974 14:fc836a5a5d2f 53 if (!joined){
alan1974 14:fc836a5a5d2f 54 printf("\r\n cannot change radio class unless already joined");
alan1974 14:fc836a5a5d2f 55 return false; //don't switch if not joined
alan1974 14:fc836a5a5d2f 56 }
alan1974 17:74d60177c6b6 57 printf("\r\n switching to class C \r\n");
alan1974 14:fc836a5a5d2f 58 downcounter_OTAA = dot->getDownLinkCounter(); //save frame counters before switching
alan1974 14:fc836a5a5d2f 59 upcounter_OTAA = dot->getUpLinkCounter();
alan1974 14:fc836a5a5d2f 60
alan1974 17:74d60177c6b6 61 dot->setUpLinkCounter(0);
alan1974 17:74d60177c6b6 62 dot->setDownLinkCounter(0);
alan1974 14:fc836a5a5d2f 63
alan1974 14:fc836a5a5d2f 64 //load ABP keys into arrays
alan1974 14:fc836a5a5d2f 65 std::vector<uint8_t> dev_adr;
alan1974 14:fc836a5a5d2f 66 std::vector<uint8_t> nwky;
alan1974 14:fc836a5a5d2f 67 std::vector<uint8_t> dataky;
alan1974 14:fc836a5a5d2f 68 bool bKeyOk = true;
alan1974 14:fc836a5a5d2f 69 uint8_t indx;
alan1974 14:fc836a5a5d2f 70
alan1974 14:fc836a5a5d2f 71 //set ABP keys
alan1974 14:fc836a5a5d2f 72 for (indx =0; indx < sizeof(sClass->devAdr);indx++) dev_adr.push_back(sClass->devAdr[indx]);
alan1974 14:fc836a5a5d2f 73 for (indx =0; indx < sizeof(sClass->key_nsk);indx++) nwky.push_back(sClass->key_nsk[indx]);
alan1974 14:fc836a5a5d2f 74 for (indx =0; indx < sizeof(sClass->key_aps);indx++) dataky.push_back(sClass->key_aps[indx]);
alan1974 14:fc836a5a5d2f 75 //set ABP keys
alan1974 14:fc836a5a5d2f 76 printf("\r\nsetting ABP network address %s\r\n", mts::Text::bin2hexString(dev_adr).c_str());
alan1974 14:fc836a5a5d2f 77 if (dot->setNetworkAddress(dev_adr) != mDot::MDOT_OK){
alan1974 14:fc836a5a5d2f 78 printf(" failed to set key\r\n");
alan1974 14:fc836a5a5d2f 79 bKeyOk = false;
alan1974 14:fc836a5a5d2f 80 }
alan1974 14:fc836a5a5d2f 81 printf("\r\nsetting ABP network session key %sr\n", mts::Text::bin2hexString(nwky).c_str());
alan1974 14:fc836a5a5d2f 82 if (dot->setNetworkSessionKey(nwky) != mDot::MDOT_OK){
alan1974 14:fc836a5a5d2f 83 printf(" failed to set key\r\n");
alan1974 14:fc836a5a5d2f 84 bKeyOk = false;
alan1974 14:fc836a5a5d2f 85 }
alan1974 14:fc836a5a5d2f 86 printf("\r\nsettomg ABP data session key %sr\n", mts::Text::bin2hexString(dataky).c_str());
alan1974 14:fc836a5a5d2f 87 if (dot->setDataSessionKey(dataky) != mDot::MDOT_OK){
alan1974 14:fc836a5a5d2f 88 printf(" failed to set key\r\n");
alan1974 14:fc836a5a5d2f 89 bKeyOk = false;
alan1974 14:fc836a5a5d2f 90 }
alan1974 14:fc836a5a5d2f 91 if (!bKeyOk) return false;
alan1974 14:fc836a5a5d2f 92
alan1974 14:fc836a5a5d2f 93 if (dot->setClass("C") == mDot::MDOT_OK){
alan1974 14:fc836a5a5d2f 94 printf("\r\n set network mode to class C\r\n");
alan1974 14:fc836a5a5d2f 95 return true;
alan1974 14:fc836a5a5d2f 96 }
alan1974 14:fc836a5a5d2f 97 else{
alan1974 14:fc836a5a5d2f 98 printf("\r\n FAILED to set network mode to class C\r\n");
alan1974 14:fc836a5a5d2f 99 return false;
alan1974 14:fc836a5a5d2f 100 }
alan1974 14:fc836a5a5d2f 101 } //if Class C
alan1974 14:fc836a5a5d2f 102 else{ //change back to OTAA
alan1974 17:74d60177c6b6 103 printf("\r\n switching to class A \r\n");
alan1974 14:fc836a5a5d2f 104 printf("\r\nchanging network address to OTAA device address %s\r\n", mts::Text::bin2hexString(netwrk_address_OTAA).c_str());
alan1974 14:fc836a5a5d2f 105 if (dot->setNetworkAddress(netwrk_address_OTAA) != mDot::MDOT_OK) {
alan1974 14:fc836a5a5d2f 106 printf("\r\nfailed to set network device address to %s", mts::Text::bin2hexString(netwrk_address_OTAA).c_str());
alan1974 14:fc836a5a5d2f 107 }
alan1974 14:fc836a5a5d2f 108 printf("\r\nchanging network session key to OTAA device key %s", mts::Text::bin2hexString(netwrk_session_key_OTAA).c_str());
alan1974 14:fc836a5a5d2f 109 if (dot->setNetworkSessionKey(netwrk_session_key_OTAA) != mDot::MDOT_OK) {
alan1974 14:fc836a5a5d2f 110 printf("\r\nfailed to set network session key to %s", mts::Text::bin2hexString(netwrk_session_key_OTAA).c_str());
alan1974 14:fc836a5a5d2f 111 }
alan1974 14:fc836a5a5d2f 112 printf("\r\nchanging data session key to OTAA device data key %s", mts::Text::bin2hexString(data_session_key_OTAA).c_str());
alan1974 14:fc836a5a5d2f 113 if (dot->setDataSessionKey(data_session_key_OTAA) != mDot::MDOT_OK) {
alan1974 14:fc836a5a5d2f 114 printf("\r\nfailed to set data session key to %s", mts::Text::bin2hexString(data_session_key_OTAA).c_str());
alan1974 14:fc836a5a5d2f 115 }
alan1974 14:fc836a5a5d2f 116 dot->setDownLinkCounter(downcounter_OTAA); //restore frame counters before switching
alan1974 14:fc836a5a5d2f 117 dot->setUpLinkCounter(upcounter_OTAA);
alan1974 14:fc836a5a5d2f 118
alan1974 14:fc836a5a5d2f 119 if (dot->setClass("A") == mDot::MDOT_OK){
alan1974 14:fc836a5a5d2f 120 printf("\r\nset network mode to class A");
alan1974 14:fc836a5a5d2f 121 return true;
alan1974 14:fc836a5a5d2f 122 }
alan1974 14:fc836a5a5d2f 123 else{
alan1974 14:fc836a5a5d2f 124 printf("\r\n FAILED set network mode to class A");
alan1974 14:fc836a5a5d2f 125 return false;
alan1974 14:fc836a5a5d2f 126 }
alan1974 14:fc836a5a5d2f 127
alan1974 14:fc836a5a5d2f 128
alan1974 14:fc836a5a5d2f 129 }
alan1974 14:fc836a5a5d2f 130
alan1974 14:fc836a5a5d2f 131 }
alan1974 14:fc836a5a5d2f 132 /*
alan1974 14:fc836a5a5d2f 133 //========================================================================================================
alan1974 14:fc836a5a5d2f 134 //multicast_cmd_process()
alan1974 14:fc836a5a5d2f 135 //process a rx incoming multicast packet
alan1974 14:fc836a5a5d2f 136 //========================================================================================================
alan1974 14:fc836a5a5d2f 137 void multicast_cmd_process(std::vector<uint8_t> rx_packet){
alan1974 14:fc836a5a5d2f 138 uint8_t i;
alan1974 14:fc836a5a5d2f 139 uint8_t rxLen = rx_packet.size();
alan1974 14:fc836a5a5d2f 140 printf("\r\n**********************************************");
alan1974 14:fc836a5a5d2f 141 printf("\r\nmulticast cmd len, %d, data: ",rxLen);
alan1974 14:fc836a5a5d2f 142 for (i=0; i< rxLen;i++)printf(" %x",rx_packet[i]);
alan1974 14:fc836a5a5d2f 143 printf("\r\n");
alan1974 14:fc836a5a5d2f 144
alan1974 14:fc836a5a5d2f 145 uint8_t mCmd = rx_packet[0];
alan1974 14:fc836a5a5d2f 146 switch (mCmd){
alan1974 14:fc836a5a5d2f 147 case MULTICAST_CMD_SPOOF:
alan1974 14:fc836a5a5d2f 148 printf("\r\nmulticast to change to spoof mode: cmd#: %d",mCmd);
alan1974 14:fc836a5a5d2f 149 multicast_change_creds(true); //change credentials to NodeX
alan1974 14:fc836a5a5d2f 150 nodeState = STATE_SPOOF;
alan1974 14:fc836a5a5d2f 151 break;
alan1974 14:fc836a5a5d2f 152 case MULTICAST_CMD_GOTOCLASSC:
alan1974 14:fc836a5a5d2f 153 nodeState = STATE_MULTICAST_ACK_RCVD;
alan1974 14:fc836a5a5d2f 154 frags_missing_cnts = 0;
alan1974 14:fc836a5a5d2f 155 printf("\r\nmulticast to change to class c: cmd#: %d",mCmd);
alan1974 14:fc836a5a5d2f 156 frags_nmb_sending = rx_packet[1]; //# of frags to be sent
alan1974 14:fc836a5a5d2f 157 frags_size = rx_packet[2]; //size of each frag to be sent
alan1974 14:fc836a5a5d2f 158 frag_missd = 0xffffffff; //preload to all frags missed
alan1974 14:fc836a5a5d2f 159 printf(" frags2BeRcvd: %d frag_size(bytes): %d",frags_nmb_sending,frags_size);
alan1974 14:fc836a5a5d2f 160 break;
alan1974 14:fc836a5a5d2f 161 case MULTICAST_CMD_GOTOCLASSA:
alan1974 14:fc836a5a5d2f 162 printf("\r\nmulticast to change back to class A: cmd#: %d",mCmd);
alan1974 14:fc836a5a5d2f 163 multicast_change_creds(false); //change credentials to OTAA
alan1974 14:fc836a5a5d2f 164 nodeState = STATE_CLASSA;
alan1974 14:fc836a5a5d2f 165 break;
alan1974 14:fc836a5a5d2f 166 case MULTICAST_CMD_SENDFRAGDATA: //send the frag multicast info status
alan1974 14:fc836a5a5d2f 167 printf("\r\nmulticast send frag data: cmd#: %d",mCmd);
alan1974 14:fc836a5a5d2f 168 nodeState = STATE_MULTICAST_FRAG_INFO;
alan1974 14:fc836a5a5d2f 169 break;
alan1974 14:fc836a5a5d2f 170
alan1974 14:fc836a5a5d2f 171 } //switch
alan1974 14:fc836a5a5d2f 172 printf("\r\n **********************************************\r\n");
alan1974 14:fc836a5a5d2f 173 }
alan1974 14:fc836a5a5d2f 174 //========================================================================================================
alan1974 14:fc836a5a5d2f 175 //multicast_cmd_process()
alan1974 14:fc836a5a5d2f 176 //process a rx incoming multicast packet
alan1974 14:fc836a5a5d2f 177 //missing frags are a bit location in uint32_t frag_missd; a bit location = 1 => missing frag
alan1974 14:fc836a5a5d2f 178 //========================================================================================================
alan1974 14:fc836a5a5d2f 179 void multicast_data_process(std::vector<uint8_t> rx_packet){
alan1974 14:fc836a5a5d2f 180 uint8_t i;
alan1974 14:fc836a5a5d2f 181 uint8_t rxLen = rx_packet.size();
alan1974 14:fc836a5a5d2f 182 uint8_t frag_nmb = rx_packet[0];
alan1974 14:fc836a5a5d2f 183 printf("\r\n**********************************************");
alan1974 14:fc836a5a5d2f 184 printf("\r\n frag nmb: %d",frag_nmb);
alan1974 14:fc836a5a5d2f 185 frag_missd = frag_missd &~(1UL << (frag_nmb-1));
alan1974 14:fc836a5a5d2f 186 printf(" missdd frag bit pattern: %x,",frag_missd);
alan1974 14:fc836a5a5d2f 187 if (frag_nmb > frags_old_nmb+1) frags_missing_cnts++;
alan1974 14:fc836a5a5d2f 188
alan1974 14:fc836a5a5d2f 189 printf("\n\rmulticast data rcvd, len: %d,missing frag cnt: %d ",rxLen,frags_missing_cnts);
alan1974 14:fc836a5a5d2f 190 printf("\r\ndata: ");
alan1974 14:fc836a5a5d2f 191 for (i=1; i< rxLen;i++)printf(" %x",rx_packet[i]);
alan1974 14:fc836a5a5d2f 192 printf("\r\n");
alan1974 14:fc836a5a5d2f 193 printf("\r\n**********************************************\r\n");
alan1974 14:fc836a5a5d2f 194 frags_old_nmb = frag_nmb;
alan1974 14:fc836a5a5d2f 195
alan1974 14:fc836a5a5d2f 196 if (frag_nmb == frags_nmb_sending){
alan1974 14:fc836a5a5d2f 197 printf("last frag rcvd, changing to classA");
alan1974 14:fc836a5a5d2f 198 multicast_change_creds(false); //change credentials to OTAA
alan1974 14:fc836a5a5d2f 199 nodeState = STATE_CLASSA;
alan1974 14:fc836a5a5d2f 200 }
alan1974 14:fc836a5a5d2f 201 }
alan1974 14:fc836a5a5d2f 202 */