123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746 |
- int sendPacket(uint8_t *buf, uint8_t length)
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int i=0;
- StaticJsonDocument<312> jsonBuffer;
- char * bufPtr = (char *) (buf);
- buf[length] = 0;
-
- #if DUSB>=1
- if (debug>=2) {
- Serial.println((char *)buf);
- Serial.print(F("<"));
- Serial.flush();
- }
- #endif
-
-
- auto error = deserializeJson(jsonBuffer, bufPtr);
-
- if (error) {
- #if DUSB>=1
- if (( debug>=1) && (pdebug & P_TX)) {
- Serial.print (F("T sendPacket:: ERROR Json Decode"));
- if (debug>=2) {
- Serial.print(':');
- Serial.println(bufPtr);
- }
- Serial.flush();
- }
- #endif
- return(-1);
- }
- yield();
-
-
-
-
- JsonObject root = jsonBuffer.to<JsonObject>();
-
- const char * data = root["txpk"]["data"];
- uint8_t psize = root["txpk"]["size"];
- bool ipol = root["txpk"]["ipol"];
- uint8_t powe = root["txpk"]["powe"];
- LoraDown.tmst = (uint32_t) root["txpk"]["tmst"].as<unsigned long>();
- const float ff = root["txpk"]["freq"];
-
-
- const char * datr = root["txpk"]["datr"];
- const char * modu = root["txpk"]["modu"];
- const char * codr = root["txpk"]["codr"];
-
-
-
- if ( data != NULL ) {
- #if DUSB>=1
- if (( debug>=2 ) && ( pdebug & P_TX )) {
- Serial.print(F("T data: "));
- Serial.println((char *) data);
- if (debug>=2) Serial.flush();
- }
- #endif
- }
- else {
- #if DUSB>=1
- if ((debug>0) && ( pdebug & P_TX )) {
- Serial.println(F("T sendPacket:: ERROR: data is NULL"));
- if (debug>=2) Serial.flush();
- }
- #endif
- return(-1);
- }
- LoraDown.sfTx = atoi(datr+2);
- LoraDown.iiq = (ipol? 0x40: 0x27);
- LoraDown.crc = 0x00;
- LoraDown.payLength = base64_dec_len((char *) data, strlen(data));
- base64_decode((char *) payLoad, (char *) data, strlen(data));
-
- uint32_t w = (uint32_t) (LoraDown.tmst - micros());
- #if _STRICT_1CH == 1
-
-
-
-
-
-
- if ((w>1000000) && (w<3000000)) {
- LoraDown.tmst-=1000000;
- }
-
- else if ((w>6000000) && (w<7000000)) {
- LoraDown.tmst-=500000;
- }
- LoraDown.powe = 14;
- LoraDown.sfTx = sfi;
-
-
- #else
- than for gateways.
- LoraDown.powe = powe;
-
- LoraDown.fff = (uint32_t) ((uint32_t)((ff+0.000035)*1000)) * 1000;
- #endif
-
- LoraDown.payLoad = payLoad;
- #if DUSB>=1
- if (( debug>=1 ) && ( pdebug & P_TX)) {
-
- Serial.print(F("T LoraDown tmst="));
- Serial.print(LoraDown.tmst);
-
-
-
- if ( debug>=2 ) {
- Serial.print(F(" Request:: "));
- Serial.print(F(" tmst=")); Serial.print(LoraDown.tmst); Serial.print(F(" wait=")); Serial.println(w);
-
- Serial.print(F(" strict=")); Serial.print(_STRICT_1CH);
- Serial.print(F(" datr=")); Serial.println(datr);
- Serial.print(F(" Rfreq=")); Serial.print(freqs[ifreq].dwnFreq);
- Serial.print(F(", Request=")); Serial.print(freqs[ifreq].dwnFreq);
- Serial.print(F(" ->")); Serial.println(LoraDown.fff);
- Serial.print(F(" sf =")); Serial.print(atoi(datr+2)); Serial.print(F(" ->")); Serial.println(LoraDown.sfTx);
-
- Serial.print(F(" modu=")); Serial.println(modu);
- Serial.print(F(" powe=")); Serial.println(powe);
- Serial.print(F(" codr=")); Serial.println(codr);
- Serial.print(F(" ipol=")); Serial.println(ipol);
- }
- Serial.println();
- }
- #endif
- if (LoraDown.payLength != psize) {
- #if DUSB>=1
- Serial.print(F("sendPacket:: WARNING payLength: "));
- Serial.print(LoraDown.payLength);
- Serial.print(F(", psize="));
- Serial.println(psize);
- if (debug>=2) Serial.flush();
- #endif
- }
- #if DUSB>=1
- else if (( debug >= 2 ) && ( pdebug & P_TX )) {
- Serial.print(F("T Payload="));
- for (i=0; i<LoraDown.payLength; i++) {
- Serial.print(payLoad[i],HEX);
- Serial.print(':');
- }
- Serial.println();
- }
- #endif
-
- statc.msg_down++;
- switch(statr[0].ch) {
- case 0: statc.msg_down_0++; break;
- case 1: statc.msg_down_1++; break;
- case 2: statc.msg_down_2++; break;
- }
- #if DUSB>=1
- if (( debug>=2 ) && ( pdebug & P_TX )) {
- Serial.println(F("T sendPacket:: fini OK"));
- Serial.flush();
- }
- #endif
-
-
- _state = S_TX;
-
- return 1;
- }
- int buildPacket(uint32_t tmst, uint8_t *buff_up, struct LoraUp LoraUp, bool internal)
- {
- long SNR;
- int rssicorr;
- int prssi;
-
- char cfreq[12] = {0};
-
- int buff_index=0;
- char b64[256];
-
- uint8_t *message = LoraUp.payLoad;
- char messageLength = LoraUp.payLength;
-
- #if _CHECK_MIC==1
- unsigned char NwkSKey[16] = _NWKSKEY;
- checkMic(message, messageLength, NwkSKey);
- #endif
-
-
- if (internal) {
- SNR = 12;
- prssi = 50;
- rssicorr = 157;
- }
- else {
- SNR = LoraUp.snr;
- prssi = LoraUp.prssi;
- rssicorr = LoraUp.rssicorr;
- }
- #if STATISTICS >= 1
-
-
-
-
- for (int m=( MAX_STAT -1); m>0; m--) statr[m]=statr[m-1];
-
-
- #if _LOCALSERVER==1
- statr[0].datal=0;
- int index;
- if ((index = inDecodes((char *)(LoraUp.payLoad+1))) >=0 ) {
- uint16_t frameCount=LoraUp.payLoad[7]*256 + LoraUp.payLoad[6];
-
- for (int k=0; (k<LoraUp.payLength) && (k<23); k++) {
- statr[0].data[k] = LoraUp.payLoad[k+9];
- };
-
-
-
-
- uint8_t DevAddr[4];
- DevAddr[0]= LoraUp.payLoad[4];
- DevAddr[1]= LoraUp.payLoad[3];
- DevAddr[2]= LoraUp.payLoad[2];
- DevAddr[3]= LoraUp.payLoad[1];
- statr[0].datal = encodePacket((uint8_t *)(statr[0].data),
- LoraUp.payLength-9-4,
- (uint16_t)frameCount,
- DevAddr,
- decodes[index].appKey,
- 0);
- }
- #endif
- statr[0].tmst = now();
- statr[0].ch= ifreq;
- statr[0].prssi = prssi - rssicorr;
- #if RSSI==1
- statr[0].rssi = _rssi - rssicorr;
- #endif
- statr[0].sf = LoraUp.sf;
- #if DUSB>=2
- if (debug>=0) {
- if ((message[4] != 0x26) || (message[1]==0x99)) {
- Serial.print(F("addr="));
- for (int i=messageLength; i>0; i--) {
- if (message[i]<0x10) Serial.print('0');
- Serial.print(message[i],HEX);
- Serial.print(' ');
- }
- Serial.println();
- }
- }
- #endif
- statr[0].node = ( message[1]<<24 | message[2]<<16 | message[3]<<8 | message[4] );
- #if STATISTICS >= 2
-
-
- switch (statr[0].sf) {
- case SF7: statc.sf7++; break;
- case SF8: statc.sf8++; break;
- case SF9: statc.sf9++; break;
- case SF10: statc.sf10++; break;
- case SF11: statc.sf11++; break;
- case SF12: statc.sf12++; break;
- }
- #endif
- #if STATISTICS >= 3
- if (statr[0].ch == 0) {
- statc.msg_ttl_0++;
- switch (statr[0].sf) {
- case SF7: statc.sf7_0++; break;
- case SF8: statc.sf8_0++; break;
- case SF9: statc.sf9_0++; break;
- case SF10: statc.sf10_0++; break;
- case SF11: statc.sf11_0++; break;
- case SF12: statc.sf12_0++; break;
- }
- }
- else
- if (statr[0].ch == 1) {
- statc.msg_ttl_1++;
- switch (statr[0].sf) {
- case SF7: statc.sf7_1++; break;
- case SF8: statc.sf8_1++; break;
- case SF9: statc.sf9_1++; break;
- case SF10: statc.sf10_1++; break;
- case SF11: statc.sf11_1++; break;
- case SF12: statc.sf12_1++; break;
- }
- }
- else
- if (statr[0].ch == 2) {
- statc.msg_ttl_2++;
- switch (statr[0].sf) {
- case SF7: statc.sf7_2++; break;
- case SF8: statc.sf8_2++; break;
- case SF9: statc.sf9_2++; break;
- case SF10: statc.sf10_2++; break;
- case SF11: statc.sf11_2++; break;
- case SF12: statc.sf12_2++; break;
- }
- }
- #endif
- #endif
- #if DUSB>=1
- if (( debug>=2 ) && ( pdebug & P_RADIO )){
- Serial.print(F("R buildPacket:: pRSSI="));
- Serial.print(prssi-rssicorr);
- Serial.print(F(" RSSI: "));
- Serial.print(_rssi - rssicorr);
- Serial.print(F(" SNR: "));
- Serial.print(SNR);
- Serial.print(F(" Length: "));
- Serial.print((int)messageLength);
- Serial.print(F(" -> "));
- int i;
- for (i=0; i< messageLength; i++) {
- Serial.print(message[i],HEX);
- Serial.print(' ');
- }
- Serial.println();
- yield();
- }
- #endif
- #if OLED>=1
- char timBuff[20];
- sprintf(timBuff, "%02i:%02i:%02i", hour(), minute(), second());
-
- display.clear();
- display.setFont(ArialMT_Plain_16);
- display.setTextAlignment(TEXT_ALIGN_LEFT);
-
- display.drawString(0, 0, "Time: " );
- display.drawString(40, 0, timBuff);
-
- display.drawString(0, 16, "RSSI: " );
- display.drawString(40, 16, String(prssi-rssicorr));
-
- display.drawString(70, 16, ",SNR: " );
- display.drawString(110, 16, String(SNR) );
-
- display.drawString(0, 32, "Addr: " );
-
- if (message[4] < 0x10) display.drawString( 40, 32, "0"+String(message[4], HEX)); else display.drawString( 40, 32, String(message[4], HEX));
- if (message[3] < 0x10) display.drawString( 61, 32, "0"+String(message[3], HEX)); else display.drawString( 61, 32, String(message[3], HEX));
- if (message[2] < 0x10) display.drawString( 82, 32, "0"+String(message[2], HEX)); else display.drawString( 82, 32, String(message[2], HEX));
- if (message[1] < 0x10) display.drawString(103, 32, "0"+String(message[1], HEX)); else display.drawString(103, 32, String(message[1], HEX));
-
- display.drawString(0, 48, "LEN: " );
- display.drawString(40, 48, String((int)messageLength) );
- display.display();
-
- #endif
-
- int j;
-
-
-
-
- int encodedLen = base64_enc_len(messageLength);
- #if DUSB>=1
- if ((debug>=1) && (encodedLen>255) && ( pdebug & P_RADIO )) {
- Serial.print(F("R buildPacket:: b64 err, len="));
- Serial.println(encodedLen);
- if (debug>=2) Serial.flush();
- return(-1);
- }
- #endif
- base64_encode(b64, (char *) message, messageLength);
-
- uint8_t token_h = (uint8_t)rand();
- uint8_t token_l = (uint8_t)rand();
-
-
- buff_up[0] = PROTOCOL_VERSION;
- buff_up[1] = token_h;
- buff_up[2] = token_l;
-
- buff_up[3] = PKT_PUSH_DATA;
-
-
- buff_up[4] = MAC_array[0];
- buff_up[5] = MAC_array[1];
- buff_up[6] = MAC_array[2];
- buff_up[7] = 0xFF;
- buff_up[8] = 0xFF;
- buff_up[9] = MAC_array[3];
- buff_up[10] = MAC_array[4];
- buff_up[11] = MAC_array[5];
- buff_index = 12;
-
- memcpy((void *)(buff_up + buff_index), (void *)"{\"rxpk\":[", 9);
- buff_index += 9;
- buff_up[buff_index] = '{';
- ++buff_index;
- j = snprintf((char *)(buff_up + buff_index), TX_BUFF_SIZE-buff_index, "\"tmst\":%u", tmst);
- #if DUSB>=1
- if ((j<0) && ( debug>=1 ) && ( pdebug & P_RADIO )) {
- Serial.println(F("buildPacket:: Error "));
- }
- #endif
- buff_index += j;
- ftoa((double)freqs[ifreq].upFreq / 1000000, cfreq, 6);
-
- j = snprintf((char *)(buff_up + buff_index), TX_BUFF_SIZE-buff_index, ",\"chan\":%1u,\"rfch\":%1u,\"freq\":%s", 0, 0, cfreq);
- buff_index += j;
- memcpy((void *)(buff_up + buff_index), (void *)",\"stat\":1", 9);
- buff_index += 9;
- memcpy((void *)(buff_up + buff_index), (void *)",\"modu\":\"LORA\"", 14);
- buff_index += 14;
-
-
- switch (LoraUp.sf) {
- case SF6:
- memcpy((void *)(buff_up + buff_index), (void *)",\"datr\":\"SF6", 12);
- buff_index += 12;
- break;
- case SF7:
- memcpy((void *)(buff_up + buff_index), (void *)",\"datr\":\"SF7", 12);
- buff_index += 12;
- break;
- case SF8:
- memcpy((void *)(buff_up + buff_index), (void *)",\"datr\":\"SF8", 12);
- buff_index += 12;
- break;
- case SF9:
- memcpy((void *)(buff_up + buff_index), (void *)",\"datr\":\"SF9", 12);
- buff_index += 12;
- break;
- case SF10:
- memcpy((void *)(buff_up + buff_index), (void *)",\"datr\":\"SF10", 13);
- buff_index += 13;
- break;
- case SF11:
- memcpy((void *)(buff_up + buff_index), (void *)",\"datr\":\"SF11", 13);
- buff_index += 13;
- break;
- case SF12:
- memcpy((void *)(buff_up + buff_index), (void *)",\"datr\":\"SF12", 13);
- buff_index += 13;
- break;
- default:
- memcpy((void *)(buff_up + buff_index), (void *)",\"datr\":\"SF?", 12);
- buff_index += 12;
- }
- memcpy((void *)(buff_up + buff_index), (void *)"BW125\"", 6);
- buff_index += 6;
- memcpy((void *)(buff_up + buff_index), (void *)",\"codr\":\"4/5\"", 13);
- buff_index += 13;
- j = snprintf((char *)(buff_up + buff_index), TX_BUFF_SIZE-buff_index, ",\"lsnr\":%li", SNR);
- buff_index += j;
- j = snprintf((char *)(buff_up + buff_index), TX_BUFF_SIZE-buff_index, ",\"rssi\":%d,\"size\":%u", prssi-rssicorr, messageLength);
- buff_index += j;
- memcpy((void *)(buff_up + buff_index), (void *)",\"data\":\"", 9);
- buff_index += 9;
-
- encodedLen = base64_enc_len(messageLength);
- j = base64_encode((char *)(buff_up + buff_index), (char *) message, messageLength);
- buff_index += j;
- buff_up[buff_index] = '"';
- ++buff_index;
-
- buff_up[buff_index] = '}';
- ++buff_index;
- buff_up[buff_index] = ']';
- ++buff_index;
-
-
- buff_up[buff_index] = '}';
- ++buff_index;
- buff_up[buff_index] = 0;
- #if STAT_LOG == 1
-
-
- addLog( (unsigned char *)(buff_up), buff_index );
- #endif
-
- #if DUSB>=1
- if (( debug>=2 ) && ( pdebug & P_RX )) {
- Serial.print(F("R RXPK:: "));
- Serial.println((char *)(buff_up + 12));
- Serial.print(F("R RXPK:: package length="));
- Serial.println(buff_index);
- }
- #endif
- return(buff_index);
- }
- int receivePacket()
- {
- uint8_t buff_up[TX_BUFF_SIZE];
- long SNR;
- uint8_t message[128] = { 0x00 };
- uint8_t messageLength = 0;
-
-
-
-
-
-
-
- uint32_t tmst = (uint32_t) micros();
-
-
-
- if (LoraUp.payLength > 0) {
-
- int build_index = buildPacket(tmst, buff_up, LoraUp, false);
-
-
-
- #if _REPEATER==1
- if (!sendLora(LoraUp.payLoad, LoraUp.payLength)) {
- return(-3);
- }
- #endif
-
-
-
-
- #ifdef _TTNSERVER
- if (!sendUdp(ttnServer, _TTNPORT, buff_up, build_index)) {
- return(-1);
- }
- yield();
- #endif
-
- #ifdef _THINGSERVER
- if (!sendUdp(thingServer, _THINGPORT, buff_up, build_index)) {
- return(-2);
- }
- #endif
- #if _LOCALSERVER==1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int index=0;
- if ((index = inDecodes((char *)(LoraUp.payLoad+1))) >=0 ) {
- uint8_t DevAddr[4];
- DevAddr[0]= LoraUp.payLoad[4];
- DevAddr[1]= LoraUp.payLoad[3];
- DevAddr[2]= LoraUp.payLoad[2];
- DevAddr[3]= LoraUp.payLoad[1];
- uint16_t frameCount=LoraUp.payLoad[7]*256 + LoraUp.payLoad[6];
- #if DUSB>=1
- if (( debug>=1 ) && ( pdebug & P_RX )) {
- Serial.print(F("R receivePacket:: Ind="));
- Serial.print(index);
- Serial.print(F(", Len="));
- Serial.print(LoraUp.payLength);
- Serial.print(F(", A="));
- for (int i=0; i<4; i++) {
- if (DevAddr[i]<0x0F) Serial.print('0');
- Serial.print(DevAddr[i],HEX);
-
- }
-
- Serial.print(F(", Msg="));
- for (int i=0; (i<statr[0].datal) && (i<23); i++) {
- if (statr[0].data[i]<0x0F) Serial.print('0');
- Serial.print(statr[0].data[i],HEX);
- Serial.print(' ');
- }
- Serial.println();
- }
- #endif
- }
- #if DUSB>=1
- else if (( debug>=2 ) && ( pdebug & P_RX )) {
- Serial.println(F("receivePacket:: No Index"));
- }
- #endif
- #endif
-
- LoraUp.payLength = 0;
- LoraUp.payLoad[0] = 0x00;
- return(build_index);
- }
-
- return(0);
-
- }
|