6

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

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

我只需要一个正确方向的刺激。

谢谢!:)

4

3 回答 3

13

最好的起点是来自 UPnP 论坛的文档包中的 UPnP 设备架构文档。这将协议拆分为多个区域:

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

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

于 2012-09-10T08:09:59.453 回答
4

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

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

和 ssdp.js - (Simple Service Discovery Protocol) 基于 W3C Raw Socket API 的网络服务发现 API 实现

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

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

于 2015-07-16T21:44:41.127 回答
1

编辑:基于火狐操作系统。

环顾这个主题并根据 André Fiedler 的回答,我发现他发布的库位于MDN webarchiveUDPSocket

在主页中,您可以看到发现示例:

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);
});
于 2016-05-02T01:00:42.833 回答