在过去的几周里,Android的NSD实现让我发疯:
从用户的角度来看,出现以下问题:
设备以完全不确定的方式发现彼此.如果我启动NsdManager基于应用程序的应用程序,如果只涉及两个设备,它或多或少会起作用.如果第三个设备加入,它将很少发现前两个,前两个将不会看到第三个.如果我退出应用程序(它们优雅地取消注册NSD侦听器)并以不同的顺序重新启动它们,则发现模式不完全相同,但类似.
在我的家庭网络中,发现的设备的IP分辨率基本上按预期工作.在工作中,有时即使仅使用两个设备(A和B),设备A也将使用A的IP地址和B的端口解析设备B的服务,反之亦然.所以IP地址和服务名称似乎在较低级别(可能是NsdManager)混淆了.
我现在已经为此提交了有关Google代码的错误报告(https://code.google.com/p/android/issues/detail?id=201314&thanks=201314&ts=1455814995).我也在这里发帖,希望得到更多的反馈; 也许我的Nsd助手类错了.
首先,经过无休止的调试,我现在已经在logcat中发现Android底层NsdService本身可能出现故障的提示,而MDnsDS似乎正常工作.但我不确定......
这里有一些日志输出来说明问题(为了便于阅读,过滤了一些消息):
02-18 16:57:02.327: D/NsdService(628): startMDnsDaemon
02-18 16:57:02.327: D/MDnsDS(187): Starting MDNSD
02-18 16:57:02.529: D/NsdService(628): New client listening to asynchronous messages
02-18 16:57:02.529: D/NsdService(628): New client, channel: com.android.internal.util.AsyncChannel@1fa188ce messenger: android.os.Messenger@cca33ef
02-18 16:57:02.532: D/NsdService(628): Register service
02-18 16:57:02.532: D/NsdService(628): registerService: 106 name: TuSync-0.57392, type: _tusync._tcp., host: /::, port: 57392
02-18 16:57:02.533: D/MDnsDS(187): serviceRegister(106, (null), TuSync-0.57392, _tusync._tcp., (null), (null), 57392, 0, <binary>)
02-18 16:57:02.533: D/MDnsDS(187): serviceRegister successful …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我公司的专有硬件设备上执行服务发现,该设备拥有自己的WiFi网络,并在该网络上宣传一项bonjour服务.当我连接到那个WiFi网络时,我正在使用NSD来发现该服务并解决它.
代码非常简单,通常效果很好而且很快.除了我有一个相当反复出现的问题(10次尝试中有5次)到目前为止本地化我的三星S8 +.到目前为止无法在S6或Pixel XL上重现.
问题是DiscoveryListener除了onDiscoveryStarted()之外从未做过任何事情,它只是永远运行.如果我杀了应用程序并重新开始,有时候它会继续挂起.
这就像有一个被阻塞的线程或东西,但是在日志中没有有用的信息(我能找到),而且我还没有发现任何东西可以锁定,因为我可以做些什么来从中恢复.
我添加了一个超时,它将在30秒后停止监听器,但通常在我重试之后它仍然无效.
服务发现过程包含在LiveData中,LiveData在活动时启动.
const val SERVICE_TYPE_FOO = "_foo._tcp."
private val serviceDiscoveryListener = ServiceDiscoveryListener()
override fun onActive() {
super.onActive()
stopRunnable = StopDiscoveryRunnable()
nsdManager.discoverServices(
SERVICE_TYPE_FOO,
NsdManager.PROTOCOL_DNS_SD,
serviceDiscoveryListener
)
handler.postDelayed(stopRunnable, SERVICE_DISCOVERY_TIMEOUT_MS)
}
private lateinit var stopRunnable: Runnable
private inner class StopDiscoveryRunnable : Runnable {
override fun run() {
try {
nsdManager.stopServiceDiscovery(serviceDiscoveryListener)
Timber.w("service discovery timed out")
postValue(ServiceDiscoveryState.Error)
} catch (e: Throwable) {
// no-op
}
}
}
Run Code Online (Sandbox Code Playgroud)
听众很简单......
private inner class ServiceDiscoveryListener : NsdManager.DiscoveryListener {
override fun onServiceFound(serviceInfo: NsdServiceInfo?) …Run Code Online (Sandbox Code Playgroud) 嗨,我正在试图寻找连接从Android我的Wi-Fi路由器的所有设备和,我需要设备的MAC地址和每台设备(包括物联网设备)的本地IP地址,现在,我试图从ARP缓存表中寻找.但是在扫描的某个时候某些设备丢失了,它并不那么准确.
我的代码:
List<LocalDeviceInfo> devicesInfos = new ArrayList<>();
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader("/proc/net/arp"));
String line;
while ((line = bufferedReader.readLine()) != null) {
String[] splitted = line.split(" +");
if (splitted != null && splitted.length >= 4) {
String ip = splitted[0];
String mac = splitted[3];
if (mac.matches("..:..:..:..:..:..")) {
LocalDeviceInfo thisNode = new LocalDeviceInfo(ip, mac);
devicesInfos.add(thisNode);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
bufferedReader.close();
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下方法查找网络中的所有服务:
mNsdManager.discoverServices(
SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
Run Code Online (Sandbox Code Playgroud)
但您必须定义SERVICE_TYPE,例如:
public static final String SERVICE_TYPE = "_http._tcp.";
Run Code Online (Sandbox Code Playgroud)
因此它将使用tcp发现所有http服务,但它不会同时找到https服务或任何其他类型的服务
如何设置所有这些以便使用tcp查找任何服务?
先感谢您.
我已经阅读了使用NSD查找特定网络服务的android 文档.以下是我发现所有可用_http._tcp服务的代码.
final NsdManager.DiscoveryListener discoveryListener = new NsdManager.DiscoveryListener() {
@Override
public void onDiscoveryStarted(String s) {
Log.i(TAG, "onDiscoveryStarted: " + s);
}
@Override
public void onServiceFound(NsdServiceInfo nsdServiceInfo) {
Log.i(TAG, "onServiceFound: " + nsdServiceInfo.toString());
}
@Override
public void onServiceLost(NsdServiceInfo nsdServiceInfo) {
Log.i(TAG, "onServiceLost: " + nsdServiceInfo.toString());
}
@Override
public void onDiscoveryStopped(String s) {
Log.i(TAG, "onDiscoveryStopped: " + s);
}
@Override
public void onStartDiscoveryFailed(String s, int i) {
Log.i(TAG, "onStartDiscoveryFailed: " + s);
}
@Override
public void onStopDiscoveryFailed(String s, int …Run Code Online (Sandbox Code Playgroud) 我开始创建一个 Android 应用程序 wifi Wifi Direct 功能。我做了一个同行发现,我喜欢在列表视图中看到同行。
我现在有一个应用程序,它尝试发现对等点并在列表中显示对等点。
但我面临的问题是这在我的 Android 5 设备上运行良好。在这里,我可以看到我的 Android 8 设备,但反过来却看不到。我在 Android 8 设备上看不到我的 Android 5 设备。
我按照这里的步骤操作:https : //developer.android.com/training/connect-devices-wireless/nsd
还发现了这篇文章:Android O 问题与 WiFi Peer Discovery说我需要在继续之前请求权限。
我的清单:
<uses-permission
android:required="true"
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission
android:required="true"
android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission
android:required="true"
android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission
android:required="true"
android:name="android.permission.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?如果需要解决问题,也许我可以提供更多信息?
我正在研究wifi直接和NSD(网络服务发现)来传输文件.
根据要求,即使两者都不在同一网络中,我也需要为iOS设备提供兼容性.我开始知道NSD类似于iOS的Bonjour服务.但是当设备在同一网络中时,这是可能的.
当两者不在同一个网络中时,有没有办法连接到iPhone?
我正在尝试官方的android NSDchat示例,以便在连接到同一个wifi网络的两个Android手机之间进行通信.将项目导入eclipse之后,我只将目标sdk更改为api级别22而不是16级.我在各种设备上尝试了应用程序,例如带有api 18的samsung设备,带有api 21的htc设备,带有api 21等的asus设备等等适用于其中一些并且不能在其他设备上工作,它也会在不同设备上产生不同的错误.运行代码时出现空指针异常,当我重新启动设备时,错误就消失了.是否演示应用程序不支持更高的api级别,或者在运行之前是否应该对该代码进行任何更改?
第一次尝试在Android中进行IP发现.我使用了http://developer.android.com/training/connect-devices-wirelessly/nsd.html#discover 并编写了代码.我没有注册设备,只是在网络中发现服务.当我在模拟器或设备中运行项目时,会调用onDiscoveryStarted(),但永远不会调用onServiceFound().请在下面找到我的代码.任何输入都非常感谢.谢谢!
public class MainActivity extends AppCompatActivity {
private Button discoverButton;
Context mContext;
NsdManager mNsdManager;
NsdManager.ResolveListener mResolveListener;
NsdManager.DiscoveryListener mDiscoveryListener;
NsdManager.RegistrationListener mRegistrationListener;
public static final String SERVICE_TYPE = "_http._tcp.";
public static final String TAG = "MyApp_MAIN_CLIENT";
public String mServiceName = "MyApp";
/*
* public static final String SERVICE_TYPE = "_http._tcp.";
public static final String TAG = "NsdHelper";
public String mServiceName = "NsdChat";
* */
NsdServiceInfo mService;
private Handler mUpdateHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNsdManager = (NsdManager) …Run Code Online (Sandbox Code Playgroud) 我想创建一个连接,其中一个设备将像服务器一样将一些数据流连接到连接,多个设备可以连接到接收数据的设备.
所以我做了一些研究,我知道我们可以使用网络服务发现和WiFi点对点来做到这一点,所以我已经建立了连接,我可以连接一个设备和流数据但我想创建一个组连接多个设备,所以任何人的任何帮助将不胜感激.
谢谢!