Vraag

LoRa join request

  • 11 April 2024
  • 12 reacties
  • 86 keer bekeken

Hoihoi,

 

Ik ben bezig met een project waarbij ik gebruik maak van KPN LoRa. Op dit moment heb ik hiervoor een freemium account. Vanuit een ESP32-bord met een LoRa module probeer ik verbinding te maken door middel van een join request.

Ik heb met een RF scanner gecontroleerd en waargenomen dat mijn hardware werkt en een signaal uitstuurt. Toch komt er niets binnen in het KPN things portaal.

Ik programmeer de ESP32 vanuit visual studio code met de ESP-IDF. Ik kan echter nergens precies vinden hoe ik vanuit mijn C-code dit joinrequest moet formatteren.

De ene bron zegt dat ik de APP_EUI en DEV_EUI nodig heb, een andere bron zegt dat ik ook een appKey nodig heb.. ik weet het zo gauw niet meer.

 

Onderstaande codesnippet illustreert mijn aanpak. In de hoofdfunctie worden wat stappen gezet voor het ontvangen van de join-accept, maar gezien ik nog niets zie gebeuren in mijn things portal, kan ik daar toch nog niet mee bezig.

 

Wat gaat hier fout?

 

edit: ik had al behoorlijk wat speurwerk gedaan, en veel dingen al geprobeerd. Ik gebruik SF12 en ik zou coverage moeten hebben volgens de map. DevEUI = 0059AC00001B2797

 

