Мне нужно подключиться из приложения Android к группе устройств Интернета вещей, которые рекламируют свои услуги с помощью mDNS.
Для этого я совместно использую NsdManager.DiscoveryListener() с NsdManager.discoverServices().
Все хорошо, когда дело доходит до обнаружения: onServiceFound() запускается, и служба разрешается с помощью NsdManager.resolveService() .
Проблема связана с onServiceLost(), который никогда не запускается. Я ожидаю, что эта функция сработает, когда устройство IoT потеряет соединение Wi-Fi.
Я запускаю DiscoverServices() и останавливаю его только при выходе из приложения Android.
Есть идеи, почему onServiceLost не срабатывает?
Вот мой код
public class MainActivity extends AppCompatActivity
{
...
public bollean serviceFound = false;
...
protected void onCreate(Bundle savedInstanceState)
{
...
nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
checkpermisions();
lookForService(this);
{
...
}
...
}
public void conn_event(String constat, int color)
{
userMessage.setText(constat);
userMessage.setTextColor(color);
}
}
public class WiFiUtils
{
...
static void lookForService(MainActivity mAct)
{
if(mAct.wifiManager.isWifiEnabled() == false)
{
mAct.conn_event("WiFI activation", mAct.getResources().getColor(R.color.blue));
if(mAct.wifiManager.setWifiEnabled(true) == false)
{
mAct.conn_event("Cannot activate WiFi", mAct.getResources().getColor(R.color.red));
return;
}
}
if(mAct.wifiInfo.getNetworkId() == -1)
{
mAct.conn_event("Not connected to any WiFi networks", mAct.getResources().getColor(R.color.red));
return;
}
int localIP = mAct.wifiInfo.getIpAddress();
mAct.t.localIP = localIP;
resolveListener = new NsdManager.ResolveListener()
{
@Override
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode)
{
// Called when the resolve fails. Use the error code to debug.
Log.e(TAG, "Resolve failed: " + errorCode);
}
@Override
public void onServiceResolved(NsdServiceInfo serviceInfo)
{
Log.i(TAG, "Resolve Succeeded. " + serviceInfo);
mAct.conn_event("Service resolved", mAct.getResources().getColor(R.color.blue));
}
};
discoveryListener = new NsdManager.DiscoveryListener()
{
// Called as soon as service discovery begins.
@Override
public void onDiscoveryStarted(String regType)
{
Log.d(TAG, "Service discovery started");
}
@Override
public void onServiceFound(NsdServiceInfo service)
{
// A service was found! Do something with it.
Log.i(TAG, "Service discovery success" + service);
Log.i(TAG, "host: " + service.getHost());
mAct.conn_event("Service found", mAct.getResources().getColor(R.color.blue));
mAct.nsdManager.resolveService(service, resolveListener);
}
@Override
public void onServiceLost(NsdServiceInfo service)
{
// When the network service is no longer available.
// Internal bookkeeping code goes here.
Log.e(TAG, "service lost: " + service);
mAct.conn_event("Service lost", mAct.getResources().getColor(R.color.red));
}
@Override
public void onDiscoveryStopped(String serviceType)
{
Log.i(TAG, "Discovery stopped: " + serviceType);
}
@Override
public void onStartDiscoveryFailed(String serviceType, int errorCode)
{
Log.e(TAG, "Discovery failed: Error code:" + errorCode);
//nsdManager.stopServiceDiscovery(this);
}
@Override
public void onStopDiscoveryFailed(String serviceType, int errorCode)
{
Log.e(TAG, "Discovery failed: Error code:" + errorCode);
//nsdManager.stopServiceDiscovery(this);
}
};
mAct.nsdManager.discoverServices("_http._tcp", NsdManager.PROTOCOL_DNS_SD, discoveryListener);
}
...
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... -triggered
Android Nsd: onServiceLost() не срабатывает ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение