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抓包确认:
- 发送的数据包源端口是否为1900
- HTTP响应的格式是否符合标准
内容的提问来源于stack exchange,提问作者Prakash.DTI
相关产品推荐
相关产品推荐

