我正在寻找一个Python 的UPnP客户端的开源实现,更具体地说是它的Internet网关设备(IGD)部分.
目前,我只能在PyMediaServer,PyMedS,BRisa或Coherence等项目中找到UPnP媒体服务器实现.
我确信我可以使用这些代码库作为开始,但媒体服务器部分将引入不必要的复杂性.
那么你能推荐一个客户端UPnP(希望是IGD)Python库吗?另一种方法是将调用调用到诸如MiniUPnP之类的C库,但我更喜欢纯Python实现.
更新:StackOverflow上提供了一个有趣的SSDP和UPnP相关讨论.
我正在尝试编写一些使用UPnP进行NAT遍历的代码(仅供家庭使用),使用C#4和Microsoft的基于COM的NAT遍历API(Hnetcfg.dll).
不幸的是(或者幸运的是)我最后一次在.NET中使用COM互操作是在最后一个冰河时代的某个时候,我似乎对C#使用动态类型进行互操作以及如何编写回调感到困惑(所以COM服务器调用我的托管代码).
这是令人兴奋的几行代码:
// Referencing COM NATUPNPLib ("NATUPnP 1.0 Type Library")
using System;
using NATUPNPLib;
class NATUPnPExample
{
public delegate void NewNumberOfEntriesDelegate(int lNewNumberOfEntries);
public static void NewNumberOfEntries(int lNewNumberOfEntries)
{
Console.WriteLine("New number of entries: {0}", lNewNumberOfEntries);
}
public static void Main(string[] args)
{
UPnPNAT nat = new UPnPNAT();
NewNumberOfEntriesDelegate numberOfEntriesCallback = NewNumberOfEntries;
nat.NATEventManager.NumberOfEntriesCallback = numberOfEntriesCallback;
nat.StaticPortMappingCollection.Add(4555, "TCP", 4555, "192.168.0.1", true, "UPnPNAT Test");
// Presumably my NewNumberOfEntries() method should be called by the COM component about now
nat.StaticPortMappingCollection.Remove(4555, "TCP");
} …Run Code Online (Sandbox Code Playgroud) 免责声明: 我在这里仔细阅读了所有类似主题,并进行了谷歌搜索.没有回答我的问题,所以我想在这个主题中积累信息.PS我的英语可能不太好,抱歉.
我想制作一个p2p应用程序(游戏).显然很多人会在一台机器上运行这个程序,这台机器是本地网络的一部分,有一个互联网接入点(路由器),如果没有端口转发,应用程序就无法运行.所以,我做了一项研究,发现我可以使用UPnP进行自动端口转发.编写微测试代码以访问端口转发:
bool CPortController::Init() {
HRESULT result = CoInitialize(NULL); // Must be NULL
if (FAILED(result)) return false;
result = CoCreateInstance(__uuidof(UPnPNAT), NULL, CLSCTX_ALL, __uuidof(IUPnPNAT), (void **)&Nat);
if (FAILED(result) || !Nat) return false;
result = Nat->get_StaticPortMappingCollection(&Collection);
if (FAILED(result) || !Collection) return false; // Here I'm getting S_OK as result, but Collection is always == 0
return true;
}
Run Code Online (Sandbox Code Playgroud)
搜索到的原因(参见代码注释)发现我发现:1.旧系统(不,我有Win7更新)2.路由器可能没有UPnP功能或者可能没有启用3.防火墙可能阻塞TCP端口2869或UDP端口1900都是UPnP所需的
可悲的是,我没有访问路由器来检查最后2,但它并不重要,因为Skype和uTorrent(两个p2p)完美运行.我需要找到使用我的应用程序自动执行相同技巧和转发端口的方法,而无需要求用户执行任何操作.
关于UPnP库: 我发现很少有UPnP库(PlatinumUPnP,miniUPnP),但他们似乎有很多代码可以找到智能设备并将它们组合在一起......呃...我不确定我需要这个完成我的任务,我找不到一段代码(不使用上面列出的那些WinUPnPAPI)进行自动端口转发.
我现在有点迷路了.谁能告诉我继续研究的方向?也许除了UPnP还有别的东西吗?也许有一个lib(我错过了)使用?请点亮一些光.先感谢您.
我正在尝试实现我自己的UpNP扫描,它主要是工作,并且为了证明这不是我,我有一个Windows程序,允许您发送数据包,看看有什么响应回来.
我正在向239.255.255.250端口发送数据包1900,我发送以下数据:
M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
Man: "ssdp:discover"
MX: 10
ST: ssdp:all
Run Code Online (Sandbox Code Playgroud)
只是为了进一步的信息,在我的Java代码(Android)中,我有以下内容,但我得到与数据包测试器应用程序相同的响应:
try
{
byte[] sendData = new byte[1024];
//byte[] receiveData = new byte[1024];
byte[] receiveData;
String mSearch = "M-SEARCH * HTTP/1.1\r\nHost: 239.255.255.250:1900\r\nMan: \"ssdp:discover\"\r\nMX: 10\r\nST: ssdp:all\r\n\r\n";
sendData = mSearch.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("239.255.255.250"), 1900);
DatagramSocket clientSocket = new DatagramSocket();
clientSocket.send(sendPacket);
while (keepGoing)
{
receiveData = new byte[1024];
receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String response = new String(receivePacket.getData());
if (response == …Run Code Online (Sandbox Code Playgroud) 我是否正确地认为如果我符合DLNA 1.5,我实施了UPnP AV?除了指定最低格式要求外,DLNA还能得到什么?DLNA不是建立在UPnP之上吗?我确信DLNA设备发现完全基于SSDP(UPnP的设备发现协议).DLNA是否在内容发现或内容交付规范中添加了一些内容?
例如,Boxee和XBMC都支持UPnP - 它们不适用于所有DLNA设备吗?
我想创建一个通过uPNP管理Windows计算机的iPhone应用程序.Windows计算机将是我控制的设备,iPhone将成为控制器.
我几乎把它缩小到uPNP作为我的选择解决方案,Platinum uPNP就是图书馆.我的问题是,我该如何实现呢?是否有一个简单的教程或示例源代码,用于使用Platinum uPNP创建iPhone uPNP控制点?(或任何其他图书馆)
我正在制作一个Python应用程序,要求用户将端口转发到他的计算机,以便与服务器或其他用户进行通信.当前的实现工作非常好,但唯一的事情是运行该文件的人必须手动将端口转发到本地IP.我想自动化这个.他选择一个端口,脚本检查是否可以转发,然后转发它.如果不能,则分别处理错误.
我已经研究了一些声称可以在纯Python中执行此操作的库(因为我需要在完成后编译为.exe的[...])但是却找不到有用的东西.如果您可以向我提供有关如何尝试转发端口并分别处理成功/失败的代码示例,那将非常棒.
在此先感谢您的时间.
PS:我的目标是Python 2.7.X
我正在浏览DIAL的功能,发现它与UPnP非常相似,实际上它使用UPnP协议进行设备发现(SSDP).
什么拨号提供,实际上是UPnP协议的子集,不是吗?我们不能使用UPnP的SOAP进行内容共享和通信(启动应用程序)而不是DIAL吗?
我没有清楚地了解DIAL适合软件堆栈的情况(如果我已经支持UPnP).
请帮我清除我的困惑.
我在Raspberry Pi上有一个DLNA服务器(可以使用miniDLNA).我有另一个带有Web服务器的Raspberry Pi(使用nGinx).
我想在Web服务器上使用我的PHP代码获取有关我的DLNA服务器的信息(扫描DLNA服务器,获取文件列表等).
我怎样才能做到这一点?是否可以在PHP中与DLNA通信?
注意:我发现了这个:https://github.com/jalder/UPnP但它不再更新,它不适用于miniDLNA 1.1.2(Jessie).另外我想自己做!
我在Raspberry Pi上安装了RaspBMC,在Window笔记本电脑上安装了XBMC,在我的Android设备上安装了UPnPlay.Raspberry Pi始终处于打开状态,旨在充当系统的服务器.
IP地址涉及:
192.168.0.18:RPi
192.168.0.13:笔记本电脑
192.168.0.1:路由器
当我将Android设备连接到WiFi并打开UPnPlay或在笔记本电脑上启动XBMC时,之前在Raspberry Pi出现在设备列表中之前会有5-10分钟的延迟.然而,在过去的几周里,除非我在其他服务(XBMC或UPnPlay)运行时重启它,否则Pi根本不会出现.我可以ssh和sftp到Pi,并且可以从两个设备访问RaspBMC的Web界面,没有任何问题.
是否可能以某种方式丢失或阻止UPnP网络发现/通知消息?我该怎么调查这个?我对网络的了解仅限于端口转发.
我对UPnP的替代协议的建议持开放态度 - 我遇到的第一个很简单,它在我之前的设置(桌面上的XBMC将媒体发送到Apple TV)上工作得很好.
编辑:
在笔记本电脑上使用Wireshark进行的一些分析显示笔记本电脑的行为符合预期 - 通过SSDP定期发送M-SEARCH和NOTIFY数据包到239.255.255.250(我认为是多播地址).但是,RPi不仅没有响应这些带有单播数据包的数据包(正如维基百科建议的那样),而且除了在启动时它也没有发送任何SSDP数据包.
我对Wireshark和网络分析一般都很陌生,但我真的很感激你能给出的任何指导或建议.
我使用的Wireshark过滤器是"(udp.dstport == 1900或ip.addr == 192.168.0.18)和!(ip.src == 192.168.0.1)",其中192.168.0.18是我的RPi地址 - 我相信这是正确的,但正如我所说,我对Wireshark很新 - 请纠正我,如果我犯了错误!特别是,我假设RPi对M-SEARCH的多播响应会有ip.src = 192.168.0.18,但我不确定(可能是192.168.0.1或239.255.255.250)
编辑2:
在这篇文章的指导下,我跑了/sbin/route -n,并获得了以下输出.
pi@raspbmc:~$ /sbin/route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Run Code Online (Sandbox Code Playgroud)
我不知道如何解释这个,但是,从链接线程中的其他注释来看,这似乎缺少多播条目.再一次,根据链接线程的建议,我运行sudo route add -net 239.0.0.0 netmask 255.0.0.0 eth0,添加了这个 …
upnp ×10
dlna ×2
python ×2
.net ×1
android ×1
c#-4.0 ×1
c++ ×1
com ×1
idispatch ×1
iphone ×1
java ×1
nat ×1
networking ×1
philips-hue ×1
php ×1
python-2.7 ×1
raspberry-pi ×1
windows ×1
xbmc ×1