UPnP信封从头开始并没有真正起作用

时间:2013-11-29 16:27:55

标签: autoit upnp

UPnP一直是我想要测试的东西之一,所以我决定用它来做一个没有模糊语言来测试它。 现在我的问题似乎是,我无法在互联网上找到关于UPnP的任何信息,我发现它在UDP上运行并且它使用SOAP信封进行通信,但这就是我能找到的所有信息。 现在我的目标是我希望能够进行动态端口转发,以及稍后可能从我的路由器收集一些信息。 这是我到目前为止测试的代码:

;;This is the UDP Server
;;Start this first

; Start The UDP Services
;==============================================
UDPStartup()

; Register the cleanup function.
OnAutoItExitRegister("Cleanup")

; Bind to a SOCKET
;==============================================
Local $socket = UDPBind("239.255.255.250", 1900)
If @error <> 0 Then
   MsgBox(0, "UDP Fail", @error, 1)
   Exit;
EndIf;

While 1
    Local $data = UDPRecv($socket, 1024)
    If $data <> "" Then
        MsgBox(0, "UDP DATA", $data, 1)
    EndIf
    Sleep(100)
WEnd

Func Cleanup()
    UDPCloseSocket($socket)
    UDPShutdown()
EndFunc   ;==>Cleanup

对于记录,这只是试图收听UPnP通信。 这只会导致我得到错误代码10049,也称为地址不可用。 所以我问亲爱的堆货机,我究竟做错了什么?

1 个答案:

答案 0 :(得分:1)

所以我自己找到了这个问题的解决方案给那些想要玩弄它的人。 UPnP协议显然对它们的设置非常挑剔,因此需要密切关注它的设置方式:

这是发现消息,它需要看起来完全像这样,即使最后有双线移位。然而,ST消息可以被改变,即'ST:ssdp:all'将使它找到所有设备的所有服务,当前的确保只获得root设备数据。发现消息通过UDP发送到端口1900上的多播地址239.255.255.250。

  

$ strUpnpDiscover ='M-SEARCH * HTTP / 1.1'&amp; @CRLF&amp; '主办:   239.255.255.250:1900'&amp; @CRLF&amp; 'ST:upnp:rootdevice'&amp; @CRLF&amp; 'MAN:'ssdp:发现''&amp; @CRLF&amp; 'MX:10'&amp; @CRLF&amp; @CRLF

现在,为了从root设备接收回复,您需要设置一个用于发送命令的源端口的侦听器,因为这会有所不同,您需要从端口对象获取它或使用一个shell命令来获取数据,就像这样(@autoitpid获取程序的父ID):

$netstat = _getDOSOutput("netstat -aonp udp")
$sourceport = StringReplace(StringMid($netstat, StringInStr($netstat, '*:*' & @AutoItPID)-5, 5), ':' , '')

但是一旦你得到这个端口,你所要做的就是为网络接口上找到的端口设置UDP监听器,你将收到UPnP单元的响应。

现在收到回复后,有关如何与设备通信和更改设置的所有数据都将在您收到的数据中,查找

LOCATION: http://192.168.1.1:49152/wps_device.xml

此网址将包含您设备的数据表。从这里开始,只需要制定一个合适的SOAP信封,让设备进行恶作剧竞标。 :P

有关如何构建SOAP信封的更多信息,请参阅此处:http://www.upnp-hacks.org/upnp.html

我希望这些东西能真正帮助其他想要构建轻量级UPnP端口转发接口的人。 :)