const uint8_t DEV_EUI[8] = { 0xXX, 0xXX, 0xXX 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
const uint8_t JOIN_EUI[8] =  { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
uint8_t join_request[JOIN_REQUEST_SIZE];
 
// Construct the Join Request message
memcpy(join_request, JOIN_EUI, 8); // Copy JOIN_EUI
memcpy(join_request + 8, DEV_EUI, 8); // Copy DEV_EUI
uint16_t dev_nonce = rand() % 65536;
join_request[16] = (dev_nonce >> 8) & 0xFF;
join_request[17] = dev_nonce & 0xFF;
join_request[18] = 0x01; // Set to 0x01 for LoRaWAN 1.1

 

Lora_send_packet(join_request, JOIN_REQUEST_SIZE)

 

int lora_send_packet(uint8_t *buf, int size) {
   // Idle mode before sending packet
   lora_idle();
   spi_write_reg(REG_FIFO_ADDR_PTR, 0);
 
   // Write packet data to FIFO
   for(int i = 0; i < size; i++)
      spi_write_reg(REG_FIFO, *buf++);
 
   // Set payload length
   spi_write_reg(REG_PAYLOAD_LENGTH, size);
 
   // Start transmission
   spi_write_reg(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_TX);
 
   // Wait for transmission to complete or timeout
   uint32_t start_time = time();
   while (!(spi_read_reg(REG_IRQ_FLAGS) & IRQ_TX_DONE_MASK)) {
      if ((time() - start_time) > TRANSMISSION_TIMEOUT_MS) {
            spi_write_reg(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY); // Put LoRa module back to standby mode
            return -1; // Transmission failed
      }
      //delay_ms(10); // Adjust delay according to your application's timing requirements
   }
 
   // Clear IRQ flags
   spi_write_reg(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK);
   return 1; // Transmission successful
}
 
 
 

12 reacties

Reputatie 7
Badge +6

Goedemorgen @Rosa

Welkom op het Zakelijk KPN Forum! 
We helpen je graag verder. Ik heb het Things Portal account opgezocht aan de hand van de info in jouw forumprofiel. Ik zie het device daar naar voren komen en het is goed gekoppeld. Het valt me wel op dat de flow waar het device aan gekoppeld is niet compleet is. Zo mist er een decoder en is er nog geen destination ingesteld. Hiervoor kun je de instructies op de Configure a flow pagina gebruiken. 

Hi Rick,

Allereerst, dank voor de reactie.

 

Er is inderdaad geen destination ingesteld, maar het lijkt mij dat dat niet uit zou moeten maken voor de join request. Het feit is dat de join request uberhaupt al niet binnenkomt, de data zelf, en waar dit uiteindelijk naartoe gaat is nog niet iets waar ik op dit moment mee bezig ben geweest.

 

Heb inmiddels de flow wel geconfigureerd maar dit verandert niets. Ik twijfel daarom nogsteeds aan het formaat van mijn join-request en ik kan het nergens vinden

Reputatie 7
Badge +6

Hey Rosa, 

Bedankt voor je toelichting! 
Ik ga dit intern verder uitzoeken en met de specialisten bespreken. Ik kom hier begin volgende week op terug. 

Voor nu wens ik je een heel fijn weekend! 

 

Wat ik inmiddels ook heb geprobeerd is het toevoegen van de appKey in het join-request. Wat ik vooral niet snap is dat ik online nergens kan vinden hoe dat join-request er precies uit moet zien. Een voorbeeld hiervan is al: DEV_EUI, doe ik die big endian of little endian? Tja.

 

   // Construct the Join Request message
   uint8_t join_request[JOIN_REQUEST_SIZE];
   memcpy(join_request, JOIN_EUI, 8); // Copy JOIN_EUI
   memcpy(join_request + 8, DEV_EUI, 8); // Copy DEV_EUI
   memcpy(join_request + 16, APPKEY, 16); // Copy APPKEY
   uint16_t dev_nonce = rand() % 65536;
   //join_request[32] = (dev_nonce >> 8) & 0xFF; // High byte of DevNonce
   //join_request[33] = dev_nonce & 0xFF; // Low byte of DevNonce
   join_request[32] = 0x00;
   join_request[33] = 0x01;

 

 

Ik heb dit in little endian en big endian formaat geprobeerd. De appKey wel of niet toegevoegd, de nonce random gegenereerd, en vervolgens gewoon op 0001 gezet. Ik zie het signaal langskomen op de RF scanner maar er verschijnt nog altijd niets in het dashboard.

 

Reputatie 7
Badge +6

Goedemiddag Rosa, 

Ik heb dit met de specialisten besproken en we hebben het ook aan onze kant getest. De DevEUI, AppEUI en AppKey zijn inderdaad nodig voor een Join. We zien bij jou een JoinEUI, maar dat herkennen we niet. 

In de Arduino IDE staan voorbeelden waarmee je ook LoRa connectiviteit kunt maken. Mijn collega geeft aan dat de manier van notatie in de code (Little Endian of Big Endian) van wezenlijk belang is. 

Hieronder een stukje code vanuit de Arduino IDE waarmee het bij mijn collega goed ging met diverse devices: 

Voor een Marvin device:
const String DevEUI = "xxxxxxxxxxxxxxxx";

const String AppEUI = " xxxxxxxxxxxxxxxx ";

const String AppKey = " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";


Of voor bijvoorbeeld een dragino:
// This EUI must be in little-endian format, so least-significant-byte

// first. When copying an EUI from ttnctl output, this means to reverse

// the bytes. For TTN issued EUIs the last bytes should be 0xD5, 0xB3,

// 0x70.

static const u1_t PROGMEM APPEUI[8]= { 0xAA, 0xAA, 0x0A, 0x00, 0x00, 0xBD, 0x60, 0x11 };

void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);}

 

// This should also be in little endian format, see above.

static const u1_t PROGMEM DEVEUI[8]= { 0xB4, 0x67, 0x28, 0x11, 0x11, 0xBD, 0x60, 0x11 };

void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);}

 

// This key should be in big endian format (or, since it is not really a

// number but a block of memory, endianness does not really apply). In

// practice, a key taken from ttnctl can be copied as-is.

static const u1_t PROGMEM APPKEY[16]= { 0xC0, 0x26, 0x14, 0x8G, 0xG3, 0x50, 0x6D, 0xC5, 0xFE, 0x7F, 0x1E, 0x20, 0x53, 0x6C, 0x0A, 0xF7 };

void os_getDevKey (u1_t* buf) {  memcpy_P(buf, APPKEY, 16);}

 

Hopelijk kom je hiermee verder. Tot slot ook nog een advies van mijn collega, gebruik Arduino met diverse kant en klare libraries als startpunt. 

Hey, ik heb inderdaad een dragino-device. De JOIN_EUI is de APP_EUI, ik was eerst bezig met het things netwerk en daar was/is de benaming anders.

 

Vanuit de arduino omgeving krijg ik het ook niet helemaal voor elkaar en de kant en klare libraries hebben zoveel dependencies dat het weer een dag werk is voordat dat aan de praat wil.

 

