Android NsdManager разрешает ошибку возврата, код 0
Я хочу разрешить IP-адрес пользовательского устройства IOT (esp8266) с помощью устройства Android.
После некоторого исследования я думаю, что есть два отличных варианта сделать это. Первый вариант - это Android NsdManager. Второй вариант - Android mDNSResponder.
Я предпочитаю делать это с помощью NsdManager.
Я использовал руководство по Android и некоторые другие сообщения, чтобы получить хороший пример. Когда я пытаюсь разрешить службе получить IP-адрес и номер порта, я постоянно получаю в результате 0 (внутренняя ошибка сбоя).
Чтобы убедиться, что ESP работает правильно, я установил приложение с браузером mdns-sd, чтобы протестировать его. Это нормально работает.
Может кто-нибудь подскажет, почему в результате я получаю 0?
ESP8266:
AsyncWebServer server(80);
DNSServer dns;
uint16_t GetDeviceId()
{
return ESP.getChipId();
}
String MakeMine(const char *NameTemplate)
{
uint16_t uChipId = GetDeviceId();
String Result = String(NameTemplate) + String(uChipId, HEX);
return Result;
}
void setup() {
Serial.begin(115200);
AsyncWiFiManager wifiManager(&server,&dns);
wifiManager.autoConnect("AutoConnectAP");
if (MDNS.begin("lego-test")) {
String MyName = MakeMine("LegoSensor");
MDNS.addService(MyName.c_str(), "tcp", 23);
}else{
Serial.println("Error setting up MDNS responder!");
}
}
void loop() {
MDNS.update();
}
Android:
public class MainActivity extends BridgeActivity {
public String TAG = "test_mdns";
private NsdManager.DiscoveryListener discoveryListener;
private NsdManager mgr;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Initializes the Bridge
registerPlugin(ToiletLegoPlugin.class);
mgr = (NsdManager) getSystemService(Context.NSD_SERVICE);
initializeDiscoveryListener();
this.discoverServices();
}
public void discoverServices() {
mgr.discoverServices("_services._dns-sd._udp", NsdManager.PROTOCOL_DNS_SD, discoveryListener);
}
public void stopDiscovery() {
mgr.stopServiceDiscovery(discoveryListener);
}
public void initializeDiscoveryListener() {
discoveryListener = new NsdManager.DiscoveryListener() {
@Override
public void onDiscoveryStarted(String regType) {
Log.d(TAG, "Service discovery started");
}
@Override
public void onServiceFound(NsdServiceInfo service) {
if(service.getServiceName().contains("LegoSensor")){
Log.d(TAG, "Service discovery success" + service);
Log.d(TAG, "Type: " + service.getServiceType());
Log.d(TAG, "Service Name: " + service.getServiceName());
Log.d(TAG, "Service discovery success = " + service.toString());
mgr.resolveService(service, new InitializeResolveListener());
}
}
@Override
public void onServiceLost(NsdServiceInfo service) {
Log.e(TAG, "service lost: " + service);
}
@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);
mgr.stopServiceDiscovery(this);
}
@Override
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
Log.e(TAG, "Discovery failed: Error code:" + errorCode);
mgr.stopServiceDiscovery(this);
}
};
}
public class InitializeResolveListener 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);
int port = serviceInfo.getPort();
InetAddress host = serviceInfo.getHost(); // getHost() will work now
Log.d(TAG, "Host: " + host.getHostAddress());
}
};
}
Logcat:
2022-01-03 17:42:26.506 548-642/? E/NsdService: Failed to execute mdnssd [resolve, 152552, _LegoSensora15f, _tcp.local., local.]
com.android.server.NativeDaemonConnector$NativeDaemonArgumentException: command '152710 mdnssd resolve 152552 _LegoSensora15f _tcp.local. local.' failed with '501 152710 resolveService got an error from DNSServiceResolve'
at com.android.server.NativeDaemonConnector.executeForList(NativeDaemonConnector.java:512)
at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:411)
at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:406)
at com.android.server.NsdService$DaemonConnection.execute(NsdService.java:698)
at com.android.server.NsdService.resolveService(NsdService.java:749)
at com.android.server.NsdService.access$2300(NsdService.java:61)
at com.android.server.NsdService$NsdStateMachine$EnabledState.processMessage(NsdService.java:363)
at com.android.internal.util.StateMachine$SmHandler.processMsg(StateMachine.java:992)
at com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:809)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.os.HandlerThread.run(HandlerThread.java:65)
2022-01-03 17:42:26.507 315-23443/? I/ADB_SERVICES: post waitpid (pid=23442) status=0000
2022-01-03 17:42:26.514 23388-23438/com.lego.frontend E/test_mdns: Resolve failed0
1 ответ
Я нашел проблему. Я смешал имя MDNS с типом службы имен. Argh после 5 часов отладки.