在WIFI物联网解决方案中,我们通常需要绑定设备,并且需要以某种方式首先发现设备。 例如,wechat硬件采用广播方式,定时向外部发送在线消息,或采用一问一答的方式。 Bonjour是苹果公司实现的零配置网络(Zeroconf )协议,这是基于服务的设备发现协议。 除了可以自动获取有效的IP地址外,还可以通过联系服务来找到设备的地址。 如果双方约定服务的名称,则可以更改设备的IP地址和端口。
一、mDNS协议和DNS-SD协议
由于Bonjour协议是基于mdns(multicastDNS )协议和DNS-SD ) DNSservicediscovery协议开发实现的,所以首先需要介绍这两种协议。
1.1 mDNS协议介绍
mDNS协议适用于局域网内没有DNS服务器时的域名解析。 设备通过组播方式交换DNS记录来完成域名解析。 约定的组播地址为224.0.0.251,端口号为5353。 mDNS协议使用类似于DNS协议的包,由标头和数据段两部分组成。 (可以自己知道DNS数据包的格式,这里不介绍)。
mDNS的使用场景之一如下所示。
设备d通过组播(224.0.0.251:5353 ),a .本地地址是多少?
设备a在知道有人查询后,也会通过同一组播组返回地址信息。 在这里,组播中的所有人b、c、d都会接收到,并将其转换为a.local的IP地址
mDNS协议和DNS协议略有不同。 mDNS只能在LAN内部使用,并且只接受主机名前缀为. local的域名。 因此,mDNS也可以与DNS在同一设备上共存,存储记录的区域是分开的。
此外,mDNS还有其他作用。 例如,在零配置网络中为自己分配域名,设备为自己选择域名后,通过发送记录类型为“any”的mDNS包,检查LAN内是否有相同的名称,如果没有设备,则将其命名为自己的域名
1.2 DNS-SD协议的介绍
下面介绍DNS-SD协议,即基于DNS的服务发现。 基于DNS的服务发现主要使用DNS现有的三种记录(记录类型)。 PTR记录、SRV记录、TXT记录如下。
1 )服务发现:设备首先将查询PTR记录的数据包发送到多播组。 咨询服务的格式如下。
服务.传输.域
service表示要查询的服务,transport表示传输的协议。 TCP还是UDP,域表示呼叫的域,在mDNS中表示. local,拥有对应服务的设备响应一系列本设备拥有的服务实例。
instance .服务. transport .域
实例表示服务的实例名称,接收instance.service.transport.domain,但只有实例对用户可见。 例如,要查询_easylink._tcp.local的服务,具有此服务支持实例的设备必须是emw 3031模块# 500 a3f._ easy link._ TCP.local 也就是说,emw 3031模块# 500 a3f表示为_easylink._TCP.local
可以看出,DNS-SD的PTR记录所表示的意义不同于以往的DNS的PTR记录,DNS-SD下的PTR记录用于记录从服务到服务实例的映射。
2 )获取服务实例的主机名和端口号)上述多个服务实例表示在用户选择并确定一个之后,需要查询服务实例的主机名和端口号,即SRV记录
设备发送mDNS请求,具有请求的服务实例的设备响应SRV记录。 SRV记录记录与服务实例相对应的主机名、端口号和TTL信息。 SRV记录的例子如下。
EMW 3031模块# 500 a3f._ EASY链接. _ TCP .本地.3in SRV 08002 EMW 3031模块# 500 a3f .本地。
DNS中的SRV记录格式如下:
_service._proto.name. TTL class SRV priority weight port target.
在DNS-SD中,priority和weight无效,一般置为00 00,port和target即为端口号和主机名。
因此SRV记录用于记录服务实例到端口号和主机名的映射,即便端口号可变也没有关系。
3)服务实例更详细的信息:有时候,一个服务实例除了所在设备的端口号和主机名这些信息以外,还可以提供更多的附加参数信息,服务实例的附加信息记录在TXT记录中,以”key = value”的格式记录,如提供设备的MAC地址:
MAC=D0:BA:E4:50:0A:3F
二、Bonjour协议原理
前面介绍了mDNS协议以及DNS-SD协议,其实基本上就已经展开介绍了Bonjour协议的细节,接下来再来理解Bonjour就相当轻松了。Bonjour协议可以理解为mDNS协议和DNS-SD协议的结合,其实大家在继续往下看之前可以自己想一下如何将两个协议结合起来呢?DNS-SD已经找到了提供服务的端口号和主机好了,最后再做进一步的主机名到IP地址的解析就完成了Bonjour协议的整个过程,当然结合的时候DNS-SD所发送的三种记录都是通过mDNS规定的组播组和端口号(224.0.0.254:5353)发送出去的,但是DNS-SD是不依赖mDNS协议而存在的。
Bonjour协议提供三部分功能:通告服务、发现服务、解析服务,这是三个动宾词组哈。在物联网中,设备在本地记录一个服务往往需要提供服务相关的SRV记录、PTR记录以及TXT记录相关的信息,用于最后组装mDNS数据包发送出去。
在没有DHCP分配IP地址和没有设置静态IP地址情况下,通过Bonjour协议还可以自己在局域网内获取有效的IP地址以及主机名,但是需要我们配置好路由的信息如子网掩码等,它会生成一个IP,然后询问局域网内是否有冲突,如果没有冲突就将这个IP占为己有,如果有冲突,就会更换一个IP,继续查询,主机名也是利用同样的方法获得。
通告服务用于设备告之局域网内其他人本设备的服务信息,一般包括发送SRV记录和PTR记录,这些记录被其它mDNS设备记录在本地的存储区中。
发现服务用于查询一个指定的服务,然后具有该服务的设备会响应PTR记录,告诉查询的设备有这样的服务并且服务实例的名称是什么。
解析服务发生在完成服务发现之后,获得了服务实例后供用户选择,再下一步就要进行解析,首先根据服务实例获得该设备的主机名以及端口,最后再根据主机名来获取IP地址。
经过以上一步步交互就可以获得了目标设备的IP地址和端口号了,然后就可以根据选择的传输协议TCP或者UDP进行通信。
三、mDNS数据包
庆科物联的设备端已经实现了Bonjour协议的主要功能,以下是基于其设备端发现过程用Wireshark抓的包,其中IP地址为192.168.191.2表示的是手机端,192.168.191.3表示的是完成配网后的设备端,它们在同一个局域网内。
服务发现:由手机APP发送查询_easylink._tcp.local服务
服务解析:设备端一次性响应了PTR记录、SRV记录、TXT记录以及A记录:
每条记录展开为:
欢迎关注微信公众号:嵌入式企鹅圈,实时推送原创文章!
嵌入式企鹅圈原创团队由阿里、魅族、nvidia、龙芯、炬力、拓尔思等资深工程师组成。百分百原创,分享嵌入式、Linux、物联网、GPU、Android、自动驾驶等技术。