我正在开发一个我想要发现一些UPnP设备的网页,但是客户端可能在与服务器不同的VLAN上.因此,UPnP发现需要在客户端上进行.显然,使用Javascript无法实现UDP.有没有人知道是否有办法从客户端的浏览器进行UPnP发现?
我在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,添加了这个 …
自Android 4.1网络服务发现(NSD)可用.但是,如何找到从计算机或其他不运行android的设备中暴露NSD-Service的Android设备.如示例中所示构建一个Android应用程序会发现其他设备很好,但是,并不总是将Android作为平台.
我在我的电脑上运行UPnP发现,手机没有出现.
你可以在github上找到我在这里实现的NSD-Service .
Discovery应用程序很简单,来自android示例.
UPnP示例使用Cling,并且从他们的教程中找到我的路由器和Windows媒体播放器,所以我认为它有效.
可能是问题是基于服务发现协议的不匹配,我继续对NSD,UPnP,Bonjour,Zeroconf和所有其他可能性之间的差异感到困惑......
我想让用户轻松将NAT上的端口转发到我的C++应用程序的本地机器上.我想在OSX和Windows上做这个工作.Linux将是一个很好的奖励,但Linux用户可能更容易手动转发端口,所以它不是一个问题.LGPL类型代码没问题,但我不能使用任何直接GPL.
我很想听听任何人在这个领域有过的想法或经历,但我想到了一些具体的问题:
我有点好奇我应该如何处理iPhone和两部手机之间的通信问题.
我知道需要在两个已知手机之间发送数据的应用程序.问题是数据可能非常小或非常大.我希望在服务器和消息传递层上有中间存储,但我希望有高性能的方法在设备之间进行通信,以获得更短,不重要的消息.
你总是听说网络和客户端与流行的平台和协议进行客户沟通,但我很好奇人们对与iPhone进行p2p风格通信的想法.
我很确定它应该(并且可以)被视为一个简单的可寻址机器...因此我必须构建NAT遍历网络代码到iPhone本身.我的想法是某种UPnP情况,我会要求NAT特定端口与设备通信......但我想我可以很容易地把它变成轮询情况.
当然,据我所知,Apple最终将为开发人员提供一个"推送"机制,但我希望事先将应用程序推出门外......
只是对这类事情的想法感到好奇......对多人游戏情境的任何想法也会直接适用于(并从中受益)这个问题.
我需要能够发送一个UDP消息,还收到一个以发现从iPhone网络上的SSDP设备.
我知道我需要将数据包发送到多播地址,我的HTTP请求需要看起来像这样:
M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
Man: ssdp:discover
Mx: 3
ST: "urn:schemas-upnp-org:device:InternetGatewayDevice:1"
Run Code Online (Sandbox Code Playgroud)
从阅读的文档,似乎我能做到这一切与CFNetwork的,尽管阅读(并重新读取文档)我奋力上手.任何人都可以推荐和教程或代码片段让我超过最初的学习驼峰吗?
我有CFNetwork编程指南:
http://developer.apple.com/mac/library/documentation/Networking/Conceptual/CFNetwork/CFNetwork.pdf
和Beej的网络编程指南使用互联网套接字:
谢谢
戴夫
PS
在这种情况下,我无法使用任何第三方库和框架.
我正在尝试开发一个Android UPnP应用程序,其中包含一个嵌入式http服务器,因此它可以通过局域网从设备提供媒体文件.
我使用的Web服务器的第一个实现基于来自Apache HttpCore的ElementalHttpServer示例http://hc.apache.org/httpcomponents-core-ga/index.html.它必须稍微更改一下,因为Android库中已包含的org.apache.http元素与httpCore jar中包含的最新元素不同.
我试图用jar中的那些替换那些来自jar的那些但是无法完成 - 安卓库中的那些优先级.当我更改库顺序时,重复的类有问题.
而不是罐子,我包括源代码和更改数据包名称,以避免重复的类问题.
管道损坏和连接问题仍然存在问题.
我也尝试过来自HttpCoreNIO的NHttpServer,因为它具有与基本httpCore不同的类集,可以包含和使用,而不会与Android本身的httpCore冲突.
然后我使用了NanoHTTPD,这似乎是所有http服务器中最好的,但它仍然受到与其他所有服务器相同的问题的困扰:
java.net.SocketException: The connection was reset
at org.apache.harmony.luni.platform.OSNetworkSystem.sendStreamImpl(Native Method)
at org.apache.harmony.luni.platform.OSNetworkSystem.sendStream(OSNetworkSystem.java:498)
at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:585)
at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59)
at com.zappotv.network.http.NanoHTTPD$HTTPSession.sendResponse(NanoHTTPD.java:828)
at com.zappotv.network.http.NanoHTTPD$HTTPSession.run(NanoHTTPD.java:478)
at java.lang.Thread.run(Thread.java:1096)
Run Code Online (Sandbox Code Playgroud)
和
java.net.SocketException: Broken pipe
at org.apache.harmony.luni.platform.OSNetworkSystem.sendStreamImpl(Native Method)
at org.apache.harmony.luni.platform.OSNetworkSystem.sendStream(OSNetworkSystem.java:498)
at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:585)
at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59)
at com.zappotv.network.http.NanoHTTPD$HTTPSession.sendResponse(NanoHTTPD.java:828)
at com.zappotv.network.http.NanoHTTPD$HTTPSession.run(NanoHTTPD.java:478)
at java.lang.Thread.run(Thread.java:1096)
Run Code Online (Sandbox Code Playgroud)
最近我已经在应用程序中实现了iJetty,但问题仍然存在.有时请求设备进入无限循环的请求.
我能做错什么?标题可能有问题吗?
我将把广播频道和IPTV频道整合到我的电视上的一个菜单中.问题是在不同来源之间进行切换是一种痛苦.所以基本上我需要在电视上创建一个菜单来选择我想要观看的频道,然后将电视切换到那个频道.我知道如何创建菜单.
解决方案的另一部分是将ITPV频道从mediaserver推送到电视屏幕.这是一个很难的部分.我最终安装了gupnp并玩它.它工作,我将能够编写应用程序.
您是否想过通过DLNA推送内容的更好解决方案?是否可以从命令行控制命令行实用程序或mediaserver?这将是一个理想的选择.
最基本的问题是如何以编程方式从渲染器上的mediaserver播放资源?
谢谢.
我正在尝试实现一个简单的库,如果应用程序在NAT环境中运行,它可以通过UPnP协议发现路由器.我尝试了两种方式,多播和数据报,用于将发现数据包发送到路由器,并尝试侦听端口1901以获取路由器的响应.但是,我的代码有些问题.我尝试了以下三种方式,只有第三种方式可以正确地从路由器接收响应.我不知道为什么它在第一和第二种方式上都不起作用.
第一个:发送多播数据包,并听取端口1901的响应.
代码:
public void discovery () throws IOException {
// SSDP port
final int SSDP_PORT = 1900;
final int SSDP_SEARCH_PORT = 1901;
// Broadcast address for finding routers.
final String SSDP_IP = "239.255.255.250";
// Time out of the connection.
int TIMEOUT = 5000;
// Localhost address.
InetAddress localhost = InetAddress.getLocalHost();
// Send from localhost:1901
InetSocketAddress srcAddress = new InetSocketAddress(localhost, SSDP_SEARCH_PORT);
// Send to 239.255.255.250:1900
InetSocketAddress dstAddress = new InetSocketAddress(InetAddress.getByName(SSDP_IP), SSDP_PORT);
// ----------------------------------------- //
// Construct the request packet. …Run Code Online (Sandbox Code Playgroud) 我正在尝试向我的电视(Sony Bravia KDL-42W800A)发送命令,通过UPnP播放视频.我可以使用SSDP发现网络上的所有UPnP设备.以下是来自电视的示例回复:
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
EXT:
LOCATION: http://192.168.1.11:52323/dmr.xml
SERVER: Linux/2.6 UPnP/1.0 KDL-42W800A/1.7
ST: urn:schemas-upnp-org:service:AVTransport:1
USN: uuid:00000000-0000-1010-8000-d8d43c73618b::urn:schemas-upnp-org:service:AVTransport:1
X-AV-Physical-Unit-Info: pa="BRAVIA KDL-42W800A";
X-AV-Server-Info: av=5.0; cn="Sony Corporation"; mn="BRAVIA KDL-42W800A"; mv="1.7";
Run Code Online (Sandbox Code Playgroud)
从这里我已经按照位置检索包含电视上更多细节的XML文件.给出如下:
<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0"
xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11"
xmlns:df="http://schemas.microsoft.com/windows/2008/09/devicefoundation">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
<friendlyName>BRAVIA KDL-42W800A</friendlyName>
<manufacturer>Sony Corporation</manufacturer>
<manufacturerURL>http://www.sony.net/</manufacturerURL>
<modelName>KDL-42W800A</modelName>
<modelNumber>MINT1.7.0.1</modelNumber>
<UDN>uuid:00000000-0000-1010-8000-d8d43c73618b</UDN>
<dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMR-1.50</dlna:X_DLNADOC>
<microsoft:magicPacketWakeSupported xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0">1</microsoft:magicPacketWakeSupported>
<iconList>
<icon>
<mimetype>image/png</mimetype>
<width>32</width>
<height>32</height>
<depth>24</depth>
<url>/MediaRenderer_32x32.png</url>
</icon>
<icon>
<mimetype>image/png</mimetype>
<width>48</width>
<height>48</height>
<depth>24</depth>
<url>/MediaRenderer_48x48.png</url>
</icon>
<icon>
<mimetype>image/png</mimetype>
<width>60</width>
<height>60</height>
<depth>24</depth>
<url>/MediaRenderer_60x60.png</url>
</icon>
<icon>
<mimetype>image/png</mimetype>
<width>120</width>
<height>120</height> …Run Code Online (Sandbox Code Playgroud)