Sending "unconfirmed data up" with LoraWAN

Hi,

How can I send unconfirmed message with LoRaWAN? The following MKRWAN.h library example code sends "confirmed data up".

/*
  Lora Send And Receive
  This sketch demonstrates how to send and receive data with the MKR WAN 1300/1310 LoRa module.
  This example code is in the public domain.
*/

#include <MKRWAN.h>

LoRaModem modem;

// Uncomment if using the Murata chip as a module
// LoRaModem modem(Serial1);

#include "arduino_secrets.h"
// Please enter your sensitive data in the Secret tab or arduino_secrets.h
String appEui = SECRET_APP_EUI;
String appKey = SECRET_APP_KEY;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  while (!Serial);
  // change this to your regional band (eg. US915, AS923, ...)
  if (!modem.begin(EU868)) {
    Serial.println("Failed to start module");
    while (1) {}
  };
  Serial.print("Your module version is: ");
  Serial.println(modem.version());
  Serial.print("Your device EUI is: ");
  Serial.println(modem.deviceEUI());

  int connected = modem.joinOTAA(appEui, appKey);
  if (!connected) {
    Serial.println("Something went wrong; are you indoor? Move near a window and retry");
    while (1) {}
  }

  // Set poll interval to 60 secs.
  modem.minPollInterval(60);
  // NOTE: independent of this setting, the modem will
  // not allow sending more than one message every 2 minutes,
  // this is enforced by firmware and can not be changed.
}

void loop() {
  Serial.println();
  Serial.println("Enter a message to send to network");
  Serial.println("(make sure that end-of-line 'NL' is enabled)");

  while (!Serial.available());
  String msg = Serial.readStringUntil('\n');

  Serial.println();
  Serial.print("Sending: " + msg + " - ");
  for (unsigned int i = 0; i < msg.length(); i++) {
    Serial.print(msg[i] >> 4, HEX);
    Serial.print(msg[i] & 0xF, HEX);
    Serial.print(" ");
  }
  Serial.println();

  int err;
  modem.beginPacket();
  modem.print(msg);
  err = modem.endPacket(true);
  if (err > 0) {
    Serial.println("Message sent correctly!");
  } else {
    Serial.println("Error sending message :(");
    Serial.println("(you may send a limited amount of messages per minute, depending on the signal strength");
    Serial.println("it may vary from 1 message every couple of seconds to 1 message every minute)");
  }
  delay(1000);
  if (!modem.available()) {
    Serial.println("No downlink message received at this time.");
    return;
  }
  char rcv[64];
  int i = 0;
  while (modem.available()) {
    rcv[i++] = (char)modem.read();
  }
  Serial.print("Received: ");
  for (unsigned int j = 0; j < i; j++) {
    Serial.print(rcv[j] >> 4, HEX);
    Serial.print(rcv[j] & 0xF, HEX);
    Serial.print(" ");
  }
  Serial.println();
}

Thanks,
Tipo

I think the true you pass there means you want confirmation. May be you could try with false

  err = modem.endPacket(fasle); // no ack

or try flase.... Joking!

Hmmm .... there is no documentation of any parameter to endPacket():

And yet the example there does use it - without explanation!

I guess you'd just have to delve into the source code to find out ...

:roll_eyes:

yeah, another example of poor documentation

the source code is available (I think that's the one)

Thanks for finding that.

In the "Arduino LoRa Library" (mention in "The Arduino Guide To LoRa"), endPacket() also takes a bool parameter, but uses it to select whether the call is asynchronous or not.

At least that one is documented:

synchronous probably means you await for the ACK

It says synchronous as in non- blocking...

EDIT

Corrected - see post #9

they say

so it's asynchronous if you don't wait, ie if the async parameter is true

➜ synchronous is blocking

Indeed - my mistake!

I tested with my LoRaWAN board err = modem.endPacket(false); and indeed it sends "unconfirmed data up". Thanks!

here you go :slight_smile:

have fun