测试LoRa / LoRaWAN RN2483无线电调制解调器。第2部分,LoRaWAN

上一部分描述了如何在LoRa模式下连接RN2483调制解调器。现在,让我们继续下一个更复杂的部分-连接到LoRaWAN网络。

什么是LoRaWAN?



LoRaWAN是一个“有条件的全局”网络,由将数据发送到集线器(网关)的终端设备(节点)组成。每个集线器都可以访问Internet,并将接收到的数据发送到服务器,服务器再将它们发送给已签名的客户。一方面,网络是“全球的”,因为 数据可以由附近的任何网关接收,另一方面,它是“有条件的全局”数据,因为 没有Internet / Intranet,它就无法工作(尽管没有人愿意在组织内部拥有自己的网关和服务器)。

RN2483调制解调器将用作“节点”,免费服务将用于连接继续下割。

物联网


www.thethingsnetwork.org 服务是一个开放社区,用户可以创建,注册设备和集线器,尝试其所有工作方式等。正如他们所说,免费且没有短信。我们将使用它进行测试。

任何人都可以在网络上注册节点和网关。物联网完全免费,许多发烧友自费购买设备。
在撰写本文时,覆盖率地图如下:



如您所见,俄语覆盖率段尚有许多不足之处,但仍然是。这样做有积极的一面-在伦敦或阿姆斯特丹,任何配备新选矿厂的人都不会感到惊讶,但在俄罗斯-很有可能成为第一家。

将RN2483连接到LoRaWAN


与简单的p2p连接不同,LoRaWAN中的一切都更加复杂-设备已在网络上注册,使用各种密钥对流量进行加密等等。因为由于网络是公共的,因此此处的数据保护问题非常重要。

LoRaWAN网络中有两种身份验证类型:

-“空中”身份验证(OTAA,空中激活)。设备在网络上注册并接收操作所需的密钥。
-激活ABP(通过个性化激活)。设置已在设备中预注册,不需要其他身份验证。此模式较为简单,但有一个缺点-数据只是简单地发送到空中,不能保证集线器已接收到它。

重要注意:许多廉价的单通道集线器仅支持ABP模式,因此第一种方法可能不起作用。

1.设备注册-OTAA


第一步是转到staging.thethingsnetwork.org并注册一个“应用程序”。我称它为Raspberry Pi Home。在注册应用程序时,用户会收到第一个密钥,这在将来很有用。



接下来,我们看到“设备”选项卡,您可以在其中添加我们的调制解调器(可能有几个)。单击“注册设备”,然后选择OTAA模式。出现一个窗口,您需要在其中输入设备的标识符。


可以通过将sys get hweui命令发送到调制解调器来获取此标识符。如预期的那样,此注册是免费的,没有SMS。

通过打开设备的参数,您可以看到所有键;它们必须在程序中注册。



为了简化代码,我使用了python-loranode库,下面给出了发送数据的源代码。如您所见,在代码中有3行appkey,appeui和de​​veui,它们用于身份验证。

源代码
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)


在此示例中,包含当前时间(hhmm)的数据包被发送到服务器。这对于控制接收哪个数据包很方便。

2.设备注册-ABP


这里的一切都比较简单-我们将设备注册为ABP,然后我们获得了一些需要在程序中注册的密钥。



调制解调器按“原样”发送数据,不能保证身份验证成功。

要发送数据,必须在代码中插入nwkskey,appskey,devaddr键。源代码如下。

源代码
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


测试中


最后,剩下的一件事是-带上一台带调制解调器的笔记本电脑(或Arduino或Raspberry Pi),然后走(飞)到最近网关覆盖区域所在的地方。我坐电车到最近的覆盖区大约半个小时,所以这个过程并不那么漫长和昂贵。

如果成功接收到数据,数据包将显示在服务器上。



服务器本身对数据不做任何事情;您可以在服务器上配置自己的代码以处理接收到的数据。这个例子只是一个测试,没有对数据做任何事情,在实际的应用程序中,它们可以添加到数据库,发送通知等,这完全取决于任务。

为什么这是必要的?


理想情况下,LoRaWAN网络可为用户提供现成的现成的数据传输服务,您只需连接设备,数据就会由最近的集线器发送和处理(当然,如果用户在网络覆盖范围内)。应用范围非常广泛,从传感器到开门的传感器,温度或水位,再到动物或飞机模型上的GPS信标。

几个视频(英语)。

LoRa联盟介绍:



物联网介绍:


但是,如果我们谈论的是物联网,那么这是一项“业余”服务,当然不能保证永久的连接。是否有商业提供商LoRaWAN,我仍然不知道。

如果没有保险怎么办?


可能会出现一个合理的问题-如果乘火车几天或乘飞机几个小时到最近的门户怎么办?这有它自己的优点-您可以成为第一个。您可以创建自己的网关并将其注册在The Things Network服务器上,发行价格视功能而定-从“专有”多通道集线器的1000欧元起,基于SX1276和Raspberry Pi的家用设备的起价为15欧元。这里有一个不同路由器的比较表,希望对它们有更详细研究的人。

下一部分将考虑最后一个选项。

Source: https://habr.com/ru/post/zh-CN398247/


All Articles