使用zeroconf区分多个服务的正确方法

时间:2014-01-10 19:18:33

标签: bonjour zeroconf

我正在编写一个可以在计算机和手机上运行的软件。

该服务使用HTTP API进行通信,并将使用Zeroconf在本地网络上发布。

最初我使用_http._tcp.作为服务类型发布了我的服务,但我很快发现我的NAS和我的音乐接收器(!)也使用这种确切的服务类型进行广播。

所以现在出现的问题是如何区分我的服务和使用HTTP的其他服务。

替代

使用其他服务类型

肯定是最简单的方式,而且(几乎)保证不会接收其他服务。

但是,根据Apple 1 ,新服务在IANA注册。这显然不是必需的,但看到他们推荐它,感觉它是错误的方式

使用TXT记录

Apple 2 描述了这样的TXT记录:

  

注册服务时,会创建三个相关的DNS记录:服务(SRV)记录,指针(PTR)记录和文本(TXT)记录。 TXT记录包含解析或使用服务所需的其他数据,尽管它通常也是空的。

当然感觉它可能是正确的方法,但我仍然不确定,并且很难找到该字段应包含的内容的描述。

我的第一个问题是将<service_name>-<version>这样的内容解析,然后解析它实际上是哪个服务。

我的NAS似乎用它来识别型号和版本号。

尝试与服务交谈

找到服务后,可以始终在已知端点上执行HEAD请求,并查找服务设置的已知标头。

这感觉就像一个相当缓慢的方法,谁知道向我的接收者提出HEAD请求会做什么。


为了清楚起见,这个问题与特定的语言或框架无关,它与zeroconf的概念有关。

我可以展示一些代码,但我不知道这会有什么帮助。

1 个答案:

答案 0 :(得分:1)

首先,您宣传的服务实际上是否符合RFC 2782定义的_http资格。具体来说,它不只是使用HTTP进行传输,而且还是:

  • 可以通过“典型”Web浏览器客户端软件和
  • 显示
  • 主要供人类用户查看。

如果不是,请注册您自己的服务类型(还有一些其他服务使用HTTP作为传输但不符合这些资格,因此他们将-http作为服务名称的后缀,请参阅{{ 1}},pgpkey-httpsenteo-http)。

如果是,根据对RFC的解释有多严格,有几种方法可以实现。最简单的就是添加 TXT 记录,就像你在问题中已经提到的那样。 iTunes使用格式为xul-http

TXT 记录进行自我注册

如果您感觉更严格,RFC只会明确声明HTTP存在iTSh Version=196618u=p= TXT记录。也许有人可以对此进行讨论,但我还没有看到很多关于是否对现有条目添加TXT记录的讨论。因此,另一种方法是仅使用算法实例名称。例如,将后缀“-NicklasAService”添加到设备名称。希望为本地网络提供一个唯一的名称,但仍然可以通过PTR记录轻松选择服务,只需查找后缀即可。