2012-09-09 24 views
6

Estoy planeando escribir un cliente DLNA (upnp) en javascript. Me gustaría saber si esto es posible en primer lugar o no.Javascript: cliente DLNA

En caso afirmativo, ¿dónde puedo comenzar? ¿Qué necesito saber para comenzar? Los enlaces a cualquier documentación y tutoriales serán muy apreciados. Intenté usar Google, pero no encontré mucho contenido útil.

Solo necesito un prod en la dirección correcta.

Gracias! :)

+3

En primer lugar es necesario investigar lo que es DLNA, a continuación descomponerlo a su necesidades individuales, y luego ver si es posible con JavaScript. Mi conjetura es 'no'. Pero no estoy seguro. –

+0

Posiblemente accesible a través de activeX que no es JavaScript – mplungjan

Respuesta

12

El mejor lugar para comenzar es el doc de la arquitectura del dispositivo UPnP en el docs bundle del foro UPnP. Esto divide el protocolo en varias áreas:

  • Discovery. Esto requiere la capacidad de enviar paquetes UDP de multidifusión y recibir UDP unicast. Usted no puede hacer esto desde JavaScript, por lo que requeriría una aplicación de ayuda nativa para cubrir esta parte si desea buscar en una red y ofrecerle controlar cualquier dispositivo que se encuentre en ella. Alternativamente, puede omitir esta sección si de alguna manera ya sabe la dirección de su dispositivo de destino.
  • Descripción. Dada una dirección para un dispositivo, obtenga (http get) un resumen xml de sus capacidades. Puedes hacerlo fácilmente desde JavaScript.
  • Control. Instruir a un dispositivo determinado para llevar a cabo acciones determinadas. Implementado usando http post y soap. Puedes hacerlo fácilmente desde JavaScript.
  • Eventing. Un mecanismo para estar informado de los cambios en el estado del dispositivo. Requiere que ejecute un servidor tcp para que no se pueda hacerse desde JavaScript. Afortunadamente, esto a menudo es opcional, ya que la mayoría de los servicios de los dispositivos están diseñados para permitir a los clientes sondear a los captadores de estado como una alternativa al evento. Por lo tanto, puede hacer esto desde JavaScript, aunque su aplicación será menos eficiente que una nativa.
  • Presentación. Algunos dispositivos proporcionan una aplicación web que les permite su control. Está alojado en un navegador, por lo que usará JavaScript y es un buen ejemplo de que es posible el tipo de aplicación de control que desea escribir.

En resumen, un cliente de JavaScript UPnP solo es posible si puede usar el código nativo para manejar la detección de dispositivos. Si decides probar esto, existen pilas UPnP de fuente abierta para que te hagan la mayor parte del trabajo de descubrimiento.

+0

Desde mi experiencia personal, es mejor no contar con eventos para los dispositivos del mundo real (al menos reproductores de medios). Eventing incluso está deshabilitado por la especificación UPnP para ciertos valores que tienen una alta cadencia y/o cantidad de datos, como AVTransport.RelativeTimePosition. Pero la necesidad de HTTPMU (multidifusión HTTP sobre UDP) se mantiene. +1 para una descripción completa. –

+0

Wow ... ¡No puedo agradecerle lo suficiente! Esto me dio una gran idea de UPnP. Muchas gracias por tu explicación detallada. :) Pronto comenzaré a trabajar en este proyecto. :) – wiseindy

+0

No creo que el control pueda ocurrir desde Javascript en el navegador. Sería una solicitud CORS y, a menos que el servidor Upnp esté configurado para manejar esto, simplemente fallaría. Sin embargo, a través del terminal de nodo puede funcionar fácilmente. – arjun

4

Tome un vistazo a Plug.Play.js - Un API de JavaScript para la comunicación con Universal Plug and Play Services (UPnP) obtenidos a través de la API de W3C red de descubrimiento de servicios

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

Y ssdp.js - (ssdp) una aplicación API de red de descubrimiento de servicios basado en la API de W3C Raw Socket

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

Y aquí es un ejemplo de implementación de un DL Cliente NA que utiliza lo anterior: https://github.com/mozilla-b2g/gaia/tree/master/tv_apps/dlna-player

0

EDITAR: Basado en Firefox OS.

Mirando alrededor de este tema y basado en la respuesta de André Fiedler encontré que las bibliotecas que publicó sobre reside en UDPSocket de MDN.

En la página principal se puede ver el ejemplo de descubrimiento:

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); 
}); 
Cuestiones relacionadas