Atom DTU LoRaWAN 系列(RAK3172)底座。

SKU:A152-CN470、A152-US915、A152-EU868

Atom DTU LoRaWAN-Series 是一款基于 STM32WLE5 芯片的 LoRaWAN 可编程数据传输单元(DTU)。该模块支持远距离通信、低功耗运行和高灵敏度特性,适用于多种复杂环境下的 IoT 通信需求。

  • 频段支持:CN470(470MHz)、EU868(868MHz)、US915(915MHz)

  • 通信协议

    • 支持 LoRaWAN Class A、Class B、Class C 模式。

    • 支持 LoRa 点对点(P2P)通信模式。

  • 通信接口

    • UART 接口:用于发送 AT 命令,以控制 LoRaWAN 网络接入、数据收发、P2P 模式通信等。

    • RS485 接口:支持工业设备的有线通信,可靠性高。

  • 联网方式

    • OTAA(空中激活)

    • ABP(通过个性化激活)

支持以下产品:

LoRaWAN-CN470

LoRaWAN-EU868

LoRaWAN-US915

MicroPython LoRaWAN-EU868 LoRaWAN OTAA 模式示例:

 1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
 2#
 3# SPDX-License-Identifier: MIT
 4
 5import os, sys, io
 6import M5
 7from M5 import *
 8from hardware import RGB
 9from base import AtomDTULoRaWANRUI3Base
10
11
12rgb = None
13base_lorawaneu868 = None
14
15
16def setup():
17    global rgb, base_lorawaneu868
18
19    M5.begin()
20    rgb = RGB()
21    base_lorawaneu868 = AtomDTULoRaWANRUI3Base(2, port=(19, 22))
22    base_lorawaneu868.set_network_mode(1)
23    base_lorawaneu868.set_otaa_config(
24        "70B3D57ED007006A", "A843ECB026197C981D67AEFACC72D01E", "70B3D57ED0063472"
25    )
26    base_lorawaneu868.set_rx_delay_on_window1(1)
27    base_lorawaneu868.set_rx_delay_on_window2(2)
28    base_lorawaneu868.set_rx_data_rate_on_windows2(0)
29    base_lorawaneu868.set_lorawan_node_class("C")
30    if base_lorawaneu868.join_network(10000):
31        print("Success join the network")
32        rgb.fill_color(0x33FF33)
33        base_lorawaneu868.send_data(1, "AABBCC", 0)
34    else:
35        print("Failed Join to the network")
36        rgb.fill_color(0xFF0000)
37
38
39def loop():
40    global rgb, base_lorawaneu868
41    M5.update()
42    if BtnA.wasPressed():
43        if (base_lorawaneu868.get_received_data_count()) != 0:
44            print(base_lorawaneu868.get_received_data_string())
45        else:
46            print("Message queue is empty")
47
48
49if __name__ == "__main__":
50    try:
51        setup()
52        while True:
53            loop()
54    except (Exception, KeyboardInterrupt) as e:
55        try:
56            from utility import print_error_msg
57
58            print_error_msg(e)
59        except ImportError:
60            print("please update to latest firmware")

MicroPython LoRaWAN-EU868 P2P 模式 TX 应用示例:

 1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
 2#
 3# SPDX-License-Identifier: MIT
 4
 5import os, sys, io
 6import M5
 7from M5 import *
 8from hardware import RGB
 9from base import AtomDTULoRaWANRUI3Base
10
11
12rgb = None
13base_lorawaneu868 = None
14
15
16def setup():
17    global rgb, base_lorawaneu868
18
19    M5.begin()
20    rgb = RGB()
21    base_lorawaneu868 = AtomDTULoRaWANRUI3Base(2, port=(19, 22))
22    base_lorawaneu868.set_network_mode(0)
23    base_lorawaneu868.set_p2p_frequency(600000000)
24    base_lorawaneu868.set_p2p_spreading_factor(7)
25    base_lorawaneu868.set_p2p_bandwidth(0)
26    base_lorawaneu868.set_p2p_tx_power(14)
27    base_lorawaneu868.set_p2p_code_rate(0)
28    base_lorawaneu868.set_p2p_preamble_length(8)
29    print("Press the button to send P2P message")
30
31
32def loop():
33    global rgb, base_lorawaneu868
34    M5.update()
35    if BtnA.wasPressed():
36        base_lorawaneu868.send_p2p_data("AABBCC", timeout=0, to_hex=False)
37
38
39if __name__ == "__main__":
40    try:
41        setup()
42        while True:
43            loop()
44    except (Exception, KeyboardInterrupt) as e:
45        try:
46            from utility import print_error_msg
47
48            print_error_msg(e)
49        except ImportError:
50            print("please update to latest firmware")

