
* [LoRaWAN] Major rework * [LoRaWAN] Some CI fixes, add retransmission timeout * [LoRaWAN] CI fixes * [LoRaWAN] Add missing initializers * [LoRaWAN] Return Rx window number, fix casing * [LoRaWAN] Un-static functions to fix overriding * [LoRaWAN] Integrate feedback, fix session save/restore * [LoRaWAN] Add const * [LoRaWAN] Do not accept invalid Rx2 datarate * [LoRaWAN] Integrate feedback * [LoRaWAN] Fix retransmission, ADR backoff, setDatarate; reject out-of-band frequencies * Update keywords.txt * [LoRaWAN] Fix initial datarate, misc cleanup * [LoRaWAN] Update examples * [LoRaWAN] Update README * [LoRaWAN] Reject oversized downlinks * [LoRaWAN] Remove VLAs * [LoRaWAN] CI fixes * [LoRaWAN] More CI * [LoRaWAN] Fix getMaxPayloadLen * [LoRaWAN] Rename some status codes * [CI] Skip LoRaWAN on XMega48 * [CI] Skip FW update for LR11x0 --------- Co-authored-by: jgromes <jan.gromes@gmail.com>
82 lines
2.6 KiB
C++
82 lines
2.6 KiB
C++
/*
|
|
RadioLib LoRaWAN Starter Example
|
|
|
|
! Please refer to the included notes to get started !
|
|
|
|
This example joins a LoRaWAN network and will send
|
|
uplink packets. Before you start, you will have to
|
|
register your device at https://www.thethingsnetwork.org/
|
|
After your device is registered, you can run this example.
|
|
The device will join the network and start uploading data.
|
|
|
|
Running this examples REQUIRES you to check "Resets DevNonces"
|
|
on your LoRaWAN dashboard. Refer to the network's
|
|
documentation on how to do this.
|
|
|
|
For default module settings, see the wiki page
|
|
https://github.com/jgromes/RadioLib/wiki/Default-configuration
|
|
|
|
For full API reference, see the GitHub Pages
|
|
https://jgromes.github.io/RadioLib/
|
|
|
|
For LoRaWAN details, see the wiki page
|
|
https://github.com/jgromes/RadioLib/wiki/LoRaWAN
|
|
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
while(!Serial);
|
|
delay(5000); // Give time to switch to the serial monitor
|
|
Serial.println(F("\nSetup ... "));
|
|
|
|
Serial.println(F("Initialise the radio"));
|
|
int16_t state = radio.begin();
|
|
debug(state != RADIOLIB_ERR_NONE, F("Initialise radio failed"), state, true);
|
|
|
|
// Setup the OTAA session information
|
|
state = node.beginOTAA(joinEUI, devEUI, nwkKey, appKey);
|
|
debug(state != RADIOLIB_ERR_NONE, F("Initialise node failed"), state, true);
|
|
|
|
Serial.println(F("Join ('login') the LoRaWAN Network"));
|
|
state = node.activateOTAA();
|
|
debug(state != RADIOLIB_LORAWAN_NEW_SESSION, F("Join failed"), state, true);
|
|
|
|
Serial.println(F("Ready!\n"));
|
|
}
|
|
|
|
void loop() {
|
|
Serial.println(F("Sending uplink"));
|
|
|
|
// This is the place to gather the sensor inputs
|
|
// Instead of reading any real sensor, we just generate some random numbers as example
|
|
uint8_t value1 = radio.random(100);
|
|
uint16_t value2 = radio.random(2000);
|
|
|
|
// Build payload byte array
|
|
uint8_t uplinkPayload[3];
|
|
uplinkPayload[0] = value1;
|
|
uplinkPayload[1] = highByte(value2); // See notes for high/lowByte functions
|
|
uplinkPayload[2] = lowByte(value2);
|
|
|
|
// Perform an uplink
|
|
int16_t state = node.sendReceive(uplinkPayload, sizeof(uplinkPayload));
|
|
debug(state < RADIOLIB_ERR_NONE, F("Error in sendReceive"), state, false);
|
|
|
|
// Check if a downlink was received
|
|
// (state 0 = no downlink, state 1/2 = downlink in window Rx1/Rx2)
|
|
if(state > 0) {
|
|
Serial.println(F("Received a downlink"));
|
|
} else {
|
|
Serial.println(F("No downlink received"));
|
|
}
|
|
|
|
Serial.print(F("Next uplink in "));
|
|
Serial.print(uplinkIntervalSeconds);
|
|
Serial.println(F(" seconds\n"));
|
|
|
|
// Wait until next uplink - observing legal & TTN FUP constraints
|
|
delay(uplinkIntervalSeconds * 1000UL); // delay needs milli-seconds
|
|
}
|