Pacote de keep-Alive EndDevice LoRaWAN

Pacote de keep-Alive LoRaMESH EndDevice LoRaWAN

O que é: É um uplink gerado pelo módulo EndDevice LoRaWAN em intervalos regulares.

Para que serve: A primeira função é mostrar para a aplicação que o módulo está funcionando normalmente. A segunda é enviar medidas das GPIOs analógicas (valor de tensão) e os estados das GPIOs digitais (nível alto ou baixo).

Como configurar: enviar na serial de do módulo ou via downlink o comando

AT+KEEPALIVE=L:PPP:C:TTTTTTT

Onde:

L = 1 byte 0 ou 1; 1 para Ligado; 0 para desligado

PPP = Port do protocolo LoRaWAN que o pacote utilizará. Valores permitidos de 0 a 255 com as restrições do protocolo LoRaWAN. Vide https://lora-alliance.org/resource-hub/lorawanr-specification-v101

C: pacote confirmado ou não confirmado; 1 para confirmado; 0 para não confirmado.

Obs.: Cuidado com pacotes confirmados! A confirmação enviada pelo Gateway é um downlink e os downlinks ocupam o gateway (“desligam” a recepção enquanto ocorre a transmissão) e são tarifados de forma diferenciada.

TTTTTTT: intervalo de envio do keep alive em ms. Por exemplo: 3600000 = 1 hora

Exemplo: AT+KEEPALIVE=1:85:0:3600000 = ativa o keep alive, na porta 85, sem confirmação e a cada 1 hora.

Tratamento do pacote de keep-alive recebido:

image

São ao todo 16 Bytes (0 ao 15):
image
Byte 0: Nível de bateria

Tratamento para chegar no valor em volts: =((1,8/255)*valor)+1,8

Exemplo: =((1,8/255)*192)+1,8 = 3,15Volts

Byte 1: Reservado para uso futuro

Byte 2: Fixo em 0xFF (Decimal 225) para indicar que se trata de um pacote de Keep-Alive

Byte 3: Estado dos pinos configurados como entrada digital (MSB) … dos GPIOs 9 e 8.

Os oito bits deste byte devem ser interpretados individualmente. Cada bit significa o estado de um GPIO.

Exemplo : valor 0x03 ou 3 decimal = 00000011 binário significa que os GPIOs 9 e 8 estão com nível alto em suas entradas.

image

Byte 4: Estado dos pinos configurados como entrada digital (LSB) … dos GPIOs 7 a 0.

image

Byte 5 e 6: Valor de tensão na entrada analógica do AD 0 ou GPIO 00.

Tratamento:

[Valor de referência do AD (3,3volts)/precisão do AD (12 bits) ]*[(byte MSB * 256) +(byte LSB)]

=(3,3/4092)*(byte 5 * 256+byte 6)

Exemplo:

Byte 5 = 0x05 = 5 decimal (MSB)

Byte 6 = 0x9D = 157 decilma (LSB)

=(3,3/4092)*(5 * 256+157) = 1,42 volts

Byte 7 e 8: Valor de tensão na entrada analógica do AD 1 ou GPIO 01.

Mesmo tratamento feito para os bytes 5 e 6.

Byte 9 e 10: Valor de tensão na entrada analógica do AD 2 ou GPIO 07.

Mesmo tratamento feito para os bytes 5 e 6.

Byte 11 e 12: Valor de tensão na entrada analógica do AD 3 ou GPIO 08.

Mesmo tratamento feito para os bytes 5 e 6.

Byte 13: SNR Relação sinal ruído do último pacote que o EndDevice recebeu (se nunca recebeu um pacote de downlink ou foi reinicializado recentemente o campo informará 0)

Simplesmente o valor do SNR. Exemplo: 0x013 = 27 que significa 27dB. O sinal de recepção de downlink foi 27dB mais forte que o ruído no receptor do EndDevice.

Byte 14 e 15 : RSSI do último pacote de downlink recebido. RSSI é a intensidade de sinal recebido ou simplesmente nível de RX. Este é um valor negativo em dBm! Terá que ser tratado como signed (o primeiro bit da word formada pelos dois bytes será 1 por ser negativo).

Tratamento :

=(Byte 14 (MSB) * 256 + Byte15) – 65535

Exemplo:

byte 14 = 0xFF; 255 decimal

byte 15 = 0xD2; 210 decimal

225*256 + 210 – 65535 = -45 dBm

Python para conectar na TTN via MQTT, abrir e mostrar o pacote de keepAlive do módulo LoRaWAN Radioenge:

Segue uma sugestão de configuração do Payload Formatter para a TTN v3.

function decodeUplink(input) {

  var warnings = [];
  var data = {};
  if (input.bytes[2] == 'FF'){
    warnings.push("Pacote de Keep-Alive");
  }
  //data._bytes = input.bytes;
  data.battery = (input.bytes[0]);
  data.gpio9_8 = input.bytes[3].toString(2);
  data.gpio7_0 = input.bytes[4].toString(2);
  //data.adc_0a = (3.3/4095) * (input.bytes[5] * 256 + input.bytes[6]);
  data.adc_0 = (input.bytes[5] * 256 + input.bytes[6]);  //[0...4095]
  data.adc_1 = (input.bytes[7] * 256 + input.bytes[8]);
  data.adc_2 = (input.bytes[9] * 256 + input.bytes[10]);
  data.adc_3 = (input.bytes[11] * 256 + input.bytes[12]);
  data.snr = input.bytes[13];
  data.rssi = (((input.bytes[14] & 0x80 ? input.bytes[14] - 0x100 : input.bytes[14]) << 8) + input.bytes[15]);
  
  return {
    data: data,
    warnings: [],
    errors: []
  };
}

Fábio esse intervalo do Keep Alive são no máximo 7 algarismos (TTTTTTT)? Quero entender qual o maior valor que posso configurar. Obrigado

1 Curtida

O limite não está exatamente no número de algarismos e sim internamente no armazenamento da informação que é de um “unsigned long” ( Máximo de 32its (4bytes) = 4294967295).

1 Curtida