Обнаружение сетевых служб не работает всегда - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь создать приложение для Android, которое обнаруживает IP-адрес брокера mqtt в локальной сети с помощью NDS.Я запускаю обнаружение сервиса в MainActivity:

NsdManager mNsdManager;
NsdManager.DiscoveryListener mDiscoveryListener;
NsdServiceInfo mService;
String serverUri;

public static final String SERVICE_TYPE = "_mqtt._tcp.";
public String myServiceName = "mqtt_broker";

public class MyResolveListener implements NsdManager.ResolveListener {

    @Override
    public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
        Log.e(TAG, "Resolve failed" + errorCode);
    }

    @Override
    public void onServiceResolved(NsdServiceInfo serviceInfo) {
        Log.e(TAG, "Resolve Succeeded. " + serviceInfo);
        mService = serviceInfo;
        serverUri = "ssl:/" + mService.getHost() + ":8883";
        mNsdManager.stopServiceDiscovery(mDiscoveryListener);
    }
}

public void searchServerIP()
{
    mNsdManager = (NsdManager)getSystemService(Context.NSD_SERVICE);
    mDiscoveryListener = new NsdManager.DiscoveryListener() {

        @Override
        public void onDiscoveryStarted(String regType) {
            // ...
        }

        @Override
        public void onServiceFound(NsdServiceInfo service) {
            if (service.getServiceName().contains(myServiceName)){
                mNsdManager.resolveService(service, new MyResolveListener());
            }
        }

        @Override
        public void onServiceLost(NsdServiceInfo service) {
            // ...
        }

        @Override
        public void onDiscoveryStopped(String serviceType) {
            // ...
        }

        @Override
        public void onStartDiscoveryFailed(String serviceType, int errorCode) {
            // ...
        }

        @Override
        public void onStopDiscoveryFailed(String serviceType, int errorCode) {
            // ...
        }
    };
    mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    searchServerIP();
}

Я пробовал этот код на некоторых устройствах: Xiaomi MI5 (с android 8.0), Xiaomi MI4 (с android 6.0) и Samsung GT-P5200 (с android 4.40,2).Код работает на всех устройствах, но иногда я не могу найти какие-либо службы MDNS, и мое приложение не соединяется с сервером (брокер MQTT).У кого-то есть идея?Извините за мой английский и спасибо за ваше время.

...