注意:
配置前请确认:
CN470 频段。1.0.2。
详细教程请参考MODBUS 详细说明
CLASS A 或 CLASS C。OTAA 或 ABP 入网模式。UNCONFIRM 或 CONFIRM。
| 参数 | 配置项 | 说明 | 适用场景 | 注意事项 |
|---|---|---|---|---|
| 频段 | CN470 | LoRaWAN 工作频段,决定节点使用的区域参数、信道和数据速率。节点、网关和网络服务器必须使用相同的频段和频率计划。 | 中国 470MHz 频段 | 频段或频率计划不一致可能导致无法入网、无法收发数据或通信异常。 |
| 输入数据源 | 本地数据源 | 当数据源产生数据时,系统会将其封装为 LoRaWAN 上行数据发送至网络服务器。(一般为自定义1,表示modbus数据) | 传感器数据、Modbus 数据等 | 单个 LoRaWAN 数据包最大约 48 Byte(实际与数据速率 DR 有关),数据较大时系统会尝试按字段拆分为多个数据包。 |
| 输出数据源 | 本地数据源 | 当启用低功耗功能时,可在完成 LoRaWAN 上报后,将原始数据转发到指定的数据源,并进入休眠。 | 数据透传、本地处理 | 输出数据源不是 LoRaWAN 网络服务器地址,也不会影响网关或服务器接收数据。 |
| CLASS | CLASS A | 每次上行完成后依次开启 RX1、RX2 两个短暂接收窗口,仅在接收窗口内接收服务器下行数据。功耗最低,是 LoRaWAN 默认工作模式。 | 电池供电设备、周期采集设备、遥测设备 | 推荐绝大多数设备使用。服务器通常需要等待节点主动上行后才能发送下行数据。 |
| CLASS C | 除发送期间外,其余时间几乎一直保持接收状态,下行延迟低,但持续监听导致功耗较高。 | 持续供电设备 | 不适合电池供电设备。 | |
| 入网模式 | OTAA | 设备通过 Join 流程动态建立 LoRaWAN 会话,服务器动态分配会话参数。 | 正式部署 | 安全性高,会话可动态更新,是 LoRaWAN 推荐的入网方式。 |
| ABP | 设备直接使用预配置的 DevAddr、NwkSKey、AppSKey 建立通信,不执行 Join。 | 测试环境、部分存量设备 | 节点和服务器必须保持一致的会话和帧计数器,否则服务器可能拒绝数据。 | |
| OTAA 参数 | AppEUI(JoinEUI) | 应用标识,在部分网络服务器中称为 JoinEUI。 | OTAA | 长度 8 Byte(16 个十六进制字符),不得包含空格、冒号或短横线。示例:70B3D57ED000ABCD。 |
| DevEUI | 设备唯一标识。 | OTAA | 长度 8 Byte(16 个十六进制字符)。示例:0011223344556677。 |
|
| AppKey | OTAA 入网密钥,用于 Join 认证和生成会话密钥。 | OTAA | 长度 16 Byte(32 个十六进制字符)。属于敏感信息,请勿泄露。示例:2B7E151628AED2A6ABF7158809CF4F3C。 |
|
| ABP 参数 | DevAddr | 设备地址。 | ABP | 长度 4 Byte(8 个十六进制字符)。示例:007E6AE1。 |
| NwkSKey | 网络会话密钥,用于 MAC 层完整性校验。 | ABP | 长度 16 Byte(32 个十六进制字符)。 | |
| AppSKey | 应用会话密钥,用于业务数据加密。 | ABP | 长度 16 Byte(32 个十六进制字符)。 | |
| ABP 使用注意事项 | 帧计数器(FCnt) | ABP 模式下节点与服务器必须保持相同的帧计数器状态。 | ABP | 如果服务器删除设备、重建设备、清除 Session、恢复旧数据库、重置帧计数器或重启后未恢复会话,节点也必须同步重置,否则服务器可能拒绝接收新的上行数据。 |
| 会话保持 | 启用 | 保存当前 LoRaWAN Session 信息。OTAA 可恢复 Join 后建立的会话,ABP 可恢复 DevAddr、密钥及帧计数器。 | 正式部署 | 可减少重新入网时间、降低功耗,尤其推荐低功耗设备和 ABP 设备启用。 |
| 禁用 | 每次重启重新初始化 Session。 | 测试环境 | OTAA 会重新 Join;ABP 帧计数器可能重新从 0 开始,若服务器仍保留旧计数器,则可能拒绝数据。 | |
| ADR | 开启 | 自适应数据速率。服务器根据链路质量自动调整数据速率、发射功率等参数。 | 固定安装设备、覆盖稳定环境 | 可提升网络容量、降低功耗和空口占用。 |
| 关闭 | 使用固定数据速率,不接受服务器动态调整。 | 移动设备、测试环境 | 数据速率保持固定,便于测试和调试。 | |
| RX1 速率 | 数据速率(DR) | 节点默认数据速率。ADR 关闭时主要作为默认上行数据速率;ADR 开启时可能由服务器动态调整。 | 通用 | RX1 实际接收速率还受到区域参数、上行 DR 和服务器调度方式影响,并非完全由此参数决定。ADR 开启后,服务器可能动态修改设备的数据速率。 |
| RX1 频段 | 信道组(Channel Group) | 指定 CN470 使用的上行信道范围。 | CN470 | 必须与网关和服务器保持一致,否则可能导致无法 Join、收不到 ACK、上下行异常或数据时有时无。 |
| RX2 数据速率 | RX2 DR | 第二个接收窗口的数据速率。 | 通用 | 必须与网络服务器配置保持一致。 |
| RX2 频率 | RX2 Frequency | 第二个接收窗口的中心频率,单位 Hz。 | CN470 | 必须与服务器配置一致,否则可能无法收到 ACK、业务下行或导致 Confirm 数据持续重传。 |
| ACK 数据 | UNCONFIRM | 不要求服务器返回 LoRaWAN ACK。 | 周期采集、遥测数据 | 功耗低、空口占用少、发送速度快,但无法确认服务器是否收到数据。适用于允许少量丢包的数据。 |
| CONFIRM | 要求服务器返回 LoRaWAN ACK。 | 告警、控制、重要状态变化 | 收不到 ACK 时会自动重传,会增加功耗、延迟和网络负载。ACK 仅表示网络层确认,不代表业务程序已处理数据。 | |
| 数据重传次数 | Retry Count | CONFIRM 模式下,当未收到 ACK 时的自动重传次数。 | CONFIRM | 建议设置 1~3 次。重传次数过大会增加功耗、空口占用、通信延迟及网络拥塞风险。UNCONFIRM 模式下,该参数不具有 ACK 重传意义。 |
说明: 下表仅适用于 ADR 关闭 时,设备使用固定数据速率发送数据。
- 以上数据为单个 LoRaWAN 数据包可承载的最大应用数据长度(Payload)。
- 实际可发送的数据长度还可能受到 FPort、MAC Command 等协议开销影响。
- 当应用数据超过对应 DR 的最大长度时,系统会自动拆分为多个 LoRaWAN 数据包发送。‘
| 数据速率 | 单个 LoRaWAN 数据包最大应用数据长度 |
|---|---|
| DR0 | 48 Byte |
| DR1 | 48 Byte |
| DR2 | 48 Byte |
| DR3 | 100 Byte |
| DR4 | 160 Byte |
| DR5 | 160 Byte |
启用:启用
频段:CN470
CLASS:CLASS A
入网模式:OTAA
会话保持:启用
ADR:开启
RX1速率:DR5
RX1频段:0 - 7
RX2速率:DR0
RX2频率:505300000
ACK数据:UNCONFIRM
数据重传次数:3
启用:启用
频段:CN470
CLASS:CLASS A
入网模式:OTAA
会话保持:启用
ADR:开启
RX1速率:DR5
RX1频段:0 - 7
RX2速率:DR0
RX2频率:505300000
ACK数据:CONFIRM
数据重传次数:3
启用:启用
频段:CN470
CLASS:CLASS A
入网模式:ABP
会话保持:启用
ADR:开启
RX1速率:DR5
RX1频段:0 - 7
RX2速率:DR0
RX2频率:505300000
ACK数据:UNCONFIRM
数据重传次数:3
启用:启用
频段:CN470
CLASS:CLASS C
入网模式:OTAA
会话保持:启用
ADR:开启
RX1速率:DR5
RX1频段:0 - 7
RX2速率:DR0
RX2频率:505300000
ACK数据:根据业务需要选择
CLASS C 功耗较高,建议用于持续供电场景。
| 查询指令 | 功能 | 返回示例 |
|---|---|---|
ZAT+ENABLE? |
查询 LoRaWAN 是否启用 | +ENABLE:1OK |
ZAT+MODE? |
查询入网模式 | +MODE:OTAAOK |
ZAT+CLASS? |
查询设备 Class | +CLASS:AOK |
ZAT+REGION? |
查询区域 | +REGION:CN470OK |
ZAT+DEVEUI? |
查询 DevEUI | +DEVEUI:AABBCCDDEEFF0011OK |
ZAT+APPEUI? |
查询 AppEUI/JoinEUI | +APPEUI:0011223344556677OK |
ZAT+APPKEY? |
查询 AppKey | +APPKEY:00112233445566778899AABBCCDDEEFFOK |
ZAT+DEVADDR? |
查询 ABP DevAddr | +DEVADDR:26011ABCOK |
ZAT+NWKSKEY? |
查询 ABP NwkSKey | +NWKSKEY:00112233445566778899AABBCCDDEEFFOK |
ZAT+APPSKEY? |
查询 ABP AppSKey | +APPSKEY:FFEEDDCCBBAA99887766554433221100OK |
ZAT+ADR? |
查询 ADR 是否启用 | +ADR:1OK |
ZAT+CFM? |
查询上行确认模式 | +CFM:0OK |
ZAT+KEEPNET? |
查询会话保持状态 | +KEEPNET:1OK |
ZAT+RX1DR? |
查询默认数据速率 | +RX1DR:5OK |
ZAT+RX2DR? |
查询 RX2 数据速率 | +RX2DR:0OK |
ZAT+RX2FREQ? |
查询 RX2 频率,单位 Hz | +RX2FREQ:505300000OK |
ZAT+RETRIES? |
查询 confirmed 重传次数 | +RETRIES:3OK |
ZAT+CHMASK? |
查询信道掩码 | +CHMASK:00FF,0000,0000,0000,0000,0000OK |
本设备支持通过 Lua 脚本发送和接收自定义 LoRaWAN 原始字节数据。
注意!!!!:
userapp.lua文件烧录进网关,具体教程可查看教程二次开发HEX 是一种用于显示和传输字节的文本格式。
例如:
64050000FF0085CF
实际对应的原始字节为:
64 05 00 00 FF 00 85 CF
LoRaWAN 最终发送的是原始字节,不是 HEX 字符串。
以下两种写法含义不同:
-- 正确:发送 8 个原始字节
local payload = string.fromHex("64050000FF0085CF")
-- 错误:发送 16 个 ASCII 字符
local payload = "64050000FF0085CF"
第二种方式发送到 LoRaWAN 服务器后,实际数据会变成 ASCII 字节。因此,自定义二进制协议必须使用 string.fromHex() 将 HEX 文本转换为原始字节后再发送。
使用主题 LORA_TX 发送原始字节数据:
local payload = string.fromHex("64050000FF0085CF")
sys.publish("LORA_TX", payload, 10)
上述示例表示:
FPort:10
数据长度:8 Byte
数据内容:64 05 00 00 FF 00 85 CF
也可以使用 string.char() 构造原始字节:
local payload = string.char(
0x64, 0x05, 0x00, 0x00,
0xFF, 0x00, 0x85, 0xCF
)
sys.publish("LORA_TX", payload, 10)
两种写法发送的 LoRaWAN 数据完全相同。
LORA_TX 的第三个参数是 LoRaWAN FPort:
sys.publish("LORA_TX", payload, 10)
FPort 可根据业务协议自行设置,允许范围为:
1~223
不同业务可以使用不同端口:
-- 仪表协议
sys.publish("LORA_TX", string.fromHex("64050000FF0085CF"), 10)
-- 报警协议
sys.publish("LORA_TX", string.fromHex("AA550101"), 20)
-- 控制协议
sys.publish("LORA_TX", string.fromHex("01020304"), 30)
FPort 用于区分不同业务数据,不是 RX1、RX2 接收窗口,也不是频率或数据速率。
设备收到 LoRaWAN 下行数据后,会通过 LORA_RX 主题发布原始字节数据:
sys.subscribe("LORA_RX", function(payload, port)
log.info(
"LoRa downlink",
"port=" .. tostring(port),
"len=" .. tostring(#payload),
"hex=" .. payload:toHex()
)
end)
其中:
payload:原始字节字符串;port:LoRaWAN FPort;#payload:数据长度,单位为 Byte;payload:toHex():将原始字节转换为 HEX 文本,方便调试。例如,服务器下发:
FPort:10
Payload:64050000FF0085CF
Lua 回调中得到的内容为:
port = 10
len = 8
hex = 64050000FF0085CF
如果需要按照协议解析原始字节,可以直接使用 string.byte():
sys.subscribe("LORA_RX", function(payload, port)
if port ~= 10 or #payload < 8 then
return
end
local address = string.byte(payload, 1)
local command = string.byte(payload, 2)
local data1 = string.byte(payload, 3)
local data2 = string.byte(payload, 4)
log.info(
"custom protocol",
address,
command,
data1,
data2
)
end)
使用 string.fromHex() 时需要注意:
0~9、A~F、a~f;0x 前缀。正确示例:
string.fromHex("010300000002C40B")
string.fromHex("64050000FF0085CF")
string.fromHex("AA55A501")
错误示例:
string.fromHex("0x64050000FF0085CF")
string.fromHex("64 05 00 00 FF 00 85 CF")
string.fromHex("6405000")
自定义 raw 数据一次调用对应一个 LoRaWAN 上行帧,系统不会像 JSON 数据一样自动拆分自定义协议。
当前单帧长度限制如下:
| 工作模式 | 单帧最大数据长度 |
|---|---|
| ADR 开启 | 48 Byte |
| ADR 关闭,DR0 | 48 Byte |
| ADR 关闭,DR1 | 48 Byte |
| ADR 关闭,DR2 | 48 Byte |
| ADR 关闭,DR3 | 100 Byte |
| ADR 关闭,DR4 | 160 Byte |
| ADR 关闭,DR5 | 160 Byte |
例如,ADR 开启时:
-- 48 Byte,可以发送
sys.publish("LORA_TX", string.rep(string.char(0xAA), 48), 10)
-- 49 Byte,超过当前限制,会被拒绝
sys.publish("LORA_TX", string.rep(string.char(0xAA), 49), 10)
如果客户协议需要传输超过单帧限制的数据,应由客户协议自行设计分包和重组方式,不建议依赖 LoRaWAN 通用层自动拆包。
使用自定义 HEX 数据传输前,请确认:
LORA_TX 只表示提交一帧数据,不表示服务器已经收到;+LORATXACK:xx,OK 只表示 nRF 已经将数据放入 LoRaWAN 队列;LORA_RX 接收到的是原始字节,不是 JSON,也不是 HEX 文本;LORA_RX 和原有下行数据源,同一条下行可能被两个业务入口同时处理,应避免重复执行控制逻辑。-- 测试发送自定义协议
sys.taskInit(function()
-- 等待 LoRa 配置同步、nRF 初始化和入网
sys.wait(20000)
local payload = string.fromHex("64050000FF0085CF")
log.info(
"LoRa raw uplink",
"port=10",
"len=" .. tostring(#payload),
"hex=" .. payload:toHex()
)
sys.publish("LORA_TX", payload, 10)
end)
-- 测试接收自定义下行
sys.subscribe("LORA_RX", function(payload, port)
log.info(
"LoRa raw downlink",
"port=" .. tostring(port),
"len=" .. tostring(#payload),
"hex=" .. payload:toHex()
)
end)
服务器侧应看到:
FPort:10
Payload:64050000FF0085CF
请检查:
请检查:
请检查:
ABP 除了设备地址和密钥,还依赖帧计数器。
请确认服务器重启后是否恢复:
如果服务器已经重置 ABP 会话,需要同步重置节点侧会话,不能只重置其中一端。
配置下发后,节点可能需要保存配置、重新初始化或重新入网。
请等待配置生效和入网完成后再进行数据测试。