Teste de modems de rádio LoRa / LoRaWAN RN2483. Parte 2, LoRaWAN

A parte anterior descreveu como conectar os modems RN2483 no modo LoRa. Agora vamos para a próxima parte mais complexa - conectando-se à rede LoRaWAN.

O que é o LoRaWAN?



LoRaWAN é uma rede "condicionalmente global" que consiste em dispositivos finais (nós) que enviam dados para hubs (gateway). Cada hub tem acesso à Internet e envia os dados recebidos para um servidor, que por sua vez os envia para clientes assinados. A rede, por um lado, é "global", porque os dados podem ser recebidos por qualquer gateway próximo; por outro lado, são "condicionalmente globais", porque não funcionará sem a Internet / intranet (embora ninguém se preocupe em ter seu próprio gateway e servidor dentro da organização).

O modem RN2483 será usado como o "nó", um serviço gratuito será usado para conectar . Continua sob o corte.

A Rede de Coisas


O serviço www.thethingsnetwork.org é uma comunidade aberta, cujos usuários podem criar, registrar dispositivos e hubs, experimentar como tudo funciona, etc. Como se costuma dizer, de graça e sem SMS. Vamos usá-lo para testes.

Qualquer pessoa pode registrar um nó e um gateway na rede. A rede Things é totalmente gratuita, muitos entusiastas compram equipamentos às suas próprias custas.
O mapa de cobertura no momento da redação deste artigo é o seguinte:



Como você pode ver, o segmento de cobertura em russo deixa muito a desejar, mas ainda é. Existe um lado positivo nisso - em Londres ou Amsterdã, você não surpreenderá ninguém com um novo concentrador, mas na Rússia - há uma chance de ser o primeiro.

Conecte RN2483 ao LoRaWAN


Diferente de uma conexão p2p simples, tudo é muito mais complicado no LoRaWAN - os dispositivos são registrados na rede, o tráfego é criptografado com várias chaves e assim por diante. Porque a rede é pública e pública, os problemas de proteção de dados são muito relevantes aqui.

Existem 2 tipos de autenticação na rede LoRaWAN:

- Autenticação “over the air” ( OTAA , Ativação Over the Air). Os dispositivos são registrados na rede e recebem a chave necessária para a operação.
- Ativação de ABP (Ativação por Personalização). As configurações são pré-registradas no dispositivo, autenticação adicional não é necessária. Esse modo é mais simples, mas também há um sinal de menos - os dados são simplesmente enviados ao ar, não há garantia de que foram recebidos pelo hub.

É importante: Muitos hubs de canal único baratos suportam apenas o modo ABP; portanto, o primeiro método pode não funcionar.

1. Registro de dispositivos - OTAA


O primeiro passo é ir para staging.thethingsnetwork.org e registrar um "aplicativo". Eu chamei isso de Raspberry Pi Home. Ao registrar o aplicativo, o usuário recebe a primeira chave, que é útil no futuro.



Em seguida, vemos a guia Dispositivos, onde você pode adicionar nosso modem (pode haver vários). Clique em "registrar dispositivo" e selecione o modo OTAA. Uma janela é exibida na qual você precisa digitar o identificador do dispositivo.


Esse identificador pode ser obtido enviando o comando sys get hweui ao modem. Este registro é concluído, conforme prometido, gratuitamente e sem SMS.

Ao abrir os parâmetros do dispositivo, você pode ver todas as chaves; elas devem estar registradas no programa.



Para simplificar o código, usei a biblioteca python-loranode , o código fonte para o envio de dados é fornecido abaixo. Como você pode ver, no código existem 3 linhas appkey, appeui e deveui, que são usadas para autenticação.

Código fonte
from loranode import RN2483Controller
from commands import *
import time

# LoRaController OTAA based join and message test
if __name__ == "__main__":
    set_debug_level(Level.DEBUG)
    
    port = "COM3"
    appkey = "58FF3007CAED02xxxxxxxxxxxxxxxxxxxx"
    appeui = "70B3D57Exxxxxxxxxxxxxx"
    deveui = "0004A30xxxxxxxxxxx"

    # Test controller
    lc = RN2483Controller(port)
    if lc.test():
        printd("[+] Connected to LoRa RN2483 device", Level.INFO)
        lc.serial_sr(CMD_GET_VERSION)
        lc.serial_sr(CMD_GET_HWEUI)
        lc.get_freq()
    else:
        printd(clr(Color.YELLOW, "[-] Failed to get version from LoRa device"), Level.WARNING)

    lc.set_pwr(15)
    lc.set_adr(False)
    lc.serial_sr(CMD_SET_SF, "sf7") # sf12, sf7

    # Join and send a message
    if lc.join_otaa(appkey, appeui, deveui):
        printd("[+] Connected to gateway", Level.INFO)
        
        # Data-1
        printd("[+] Sending packet #1", Level.INFO)
        timeStr = time.strftime("%H%M", time.gmtime())
        if lc.send(timeStr, ack=False):
            printd(clr(Color.GREEN, "[+] Send-1 succeeded"), Level.CRITICAL)
        else:
            printd(clr(Color.RED, "[+] Send-1 failed"), Level.CRITICAL)
        time.sleep(15)

        # Data-2
        printd("[+] Sending packet #2", Level.INFO)
        timeStr = time.strftime("%H%M", time.gmtime())
        if lc.send(timeStr, ack=False):
          printd(clr(Color.GREEN, "[+] Send-2 succeeded"), Level.CRITICAL)
        else:
          printd(clr(Color.RED, "[+] Send-2 failed"), Level.CRITICAL)
        time.sleep(15)

        del lc
        exit()

    del lc
    printd(clr(Color.RED, "[-] Test failed"), Level.CRITICAL)


