Conaxão LoRaWAN + Shield Arduino com TTN autenticação ABP

Olá,

Temos módulos LoRaWAN + Shields Arduino da Radioenge.

A Radioenge postou no GitHub um script para conexão OTAA para TTN.

Esse script foi adaptado e a conexão OTAA funcionou corretamente.

Num segundo momento foi adaptado para ABP, mas não houve sucesso na conexão.

Segue abaixo o script para análise e sugestão de melhoria, por parte da Radioenge.

Tentamos postar uma dúvida no Fórum da Radioenge mas o site não estava funcionando.

=====================================================================

/* Includes */

#include <LoRaWAN.h>
#include <SoftwareSerial.h>
#include <stdint.h>

/* SoftwareSerial handles */

SoftwareSerial* hSerialCommands = NULL;

/* Variables */

char str_counter[128];
int counter = 0;

/* Setup */

void setup()
{
Serial.begin(9600);
delay(1000);
Serial.println(“Initializing…”);

/* Initialize SoftwareSerial */
hSerialCommands = SerialCommandsInit(7, 6, 9600);

Serial.println(“Reset…”);
SendRaw(“ATZ\r\n”);
delay(5000);

Serial.println(“Configurando ABP no device 8214…”);
SendRaw(“AT+NJM=0\r\n”);
delay(1000);

Serial.println(“Configurando DADDR…”);
SendRaw(“AT+DADDR=26:01:1B:72\r\n”);
delay(1000);

/* Configurando EndDevice como ABP */

Serial.println(“Sending Nwk Key…”);
SendRaw(“AT+NWKSKEY=76:4B:39:A8:E7:46:85:94:23:62:B1:AF:4A:9E:34:FA”);
delay(1000);

Serial.println(“Sending App Key…”);
SendRaw(“AT+APPSKEY=EF:81:C2:93:54:65:36:27:58:29:B0:8E:5F:73:0F:28”);
delay(1000);

Serial.println(“Sending Channel Mask…”);
SendRaw(“AT+CHMASK=FF00:0000:0000:0000:0001:0000”); // TTN
delay(1000);

Serial.println(“Sending JOIN…”);
SendRaw(“AT+JOIN”);
delay(1000);

Serial.println(“Aguardando 30 segundos apos JOIN…”);
delay(30000);
}

/* Loop ---------------------- */

void loop()
{
sprintf(str_counter, “AT+TXCFM=83:1:3:{“Contador”:“contador”,“value”:%d} \r\n\0”, counter++);
SendRaw(str_counter);
Serial.println(str_counter);
Serial.println(“Aguardando 60 segundos apara proximo envio…”);
delay(60000);
}

=====================================================================

Atenciosamente.

O modo de autenticação ABP não precisa de join, ou seja, se as chaves baterem todo o tráfego deveria chegar no NetworkServer . Então, se o NetworServer não recebeu nada pode ser por um erro no cadastro. Verifique se o DevADDR, DevEUI, AppEUI, NSKey e App SKey do EndDevice batem com o configurado no NS. Também é necessário verificar a máscara de canais se é a mesma utilizada pelo gateway.

Olá!

Apaguei do código as linhas:

Serial.println(“Sending JOIN…”);
SendRaw(“AT+JOIN”);
buzzer(500, 4);
delay(1000);

Serial.println(“Aguardando 30 segundos apos JOIN…”);
delay(30000);

Verifiquei as chaves Device Address, Network Session Key e App Session Key.
Funcionou bem.
Detalhe: com autenticação OTAA observei que havia perda de pacotes e no ABP não há perda.
Minha referência é a variável “counter” que incrementada no “loop” e todos pacotes chegam na TTN com ABP.
Com OTAA perdiam-se 80% dos pacotes.

Grato pelo suporte.

Olá, fui testar o código, removi as linhas indicadas porém me deparei com esse erro:

na linha sprintf(str_counter, “AT+TXCFM=83:1:3:{“Contador”:“contador”,“value”:%d} \r\n\0”, counter++);

Radioenge-ABP-2:59:49: error: inconsistent user-defined literal suffixes 'Contador' and 'contador' in string literal
 sprintf(str_counter, "AT+TXCFM=83:1:3:{"Contador":"contador","value":%d} \r\n\0", counter++);
                                                 ^~~~~
Radioenge-ABP-2:59:68: error: unable to find string literal operator 'operator""Contador' with 'const char [28]', 'unsigned int' arguments
 sprintf(str_counter, "AT+TXCFM=83:1:3:{"Contador":"contador","value":%d} \r\n\0", counter++);
                                                                    ^~~~~
exit status 1
inconsistent user-defined literal suffixes 'Contador' and 'contador' in string literal

Alguém pode me dizer qual erro do código?

A string:
“AT+TXCFM=83:1:3:{“Contador”:“contador”,“value”:%d} \r\n\0”

Deveria ter o cacacter \ antes das aspas duplas que ficam no meio da string.

Essa página distorce o código quando é salvo e postado para comunidade.

Observe também ao importar se as aspas duplas estão corretas, ou seja, todas as aspas deve ser verticais e não inclinadas.

1 Curtida