您的位置:首页 > 移动开发 > Android开发

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

2016-06-24 11:13 721 查看
作者: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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: