标签: nsd

Android,NSD/DNS-SD:NsdManager不可靠的发现和IP解析

在过去的几周里,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)

networking android p2p discovery nsd

16
推荐指数
2
解决办法
3253
查看次数

Android NSD - 永久挂起/运行 - 特定于设备?

我正在尝试在我公司的专有硬件设备上执行服务发现,该设备拥有自己的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 mdns bonjour dns-sd nsd

15
推荐指数
0
解决办法
494
查看次数

如何在android中准确扫描所有设备连接到wifi的IP和Mac地址?

嗨,我正在试图寻找连接从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)

java android nsd

10
推荐指数
1
解决办法
2890
查看次数

使用android NSD发现网络中的所有服务

我正在尝试使用以下方法查找网络中的所有服务:

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查找任何服务?

先感谢您.

android nsd

7
推荐指数
1
解决办法
931
查看次数

如何使用Android的本机网络服务发现查找所有可用服务

我已经阅读了使用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)

networking android zeroconf discovery nsd

6
推荐指数
2
解决办法
1612
查看次数

Android - Wifi Direct / p2p 无法在 Android 8 上找到对等点

我开始创建一个 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)

可能是什么问题呢?如果需要解决问题,也许我可以提供更多信息?

android wifi-direct nsd android-8.0-oreo

6
推荐指数
2
解决办法
3294
查看次数

即使不在同一个网络中,我们可以从Android设备连接到iPhone吗?

我正在研究wifi直接和NSD(网络服务发现)来传输文件.

  1. NSD:已创建serivce的位置,可以扫描在同一网络中发布相同服务的其他设备.
  2. WiFi Direct:用于扫描附近没有网络的设备
  3. WiFi P2P网络服务发现:用于扫描其他设备提供相同服务的设备附近的服务(NSD + WiFi Direct)

根据要求,即使两者都不在同一网络中,我也需要为iOS设备提供兼容性.我开始知道NSD类似于iOS的Bonjour服务.但是当设备在同一网络中时,这是可能的.

当两者不在同一个网络中时,有没有办法连接到iPhone?

networking android ios wifi-direct nsd

5
推荐指数
1
解决办法
272
查看次数

Android网络服务发现示例Nsdchat无法正常工作

我正在尝试官方的android NSDchat示例,以便在连接到同一个wifi网络的两个Android手机之间进行通信.将项目导入eclipse之后,我只将目标sdk更改为api级别22而不是16级.我在各种设备上尝试了应用程序,例如带有api 18的samsung设备,带有api 21的htc设备,带有api 21等的asus设备等等适用于其中一些并且不能在其他设备上工作,它也会在不同设备上产生不同的错误.运行代码时出现空指针异常,当我重新启动设备时,错误就消失了.是否演示应用程序不支持更高的api级别,或者在运行之前是否应该对该代码进行任何更改?

android network-service nsd

5
推荐指数
1
解决办法
2756
查看次数

Android NSD onServiceFound()没有被调用

第一次尝试在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)

android nsd

5
推荐指数
2
解决办法
1380
查看次数

使用wifi p2p创建组以连接多个设备

我想创建一个连接,其中一个设备将像服务器一样将一些数据流连接到连接,多个设备可以连接到接收数据的设备.

所以我做了一些研究,我知道我们可以使用网络服务发现和WiFi点对点来做到这一点,所以我已经建立了连接,我可以连接一个设备和流数据但我想创建一个组连接多个设备,所以任何人的任何帮助将不胜感激.

谢谢!

android wifip2p nsd

5
推荐指数
1
解决办法
2879
查看次数