2012-09-09 65 views
6

我打算在javascript中编写DLNA(upnp)客户端。我想知道这是否可能在第一位。Javascript:DLNA客户端

如果是,那么我可以从哪里开始?我需要知道什么才能开始?任何文档和教程链接将不胜感激。我试过谷歌搜索,但没有遇到很多有用的内容。

我只是需要在正确的方向刺激。

谢谢! :)

+3

首先你需要研究DLNA是什么,然后把它分解到它的个性化需求,然后看看是否有可能用JavaScript。我的猜测是'不'。但我不确定。 –

+0

可能通过不属于JavaScript的activeX访问 – mplungjan

回答

12

最适合您开始使用的是来自UPnP论坛的docs bundle中的UPnP设备架构文档。这将协议分成若干区域:

  • 发现。这要求能够发送多播UDP数据包并接收单播UDP。你不能从JavaScript做到这一点,所以如果你想搜索网络并提供控制在其上找到的任何设备,就需要一个本地帮助程序来覆盖这部分。或者,如果您已经知道目标设备的地址,则可以跳过本节。
  • 说明。给定设备的地址,获取(http get)xml概述其功能。您可以使用JavaScript轻松完成此操作。
  • 控制。指示给定的设备执行给定的操作。使用http post和soap实现。您可以使用JavaScript轻松完成此操作。
  • 事件。要通知设备状态变化的机制。需要你运行一个tcp服务器,所以不能从完成。幸运的是,这通常是可选的,因为大多数设备服务旨在允许客户轮询状态获取器作为事件的替代。所以,你可以使用JavaScript来做到这一点,尽管你的应用比原生应用效率低。
  • 演示文稿。一些设备提供了允许其控制的网络应用程序。这是托管在浏览器中,所以会使用JavaScript,并且是一个很好的例子,您想要编写的那种控制应用程序是可能的。

总之,只有当您可以使用本机代码来处理设备发现时,JavaScript UPnP客户端才有可能。如果您决定尝试这种方式,那么开放源代码UPnP协议栈可用于处理大部分发现工作。

+0

从我个人的经验来看,事件最好不要依赖现实世界的设备(至少是媒体渲染器)。事件甚至被UPnP规范所禁用,某些值可能具有较高的节奏和/或数据量,如AVTransport.RelativeTimePosition。但是对HTTPMU(Multicast HTTP over UDP)的需求依然存在。 +1全面概述。 –

+0

哇...我不能够感谢你!这让我对UPnP非常了解。非常感谢您的详细解释。 :)我将尽快开始这个项目的工作。 :) – wiseindy

+0

我不认为控制可以发生在浏览器中的JavaScript。这将是CORS请求,除非Upnp服务器配置为处理此问题,否则它将失败。然而,通过节点终端它可以很容易地工作。 – arjun

0

编辑:基于Firefox操作系统。

环顾这个主题,根据AndréFiedler的回答,我发现他发布的图书馆位于MDN的UDPSocket

在主要页面,您可以看到发现例如:

var SSDP_PORT = 1900; 
var SSDP_ADDRESS = "239.255.255.250"; 
var SSDP_DISCOVER_MX = 2; 
var SEARCH_TARGET = "urn:schemas-upnp-org:service:ContentDirectory:1"; 

var SSDP_DISCOVER_PACKET = 
    "M-SEARCH * HTTP/1.1\r\n" + 
    "HOST: " + SSDP_ADDRESS + ":" + SSDP_PORT + "\r\n" + 
    "MAN: \"ssdp:discover\"\r\n" + 
    "MX: " + SSDP_DISCOVER_MX + "\r\n" + 
    "ST: " + SEARCH_TARGET + "\r\n" + 
    "\r\n"; 

var searchSocket = new UDPSocket({ 
    loopback: true 
}); 

searchSocket.joinMulticastGroup(SSDP_ADDRESS); 

searchSocket.onmessage = function (e) { 

    var msg = String.fromCharCode.apply(null, new Uint8Array(e.data)); 

    console.log(msg); 
}; 

searchSocket.opened.then(function() { 

    searchSocket.send(SSDP_DISCOVER_PACKET, SSDP_ADDRESS, SSDP_PORT); 

    setTimeout(function() { searchSocket.close(); }, SSDP_DISCOVER_MX * 1000); 
});