Программа Android не обнаруживает уже зарегистрированный сервис dns-sd

Я пытаюсь обнаружить dns-sd, также называемый службами nsd (обнаружение сетевых служб), в приложении для Android с помощью nsd manager. Сервис зарегистрирован на моем компьютере через Wi-Fi. Проблема в том, что когда служба сначала регистрируется, а затем я запускаю приложение для Android, оно не обнаруживает службу. Но если я сначала запускаю приложение для Android, а затем регистрирую сервис, он обнаруживает его. Регистрационный код в Python с использованием библиотеки zeroconf.

Код Python Zeroconf:-

    #!/usr/bin/env python3

    import argparse
    import logging
    import socket
    from time import sleep
    from zeroconf import IPVersion, ServiceInfo, Zeroconf

    if __name__ == '__main__':
        logging.basicConfig(level=logging.DEBUG)

        parser = argparse.ArgumentParser()
        parser.add_argument('--debug', action='store_true')
        version_group = parser.add_mutually_exclusive_group()
        version_group.add_argument('--v6', action='store_true')
        version_group.add_argument('--v6-only', action='store_true')
        args = parser.parse_args()

        if args.debug:
            logging.getLogger('zeroconf').setLevel(logging.DEBUG)
        if args.v6:
            ip_version = IPVersion.All
        elif args.v6_only:
            ip_version = IPVersion.V6Only
        else:
            ip_version = IPVersion.V4Only

        desc = {'path': 'PhpProject/index.php'}

        info = ServiceInfo(
            "_http._tcp.local.",
            "Paul's Test Web Site._http._tcp.local.",
            addresses=                [socket.inet_aton(socket.gethostbyname(socket.gethostname()))],
            port=80,
            properties=desc,
            server="ash-2.local.",
        )

        zeroconf = Zeroconf(ip_version=ip_version)
        print("Registration of a service, press Ctrl-C to exit...")
        zeroconf.register_service(info)
        try:
            while True:
                sleep(0.1)
        except KeyboardInterrupt:
            pass
        finally:
            print("Unregistering...")
            zeroconf.unregister_service(info)
            zeroconf.close()

Код Android:-

public class MainActivity extends AppCompatActivity {

    NsdManager nsdManager;
    NsdManager.DiscoveryListener discoveryListener;
    NsdManager.ResolveListener resolveListener;
    public static Context context;
    Activity activity;
    RecyclerView nsd_services_list;
    List<NsdServiceInfo> nsdServiceInfoList = new ArrayList<>();
    Nsd_serviceList_adapter nsd_serviceList_adapter;

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

        activity = this;
        nsd_services_list = findViewById(R.id.nsd_services_rv);
        nsd_services_list.setLayoutManager(new LinearLayoutManager(this));
        nsd_serviceList_adapter = new     Nsd_serviceList_adapter(nsdServiceInfoList, new     Nsd_serviceList_adapter.OnNsdServiceClickedListener() {
            @Override
            public void onNsdServiceClicked(NsdServiceInfo nsdServiceInfo)     {
                Integer port_int = (Integer)nsdServiceInfo.getPort();
                String port = port_int.toString();
                String ipV4 = nsdServiceInfo.getHost().getHostAddress();
                Map<String, byte[]> attributes =     nsdServiceInfo.getAttributes();
                String path = new String(attributes.get("path"));

                Intent intent = new Intent(getApplicationContext(),     WebViewActivity.class);
                intent.putExtra("ipv4_address", ipV4);
                intent.putExtra("port", port);
                intent.putExtra("path", path);

                startActivity(intent);

            }
        });
        nsd_services_list.setAdapter(nsd_serviceList_adapter);

        context = getApplicationContext();
        nsdManager = (NsdManager) this.getSystemService(Context.NSD_SERVICE);

        discoveryListener = new NsdManager.DiscoveryListener() {

            @Override
            public void onDiscoveryStarted(String regType) {
                Log.d("nsd", "Service discovery started");
            }

            @Override
            public void onServiceFound(NsdServiceInfo service) {
                Log.d("nsd", "Service discovery success" + service);
                nsdManager.resolveService(service, resolveListener);

            }

            @Override
            public void onServiceLost(NsdServiceInfo service) {
                Log.e("nsd", "service lost: " + service);
            }

            @Override
            public void onDiscoveryStopped(String serviceType) {
               Log.i("nsd", "Discovery stopped: " + serviceType);
            }

            @Override
            public void onStartDiscoveryFailed(String serviceType, int     errorCode)     {
                Log.e("nsd", "Discovery failed: Error code:" + errorCode);
                nsdManager.stopServiceDiscovery(this);
            }

            @Override
            public void onStopDiscoveryFailed(String serviceType, int     errorCode)     {
                Log.e("nsd", "Discovery failed: Error code:" + errorCode);
                nsdManager.stopServiceDiscovery(this);
            }
        };

        resolveListener = new NsdManager.ResolveListener() {

            @Override
            public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode)     {
                Log.e("nsd", "Resolve failed: " + errorCode);
            }
            @Override
            public void onServiceResolved(NsdServiceInfo serviceInfo) {
                Log.e("nsd", "Resolve Succeeded. " + serviceInfo);
                if (serviceInfo.getServiceName().equals("wifi_zone")) {
                    Log.d("nsd", "Same IP.");
                    return;
                }
                NsdServiceInfo mService = serviceInfo;
                nsdServiceInfoList.add(mService);
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        nsd_serviceList_adapter.notifyDataSetChanged();
                    }
                });
            }
        };
        nsdManager.discoverServices(
                "_http._tcp.", NsdManager.PROTOCOL_DNS_SD, discoveryListener);
        }
    }

Пожалуйста, кто-нибудь может решить мою проблему. Я хочу, чтобы приложение для Android обнаружило службы nsd, которые уже зарегистрированы до запуска приложения. Чтобы обнаружить службы, зарегистрированные до запуска приложения.

0 ответов

Другие вопросы по тегам