×

使用MQTT集成来监控控制基于LoRa E5的物联网设备

消耗积分:0 | 格式:zip | 大小:7.82 MB | 2022-10-31

池鹄展

分享资料个

描述

该项目的目标是使用 LoRaWAN 上的物联网 MQTT 集成来监控和控制基于 LoRa-E5 的物联网设备。

LoRa-E5 模块在其 LoRa 调制解调器旁边有一个嵌入式 MCU,但是我对 ESP32 最满意,所以我将 LoRa-E5 用作带有 ESP32 开发模块的 LoRa 调制解调器。在几款 LoRa-E5 板卡中,当您只需要 LoRa-E5 作为调制解调器时,推荐使用Grove LoRa E5模块,因此在本项目中使用了相同的模块。

poYBAGNY3FqAHQZLABUVz-qaDiA295.png
洛拉 E5 <> ESP32
 

最初,我只是想在两个 LoRa-E5 模块之间交换消息,而不需要 LoRaWAN,因此我使用了 TEST 模式并使其成功运行。如果您只想在 LoRa 模块之间交换消息而无需设置网关(这称为 TEST 模式),请查看此项目!

继续实现该项目的目标,我将其分为以下里程碑

  • 设置物联网网关 (LoRaWAN)
  • 在物联网上设置 LoRa-E5 设备
  • 在 ESP32 上上传固件以与 TTN 通信
  • MQTT 集成
  • 通过 Python 程序监视和控制您的 LoRa 设备

 

设置物联网网关

为了将数据包从我的 ESP32 发送到物联网,我需要一个支持与我的 LoRa-E5 模块相同频率的网关。这是我使用 Raspberry Pi + RAK2245 Pi HAT 的地方。

如果您有任何其他与您的 LoRa-E5 模块频率范围相同的 LoRaWAN 网关,并且能够通过它连接到物联网,那就太好了!

要设置我的 Pi+RAK2245 LoRaWAN 网关,我只需要按照RAK Wireless的官方指南进行操作即可。

设置完成后,您将看到网关页面如下

poYBAGNY3GGAc2UIAAJ9XZvkqNI239.png
 

在物联网上设置 LoRa-E5 设备

在物联网上配置 LoRa-E5 设备时,需要设备中的以下信息

  • 开发EUI
  • AppEUI

所有的 LoRa-E5 模块都已经有了这些信息。我们可以选择使用已配置的内容或生成新的 EUI 并使用它配置 LoRa-E5 模块。我选择使用预先配置在模块上的 EUI。

要获取 DevEUI 和 AppEUI,请在 ESP32 开发模块上上传串行直通固件,其连接如示意图所示请注意,LoRa-E5 模块在 9600 波特上工作,因此请相应地配置您的串行直通固件。

刷新 ESP32 开发模块后,打开串行监视器/CoolTerm 并发送以下命令

AT+ID

这将返回类似于以下内容的内容

+ID: DevAddr, 25:1B:2E:11
+ID: DevEui, 2C:F7:F1:21:42:60:90:CE
+ID: AppEui, 80:00:00:00:00:00:00:06
poYBAGNY3GSAXHOkAADJyrR0TrA076.png
 

请注意此信息可能在记事本中的某处。我们将在接下来的步骤中需要它。

现在让我们配置The Things Network (TTN),以便我们可以通过以下步骤在 ESP32+LoRa-E5 和 TTN 之间发送和接收数据:

  • Things Stack 控制台上,选择您选择的区域并转到 Applications 并创建一个新应用程序
pYYBAGNY3GiAetCJAAGiuwbdXGk141.png
 
  • 现在您已经创建了一个 Things Stack 应用程序。进入应用程序控制台后(如上所示),单击+ 添加终端设备
  • 我无法在 LoRaWAN 设备存储库中找到 LoRa-E5,因此我在手动部分中手动提供了信息
  • 选择 LoRa-E5 模块的频率计划、LoRaWAN 版本(取决于您的网关)、区域参数版本。我在这里找到了这个信息
  • 现在,输入您在前面步骤中记下的 DevEUI 和 AppEUI
  • 生成一个新的 AppKey 并在某处记下它。
poYBAGNY3GuADLuZAAFAqBFPUtg799.png
 

您的 Things Stack 控制台配置已基本完成,可以在 ESP32+LoRa-E5 设备之间交换消息

在 ESP32 上上传固件并与 TTN 通信

此固件在配置了 AppKey(如上所述)并上传到 ESP32 后,会连接到附近的 LoRaWAN (TTN) 网关,并每 5 秒发送一次以下 JSON 对象