MicroPython LoRaWAN-EU868 P2P 模式 RX 应用示例:

 1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
 2#
 3# SPDX-License-Identifier: MIT
 4
 5import os, sys, io
 6import M5
 7from M5 import *
 8from hardware import RGB
 9from base import AtomDTULoRaWANRUI3Base
10
11
12rgb = None
13base_lorawaneu868 = None
14
15
16def setup():
17    global rgb, base_lorawaneu868
18
19    M5.begin()
20    rgb = RGB()
21    base_lorawaneu868 = AtomDTULoRaWANRUI3Base(2, port=(19, 22))
22    base_lorawaneu868.set_network_mode(0)
23    base_lorawaneu868.set_p2p_frequency(600000000)
24    base_lorawaneu868.set_p2p_spreading_factor(7)
25    base_lorawaneu868.set_p2p_bandwidth(0)
26    base_lorawaneu868.set_p2p_tx_power(14)
27    base_lorawaneu868.set_p2p_code_rate(0)
28    base_lorawaneu868.set_p2p_preamble_length(8)
29    print("Press the button to send P2P message")
30
31
32def loop():
33    global rgb, base_lorawaneu868
34    M5.update()
35    if BtnA.wasPressed():
36        base_lorawaneu868.send_p2p_data("AABBCC", timeout=0, to_hex=False)
37
38
39if __name__ == "__main__":
40    try:
41        setup()
42        while True:
43            loop()
44    except (Exception, KeyboardInterrupt) as e:
45        try:
46            from utility import print_error_msg
47
48            print_error_msg(e)
49        except ImportError:
50            print("please update to latest firmware")

UiFlow2 LoRaWAN-EU868 LoRaWAN OTAA 模式应用示例:

UIFLOW2 LoRaWAN-EU868 P2P 模式 TX 应用示例:

UIFLOW2 LoRaWAN-EU868 P2P 模式 RX 应用示例:

API参考

AtomDTULoRaWANRUI3Base

class base.dtu_lorawan_rui3.AtomDTULoRaWANRUI3Base(id=2, port=None, debug=False)

基类:RUI3

创建一个 AtomDTULoRaWANRUI3Base 对象。

参数:
  • id (int) – 要使用的 UART ID(0、1 或 2)。默认值为 2。

  • port (list | tuple) – 包含 TX 和 RX 引脚编号的列表或元组。

  • debug (bool) – 是否启用调试模式。默认值为 False。

MicroPython 代码块:

from base import AtomDTULoRaWANRUI3Base

lorawan_rui3 = AtomDTULoRaWANRUI3Base(2, port=(19, 22))
set_abp_config(dev_addr, apps_key, nwks_key)

将设备配置为 ABP(Activation By Personalization)模式。

参数:
  • dev_addr (str) – ABP 配置的设备地址。

  • apps_key (str) – 用于加密的应用会话密钥。

  • nwks_key (str) – 用于通信的网络会话密钥。

返回类型:

None

MicroPython 代码块:

lorawan_rui3.set_abp_config(
    dev_addr="26011D89",
    apps_key="2B7E151628AED2A6ABF7158809CF4F3C",
    nwks_key="2B7E151628AED2A6ABF7158809CF4F3C"
)
get_abp_config()

获取当前 ABP 配置。

返回:

包含 (device_address, apps_key, networks_key) 的元组。

返回类型:

tuple[str, str, str]

MicroPython 代码块:

print(lorawan_rui3.get_abp_config())
set_otaa_config(device_eui, app_key, app_eui)

将设备配置为 OTAA(Over-The-Air Activation)模式。

参数:
  • device_eui (str) – 用于 OTAA 配置的设备 EUI。

  • app_key (str) – 用于加密的应用密钥。

  • app_eui (str) – 用于 OTAA 配置的应用程序 EUI。

返回类型:

None

MicroPython 代码块:

lorawan_rui3.set_otaa_config(
    device_eui="2CF7F1C0420000AA",
    app_key="2B7E151628AED2A6ABF7158809CF4F3C"
    app_eui="80000000000000AA",
)
get_otaa_config()

