Javascript:DLNA客户端

时间:2012-09-09 11:17:17

标签: javascript video upnp dlna

我打算用javascript写一个DLNA(upnp)客户端。我想首先知道这是否可行。

如果是,那我可以从哪里开始?开始时我需要知道什么?任何文档和教程的链接将受到高度赞赏。我试过谷歌搜索,但没有发现很多有用的内容。

我只需要朝着正确的方向努力。

谢谢! :)

3 个答案:

答案 0 :(得分:12)

最佳起点是UPnP论坛docs bundle中的UPnP设备架构文档。这将协议分成许多区域:

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

总而言之,只有在您可以使用本机代码来处理设备发现时,才可能使用JavaScript UPnP客户端。如果您决定尝试此操作,则存在开源UPnP堆栈,以便为您处理大部分发现工作。

答案 1 :(得分:4)

查看Plug.Play.js - 用于与通过W3C网络服务发现API获得的通用即插即用(UPnP)服务进行通信的JavaScript API

https://github.com/rexboy7/plug.play.js

和ssdp.js - (简单服务发现协议)基于W3C Raw Socket API的网络服务发现API实现

https://github.com/schien/ssdp.js

以下是使用上述内容的DLNA客户端的示例实现:https://github.com/mozilla-b2g/gaia/tree/master/tv_apps/dlna-player

答案 2 :(得分:1)

编辑:基于Firefox OS。

环顾这个主题并根据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);
});