跳转至

32 udpsrv-UDP服务器

作者:王世豪 | 最后修改:2026-03-10

一、概述

udpsrv 是 LuatOS 提供的一个 UDP 服务器扩展库,用于创建和管理 UDP 网络服务。该库允许开发者在设备上创建 UDP 服务器,监听指定端口,实现基于 UDP 协议的网络通信功能。

在 ram 资源足够的情况下:

1、Air780 系列/Air8000 系列的模组,允许创建的同时存在的 udp server 对象数量为 64 个;

2Air8101 系列的模组,允许创建的同时存在的 udp server 对象数量为 32 个;

UDP 协议本身是无连接的,这意味着任何在同一局域网下的客户端都可以向服务器的 IP 和端口发送数据包。

二、核心

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

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

  3. 更加完整和详细的 demo,请参考 LuatOS 仓库 中支持充电管理的产品目录下的 demo/socket/server;

function udpsrv_task()
    sys.waitUntil("IP_READY")
    local mytopic = "my_udpsrv"

    -- 创建UDP服务器,监听12345端口
    -- 注意, udpsrv.create有3个参数, 最后一个参数是网络适配器编号
    local udpsrv = udpsrv.create(12345, mytopic)
    -- 若需要在AP监听,则需要指定编号
    -- local udpsrv = udpsrv.create(12345, mytopic, socket.LWIP_AP)

    if udpsrv then
        -- 单播
        udpsrv:send("I am UP", "192.168.1.5", 777)
        -- 广播
        udpsrv:send("I am UP", "255.255.255.255", 777)
        while true do
            -- 等待接收数据,超时时间15秒
            local ret, data, remote_ip, remote_port = sys.waitUntil(mytopic, 15000)
            if ret then
                log.info("udpsrv", "收到数据", data:toHex(), remote_ip, remote_port)
                -- 按业务处理收到的数据
            else
                log.info("udpsrv", "没数据,那广播一条")
                udpsrv:send("I am UP", "255.255.255.255", 777)
            end
        end
    else
        log.info("udpsrv", "启动失败")
    end
    -- 如果关闭,调用
    -- udpsrv:close()
end

sys.taskInit(udpsrv_task)

三、常量详解

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

  2. udpsrv 扩展库本身没有定义常量,但在创建 UDP 服务器时可使用 socket 核心库中的网络适配器类型常量。

四、函数详解

4.1 udpsrv.create(port, topic, adapter)

功能

创建 UDP 服务器并开始监听指定端口;

注意事项

1、创建 UDP 服务器前需要确保网络已就绪("IP_READY");

2、若需要在 AP/STA/ETH 监听,则需要指定适配器编号;

AP 模式(Access Point):

  • 在此模式下,设备作为一个 WiFi 热点,允许其他设备连接到此热点。

  • 当设备作为 TCP/UDP 服务器时,它会在热点的 IP 地址上监听端口。其他连接到该热点的设备可以作为客户端连接到此服务器。

STA 模式(Station):

  • 在此模式下,设备连接到现有的 WiFi 网络,作为该网络的一个站点。

  • 设备作为 TCP/UDP 服务器时,它会使用从路由器获取的 IP 地址(或静态 IP)来监听端口。同一网络下的其他设备可以通过这个 IP 和端口连接到此服务器。

ETH 模式(Ethernet):

  • 在此模式下,设备通过有线以太网连接网络。

  • 设备作为 TCP/UDP 服务器时,使用有线网络分配的 IP 地址(或静态 IP)来监听端口。通过有线网络可达的设备可以连接到此服务器。

3、创建的 UDP 服务器可以通过 sys.waitUntil 接收数据,接收到的数据会通过指定的 topic 传递;

参数

port

含义说明:UDP服务器监听的端口号
数值类型:number
取值范围:0-65525
是否必选:是;
注意事项:端口号不能和其他服务冲突;
参数示例:udpsrv.create(12345, "my_topic")

topic

含义说明:接收UDP数据的消息主题
数值类型:string
取值范围:任意有效的字符串;
是否必选:是;
注意事项:该topic用于通过sys.waitUntil接收数据
参数示例:udpsrv.create(12345, "my_topic")

