我正在使用强大的Cling
库来扫描我的网络以获取UPnP设备。我的目标是将一个小的DLNA库浏览器放在一起,这样我就可以学习这项技术。到目前为止,我已经能够1.扫描网络并连接UPnP设备,2。扫描每个远程设备并确定它是否运行了DLNA服务,以及3.浏览已知节点的直接子节点。简而言之,这是我能够运行所有这些的方法:
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服务器的位置,现在我如何获得这些根存储目录?在上面给出的浏览命令中,我必须实际传递一些索引的字符串表示以获得“音乐”或“视频”等。如何获取顶级存储目录,然后如何浏览每个目录?我的目标是至少构建一个简单的浏览器。
答案 0 :(得分: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'的“所有音乐”,我首先请求'0',显示子容器,然后在用户交互时浏览节点'2',然后在用户交互时浏览节点'5',然后选择节点'6',这是我正在寻找的实际文件,并对其执行一些操作。
了解DLNA的工作方式是促进所有这一切的关键。所有重要的东西都通过HTTP提供,UPnP促进了对等体的检测。首先,找到网络上的所有UPnP客户端,然后对所有客户端进行排序并确定哪些客户端正在运行DLNA,然后进行浏览。找到您要找的内容,然后通过HTTP流式播放它。胜利的理论。