获取当前 OTAA 配置。

返回:

包含 (device_eui, app_key, app_eui) 的元组。

返回类型:

tuple[str, str, str]

MicroPython 代码块:

print(lorawan_rui3.get_otaa_config())
get_device_eui()

获取设备 EUI。

返回:

设备 EUI。

返回类型:

str

MicroPython 代码块:

lorawan_rui3.get_device_eui()
get_join_state()

检查模块是否已成功加入网络。

返回:

如果已加入则为 True,否则为 False。

返回类型:

bool

MicroPython 代码块:

if lorawan_rui3.get_join_state():
    print("Module is joined to the network.")
else:
    print("Module is not joined to the network.")
get_last_receive()

获取最后接收消息中的数据。

返回:

一个包含端口号(int)和接收到的数据(bytes)的元组;如果未接收到数据,则返回 False。

返回类型:

tuple[int, bytes] | bool

MicroPython 代码块:

last_data = lorawan_rui3.get_last_receive()
if last_data:
    port, data = last_data
    print(f"Received data on port {port}: {data}")
else:
    print("No data received.")
get_p2p_bandwidth()

获取当前 P2P 带宽。

返回:

当前 P2P 带宽的整数值。

返回类型:

int

MicroPython 代码块:

bw = lorawan_rui3.get_p2p_bandwidth()
print(f"Current P2P bandwidth: {bw}")
get_p2p_code_rate()

获取当前 P2P 码率。

返回:

当前 P2P 代码速率(整数)。

返回类型:

int

MicroPython 代码块:

code_rate = lorawan_rui3.get_p2p_code_rate()
print(f"Current P2P code rate: {code_rate}")
get_p2p_frequency()

获取当前 P2P 频率。

返回:

当前 P2P 频率的整数值。

返回类型:

int

MicroPython 代码块:

frequency = lorawan_rui3.get_p2p_frequency()
print(f"Current P2P frequency: {frequency} Hz")
get_p2p_fsk_bitrate()

获取当前 P2P FSK 比特率。

返回:

AT 命令执行结果。

返回类型:

bool

MicroPython 代码块:

fsk_bitrate = lorawan_rui3.get_p2p_fsk_bitrate()
print(f"Current P2P FSK bitrate: {fsk_bitrate} b/s")
get_p2p_preamble_length()

获取当前 P2P 前导码长度。

返回:

当前 P2P 前导码长度,整数。

返回类型:

int

MicroPython 代码块:

preamble_length = lorawan_rui3.get_p2p_preamble_length()
print(f"Current P2P preamble length: {preamble_length}")
get_p2p_receive_data(timeout=500, to_str=False)

在 P2P 模式下接收数据,包括 RSSI、SNR 和 payload。

参数:
  • timeout (int) – P2P LoRa 数据包监听超时时间,单位为毫秒。有效值为 1 到 65535。0:持续监听。65535:无超时。

  • to_str (bool) – 指示是否将 payload 转换为字符串。默认值为 False。

返回:

如果接收到数据,则返回一个元组 (RSSI, SNR, Payload);如果未接收到数据,则返回 False。

返回类型:

tuple[int, int, str] | bool

MicroPython 代码块:

result = lorawan_rui3.get_p2p_receive_data(timeout=1000, to_str=True)
if result:
    rssi, snr, payload = result
    print(f"Received data - RSSI: {rssi}, SNR: {snr}, Payload: {payload}")
else:
    print("No data received.")
get_p2p_spreading_factor()

获取当前 P2P 扩频因子。

返回:

当前 P2P 扩频因子(整数)。

返回类型:

int

MicroPython 代码块:

sf = lorawan_rui3.get_p2p_spreading_factor()
print(f"Current P2P spreading factor: {sf}")
get_p2p_sync_word()

获取 P2P 模式下的当前同步字。

返回:

同步字(sync word)的字符串。

返回类型:

str

MicroPython 代码块:

sync_word = lorawan_rui3.get_p2p_sync_word()
print(f"Current P2P sync word: {sync_word}")
get_p2p_tx_power()

获取当前 P2P 传输功率。

返回:

当前 P2P 传输功率,类型为整数。

返回类型:

int

MicroPython 代码块:

tx_power = lorawan_rui3.get_p2p_tx_power()
print(f"Current P2P transmission power: {tx_power} dBm")
get_received_data()

