android网络设备搜寻Nsd服务基本用法
2017-03-03 15:32
447 查看
注:文章大部分内容来源于http://blog.csdn.net/gophers/article/details/37968501,以下为个人梳理内容,限于水平,错误难免,望包含指正!
公司研发的主机使用Bonjour暴露自己的ip以供客户端搜寻,个人改写上述文章源码后大致整理流程如下,最终成功获得局域网下目标主机的ip地址
1.设置需要查找的设备的ServiceName和ServiceType,均为事先定义好的字符串:
2.配置Nsd服务的参数对象NsdServiceInfo,端口设为0对应自动获取IP(常用)
5.创建三类监听器之二解析监听器
6.创建三类监听器之三搜寻监听器
7.实例化NsdManager对象并设置以上三种监听器
// 获取注册监听器
registerListener = getRegistrationListener();
// 注册网络服务的名称、类型、端口
NsdServiceInfo nsdServiceInfo = new NsdServiceInfo();
nsdServiceInfo.setServiceName(SERVICE_NAME);
nsdServiceInfo.setServiceType(SERVICE_TYPE);
nsdServiceInfo.setPort(port);
// 获取系统网络服务管理器,准备之后进行注册
nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);
// 设置注册监听器并开始注册
nsdManager.registerService(nsdServiceInfo, NsdManager.PROTOCOL_DNS_SD, registerListener);
// 设置解析服监听器
resolveListener = getResolveListener();
nsdManager.resolveService(nsdServiceInfo, resolveListener);
// 设置搜寻监听器并开始搜寻
discoverListener = discoverService(nsdManager);
nsdManager.discoverServices(SERVICE_NAME, NsdManager.PROTOCOL_DNS_SD, discoverListener);
完成以上步骤,运行即可搜寻网络下ServiceName为"test",ServiceType为"_nb._tcp."的设备了,如愿获得了公司网络下主机的正确IP(...2.188):
注意事项
1.Internet权限
2.据说这个服务耗电量非常大不知是真是假,搜寻到服务后最好注销服务:
一知半解,不会看API,误人子弟媳妇概不负责,欢迎交流
公司研发的主机使用Bonjour暴露自己的ip以供客户端搜寻,个人改写上述文章源码后大致整理流程如下,最终成功获得局域网下目标主机的ip地址
1.设置需要查找的设备的ServiceName和ServiceType,均为事先定义好的字符串:
// 目标设备名称及类型 public static final String SERVICE_NAME = "test"; public static final String SERVICE_TYPE = "_nb._tcp.";
2.配置Nsd服务的参数对象NsdServiceInfo,端口设为0对应自动获取IP(常用)
// 注册网络服务的名称、类型、端口 NsdServiceInfo nsdServiceInfo = new NsdServiceInfo(); nsdServiceInfo.setServiceName(SERVICE_NAME); nsdServiceInfo.setServiceType(SERVICE_TYPE); nsdServiceInfo.setPort(0);3.准备Nsd服务所需NsdManager对象及三种Nsd服务回调监听器
// nsdManager对象 NsdManager nsdManager = null; // 注册监听器 NsdManager.RegistrationListener registerListener = null; // 解析监听器 NsdManager.ResolveListener resolveListener = null; // 搜寻监听器 NsdManager.DiscoveryListener discoverListener = null;4.创建三类监听器之一:注册监听器
// 实现一个网络服务的注册事件监听器,监听器的对象应该保存起来以便之后进行注销 NsdManager.RegistrationListener nsRegListener = new NsdManager.RegistrationListener() { @Override public void onUnregistrationFailed(NsdServiceInfo arg0, int arg1) { Toast.makeText(getApplicationContext(), "Unregistration Failed", Toast.LENGTH_SHORT).show(); LogErr("注销失败"); } @Override public void onServiceUnregistered(NsdServiceInfo arg0) { Toast.makeText(getApplicationContext(), "Service Unregistered", Toast.LENGTH_SHORT).show(); LogDebug("注销完成"); } @Override public void onServiceRegistered(NsdServiceInfo arg0) { Toast.makeText(getApplicationContext(), "Service Registered", Toast.LENGTH_SHORT).show(); LogDebug("注册完成"); } @Override public void onRegistrationFailed(NsdServiceInfo arg0, int arg1) { Toast.makeText(getApplicationContext(), "Registration Failed", Toast.LENGTH_SHORT).show(); LogErr("注册失败"); } }; return nsRegListener; }
5.创建三类监听器之二解析监听器
/** * 获取解析监听器 * * @return */ public NsdManager.ResolveListener getResolveListener() { NsdManager.ResolveListener listener = new NsdManager.ResolveListener() { @Override public void onResolveFailed(NsdServiceInfo nsdServiceInfo, int i) { LogErr("解析失败"); } @Override public void onServiceResolved(NsdServiceInfo nsdServiceInfo) { LogDebug("解析成功,名称-->" + nsdServiceInfo.getHost()); // 注销服务 unregisterNsdService(); } }; return listener; }
6.创建三类监听器之三搜寻监听器
/** * 调用设置好的nsdManager 搜寻服务 * * @param nsdManager */ public NsdManager.DiscoveryListener discoverService(NsdManager nsdManager) { NsdManager.DiscoveryListener nsDicListener = new NsdManager.DiscoveryListener() { @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { Toast.makeText(getApplicationContext(), "Stop Discovery Failed", Toast.LENGTH_SHORT).show(); LogErr("Stop Discovery Failed"); } @Override public void onStartDiscoveryFailed(String serviceType, int errorCode) { Toast.makeText(getApplicationContext(), "Start Discovery Failed", Toast.LENGTH_SHORT).show(); LogErr("Start Discovery Failed"); } @Override public void onServiceLost(NsdServiceInfo serviceInfo) { Toast.makeText(getApplicationContext(), "Service Lost", Toast.LENGTH_SHORT).show(); LogErr("Service Lost"); } @Override public void onServiceFound(NsdServiceInfo serviceInfo) { // 发现网络服务时就会触发该事件 // 可以通过switch或if获取那些你真正关心的服务 Toast.makeText(getApplicationContext(), "Service Found", Toast.LENGTH_SHORT).show(); LogDebug("Service Found,serviceName-->" + serviceInfo.getServiceName()); } @Override public void onDiscoveryStopped(String serviceType) { Toast.makeText(getApplicationContext(), "Discovery Stopped", Toast.LENGTH_SHORT).show(); LogDebug("Discovery Stopped"); } @Override public void onDiscoveryStarted(String serviceType) { Toast.makeText(getApplicationContext(), "Discovery Started", Toast.LENGTH_SHORT).show(); LogDebug("Discovery Started"); } }; return nsDicListener; }
7.实例化NsdManager对象并设置以上三种监听器
// 获取注册监听器
registerListener = getRegistrationListener();
// 注册网络服务的名称、类型、端口
NsdServiceInfo nsdServiceInfo = new NsdServiceInfo();
nsdServiceInfo.setServiceName(SERVICE_NAME);
nsdServiceInfo.setServiceType(SERVICE_TYPE);
nsdServiceInfo.setPort(port);
// 获取系统网络服务管理器,准备之后进行注册
nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);
// 设置注册监听器并开始注册
nsdManager.registerService(nsdServiceInfo, NsdManager.PROTOCOL_DNS_SD, registerListener);
// 设置解析服监听器
resolveListener = getResolveListener();
nsdManager.resolveService(nsdServiceInfo, resolveListener);
// 设置搜寻监听器并开始搜寻
discoverListener = discoverService(nsdManager);
nsdManager.discoverServices(SERVICE_NAME, NsdManager.PROTOCOL_DNS_SD, discoverListener);
完成以上步骤,运行即可搜寻网络下ServiceName为"test",ServiceType为"_nb._tcp."的设备了,如愿获得了公司网络下主机的正确IP(...2.188):
注意事项
1.Internet权限
2.据说这个服务耗电量非常大不知是真是假,搜寻到服务后最好注销服务:
/** * 搜寻完成 注销服务 */ private void unregisterNsdService() { if (null != nsdManager) { nsdManager.stopServiceDiscovery(discoverListener); nsdManager.unregisterService(registerListener); LogDebug("注销完成!"); } }
一知半解,不会看API,误人子弟媳妇概不负责,欢迎交流
相关文章推荐
- 深入学习:如何实现不同Android设备之间相同应用程序的网络服务发现功能
- Android获取设备的基本服务信息
- Android网络开源库Android-async-http 的基本用法(二)
- Android Retrofit+rxjava+okhttp请求网络的基本用法
- Android官方开发文档Training系列课程中文版:连接无线设备之通过P2P搜索网络服务
- 深入学习:如何实现不同Android设备之间相同应用程序的网络服务发现功能
- Android网络服务发现(NSD)协议的使用
- android后台服务的基本用法
- Android 网络请求Volley库完全解析,Volley的基本用法(一)
- 使用网络服务发现(无线连接设备)——翻译自developer.android.com-Trainning
- android学习十八(Service服务的基本用法)
- Android网络开发之OkHttp--基本用法实例化各个对象
- Android网络开发之OkHttp--基本用法POST
- android: 服务的基本用法
- Android官网培训课:网络服务探索(NSD)
- Android HTTP网络通信(二):Volley框架——介绍、基本用法
- Android网络开发之Volley--Volley基本用法StringRequest(一)
- Android网络开发之Volley--Volley基本用法ImageRequest(三)
- Android之Service(二):服务的基本用法
- Android官方开发文档Training系列课程中文版:连接无线设备之网络服务搜索功能