You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LuaSocket发送UDP数据固定1900端口失败问题求助

解决Lua UDP固定源端口发送问题(对接亚马逊Echo)

我明白你这两天的困扰——模拟Belkin Wemo开关对接亚马逊Echo时,UDP发送的源端口总是随机的,而Echo只认来自1900端口的回复,确实让人头疼。咱们来一步步解决这个问题:

问题根源分析

你的代码里已经尝试用udp:setsockname('*', 1900)绑定源端口,但后面混用了setpeername和sendto,这会干扰端口绑定的效果。另外,你的HTTP响应字符串缺少正确的换行分隔符,这也是Echo可能忽略回复的潜在原因。

修正后的代码方案

-- 修复1:HTTP头必须用\r\n分隔,最后加空行结束
local strData1 = table.concat({
    'HTTP/1.1 200 OK',
    'HOST: 239.255.255.250:1900',
    'CACHE-CONTROL: max-age=100',
    'EXT:',
    'LOCATION: http://192.168.1.152:49153/description.xml',
    'SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/1.19.0',
    'hue-bridgeid: B8AC6FFFFEC53475',
    'ST: upnp:rootdevice',
    'USN: uuid:2f402f80-da50-11e1-9b23-b8ac6fc53475::upnp:rootdevice',
    ''  -- 必须加空行,标识HTTP头结束
}, '\r\n')

local socket = require "socket"
local udp = socket.udp()

-- 修复2:明确绑定到所有接口的1900端口,添加错误检查
local bind_ok, bind_err = udp:setsockname('0.0.0.0', 1900)
if not bind_ok then
    print("绑定1900端口失败: " .. bind_err)
    return
end

udp:settimeout(0)  -- 保持非阻塞模式

-- 修复3:直接用sendto发送,不使用setpeername(避免连接模式干扰)
local send_ok, send_err = udp:sendto(strData1, '192.168.1.102', 50000)
if not send_ok then
    print("发送数据失败: " .. send_err)
else
    print("成功发送 " .. send_ok .. " 字节数据")
end

关键注意事项

  • HTTP格式必须严格:Echo对UPnP响应的格式要求很高,每个头字段必须用\r\n分隔,最后必须加一个空行,否则会被直接忽略。
  • 避免连接模式UDP:setpeername会将UDP socket转为"连接模式",此时sendto的目标参数会被忽略,还可能破坏端口绑定的效果,直接用无连接的sendto更适合这个场景。
  • 绑定到0.0.0.0:相比*,0.0.0.0更明确地表示绑定到所有网络接口的1900端口,避免因接口识别问题导致绑定失败。

如果还是有问题,建议用Wireshark抓包确认:

  1. 发送的数据包源端口是否为1900
  2. HTTP响应的格式是否符合标准

内容的提问来源于stack exchange,提问作者Prakash.DTI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:26:04