A integração da TTN com a TagoIO é uma das diversas opções de integrações possíveis com a TagoIO e se você tem uma cobertura da TTN disponível, certamente vai querer testar essa integração.
A TTN no Brasil é muito fraca se comparado com as duas principais coberturas de LoRaWAN no Brasil que é a American Tower (Everynet) e a Helium network. Porém a TTN é ótima para quem é projetista ou estudante, pois como o uso é gratuito acaba ajudando muito essas duas grandes áreas.
Como fazer a integração TTN com a TagoIO?
Para fazer essa primeiramente vamos precisar ir para TagoIO e criar um novo dispositivo com o conector especifico para TTN. Caso você não siga esse passo e tente já usar um dispositivo anteriormente criado, não irá funcionar.
Para criar um dispositivo customizado para a TTN, basta ir em: Dispositivos, adicionar um novo dispositivo e selecionar o conector “Custom TTI / TTN” e pronto.

Ao selecionar a opção descrita na imagem acima, será necessário colocar o DevEUI do dispositivo. Agora vamos criar uma autorização na TagoIO para que a TTN consiga inserir dados na sua conta Tago, para isso precisamos ir no painel da sua aplicação da Tago e clicar em ‘devices‘ depois ‘authorization‘.

Em seguida irá aparecer um painel similar a esse, porém irá ter todas as autorizações geradas. Como você não irá ter nenhuma, será necessário criar. É bastante importante que não adicione absolutamente nada no item riscado abaixo, após concluído essa tarefa, copie a autorização que você acabou de criar.

Adicionando integração com a TagoIO na TTN
Agora basta copiar a autorização respectiva a autorização que acabou de ser criada e em seguida ir na TTN na secção de integrações, webhooks e selecionar a TagoIO.

Ao fazer isso, será exibido um outro painel onde será necessário colocar um nome para essa integração e também a autenticação da TagoIO que criamos anteriormente.

Pronto, ao fazer isso concluirmos a integração da TTN com a TagoIO e após finalizar esse processo a própria TTN vai fazer “ping” da integração para validar se de fato deu certo ou não, se der certo aparecerá um status dizendo “healthy / saudável“.
Criando um formatador na TTN para TagoIO
Como já virmos nos dois últimos posts sobre integrações para a TagoIO, a própria Tago já disponibiliza alguns exemplos de formatação de json para algumas aplicações, então devemos respeitar essas formatações para que possamos aproveitar ao máximo o dashboard, certo?
Existem dois métodos para adicionarmos formatadores na TTN: 1. Adicionar para a própria aplicação, porém isso é algo massivo e para testes isolados talvez não faça tanto sentido; 2. Adicionar para o dispositivo especifico, esse método particularmente acho mais interessantes para fins de testes e é o que vamos usar aqui.
Para adicionarmos um formatador ao dispositivo basta ir no dispositivo desejado e selecionar o tipo de formatador para “Custom JavaScript formatter” como na imagem abaixo:

Problemas de formatação na TTN para a TagoIO
Antes mesmo de já te mostrar qual é o código JavaScript usado para o mesmo exemplo que foi feito no post da Helium com a adaptação para a TTN, é preciso compreender o comportamento da própria TTN em relação a integração.
Em comparação com a Helium, o que enviamos é aquilo que recebemos do outro lado (na Tago), porém na TTN não é bem assim que funciona, e para comprovar isso vamos fazer um teste usando a mesma estrutura de formatação de json para o uso do maps da TagoIO.

Então se criamos uma formatação idêntica ao modelo de cima que no caso vai replicar exatamente o que foi feito na integração da Helium o que da um resultado igual a esse abaixo:

Porém se enviarmos o json dessa forma na TTN os resultados são completamente diferentes do que enviamos, o que o corre é uma desmembramento do que enviamos e até uma “correção”, veja só:

Estratégia de correção de formatação de Json na TTN
Com esse resultado acima podemos concluir que cada integração pode ter um resultado diferente uma da outra, mas com base nesse próprio resultado podemos criar uma modificação para ajustar os resultados ao ponto retornar a variável principal “device_location_location” para “device_location” por exemplo.
Como já sabemos que o nome do array de localização acaba indo parar no nome da variável, sendo também corrigido e incrementado com o nome “location”, então podemos adotar essa estratégia a seguir:

