自android 4.1 开始实现了一个网络服务的发现服务NsdService,其基于苹果的Bonjour服务发现协议,支持远程服务的发现和零配置。
Bonjour协议包括IP地址的自动分配、服务名称与地址的转换以及服务的发现三部分内容,ANDROID4.1借助第三方开源工程mDNSResponder实现了Bonjour协议的服务名称与地址的转换以及服务的发现等 Bonjour部分协议的支持。Bonjour协议的服务名称与地址的转换以及服务的发现采用的流程和DNS流程近似包括:登记过程、服务发现过程、服务地址解析过程以及建立连接等过程,服务发现采用的协议也和DNS协议相似,不过与DNS协议采用的单播方式不同的是采用了组播方式,因此被称为mDNS。
ANDROID4.2 对网络服务发现的实现架构包括四层:NSD应用客户端、服务发现服务框架层(对应NsdService)、MDns后台监视层(对应运行在netd本地服务进程的MDnsSdListener类 )以及MDns后台服务(对应mdnsd本地服务进程)。架构的每层作为其上一层的服务端对上一层提供服务,上层通过connect与下层服务建立连接。其中NsdService 和NSD应用客户端采用JAVA语言实现 ,MDns后台监视采用C++实现,而MDns后台服务为采用C语言的开源代码。四层分别运行在不同的进程,采用相应的跨进程通讯方式进行交互。
NsdService处于整个层次的承上启下层,其通过NsdManager对上层应用客户端提供调用和回调服务,NsdManager客户和NsdService服务之间采用AsyncChannel异步通道进行消息交互。NsdService服务对下在其NativeDaemonConnector线程对象中使用UNIX SOCKET接口与MDns后台监视层建立跨进程连接,传输命令和接收响应,MDns后台监视层的MDnsSdListener对象运行在netd本地服务中。
在MDnsSdListener类中调用mDNSResponder开源工程提供的客户端桩接口与MDns后台服务建立本地SOCKET通讯,并采用Monitor对象来启动MDns后台服务,实现MDns后台服务的事件监听和事件回调处理等工作。MDnsSdListener及Monitor对象与MDns后台服务的交互也是采用UNIX SOCKET机制进行跨进程交互。
MDns后台服务的整个实现代码及客户端的桩实现由第三方工程mDNSResponder提供,代码位于 external目录下 的mdnsresponder中,包括mDNSCore(包括MDNS核心协议引擎代码)、mDNSShared多个平台共享的非核心引擎代码、mDNSPosix Posix平台相关代码、Clients包括如何使用后台服务提供的API的客户端例子代码等四个目录,整个工程编译生成一个mdnsd后台服务和一个MDns监视层使用的库libmdnssd,而Clients中的代码生成一个dnssd执行文件用于测试。
一个应用为了让网络上的其它应用发现它需要通过网络声明自己,即服务登记,这通过调用NsdManager的registerService接口实现。
下面分步骤描述服务登记流程。