{
    "state":  {
                "temp": 27.4,
                "humi": 89
              }
}

目前,固件会向 TTN 发送恒定的温度湿度值,但是您可以修改固件以满足您集成任何传感器的要求,并改为发送这些值。

确保替换固件代码第 101 行中先前步骤中记下的 AppKey。成功上传代码后,我在串行端口中看到以下内容

poYBAGNY3G6AQ_ftAAGC8V5Zce4726.png
 

JSON 被转换为字节数组(即7B 22 73 74... )并发送到 TTN。您可以通过选择终端设备的实时数据选项卡在 TTN 控制台上查看此数据

pYYBAGNY3HOAHUhEAAN_IWBx1RU154.png
 

如果您想以 JSON 格式查看字节数组中的数据,请转到 Payload formatters 选项卡并选择 Formatter type as Javascript 并将 formatter 参数更改为以下

function decodeUplink(input) {
  return {
    data: JSON.parse(String.fromCharCode(...input.bytes)),
    warnings: [],
    errors: []
  };
}
pYYBAGNY3HiAN5_PAACNi3cp7TE051.png
 

保存

返回实时数据选项卡,选择“转发上行链路数据消息”类型的条目,您现在应该能够以 JSON 格式查看发送的 LoRa 数据

pYYBAGNY3HyAWmCSAASM5rf47l4085.png
 

就像固件允许您将数据从 ESP32 发送到 TTN 一样,它也允许您从 TTN 接收 ESP32 中的数据。

要将数据从 TTN 发送到 ESP32,请转到消息选项卡并选择下行链路选项卡。我将以下 JSON 从 TTN 发送到 ESP32

{
    "name": "Sufian",
    "id": "sufiankaki"
}

TTN 控制台具有以 JSON 和字节数组形式发送数据的选项。要发送 JSON 数据,我们需要像之前所做的那样修改 Payload 格式化程序(用于下行链路)。将现有脚本更改为

function encodeDownlink(input) {
  return {
    bytes: JSON.stringify(input),
    fPort: 1,
    warnings: [],
    errors: []
  };
}

function decodeDownlink(input) {
  return {
    data: {
      bytes: input.bytes
    },
    warnings: [],
    errors: []
  }
}
pYYBAGNY3H-ABareAAIa71IMHa0638.png
 

完成后,保存并转到消息选项卡并选择下行链路。选择 JSON 并在 Payload 文本框中输入数据并点击 Schedule Downlink

poYBAGNY3IKASYT3AADObF7q5Uw417.png
 

在您的 Coolterm/Serial Monitor 上,您应该会看到现在收到一条消息

pYYBAGNY3I2AQ25KAABVN5SUb2U239.png
 

现在您知道如何从 LoRa 模块向 TTN 发送(上行链路)和接收(下行链路)数据,修改固件并相应地开发您的项目

MQTT 集成

虽然从 TTN 监视和控制 LoRa 设备很简单,但我更喜欢从我的定制应用程序中控制它。一旦这样做的方法是使用 TTN 提供的 MQTT 集成。这允许使用 MQTT 客户端与 LoRa 设备进行交互

获取 MQTT 客户端的最简单方法之一是使用安装在计算机中的Mosquitto (CLI)。或者,您可以尝试任何MQTT Explorer与 GUI 交互。

要为 LoRa 终端设备启用 MQTT 集成,请在 TTN 终端设备控制台的菜单(左侧)上选择集成选项,然后选择 MQTT

您将看到主机名、端口号和用户名。单击生成新的 API 密钥,以便您也拥有密码

poYBAGNY3JSAQoqbAADUde1ZDzo337.png
 

除了您在 MQTT 集成页面上看到的 4 个字段(主机名、端口、用户名和密码)之外,您还需要订阅或发布到 TTN 的主题,具体取决于您是要从 LoRa 设备接收消息还是发送分别向 LoRa 设备发送消息。

要接收从 LoRa 设备发送到 TTN 的消息,您需要订阅的主题是v3//devices//up。 替换为各自的值。因此,您从 LoRa 设备接收消息的 CLI 命令将是

mosquitto_sub -h eu1.cloud.thethings.network -p 1883 -u test-app-868@ttn -P NNSXS.IG5UN5CKVNA7IWCQBLS5XXCEGRKNKBEDIJTFUUY.BZSNJY6HJ2KRF36XOPLXZF45AGFZSR2AYTT4L3HF45BBSGH4RG6Q -t 'v3/test-app-868@ttn/devices/eui-70b3d57ed004d84c/up'