Mijn vraag is ook alleen maar, hoe ziet dat join request er uit, in welke volgorde moet alles, want ik maak wel een join request, dat laat ik zien in de code die ik heb meegestuurd, maar of dat formaat juist is heb ik geen idee van.

 

Het gaat daarbij om onderstaand stukje, een join request van 34 bytes groot met daarin onderstaande onderdelen. Die laatste is een devnonce, maar die mag nooit twee keer gelijk zijn van wat ik heb gevonden, dus voor een initieel joinrequest heb ik daar nu 0x0001 neergezet. Zou dit het juiste format moeten zijn, dit is het stuk dat ik nergens kan vinden.

   uint8_t join_request[JOIN_REQUEST_SIZE];
   memcpy(join_request, APP_EUI, 8); // Copy APP_EUI
   memcpy(join_request + 8, DEV_EUI, 8); // Copy DEV_EUI
   memcpy(join_request + 16, APPKEY, 16); // Copy APPKEY
   join_request[32] = 0x00;
   join_request[33] = 0x01;
Reputatie 7
Badge +6

Hey Rosa, 

Ik heb jouw reactie ook weer met de specialist gedeeld en ik kreeg onderstaand reactie hierop: 
 

Is het Dragino device wel geschikt voor de 868 Mhz band?

Ik heb er enige tijd geleden zelf ook 1 ontvangen die voor een andere frequentie bedoeld was(USA)
Staat aangevinkt als het goed is aan de achterkant. Tevens moeten de (eventuele)jumpers goed staan. 


Verder kan ik buiten de beschikbare informatie en de aanbevolen Arduino omgeving geen betere informatie dan dat daar beschikbaar is. delen. De devnonce waarover geschreven wordt heb ik nooit gebruikt en weet ik ook niet of dat nodig is om toe te passen. 

Indien de DEVEUI etc goed genoteerd zijn en als zodanig aan het device worden toegekend zou het moeten werken.

Dus voorbeeld DEVEUI:
memcpy(join_request + 8DEV_EUI8); // Copy DEV_EUI
dan zou DEV_EUI er volgens mij zo uit moeten zien: { 0xB4, 0x67, 0x28, 0x11, 0x11, 0xBD, 0x60, 0x11 }

 

Hi,

 

Ja hij is geschikt voor 868. Zoals eerder genoemd neem ik ook activiteit waar op het spectrum.

 

Waar ik inmiddels achter ben (denk ik) is dat ik de gehele data link laag moet implementeren, en dus niet alleen de appeui, deveui en devnonce, maar ook de message header en MIC.

 

Dit is voor nu iets waar ik wel aan kan rommelen, maar echt een antwoord heb ik nog niet

Reputatie 7
Badge +6

Goedemiddag Rosa, 

Dat klopt inderdaad. 
In Arduino is daar een library beschikbaar voor inzake LMIC die mijn collega heeft gebruikt. 
Ons advies is om toch Arduino eens te proberen met al zijn Example hierover.

https://www.arduino.cc/reference/en/libraries/mcci-lorawan-lmic-library/

Hi,

 

Inmiddels heb ik een package decoder gebruikt en klopt het format van het pakketje volgens deze decoder. Ik heb ook geverifieerd dat er een fysiek signaal wordt uitgestuurd. Toch komt er op het things portaal niets binnen, dus ook niet het join request zelf.

Het probleem is dus nadrukkelijk dat het join-request in het portaal niet binnenkomt. Niet dat deze niet wordt geaccepteerd oid.

Reputatie 7
Badge +6

Goedemiddag Rosa, 

Klopt het dat je het nu met een ander device bezig bent?

Wij zien een device in de Things Portal staan, maar dit is een device met een ander DevEUI (eindigend op 2842). Het device met DevEUI 0059AC00001B2797 zien we niet meer terug. 

En nog een aanvullende vraag, wat zijn de LMIC settings die je nu gebruikt?

 

Hi. Ik heb het apparaat verwijderd en weer opnieuw toegevoegd, andere codes, zelfde fysieke apparaat, nog altijd geen succes.

 

SF12
TX_POWER 14
BW: 125khz
Coding rate: (volgens mij) 4/5
Sync word: 0x35
Preamble length: 8

Ik hoor iets over frequentiekanalen, hij staat nu keihard op 868mhz, maar bijv. 868.1mhz lost ook niets op.

Reageer