Android通过JmDNS查找和注册设备的方法

来源:互联网 发布:landmark软件安装 编辑:程序博客网 时间:2024/05/22 01:25

作者:Jason Chen

 

JmDNS是multi-cast DNS的java实现,可以用来在局域网中查找设备和注册设备,而且不需要额外的配置。它可以获取到设备的IP, 端口号,服务类型,名称等信息。通过这些信息,就可以方便地实现设备互联。

这里有一个比较重要的概念是:服务类型。简单来说,服务类型阐述了该设备能提供的服务。它的格式是:_<protocol>._<transportlayer>。例如网络打印服务,它的类型为"_ipp._tcp."。想要查看更多的服务类型,可以参考http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml。当然,也可以自己约定服务类型,用于特定的功能。

下面就开始介绍如何使用JmDNS来实现设备的注册和查找。

一、设备注册

如果你的设备能够提供某种服务,那么你就可以通过注册服务,把你的能力告诉大家。举例如下:

serviceInfo = ServiceInfo.create("_ipp._tcp.",// service typename

              "test", //unqualifiedservice instance name

1926,// the local port on which the service runs

               "test server");//stringdescribing the service

mJmdns.registerService(serviceInfo);

当不在提供服务的时候,也需要告知大家,举例如下:

mJmdns.unregisterAllServices();

mJmdns.close();

二、查找设备

当你需要某种服务的时候,就可以通过查找设备来查看当前网络中,是否有人提供这种服务。查找设备包含两个步骤:1. 开启接收multicast packets的功能。为了节省用电,Android默认是不接收组播数据的。而JmDNS是通过组播通讯的。2. 查找设备。举例如下:

WifiManager wifi = (WifiManager) getSystemService(android.content.Context.WIFI_SERVICE);

lock =wifi.createMulticastLock(getClass().getSimpleName());

lock.setReferenceCounted(false);

lock.acquire();//to receive multicast packets

 

mJmdns = JmDNS.create();

   mJmdns.addServiceListener(type,listener = new ServiceListener() {

        public voidserviceResolved(ServiceEvent ev) {

            Log.d(“tag”,"Service resolved:"

                     +ev.getInfo().getQualifiedName()

                     + " port:" +ev.getInfo().getPort());

        }

        public void serviceRemoved(ServiceEventev) {

            Log.d(“tag”,"Service removed:" + ev.getName());

        }

        public void serviceAdded(ServiceEventevent) {

            mJmdns.requestServiceInfo(event.getType(),event.getName(), 1);

       }

    });

addServiceListener的方法,用来说明需要那种类型的服务。只有声明的类型才能被找到,可以声明多个类型。在找到或服务设备离开是时候,会回调ServiceListener的方法。

当不再需要查找服务的时候,需要关闭查找,举例如下:

mJmdns.removeServiceListener(type, listener);
mJmdns.close();
lock.release();

 

简单小结一下:1.查找设备需要打开组播,再进行查找;2.查找开始之后,在关闭查找之前,新加入的服务或离开的服务,都能接收到。

 

引用查询资料出处

1.https://vshivam.wordpress.com/2015/02/15/using-jmdns-for-service-advertisement-and-discovery-on-android/

2. http://home.heeere.com/tech-androidjmdns.html

3. http://www.thejeremywhite.com/jmdns/reference/javax/jmdns/JmDNS.html#registerService(javax.jmdns.ServiceInfo)

4. http://www.thejeremywhite.com/jmdns/reference/javax/jmdns/ServiceInfo.html#create(java.lang.String,%20java.lang.String,%20int,%20java.lang.String)

0 0
原创粉丝点击