luasocket 发送UDP数据从端口1900

我正在尝试从我的家庭自动化控制器模拟Belkin wemo开关,以便从亚马逊Echo发送语音命令。该控制器支持lua语言。

我正在跟进此[file](https://media.readthedocs.org/pdf/fauxmo/latest/fauxmo.pdf)从控制器的端口1900发送UDP数据到Echo的端口50000。现在,每次我发送数据时,套接字都会获取随机端口发送数据,而不是从端口1900发送。只有当数据来自端口1900时,Echo才会建立有效连接并回复。我头疼了两天,但还没有搞清楚。

下面是我的代码。

strData1 =
  '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'

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

 udp:settimeout(0)
 udp:setsockname('*', 1900)
 udp:setpeername('192.168.1.102', 50000) -- Echo IP and Port number
 udp:sendto(strData1,'192.168.1.102',50000)
点赞
用户51760
用户51760

你已经接近成功了:文档说明在使用 setpeername 时必须使用 send,而不能使用 sendto

我猜这可能是一个打字错误,但你试图发送的是 Data 而不是 strData1。这是已更正的版本:

strData1 =
  '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'

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

 udp:settimeout(0)
 udp:setoption('reuseaddr',true)
 udp:setsockname('*', 1900)
 udp:setpeername('192.168.1.102', 50000) -- 回显 IP 和端口号
 udp:send(strData1)

Tcpdump 捕获的显示源端口正确:

22:40:45.653222 IP my.super.secret.ip.1900 > 192.168.1.102.50000: UDP, length 280

2018-01-27 21:42:02