获取最后接收消息中的数据。

返回:

一个包含端口号(int)和接收到的数据(bytes)的元组;如果未接收到数据,则返回 False。

返回类型:

tuple[int, bytes] | bool

MicroPython 代码块:

data = lorawan_rui3.get_received_data()
if data:
    print(f"Received data: {data}")
else:
    print("No data received.")
get_received_data_count()

获取接收数据的数量。

返回:

接收到的数据数量。

返回类型:

int

MicroPython 代码块:

count = lorawan_rui3.get_received_data_count()
print(f"Received data count: {count}")
get_received_data_string()

以字符串形式获取接收到的数据。

返回:

接收到的数据字符串;若未接收到数据,则为空字符串。

返回类型:

str

MicroPython 代码块:

data = lorawan_rui3.get_received_data_string()
if data:
    print(f"Received data: {data}")
else:
    print("No data received.")
join_network(timeout=8000)

使用预定义的加入参数加入 LoRa 网络。

参数:

timeout (int) – 加入命令的超时时长(单位:毫秒)。默认值为 8000 ms。

返回:

如果命令设置成功则返回 True,否则返回 False。

返回类型:

bool

join_network.png

MicroPython 代码块:

if lorawan_rui3.join_network(timeout=10000):
    print("Network joined successfully!")
else:
    print("Failed to join network.")
reset_module_to_default()

将模块重置为出厂默认设置。

MicroPython 代码块:

rui3.reset_module_to_default()
send_data(port, data, timeout=600)

通过指定端口发送数据。

参数:
  • port (int) – 用于发送数据的端口号。

  • data (bytes | str) – 要发送的数据,以 bytes 或 string 形式提供(如果数据为 bytes,将被转换为 string)。

  • timeout (int) – 发送命令的超时时长,单位为毫秒。默认值为 600 ms。

返回:

如果数据发送成功则为 True,否则为 False。

返回类型:

bool

send_data.png

send_data_return.png

MicroPython 代码块:

success = lorawan_rui3.send_data(port=1, data=b"HelloLoRa", timeout=800)
if success:
    print("Data sent successfully!")
else:
    print("Failed to send data.")
send_p2p_data(payload, timeout=1000, to_hex=False)

发送带有给定有效载荷的 P2P 数据。

参数:
  • payload (str) – 要发送的负载。

  • timeout (int) – 数据传输的超时时间,单位为毫秒。默认值为 1000 ms。

  • to_hex (bool) – 指示是否将 payload 转换为十六进制格式。默认值为 False。

返回:

如果数据发送成功(“TXFSK DONE” 或 “TXP2P DONE”),则为 True;否则为 False。

返回类型:

bool

send_p2p_data.png

send_p2p_data_return.png

MicroPython 代码块:

success = lorawan_rui3.send_p2p_data("abcdef", timeout=2000, to_hex=True)
if success:
    print("P2P data sent successfully!")
else:
    print("Failed to send P2P data.")
set_join_config(state, auto_join, reattempt_interval=8, max_attempts=0, timeout=8000)

配置 LoRaWAN 的入网参数。

配置不会确认网络加入是否成功。

参数:
  • state (int) – 要配置的加入状态,类型为整数。

  • auto_join (int) – 自动加入标志,类型为整数。

  • reattempt_interval (int) – 加入重试之间的间隔时间(单位:秒)。默认值为 8。

  • max_attempts (int) – 最大重试次数。默认值为 0(无限制)。

  • timeout (int) – 命令的超时时长,单位为毫秒。默认值为 8000 ms。

返回:

如果命令设置成功则返回 True,否则返回 False。

返回类型:

bool

MicroPython 代码块:

lorawan_rui3.set_join_config(
    state=1,
    auto_join=1,
    reattempt_interval=10,
    max_attempts=5,
    timeout=10000
)
set_join_mode(mode)

设置 LoRa 模块的入网模式。

参数:

mode (int) – 要设置的入网模式,0 表示 ABP,1 表示 OTAA。

返回:

如果命令设置成功则返回 True,否则返回 False。

返回类型:

bool

MicroPython 代码块:

lorawan_rui3.set_join_mode(1)  # Set to OTAA mode
set_network_mode(mode)

设置设备的网络模式。

返回:

AT 命令执行结果。

返回类型:

bool

参数:

mode (int) – 要为网络设置的模式:- 0 = P2P_LORA - 1 = LoRaWAN - 2 = P2P_FSK。

MicroPython 代码块:

lorawan_rui3.set_network_mode(0)  # Set to P2P_LORA mode
set_p2p_bandwidth(bandwidth)

设置 P2P 带宽。

参数:

bandwidth (int) – P2P通信的带宽设置。 - 对于LoRa: - 0 = 125 kHz - 1 = 250 kHz - 2 = 500 kHz - 3 = 7.8 kHz - 4 = 10.4 kHz - 5 = 15.63 kHz - 6 = 20.83 kHz - 7 = 31.25 kHz - 8 = 41.67 kHz - 9 = 62.5 kHz - 对于FSK:范围:4800-467000 Hz

返回:

AT 命令执行结果。

返回类型:

bool

MicroPython 代码块:

success = lorawan_rui3.set_p2p_bandwidth(1)  # Set to 250 kHz
if success:
    print("P2P bandwidth set successfully!")
else:
    print("Failed to set P2P bandwidth.")
set_p2p_code_rate(code_rate)

设置 P2P 码率。

参数:

code_rate (int) – 用于设置 P2P 通信的编码速率。- 0 = 4/5 - 1 = 4/6 - 2 = 4/7 - 3 = 4/8。

返回:

AT 命令执行结果。

返回类型:

bool

MicroPython 代码块:

success = lorawan_rui3.set_p2p_code_rate(1)  # Set to 4/6
if success:
    print("P2P code rate set successfully!")
else:
    print("Failed to set P2P code rate.")
set_p2p_frequency(frequency)

设置设备的 P2P 频率。

返回:

AT 命令执行结果。

返回类型:

bool

参数:

frequency (int) – 用于设置 P2P 通信的频率。- 低频范围:150000000 - 600000000 - 高频范围:600000000 - 960000000

MicroPython 代码块:

success = lorawan_rui3.set_p2p_frequency(433000000)
if success:
    print("P2P frequency set successfully!")
else:
    print("Failed to set P2P frequency.")
set_p2p_fsk_bitrate(bitrate)

设置 P2P FSK 比特率。

参数:

bitrate (int) – 用于设置 P2P FSK 通信的比特率。范围为 600 到 300000 b/s。

返回:

AT 命令执行结果。

返回类型:

bool

MicroPython 代码块:

success = lorawan_rui3.set_p2p_fsk_bitrate(9600)  # Set to 9600 b/s
if success:
    print("P2P FSK bitrate set successfully!")
else:
    print("Failed to set P2P FSK bitrate.")
set_p2p_preamble_length(length)

设置 P2P 前导码长度。

返回:

AT 命令执行结果。

返回类型:

bool

参数:

length (int) – 用于设置 P2P 通信的前导码长度。范围为 5 到 65535。

MicroPython 代码块:

success = lorawan_rui3.set_p2p_preamble_length(16)
if success:
    print("P2P preamble length set successfully!")
else:
    print("Failed to set P2P preamble length.")
set_p2p_spreading_factor(spreading_factor)

设置 P2P 扩频因子。

参数:

spreading_factor (int) – 用于设置 P2P 通信的扩频因子。取值范围为 5 到 12。

返回:

AT 命令执行结果。

返回类型:

bool

MicroPython 代码块:

success = lorawan_rui3.set_p2p_spreading_factor(10)
if success:
    print("P2P spreading factor set successfully!")
else:
    print("Failed to set P2P spreading factor.")
set_p2p_sync_word(sync_word)

设置 P2P 模式下的同步字。

参数:

sync_word (int) – 同步字值。- 必须在 0x0000 到 0xFFFF 的范围内。

返回:

命令执行的响应。

返回类型:

bool

MicroPython 代码块:

success = lorawan_rui3.set_p2p_sync_word(0x1234)
if success:
    print("P2P sync word set successfully!")
else:
    print("Failed to set P2P sync word.")
set_p2p_tx_power(power)

设置 P2P 传输功率。

参数:

power (int) – 为 P2P 通信设置的发送功率。取值范围为 5 到 22 dBm。

返回:

AT 命令执行结果。

返回类型:

bool

MicroPython 代码块:

success = lorawan_rui3.set_p2p_tx_power(20)  # Set to 20 dBm
if success:
    print("P2P transmission power set successfully!")
else:
    print("Failed to set P2P transmission power.")