订阅后,您将收到如下消息(JSON)

pYYBAGNY3JiAGunxAARjnGEtKL8006.png
 

这包含与从 LoRa 设备到 TTN 的上行链路消息有关的终端设备、网关、元数据等的所有信息。

要从 MQTT 客户端向 LoRa 设备发送数据,您需要发布消息的主题是v3//devices//down/push。此外,消息需要采用以下格式

{
    "downlinks":
        [
        {  "f_port": 1, 
            "frm_payload":"ewogICAgIm5hbWUiOiAiU3VmaWFuIiwKICAgICJpZCI6ICJzdWZpYW5rYWtpIgp9", 
            "priority":"NORMAL"
        }
        ]
}

您需要发送的消息应该是 base64 编码的。假设您要发送以下消息

{
    "name": "Sufian",
    "id": "sufiankaki"
}

你首先需要对它进行base64编码。我使用这个在线工具来转换我的信息。对于上面的消息,我得到了ewogICAgIm5hbWUiOiAiU3VmaWFuIiwKICAgICJpZCI6ICJzdWZpYW5rYWtpIgp9我的 base64 编码字符串

因此我的 MQTT 发布消息看起来像

mosquitto_pub -h eu1.cloud.thethings.network -p 1883 -u test-app-868@ttn -P NNSXS.IG5UN5CKVNA7IWCQBLS5XXCEGRKNKBEDIJTFUUY.BZSNJY6HJ2KRF36XOPLXZF45AGFZSR2AYTT4L3HF45BBSGH4RG6Q -t 'v3/test-app-868@ttn/devices/eui-70b3d57ed004d84c/down/push' -m "{\"downlinks\":[{\"f_port\": 1, \"frm_payload\":\"ewogICAgIm5hbWUiOiAiU3VmaWFuIiwKICAgICJpZCI6ICJzdWZpYW5rYWtpIgp9\", \"priority\":\"NORMAL\"}]}"

确保您转义了消息中的双引号。

有关 MQTT 集成的更多信息,请查看官方文档我上面的解释是针对 Eclipse Mosquitto 的。

通过 Python 程序监视和控制您的 LoRa 设备

使用 MQTT 集成,LoRa 设备也可以通过 python 程序进行监视和控制。我将使用 Eclipse Paho 库从我的 Python 程序向 LoRa 设备发送和接收消息

从 LoRa 设备接收和打印消息的程序

import paho.mqtt.client as mqtt
import json

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("v3/test-app-868@ttn/devices/eui-70b3d57ed004d84c/up")

def on_message(client, userdata, msg):
    messg = json.loads(msg.payload)
    print(messg['uplink_message']['decoded_payload'])

client = mqtt.Client()
client.username_pw_set("test-app-868@ttn", "NNSXS.IG5UN5CKVNA7IWCQBLS5XXCEGRKNKBEDIJT..")
client.on_connect = on_connect
client.on_message = on_message

client.connect("eu1.cloud.thethings.network", 1883, 60)
client.loop_forever()

 

向 LoRa 设备发送消息的程序

import paho.mqtt.client as mqtt
import json
import base64
from time import sleep

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("v3/test-app-868@ttn/devices/eui-70b3d57ed004d84c/up")

def on_message(client, userdata, msg):
    messg = json.loads(msg.payload)
    print('Received: ' + str(messg['uplink_message']['decoded_payload']))

client = mqtt.Client()
client.username_pw_set("test-app-868@ttn", "NNSXS.IG5UN5CKVNA7IWCQBLS5XXCEGRKNKBEDIJT...")
client.on_connect = on_connect
client.on_message = on_message

client.connect("eu1.cloud.thethings.network", 1883, 60)
client.loop_start()

try:
    while True:
        topic = "v3/test-app-868@ttn/devices/eui-70b3d57ed004d84c/down/push"
        js = {'name': 'Sufian', 'id': 'sufiankaki'}
        str_js = json.dumps(js)

        x = {}
        x["f_port"] = 1
        x["frm_payload"] = base64.b64encode(str.encode(str_js)).decode()
        x["priority"] = "NORMAL"
        
        message = {}
        message["downlinks"] = []
        message["downlinks"].append(x)

        client.publish(topic, json.dumps(message))
        print('Published: ' + json.dumps(message))
        sleep(5)
except KeyboardInterrupt:
    client.loop_stop()
    print("Stopped the client!")

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !