Javascript:DLNA 客户端

Posted

技术标签:

【中文标题】Javascript:DLNA 客户端【英文标题】:Javascript: DLNA client 【发布时间】:2012-09-02 13:09:25 【问题描述】:

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

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

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

谢谢! :)

【问题讨论】:

首先您需要研究 DLNA 是什么,然后将其分解为个人需求,然后看看是否可以使用 JavaScript。我的猜测是“不”。但我不确定。 可能通过不是 JavaScript 的 activeX 访问 【参考方案1】:

您的最佳起点是 UPnP 论坛docs bundle 中的 UPnP 设备架构文档。这将协议分为多个领域:

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

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

【讨论】:

根据我的个人经验,事件最好不要依赖于现实世界的设备(至少是媒体渲染器)。 UPnP 规范甚至对某些可能具有高节奏和/或数据量的值禁用事件,例如 AVTransport.RelativeTimePosition。但是对 HTTPMU(基于 UDP 的多播 HTTP)的需求仍然存在。 +1 以获得全面的概述。 哇...我感激不尽!这让我对 UPnP 有了非常深刻的了解。非常感谢您的详细解释。 :) 我很快就会开始这个项目的工作。 :) 我认为浏览器中的 Javascript 无法进行控制。这将是一个 CORS 请求,除非 Upnp 服务器配置为处理此请求,否则它将失败。但是通过节点终端它可以很容易地工作。 @arjun 浏览器(或其 IP)既是请求 UPnP 演示页面的域,又是执行 POST 请求以调用 UPnP 设备上的操作的域。许多 UPnP 设备提供的演示页面正是以这种方式工作的。 @simonc 因为它们被配置为Access-Control-Allow-Origin: *。但不是所有的。不是大多数。有一些解决方法,例如启动充当客户端和设备之间网关的服务器。你知道它是如何工作的吗?【参考方案2】:

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

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

和 ssdp.js -(简单服务发现协议)基于 W3C 原始套接字 API 的网络服务发现 API 实现

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

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

【讨论】:

【参考方案3】:

编辑:基于 Firefox OS。

环顾这个主题并根据 André Fiedler 的回答,我发现他发布的库位于 MDN webarchive 的 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);
);

【讨论】:

当前UPDSocket MDN 链接已损坏,它指向此错误:bugzilla.mozilla.org/show_bug.cgi?id=745283

以上是关于Javascript:DLNA 客户端的主要内容,如果未能解决你的问题,请参考以下文章

DLNA简介

探索Javascript异步编程

在哪里可以找到完整的 DLNA 规格?

我在哪里可以找到DLNA的完整规格?

UPnP 发现可以通过 Javascript 完成吗?

用于 Javascript/JSON 的 ORM