2012-09-09 93 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); 
});