2011-02-03 23 views
7

我正在使用真棒Cling库扫描我的网络以查找UPnP设备。我的目标是拼凑一个DLNA库浏览器,以便我可以学习这项技术。到目前为止,我已能够1.扫描网络并获得连接的UPnP设备,2.扫描每个远程设备并确定它是否运行DLNA服务,以及3.浏览已知节点的直接子节点。总之,这是我的方法,它能够运行所有这一切:在Cling中获取所有DLNA根存储目录?

public void remoteDeviceAdded(Registry registry, RemoteDevice device) { 
     logger.debug("remote device added: {}[{}]", device.getDetails().getFriendlyName(), 
      device.getType().getType()); 

     if (device.getType().getType().equals("MediaServer")) {   
      for (RemoteService service : device.getServices()) { 
       if (service.getServiceType().getType().equals("ContentDirectory")) { 
//    '1' is Music, '2' is Video, '3' is Pictures 
        this.service.getControlPoint().execute(new Browse(service, "3", BrowseFlag.DIRECT_CHILDREN) { 
         @Override public void received(ActionInvocation arg0, 
           DIDLContent didl) { 
          logger.debug("found {} items.", didl.getItems().size()); 
         } 

         @Override public void updateStatus(Status arg0) { }; 

         @Override public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) { }; 
        }); 
       } 
      } 
     } 
    } 

我知道,它可能看起来像一个乌七八糟,它是,但它的工作原理:)当我放到一个调试器,我可以看到我有什么。但是,与指南here的说明不同,我没有找回任何实际的媒体项目,只是浏览结果中的存储目录。这种有意义的,因为DLNA组织到的东西,像这样一个层次结构:

Music 
    All Music 
    Artists 
     Fleetwood Mac 
     ... 
    Albums 
    ... 
Video 
    All Video 
    Folders 
... 

我的问题是,什么是浏览这些文件夹,并通过层次攀登最简单的方法?我已经处于连接到我正在寻找的UPnP DLNA服务器的地步,现在我该如何获得这些根存储目录?在上面给出的浏览命令中,我必须实际传递一些索引的字符串表示以获得“音乐”或“视频”等。如何获取最高级别​​的存储目录,然后如何浏览这些目录中的每一个?我的目标是至少建立一个简单的浏览器。

回答

8

好吧,事实证明,由于Cling邮件列表上的一些帮助,我可以回答自己的问题。

显然,DLNA中的所有元素都有一个唯一的ID号,您可以通过它在Cling中引用它们。为了获取/,必须请求节点“0”。为了访问/../(比顶部!更高一步),您可以请求节点“-1”。由于DLNA规范不存在在这个问题上毫无价值,这只是惯例而已。所以,请求节点“0”真的应该让你成为最顶级的节点,但谁知道?它可能会让你变成一只红鲱鱼或一只狂妄的驼鹿或世界末日。风险就是我们为之而活的,对吧?

在任何情况下,DLNA“文件系统”之类的作品是这样的:

/[0] 
    Browse Folders/[1] 
    Music/[2] 
     All Music/[5] 
      Heart Is Hard To Find[6] 
      ... 
     ... 
    Pictures/[3] 
    Video/[4] 

因此,如果我想顺序浏览我的方式为“所有音乐”,这是节点“5”,I”首先请求'0',显示子容器,然后在用户交互时浏览到节点'2',然后在用户交互中浏览到节点'5',然后选择节点'6',这是我正在寻找的实际文件,并对其执行一些操作。

了解DLNA的工作方式是促进所有这些的关键。所有重要的东西都通过HTTP提供,通过UPnP协助检测对等点。首先,找到您的网络上的所有UPnP客户端,然后对所有客户端进行排序,并确定哪些客户端正在运行DLNA,然后进入浏览。找到你要找的东西,然后通过HTTP流式播放它。赢得理论。

+1

您是如何在获得该物品后成功获取文件列表的?我有容器,但getItems()总是空的。 – Nifhel 2013-09-19 15:45:10