网络发现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueqian_scut/article/details/52694411
本文由嵌入式企鹅圈原创团队成员-华南师范大学物联网创新中心Hende_Zhu先生执笔。

WIFI物联网解决方案中,通常我们需要对设备进行绑定,需要通过某种方法先对设备进行发现,比如微信硬件采用广播的方式,定时向外发送上线消息或者采用一问一答的方式进行发现,Bonjour是由苹果公司实现的一种零配置网络(Zeroconf)协议,它是一种基于服务的设备发现协议,不仅能够自动获取有效IP地址,还可以通过查询服务的方式来找到设备地址,只要双方约定好服务(service)的名称,设备的IP地址和端口都是可以变化的!

一、mDNS协议和DNS-SD协议

Bonjour协议是基于mDNS(Multicast DNS)协议和DNS-SD(DNS Service Discovery)协议开发实现,因此有必要先在这里给大家介绍一下这两个协议。

1.1 mDNS协议介绍

mDNS协议适用于局域网内没有DNS服务器时的域名解析,设备通过组播的方式交互DNS记录来完成域名解析,约定的组播地址是:224.0.0.251,端口号是5353,mdns协议使用DNS协议一样的数据包,由头部和数据段两部分(大家可以自行去了解DNS数据包的格式啦,在这里不展开介绍了):

mDNS的一个使用情景是这样的:

设备d通过组播(224.0.0.251:5353),询问a.local地址是?


设备a知道有人查询它后,也是通过同样的组播组回复它的地址信息(通过回复用于IPv4的A类型DNS记录(A Record)或者用于IPv6的AAAA类型的DNS记录,A记录和AAAA记录分别用于将域名转换成IP地址),这里组播内的所有人b, c, d都会收到,它们会将a.local的ip地址等信息(如TTL值)刷新到mDNS缓冲区中。
mDNS协议和DNS协议还有些不同,mDNS只能用于局域网内部,并且它只接受解析主机名前缀为.local的域名,因此mDNS也是可以和DNS在同一台设备上共存的,以及它们存储记录的区域是分开的。
除此之外,mDNS还有其它的作用,例如在零配置网络中给自己分配域名,设备给自身选择一个域名后,然后通过发送记录类型为”any”的mDNS包来查询局域网内是否有同名,如果没有设备就会把这个名字作为自己的域名。

1.2 DNS-SD协议介绍

接下来再介绍一下DNS-SD协议,即DNS based Service Discovery,基于DNS的服务发现主要用到DNS现有的三种类型记录(Record Type):PTR记录、SRV记录、TXT记录,其中:
1)服务发现(PTR记录):
设备会先发送一个查询PTR记录的数据包到组播组,所查询服务格式为:
<service>.<transport>.<domain>
service表示的是要查询的服务,transport表示的是传输的协议:TCP还是UDP,domain表示查询的域,在mDNS中为.local,接着具有对应服务的设备会响应一系列本设备上所具有的服务实例:
<instance>.<service>.<transport>.<domain>
instance表示服务的实例名,虽然收到<instance>.<service>.<transport>.<domain>,但是只有instance才会显示给用户看,比如:要查询一个_easylink._tcp.local的服务,具有这个服务对应实例的设备会响应一条PTR记录:EMW3031 Module#500A3F._easylink._tcp.local,即表示EMW3031 Module#500A3F为_easylink._tcp.local的一个实例,设备收到后只会显示EMW3031 Module#500A3F供用户看,它是UTF-8编码的。
可以看出,DNS-SD的PTR记录所代表的意思是区别于传统DNS的PTR记录的含义的,并且DNS-SD下的PTR记录用于记录服务到服务实例的映射。
2)获取服务实例的主机名和端口号:(查询SRV记录)
上述多个服务实例instance显示供用户选择确定一个后,就需要查询记录服务实例的主机名和端口号,即查询SRV记录。设备会发送一个mDNS请求,然后具有所请求中服务实例的设备会响应SRV记录,SRV记录记录了这个服务实例对应的主机名和端口号以及TTL信息,一条SRV记录的例子是:

EMW3031 Module#500A3F._easylink._tcp.local. 3 IN SRV 0 0 8002 EMW3031 Module#500A3F.local.
DNS下的SRV记录的格式为:
_service._proto.name. TTL class SRV priority weight port target.
在DNS-SD中,priority和weight无效,一般置为00 00,port和target即为端口号和主机名。
因此SRV记录用于记录服务实例到端口号和主机名的映射,即便端口号可变也没有关系。
3)服务实例更详细的信息:(TXT记录)
有时候,一个服务实例除了所在设备的端口号和主机名这些信息以外,还可以提供更多的附加参数信息,服务实例的附加信息记录在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记录:


每条记录展开为:



作者:吴跃前
来源:CSDN
原文:https://blog.csdn.net/yueqian_scut/article/details/52694411
版权声明:本文为博主原创文章,转载请附上博文链接!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容