adapter

含义说明:网络适配器编号;
数值类型:number
取值范围:可选值为[socket 核心库](https://docs.openluat.com/osapi/core/socket/)中的网络适配器类型常量;
是否必选:否;
注意事项:默认为nil,使用默认网络适配器;
参数示例:-- 默认
         udpsrv.create(12345, "my_topic")
         -- 使用socket.LWIP_AP
         udpsrv.create(12345, "my_topic"socket.LWIP_AP)

返回值

local udpsrv_object = udpsrv.create(port, topic, adapter)

udpsrv_object

含义说明:UDP服务器对象
数据类型:table
取值范围:成功返回table对象,失败返回nil
注意事项:返回的对象具有send和close等方法
返回示例:成功返回table对象table: 0C7F56F0
         失败返回:nil

示例

-- 创建UDP服务器监听12345端口
 local udpsrv = udpsrv.create(12345, "udp_topic")
 if udpsrv then
     log.info("udpsrv", "服务器创建成功")
     -- 发送广播消息
     udpsrv:send("Hello", "255.255.255.255", 8888)
 else
     log.info("udpsrv", "服务器创建失败")
 end

4.1 udpsrv:send(data, ip, port)

功能

通过 UDP 服务器发送数据到指定地址。

注意事项

此方法只能在 UDP 服务器创建成功后调用,确保 udpsrv 已经创建成功(非 nil);

udpsrv:send(data, ip, port) 的 udpsrv 是通过 udpsrv.create()接口创建后,返回的 UDP 服务器对象;

支持单播和广播两种发送方式;

广播发送时,IP 地址应设置为"255.255.255.255";

参数

data

含义说明:要发送的数据内容;
数值类型:string
取值范围: 0-1460字节;
是否必选:是;
注意事项:无;
参数示例:udpsrv:send("I am UP", "192.168.3.23", 50000)

ip

含义说明:目标IP地址
数值类型:string
取值范围:合法的IPv4地址格式
是否必选:是;
注意事项:支持单播地址和广播地址
参数示例:udp_srv:send("Hello Server", "192.168.1.100", 8888) --单播
         udp_srv:send("Broadcast Message", "255.255.255.255", 9999) --广播

port

含义说明:目标端口号;
数值类型:number
取值范围:0-65535
是否必选:是;
注意事项:目标端口号必须与接收方监听的端口一致
参数示例:udp_srv:send("Hello Server", "192.168.1.100", 8888) --目标端口号为8888

返回值

local result = udpsrv:send(data, ip, port)

result

含义说明:是否成功执行发送操作;
数据类型:boolean
取值范围:true或false
注意事项:true表示协议栈已经执行了数据发送动作
         false表示出现错误,没有执行数据发送动作;
返回示例:-- 单播发送数据
         local result = udpsrv:send("Hello Server", "192.168.1.100", 8888)
         log.info("是否成功执行发送动作", result)

示例

-- 单播发送数据
local result = udpsrv:send("Hello Server", "192.168.1.100", 8888)
if not result then
    log.info("数据发送动作执行失败")
end

-- 广播发送数据
local result = udpsrv:send("Broadcast Message", "255.255.255.255", 9999)
if not result then
    log.info("数据发送动作执行失败")
end

4.1 udpsrv:close()

功能

关闭 UDP 服务器,释放相关资源;

注意事项

此方法只能在 UDP 服务器创建成功后调用,确保 udpsrv 已经创建成功(非 nil);

udpsrv:close() 的 udpsrv 是通过 udpsrv.create()接口创建后,返回的 UDP 服务器对象;

关闭后,UDP 服务器将停止监听端口,无法再通过该服务器发送或接收数据;

参数

返回值

示例

-- 创建UDP服务器监听12345端口
local udpsrv = udpsrv.create(12345, "udp_topic")
-- 使用服务器进行通信
...
-- 关闭服务器
udpsrv:close()

五、产品支持说明

支持 LuatOS 开发的所有产品都支持 udpsrv 扩展库。