Usando essa formatação acima podemos concluir que o resultado terá como nome de variável “device_location” e o nome do array deixará de ser “device” e passará a ser “location”. Para verificarmos isso basta irmos no ‘live inspector” da TagoIO, veja só:

Agora sim o json ficou mais arrumado e como esperado que ficasse, e como agora você já sabe o motivo das modificações no formatador basta pegar o código abaixo e usar para o teste que será feito mais a frente.
function convertByteToString(hexString){
const byteArray = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16));
return String.fromCharCode(...byteArray);
}
function extractBytes(hexString, delimiter) {
const bytes = hexString.split(delimiter);
const beforeDelimiter = bytes[0];
const afterDelimiter = bytes.slice(1).join(delimiter);
return [beforeDelimiter, afterDelimiter];
}
function decodeUplink(input) {
const a = input.bytes;
const b = a.map(byte => byte.toString(16).padStart(2, '0')).join('');
const extractedBytes = extractBytes(b, '3b');
return {
data:{
device: {
lat: parseFloat(convertByteToString(extractedBytes[0])),
lng: parseFloat(convertByteToString(extractedBytes[1]))
}
}
};
}
Podemos usar duas integrações diferentes para o mesmo dispositivo na TagoIO?
Sim podemos, e vou te explicar como fazer isso. Já foi mencionado anteriormente que a TTN tem uma cobertura muito baixa no Brasil, mas é ideal para estudo da tecnologia LoRaWAN justamente por ser gratuita, então é comum que hora ou outra a gente acaba usando mais outro LNS para aplicações profissionais, porém como vamos integrar nossos dispositivos de LNS diferentes na TagoIO?
A resposta é bastante simples, basta criamos o mesmo dispositivo porém para conectores diferentes na TagoIO. Pode parecer meio confuso isso, mas vou explicar melhor, particularmente uso tanto a TTN como também a Helium e em todos tutoriais relacionados a LoRaWAN uso os mesmos módulos LoRaWAN.
Então para esse tutorial por exemplo, já havia um dispositivo para Helium (eui-0012f80000001e62), porém também usei ele neste tutorial e a única operação feita foi adicionar outro dispositivo para TTN que tivesse o mesmo endereço ficando dessa forma:

O ruim desse método é que você terá que tratar como se fosse um dispositivo diferente mesmo embora seja o mesmo embora fisicamente seja um só.
Criando uma simulação de rastreamento no End device
Para comprovar se de fato tudo se comunica de forma adequada, vamos criar uma simulação de rastreamento com LoRaWAN usando o módulo da Radioenge, um ESP32 e um gateway LoRaWAN da Radioenge que está apontando para a TTN.
Circuito para teste
Para testes vamos usar literalmente um ESP32 e um módulo LoRaWAN da Radioenge que é um hardware amplamente usado aqui, mas você pode repetir esse mesmo processo com qualquer outro hardware que funcionará da mesma forma:

- ESP32: Aliexpress;
- Módulo LoRaWAN Radioenge: Mercado Livre / Amazon.
Código de simulação
O código não tem nada complexo, nada além do que já foi mostrado em outros posts. De qualquer forma, por mais que seja uma simulação bastante simples você poderá modificar o código e adicionar um GPS e montar um rastreador LoRaWAN.
#include "LoRaWAN_Radioenge.h"
LoRaWAN_Radioenge LoRa(&Serial2);
void setup() {
Serial.begin(9600);
Serial2.begin(9600);
LoRa.begin(true);
LoRa.AJOIN(false);
LoRa.printParameters();
if(LoRa.JoinNetwork(OTAA, TTN, true, false))
LoRa.SendString("-25.613268;-46.742196", 1);
LoRa.pinMode(2, OUTPUT);
}
void loop() {
LoRa.SendString("-24.613368;-45.722196", 1);
delay(5000);
LoRa.SendString("-23.613128;-44.752115", 1);
delay(5000);
LoRa.SendString("-23.613020;-43.782110", 1);
delay(5000);
LoRa.SendString("-21.613240;-42.742120", 1);
delay(5000);
}
Funcionamento da integração da TTN e TagoIO
No vídeo a seguir é possível notar algumas diferença se comparado com o da Helium, o “value” exibe os valores de “lat” e “lng”, e não uma legenda como do teste da Helium. De qualquer forma ainda assim funciona.