Neste exemplo, pacotes contendo o horário atual (hhmm) são enviados ao servidor. Isso é conveniente para controlar qual pacote foi recebido.

2. Registro de Dispositivo - ABP


Tudo é mais simples aqui - registramos o dispositivo como ABP e obtemos várias chaves que precisam ser registradas no programa.



O modem envia dados "como estão", não há garantia de que a autenticação tenha sido bem-sucedida, não.

Para enviar dados, você deve inserir as chaves nwkskey, appskey, devaddr no código. O código fonte é fornecido abaixo.

Código fonte
from loranode import RN2483Controller
import platform
from commands import *
import time

# LoRaController ABP based join and ACK test
if __name__ == "__main__":
    set_debug_level(Level.DEBUG)

    port = "COM3"
    nwkskey = "58AA52E96035Axxxxxxxxxxxxxxxxxxxx"
    appskey = "381B1C9206E9BE9xxxxxxxxxxxxxxxxxxx"
    devaddr = "B639xxxx"
    
    lc = None
    
    try:
      # Test controller
      lc = RN2483Controller(port)
      if lc.test():
        printd("[+] Connected to LoRa RN2483 device", Level.INFO)

        lc.serial_sr(CMD_GET_VERSION)
        lc.serial_sr(CMD_GET_HWEUI)
        lc.get_freq()
      else:
        printd(clr(Color.YELLOW, "[-] Failed to get version from LoRa device"), Level.WARNING)

    except Exception, e:
      print "Error: " + str(e)

    if lc is None:
      printd(Color.YELLOW, "Error: cannot connect to device")
      exit()

    lc.set_adr(False)
    lc.set_pwr(15)
    lc.serial_sr(CMD_MAC_PAUSE)
    lc.serial_sr(CMD_SET_SF, "sf12") # sf12, sf7
    lc.serial_sr(CMD_MAC_RESUME)

    # Join and send a message
    if lc.join_abp(nwkskey, appskey, devaddr):
        printd("[+] Connected to gateway", Level.INFO)
        
        # Data-1
        printd("[+] Sending packet #1", Level.INFO)
        timeStr = time.strftime("%H%M", time.gmtime())
        if lc.send(timeStr, ack=False):
          printd(clr(Color.GREEN, "[+] Send-1 succeeded"), Level.CRITICAL)
        else:
          printd(clr(Color.RED, "[+] Send-1 failed"), Level.CRITICAL)
        time.sleep(15)

        # Data-2
        printd("[+] Sending packet #2", Level.INFO)
        timeStr = time.strftime("%H%M", time.gmtime())
        if lc.send(timeStr, ack=False):
          printd(clr(Color.GREEN, "[+] Send-2 succeeded"), Level.CRITICAL)
        else:
          printd(clr(Color.RED, "[+] Send-2 failed"), Level.CRITICAL)
        time.sleep(15)

        del lc
        exit()

    printd(clr(Color.RED, "[-] Test failed"), Level.CRITICAL)
    del lc


Teste


O último passo, resta uma coisa - levar um laptop (ou Arduino ou Raspberry Pi) com um modem e ir (ir, voar) até o local onde está localizada a área de cobertura do gateway mais próximo. Cheguei à área de cobertura mais próxima por cerca de meia hora de bonde, para que o processo não seja tão longo e caro.

No caso de uma recepção de dados bem-sucedida, os pacotes serão exibidos no servidor.



O servidor em si não faz nada com os dados; você pode configurar seu próprio código no servidor para processar os dados recebidos. Este exemplo é apenas um teste, nada é feito com os dados; em um aplicativo real, eles podem ser adicionados ao banco de dados, enviar notificações, etc., tudo depende da tarefa.

Por que isso é necessário?


Idealmente, a rede LoRaWAN fornece ao usuário um serviço de transferência de dados pronto que funciona imediatamente.Você só precisa conectar o dispositivo e os dados serão enviados e processados ​​pelo hub mais próximo (é claro, se o usuário estiver na área de cobertura da rede). O escopo de aplicação é bastante amplo, desde sensores até a abertura da porta, temperatura ou nível da água no país, até um sinal de GPS em um animal ou modelo de avião.

Vários vídeos (em inglês).

Introdução da Aliança LoRa:



Introdução à Rede Things:


No entanto, se falarmos da The Things Network, esse é um serviço "amador", é claro que não garante uma conexão permanente. Se existem fornecedores comerciais LoRaWAN, eu ainda não sei.

E se não houver cobertura?


Uma pergunta razoável pode surgir - o que fazer se alguns dias de trem ou algumas horas de avião até o portão mais próximo? Isso tem sua própria vantagem - você pode ser o primeiro. Você pode criar seu próprio gateway e registrá-lo no servidor The Things Network, o preço da emissão varia de acordo com a funcionalidade - de> 1000EUR para hubs multicanais "proprietários", até US $ 15 para dispositivos caseiros baseados em SX1276 e Raspberry Pi. uma tabela comparativa de diferentes roteadores, aqueles que desejam podem estudá-lo com mais detalhes.

A última opção será considerada na próxima parte.

Source: https://habr.com/ru/post/pt398247/


All Articles