您的位置:首页 > 理论基础 > 计算机网络

android网络设备搜寻Nsd服务基本用法

2017-03-03 15:32 447 查看
注:文章大部分内容来源于http://blog.csdn.net/gophers/article/details/37968501,以下为个人梳理内容,限于水平,错误难免,望包含指正!

公司研发的主机使用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,误人子弟媳妇概不负责,欢迎交流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: