我正在编写一个可以在计算机和手机上运行的软件。
该服务使用HTTP API进行通信,并将使用Zeroconf在本地网络上发布。
最初我使用_http._tcp.
作为服务类型发布了我的服务,但我很快发现我的NAS和我的音乐接收器(!)也使用这种确切的服务类型进行广播。
所以现在出现的问题是如何区分我的服务和使用HTTP的其他服务。
肯定是最简单的方式,而且(几乎)保证不会接收其他服务。
但是,根据Apple 1 ,新服务应在IANA注册。这显然不是必需的,但看到他们推荐它,感觉它是错误的方式
Apple 2 描述了这样的TXT记录:
注册服务时,会创建三个相关的DNS记录:服务(SRV)记录,指针(PTR)记录和文本(TXT)记录。 TXT记录包含解析或使用服务所需的其他数据,尽管它通常也是空的。
当然感觉它可能是正确的方法,但我仍然不确定,并且很难找到该字段应包含的内容的描述。
我的第一个问题是将<service_name>-<version>
这样的内容解析,然后解析它实际上是哪个服务。
我的NAS似乎用它来识别型号和版本号。
找到服务后,可以始终在已知端点上执行HEAD
请求,并查找服务设置的已知标头。
这感觉就像一个相当缓慢的方法,谁知道向我的接收者提出HEAD
请求会做什么。
为了清楚起见,这个问题与特定的语言或框架无关,它与zeroconf的概念有关。
我可以展示一些代码,但我不知道这会有什么帮助。
答案 0 :(得分:1)
首先,您宣传的服务实际上是否符合RFC 2782定义的_http
资格。具体来说,它不只是使用HTTP进行传输,而且还是:
如果不是,请注册您自己的服务类型(还有一些其他服务使用HTTP作为传输但不符合这些资格,因此他们将-http
作为服务名称的后缀,请参阅{{ 1}},pgpkey-http
,senteo-http
)。
如果是,根据对RFC的解释有多严格,有几种方法可以实现。最简单的就是添加 TXT 记录,就像你在问题中已经提到的那样。 iTunes使用格式为xul-http
。
如果您感觉更严格,RFC只会明确声明HTTP存在iTSh Version=196618
,u=
和p=
TXT记录。也许有人可以对此进行讨论,但我还没有看到很多关于是否对现有条目添加TXT记录的讨论。因此,另一种方法是仅使用算法实例名称。例如,将后缀“-NicklasAService”添加到设备名称。希望为本地网络提供一个唯一的名称,但仍然可以通过PTR记录轻松选择服务,只需查找后缀即可。