
* Updated for new initalisation / join sequence * Removed duplicate entry * Pragmatic / conservative disabling on unknown configs with potentially wrong defines - to be investigated at a later date --------- Co-authored-by: Nick McCloud <hiq.bitbucket@armoured.email>
73 lines
2.5 KiB
C++
73 lines
2.5 KiB
C++
/*
|
|
RadioLib LoRaWAN ABP Example
|
|
|
|
ABP = Activation by Personalisation, an alternative
|
|
to OTAA (Over the Air Activation). OTAA is preferable.
|
|
|
|
This example will send uplink packets to a LoRaWAN network.
|
|
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.
|
|
|
|
LoRaWAN v1.1 requires the use of persistent storage.
|
|
As this example does not use persistent storage, running this
|
|
examples REQUIRES you to check "Resets frame counters"
|
|
on your LoRaWAN dashboard. Refer to the notes or the
|
|
network's documentation on how to do this.
|
|
To comply with LoRaWAN v1.1's persistent storage, refer to
|
|
https://github.com/radiolib-org/radiolib-persistence
|
|
|
|
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 "configABP.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"));
|
|
int state = radio.begin();
|
|
debug(state != RADIOLIB_ERR_NONE, F("Initialise radio failed"), state, true);
|
|
|
|
Serial.println(F("Initialise LoRaWAN Network credentials"));
|
|
node.beginABP(devAddr, fNwkSIntKey, sNwkSIntKey, nwkSEncKey, appSKey);
|
|
|
|
node.activateABP();
|
|
debug(state != RADIOLIB_ERR_NONE, F("Activate ABP 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
|
|
int state = node.sendReceive(uplinkPayload, sizeof(uplinkPayload));
|
|
debug((state != RADIOLIB_LORAWAN_NO_DOWNLINK) && (state != RADIOLIB_ERR_NONE), F("Error in sendReceive"), state, false);
|
|
|
|
// Wait until next uplink - observing legal & TTN FUP constraints
|
|
delay(uplinkIntervalSeconds * 1000UL);
|
|
}
|