Я пытаюсь создать приложение для 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).У кого-то есть идея?Извините за мой английский и спасибо за ваше время.