跳转至

lora2-lora 驱动模块

作者:王世豪

一、概述

LuatOS 的 lora2 驱动模块,支持多设备挂载,提供完整的 lora 通信功能。仅支持 LLCC68、SX1268 两款主流 lora 芯片。

1.1 lora 通信原理

LoRa(Long Range)是 semtech 公司创建的低功耗、远距离、无线、广域网的标准。

LoRa 模块采用扩频通信技术,其核心原理是将信号的频谱扩展到一个很宽的频率范围内,从而提高信号的抗干扰能力和安全性。LoRa 模块主要采用的是基于线性调频(LFM)的扩频技术,即 Chirp Spread Spectrum(CSS)。

LoRa 模块在发送数据时,会将数据信号与一个高速的伪随机码(PN 序列)进行模二加运算,生成扩频信号。接收端使用相同的 PN 序列对接收到的扩频信号进行解扩,恢复出原始数据信号。

如果您需要权威参考,建议查阅 Semtech 官方(https://www.semtech.cn/lora)发布的 LoRa 技术文档或 LLCC68/SX1268 系列芯片数据手册。

1.2 工作模式

  1. 发送模式:用于无线发送数据,发送完成触发 "tx_done"事件。

  2. 接收模式:监听并接收无线信号,接收成功触发 "rx_done"事件 ,超时触发 "rx_timeout"事件。

  3. 待机模式:准备就绪状态,介于工作和睡眠之间,作为发送/接收操作前的过渡状态。

1.3 注意事项

由于 LoRa 设备的半双工特性,当设备 A 处于发送模式时,若设备 B 同时发送数据,设备 A 将无法接收,导致数据丢失。

二、核心示例

  1. 核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;

  2. 核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

  3. 更加完整和详细的 demo,请参考 LuatOS 仓库 中各个产品目录下的 demo/lora2;

local spi_id,pin_cs,pin_reset,pin_busy,pin_dio1 = 0,8,1,18,19

-- 定义LoRa回调处理函数
local function lora_callback(lora_device, event, data, size)
    log.info("lora", "event", event, lora_device, data, size)
    if event == "tx_done" then 
        lora_device:recv(1000)
    elseif event == "rx_done" then 
        lora_device:send("PING")
    elseif event == "rx_timeout" then 
        lora_device:recv(1000)
    elseif event == "rx_error" then 
        -- 可以在这里添加接收错误的处理逻辑
    end
end

-- 定义主任务函数
local function lora_main_task()
    spi_lora = spi.deviceSetup(spi_id,pin_cs,0,0,8,10*1000*1000,spi.MSB,1,0) 
    lora_device = lora2.init("llcc68",{res = pin_reset,busy = pin_busy,dio1 = pin_dio1},spi_lora) 
    log.info("lora_device",lora_device) 
    lora_device:set_channel(433000000) 
    lora_device:set_txconfig(
        {
            mode=1,
            power=22,
            fdev=0,
            bandwidth=0,
            datarate=9,
            coderate=4,
            preambleLen=8, 
            fixLen=false,
            crcOn=true,
            freqHopOn=0,
            hopPeriod=0,
            iqInverted=false,
        } 
    ) 
    lora_device:set_rxconfig(
        {
            mode=1,
            bandwidth=0,
            datarate=9,
            coderate=4,
            bandwidthAfc=0,
            preambleLen=8, 
            symbTimeout=0,
            fixLen=false, 
            payloadLen=0,
            crcOn=true,
            freqHopOn=0,
            hopPeriod=0,
            iqInverted=false,
            rxContinuous=false,
        } 
    ) 

    lora_device:on(lora_callback)
    lora_device:send("PING") 

    while 1 do 
        log.info("lora") 
        sys.wait(1000) 
    end 
end

sys.taskInit(lora_main_task)

三、常量详解

核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

每个常量对应的常量取值仅做日志打印时查询使用,不要将这个常量取值用做具体的业务逻辑判断,因为LuatOS内核固件可能会变更每个常量对应的常量取值;

如果用做具体的业务逻辑判断,一旦常量取值发生改变,业务逻辑就会出错;

3.1 lora.SLEEP

常量含义:SLEEP模式(休眠模式);
数据类型:number
常量取值:0
注意事项:在此模式下,lora设备进入低功耗状态,大部分功能被关闭以节省电能;
         在休眠模式下无法进行发送或接收操作;
         需要切换到STANDBY模式后才能进行通信操作
示例代码:-- 设置lora设备进入休眠模式
        lora_device:mode(lora.SLEEP)

3.2 lora.STANDBY

常量含义:STANDBY模式(待机模式);
数据类型:number
常量取值:1
注意事项:在此模式下,lora设备处于准备状态,可以快速切换到发送或接收模式;
         相比SLEEP模式功耗较高,但响应速度更快;
         是进行发送和接收操作前的默认工作状态;
示例代码:-- 从休眠模式切换到待机模式
        lora_device:mode(lora.STANDBY)

四、函数详解

4.1 lora2.init(ic, loraconfig,spiconfig)

功能

lora 设备初始化,创建并返回一个 lora 设备对象;

注意事项

当前仅支持 llcc68 和 sx1268 两个 lora 型号;

初始化前需要确保 SPI 设备已正确配置;

参数

ic

含义说明:lora 型号;
数值类型:string
取值范围:"llcc68"/"sx1268"
是否必选:是;
注意事项:当前仅支持llcc68和sx1268两个lora型号
参数示例:"llcc68"

loraconfig

含义说明:lora设备硬件配置参数表,表结构如下:
         {
            -- 参数含义:复位引脚;
            -- 数据类型:number;
            -- 取值范围:有效的GPIO引脚编号;
            -- 是否必选:是;
            -- 注意事项:用于硬件复位LoRa芯片,低电平有效;
            res 

            -- 参数含义:发射功率;
            -- 数据类型:number;
            -- 取值范围:有效的GPIO引脚编号;
            -- 是否必选:是;
            -- 注意事项:用于检测芯片是否处于忙碌状态,高电平表示忙碌;
            busy 

            -- 参数含义:数字IO1引脚;
            -- 数据类型:number;
            -- 取值范围有效的GPIO引脚编号;
            -- 是否必选:是;
            -- 注意事项:_用于中断信号,如发送完成、接收完成等事件通知;
            dio1 
         }
数值类型:table
取值范围:符合上述结构的table对象
是否必选:是;
注意事项:引脚配置与具体硬件连接有关;
参数示例:{
            res = pin_reset, 
            busy = pin_busy,
            dio1 = pin_dio1
         }

spiconfig

含义说明:SPI设备配置对象
数值类型:userdata
取值范围:由spi.deviceSetup()返回的SPI设备对象
是否必选:是;
注意事项:需要先调用spi.deviceSetup()创建SPI设备
参数示例:spi_lora = spi.deviceSetup(spi_id,pin_cs,0,0,8,10*1000*1000,spi.MSB,1,0)

返回值

local lora_device = lora2.init(ic, loraconfig, spiconfig)

lora_device

含义说明:lora设备对象
数值类型:userdata / nil
取值范围:初始化成功返回lora设备对象,失败返回nil
注意事项:成功返回lora设备对象,可用于后续所有lora操作
        返回nil表示初始化失败,需检查参数和硬件连接;
返回示例:成功返回:0C7FCFA8
         失败返回:nil
         local lora_device = lora2.init("llcc68", lora_config, spi_lora)
         log.info("lora_device ", lora_device)

示例

-- 初始化SPI设备
local spi_lora = spi.deviceSetup(spi_id,pin_cs,0,0,8,10*1000*1000,spi.MSB,1,0)
-- 初始化LoRa设备
local lora_config = {
    res = pin_reset, 
    busy = pin_busy,
    dio1 = pin_dio1
}
local lora_device = lora2.init("llcc68", lora_config, spi_lora)

4.2 lora_device:set_channel(freq)

功能

设置 lora 设备的通信频道频率;

注意事项

常用频段:433MHz、868MHz、915MHz; 需要确保频率在 lora 设备支持的范围内;

参数

freq

含义说明:通信频率,单位为赫兹(Hz)
数值类型:number
取值范围:无底层限制,取决于具体硬件设备;
         LLCC68/SX1268芯片典型支持范围150MHz - 960MHz
         芯片手册定义了芯片的理论能力范围,手册见第六章;
         lora模块手册才定义了实际产品的可用频率范围
         不同厂商基于同一芯片的模块,支持的频段可能不同;
         实际有效范围请参考具体lora模块的数据手册
是否必选:是;
注意事项:常用频段:433MHz868MHz915MHz
        需要确保频率在lora设备支持的范围内
参数示例:-- 设置433MHz频段,参数需写成433000000
        lora_device:set_channel(433000000)

返回值

示例

-- 设置433MHz频段
lora_device:set_channel(433000000)

4.3 lora_device:set_txconfig(txconfig)

功能

配置 LoRa 设备的发送参数;

注意事项

发送参数配置必须在 lora 设备初始化成功后调用;

配置后需要调用接收配置函数以建立完整通信链路;

参数

txconfig

含义说明:LoRa发送配置参数表table内容格式说明如下
         {
            -- 参数含义:工作模式;
            -- 数据类型:number;
            -- 取值范围:0/1;
            -- 是否必选:否,默认是1:LoRa模式;
            -- 注意事项:0:FSK模式,数据率较高,但传输距离较短,适合短距离高速通信;
            --          1:LoRa模式,适合长距离通信,抗干扰能力强,但数据率较低;
            mode

            -- 参数含义:发射功率;
            -- 数据类型:number;
            -- 取值范围:取决于硬件;
            -- 是否必选:否,默认是22 (单位:dBm);
            -- 注意事项:可参考芯片手册sx1268/llcc68的 4.4 Transmitter 章节部分
            power

            -- 参数含义:频率偏差;
            -- 数据类型:number;
            -- 取值范围:取决于硬件;
            -- 是否必选:否,默认是0;
            -- 注意事项:fdev参数仅在FSK模式下有效(mode=0时),在LoRa模式下设为0;
            --          具体取值可参考芯片手册sx1268/llcc68的 6.2 FSK Modem 章节部分
            fdev

            -- 参数含义:带宽;
            -- 数据类型:number:
            -- 取值范围:LoRa模式:取值范围为 [0, 1, 2], 具体对应关系:
            --              0: 125 kHz
            --              1: 250 kHz
            --              2: 500 kHz
            --           FSK模式下(mode=0)
            --              2600 Hz 至 250000 Hz,
            -- 是否必选:否,默认0;
            -- 注意事项:在FSK模式下,bandwidth参数是直接的频率值,不是枚举值。
            bandwidth

            -- 参数含义:数据速率;
            -- 数据类型:number;
            -- 取值范围:FSK模式 : 600-300000 bits/s(比特每秒)
            --          LoRa模式:6-12(对应扩频因子SF6-SF12)
            --              6: SF6 (64码片/比特)
            --              7: SF7 (128码片/比特)
            --              8: SF8 (256码片/比特)
            --              9: SF9 (512码片/比特)
            --              10: SF10 (1024码片/比特)
            --              11: SF11 (2048码片/比特)
            --              12: SF12 (4096码片/比特)
            -- 是否必选:否,默认9(SF9);
            -- 注意事项:FSK模式:直接设置比特率,影响通信速度和抗噪能力;
            --          LoRa模式:设置扩频因子(SF),决定每个数据比特对应的码片数量;
            --                  扩频因子越高,通信距离越远,抗干扰能力越强,但数据速率越低;
            --                  扩频因子越低,数据速率越高,但通信距离越短;
            datarate

            -- 参数含义:编码率;
            -- 数据类型:number;
            -- 取值范围:0/1/2/3/4
            -- 是否必选:否,默认是4;
            -- 注意事项:LoRa模式 :取值范围为 [1, 2, 3, 4] ,具体对应关系:
            --             1 : 对应编码率 4/5
            --             2 : 对应编码率 4/6
            --             3 : 对应编码率 4/7
            --             4 : 对应编码率 4/8
            --          FSK模式 :不适用,需设置为 0
            coderate

            -- 参数含义:前导码长度;
            -- 数据类型:number;
            -- 取值范围:0-65535;
            -- 是否必选:否,默认4;
            -- 注意事项:LoRa模式 :以符号(symbols)为单位,符号是LoRa调制的基本时间单位,一个符号对应一个完整的Chirp信号周期;
            --          FSK模式 :以字节(bytes)为单位,内部实现会将其转换为比特(bit);
            preambleLen

            -- 参数含义:固定长度模式;
            -- 数据类型:boolean;
            -- 取值范围:true/false;
            -- 是否必选:否,默认是false;
            -- 注意事项:无;
            fixLen

            -- 参数含义:CRC校验使能;
            -- 数据类型:boolean;
            -- 取值范围:true/false;
            -- 是否必选:否,默认是true:
            -- 注意事项:无;
            crcOn

            -- 参数含义:跳频使能;
            -- 数据类型:number;
            -- 取值范围:0/1;
            --          0 :禁用频率跳变功能
            --          1 :启用频率跳变功能
            -- 是否必选:否,默认是0;
            -- 注意事项:该参数仅在LoRa模式(mode=1)下有效,在FSK模式下应设置为0;
            freqHopOn

            -- 参数含义:跳频周期;
            -- 数据类型:number;
            -- 取值范围:0-255;
            -- 是否必选:否,默认是0;
            -- 注意事项:该参数仅在LoRa模式(mode=1)下有效,且仅当freqHopOn=1(启用频率跳变)时才需要设置非零值;
            hopPeriod

            -- 参数含义:IQ反转;
            -- 数据类型:boolean;
            -- 取值范围:true/false;
            -- 是否必选:否,默认是false;
            -- 注意事项:仅在 LoRa 模式下有效,FSK 模式下必须设置为 0;
            iqInverted
         }
数值类型:table
取值范围:符合上述结构的table对象
是否必选:是;
注意事项:参数值需要根据具体应用场景和硬件能力进行调整;
         高发射功率会增加功耗但提高通信距离;
         低数据速率提高通信可靠性但降低吞吐量;
         具体参数含义和取值范围请参考设备数据手册;
         不同lora芯片支持的参数范围可能不同

返回值

示例

-- 配置发送参数
lora_device:set_txconfig(
{
    mode = 1,
    power = 22,
    fdev = 0,
    bandwidth = 0,
    datarate = 9,
    coderate = 4,
    preambleLen = 8,
    fixLen = false,
    crcOn = true,
    freqHopOn = 0,
    hopPeriod = 0,
    iqInverted = false,
    timeout = 3000
})

4.4 lora_device:set_rxconfig(set_rxconfig)

功能

配置 lora 设备的接收参数;

注意事项

接收参数配置必须在 lora 设备初始化成功后调用;

接收参数应与发送端参数匹配才能正常通信;

参数

txconfig

含义说明:LoRa接收配置参数表,table内容格式说明如下
         {
            -- 参数含义:工作模式;
            -- 数据类型:number;
            -- 取值范围:0/1;
            -- 是否必选:否,默认是1:LoRa模式;
            -- 注意事项:0:FSK模式,数据率较高,但传输距离较短,适合短距离高速通信;
            --          1:LoRa模式,适合长距离通信,抗干扰能力强,但数据率较低;
            mode

            -- 参数含义:带宽;
            -- 数据类型:number:
            -- 取值范围:LoRa模式:取值范围为 [0, 1, 2], 具体对应关系:
            --              0: 125 kHz
            --              1: 250 kHz
            --              2: 500 kHz
            --          FSK模式下(mode=0)
            --              2600 Hz 至 250000 Hz,
            -- 是否必选:否,默认0;
            -- 注意事项:在FSK模式下,bandwidth参数是直接的频率值,不是枚举值。
            bandwidth

            -- 参数含义:数据速率;
            -- 数据类型:number;
            -- 取值范围:FSK模式 : 600-300000 bits/s(比特每秒)
            --          LoRa模式:6-12(对应扩频因子SF6-SF12
            --              6: SF6 (64码片/比特)
            --              7: SF7 (128码片/比特)
            --              8: SF8 (256码片/比特)
            --              9: SF9 (512码片/比特)
            --              10: SF10 (1024码片/比特)
            --              11: SF11 (2048码片/比特)
            --              12: SF12 (4096码片/比特)
            -- 是否必选:否,默认9(SF9);
            -- 注意事项:FSK模式:直接设置比特率,影响通信速度和抗噪能力;
            --          LoRa模式:设置扩频因子(SF),决定每个数据比特对应的码片数量;
            --                  扩频因子越高,通信距离越远,抗干扰能力越强,但数据速率越低;
            --                  扩频因子越低,数据速率越高,但通信距离越短;
            datarate

            -- 参数含义:编码率;
            -- 数据类型:number;
            -- 取值范围:0/1/2/3/4
            -- 是否必选:否,默认是4;
            -- 注意事项:LoRa模式 :取值范围为 [1, 2, 3, 4] ,具体对应关系:
            --             1 : 对应编码率 4/5
            --             2 : 对应编码率 4/6
            --             3 : 对应编码率 4/7
            --             4 : 对应编码率 4/8
            --          FSK模式 :不适用,需设置为 0
            coderate

            -- 参数含义:前导码长度;
            -- 数据类型:number;
            -- 取值范围:0-65535;
            -- 是否必选:否,默认4;
            -- 注意事项:LoRa模式 :以符号(symbols)为单位,符号是LoRa调制的基本时间单位,一个符号对应一个完整的Chirp信号周期;
            --          FSK模式 :以字节(bytes)为单位,内部实现会将其转换为比特(bit);
            preambleLen

            -- 参数含义:符号超时;
            -- 数据类型:number;
            -- 取值范围:0-255;
            -- 是否必选:否,默认是0:
            -- 注意事项:symbTimeout 表示接收机在检测到前导码后,等待有效数据包的最大符号数量;
            --          在LoRa模式下,表示以符号为单位的接收超时时间;
            --          在FSK模式下,表示以字节为单位的超时时间;
            symbTimeout

            -- 参数含义:固定长度模式;
            -- 数据类型:boolean;
            -- 取值范围:true/false;
            -- 是否必选:否,默认是false;
            -- 注意事项:无;
            fixLen

            -- 参数含义:载荷长度;
            -- 数据类型:boolean;
            -- 取值范围:0-255;
            -- 是否必选:否,默认是0:
            -- 注意事项:当 fixLen = true (固定长度模式) 时:1-255 字节
            --          当 fixLen = false (可变长度模式) 时:参数值被忽略,使用默认值255;
            payloadLen

            -- 参数含义:CRC校验使能;
            -- 数据类型:boolean;
            -- 取值范围:true/false;
            -- 是否必选:否,默认是true:
            -- 注意事项:无;
            crcOn

            -- 参数含义:跳频使能;
            -- 数据类型:number;
            -- 取值范围:0/1;
            --          0 :禁用频率跳变功能
            --          1 :启用频率跳变功能
            -- 是否必选:否,默认是0;
            -- 注意事项:该参数仅在LoRa模式(mode=1)下有效,在FSK模式下应设置为0;
            freqHopOn

            -- 参数含义:跳频周期;
            -- 数据类型:number;
            -- 取值范围:0-255;
            -- 是否必选:否,默认是0;
            -- 注意事项:该参数仅在LoRa模式(mode=1)下有效,且仅当freqHopOn=1(启用频率跳变)时才需要设置非零值;
            hopPeriod

            -- 参数含义:IQ反转;
            -- 数据类型:boolean;
            -- 取值范围:true/false;
            -- 是否必选:否,默认是false;
            -- 注意事项:仅在 LoRa 模式下有效,FSK 模式下必须设置为 0;
            iqInverted

            -- 参数含义:接收模式;
            -- 数据类型:boolean;
            -- 取值范围:true/false;
            -- 是否必选:否,默认是false;
            -- 注意事项:true=持续接收,false=单次接收;
            rxContinuous
         }
数值类型:table
取值范围:符合上述结构的table对象
是否必选:是;
注意事项:接收参数应与发送端参数匹配才能正常通信;

返回值

示例

-- 配置接收参数
lora_device:set_rxconfig(
{
    mode = 1,
    bandwidth = 0,
    datarate = 9,
    coderate = 4,
    bandwidthAfc = 0,
    preambleLen = 8,
    symbTimeout = 0,
    fixLen = false,
    payloadLen = 0,
    crcOn = true,
    freqHopOn = 0,
    hopPeriod = 0,
    iqInverted = false,
    rxContinuous = false
})

4.5 lora_device:send(data)

功能

发数据

注意事项

  1. 发送数据前必须确保 lora 设备已正确初始化并配置了发送参数;

  2. 数据长度受 lora 协议限制,最大载荷长度为 255 字节;

  3. 发送操作是异步的,发送完成后会触发"tx_done"事件;

  4. 在发送过程中设备会切换到发送模式,完成后自动返回待机模式;

  5. 在发送模式下不能连续调用此接口发送数据,前一次发送完成事件"tx_done"触发后,才能开始下一次发送,需要通过事件回调机制来管理连续的数据发送。

参数

data

含义说明:要发送的数据内容;
数值类型:string
取值范围:任意字符串数据,长度不超过255字节;
是否必选:否;
注意事项:数据长度不应超过LoRa协议的最大限制
         发送前应确保设备处于可发送状态;
参数示例:lora_device:send("PING")

返回值

示例

-- 发送传感器数据 local temperature = 25.6
lora_device:send("TEMP:" .. temperature)

4.6 lora_device:recv(timeout)

功能

启动 lora 设备的数据接收模式,监听并接收来自其他 lora 设备发送的数据;

注意事项

  1. 接收操作是异步的,接收到的数据通过事件回调函数返回;

  2. 接收超时后会触发"rx_timeout"事件;

  3. 成功接收到数据后会触发"rx_done"事件;

  4. 接收过程中发生错误会触发"rx_error"事件;

  5. 调用此函数后设备会切换到接收模式,直到收到数据、超时或发生错误;

参数

timeout

含义说明:接收超时时间,单位毫秒(ms)
数值类型:number
取值范围:无特别限制;
是否必选:否,默认1000
注意事项:timeout=0时,表示一直保持在接收状态,不会因为超时自动退出,只有在接收到数据包或手动调用 lora_device:mode 切换到其他模式时才会退出接收状态;
         timeout0时,LoRa模块会在指定的时间内保持接收状态,如果在这段时间内接收到数据包,会触发"rx_done"回调,如果超过指定时间未收到数据包,则会触发"rx_timeout"回调并退出接收模式;
参数示例:lora_device:recv(1000)

返回值

示例

-- 启动接收,设置1秒超时
lora_device:recv(1000)

4.7 lora_device:mode(mode)

功能

设置 lora 设备的工作模式,用于控制设备的功耗状态和运行状态;

注意事项

在 SLEEP 模式下,通信功能被禁用;

在 STANDBY 模式下,设备处于就绪状态,可以快速切换到发送或接收;

参数

mode

含义说明:lora设备工作模式
数值类型:number
取值范围:lora.SLEEP --休眠模式(低功耗)
         lora.STANDBY --待机模式(正常工作)
是否必选:否,默认lora.STANDBY
注意事项:默认模式为lora.STANDBY
         SLEEP模式下无法进行通信操作
         模式常量值请参考常量详解章节;
参数示例:lora.SLEEP或者lora.STANDBY

返回值

示例

-- 设置设备进入待机模式(默认)
lora_device:mode(lora.STANDBY)
-- 设置设备进入休眠模式(低功耗)
lora_device:mode(lora.SLEEP)

4.8 lora_device:on(cb)

功能

注册 lora 设备的事件回调函数的接口;

注意事项

回调函数中应避免执行耗时操作,以免影响事件处理效率;

参数

cb

参数含义:lora事件回调函数,回调函数的格式为:
         function callback(lora_device, event, data, size)
             log.info("LoRa事件:", event, "数据:", data, "长度:", size)
         end
         该回调函数接收lora_deviceeventdatasize四个参数,在不同事件类型下参数含义有所不同:

         -- 参数含义:LoRa设备对象本身;
         -- 数据类型:userdata;
         -- 取值范围:无限制;
         -- 是否必选:必须传入此参数;
         -- 注意事项:所有事件类型都会传递此参数,可用于在回调中操作设备(如发送数据、重新接收等);
         lora_device

         -- 参数含义:事件类型标识符;
         -- 数据类型:string;
         -- 取值范围:
            "tx_done"     -- 发送完成:数据已成功发送
            "rx_done"     -- 接收完成:成功接收到数据
            "rx_timeout"  -- 接收超时:在指定时间内未收到数据
            "rx_error"    -- 接收错误:接收过程中发生错误
         -- 是否必选:必须传入此参数;
         -- 注意事项:用于标识当前触发的事件类型,是回调函数中判断事件类型的核心依据;
         event

         -- 参数含义:接收到的数据内容;
         -- 数据类型:string;
         -- 取值范围:任意字符串数据;
         -- 是否必选:否,仅在"rx_done"事件中有效,其他事件为nil;
         -- 注意事项:仅在"rx_done"事件中包含实际接收到的数据;
         data

         -- 参数含义:接收到的数据长度;
         -- 数据类型:number;
         -- 取值范围:取决于具体LoRa设备和配置;
         -- 是否必选:否,仅在"rx_done"事件中有效,其他事件为nil;
         -- 注意事项:仅在"rx_done"事件中表示实际接收数据的字节长度;
         --          实际最大值受LoRa设备硬件和协议限制
         size
数据类型:function
取值范围:回调函数本身无取值范围这一说法;
是否必选:必须传入此参数;
注意事项:每次调用会覆盖之前注册的回调函数;
参数示例:function callback(lora_device, event, data, size)
            log.info("LoRa事件:", event, "数据:", data, "长度:", size)
         end

返回值

示例

--[[
event可能出现的值有:
    tx_done     -- 发送完成:数据已成功发送
    rx_done     -- 接收完成:成功接收到数据
    rx_timeout  -- 接收超时:在指定时间内未收到数据
    rx_error    -- 接收错误:接收过程中发生错误
__]]
-- 完整的事件处理示例
function callback(lora_device, event, data, size)
    log.info("LoRa事件:", event, "数据:", data, "长度:", size)
    if event == "tx_done" then-- 发送成功,可以开始接收或进行下一步操作
        log.info("数据发送成功")
        lora_device:recv(1000)
    elseif event == "rx_done" then-- 成功接收到数据,data为字符串,size为数据长度
        log.info("成功接收", size, "字节数据")
    elseif event == "rx_timeout" then-- 接收操作超时,在指定时间内未收到任何数据
        log.info("接收超时,继续监听")
        lora_device:recv(1000)
    elseif event == "rx_error" then-- 接收过程中发生错误,可能因为信号质量差或硬件问题
        log.error("接收过程中发生错误")-- 建议检查硬件连接和信号环境
    else
        log.warn("未知事件类型:", event)
    end
end
-- 注册回调
lora_device:on(callback)

五、产品支持说明

支持 LuatOS 开发的所有产品都支持 lora2 核心库。

六、参考资料

LLCC68 datasheet

SX1268 datasheet