Программа 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, которые уже зарегистрированы до запуска приложения. Чтобы обнаружить службы, зарегистрированные до запуска приложения.