[JAVA] Finden Sie Raspberry Pi von Android mit mDNS

Raspberry Pi

Avahi-Daemon-Einstellungen

Installieren Sie den avahi-daemon (falls nicht enthalten)

sudo apt-get install avahi-daemon

Einstellungsänderung

sudo vi /etc/avahi/avahi-daemon.conf

Wenn dies nicht der Fall ist, konnte die Suche auf der Android-Seite nicht durchgeführt werden.

avahi-daemon.conf


[publish]
publish-workstation=yes

Neustart von avahi-daemon.service

sudo systemctl restart avahi-daemon.service

Bestätigung des Hostnamens

cat /etc/hostname
<Hostname>

Android

Ich denke, es ist schneller, dies zu sehen (Referenz) https://developer.android.com/training/connect-devices-wirelessly/nsd.html

Erlaubnis bekommen

AndroidManifest.xml


<uses-permission android:name="android.permission.INTERNET"/>

Mitgliedsvariablen


    String TAG = "MainActivity";
    //Wechseln Sie zum bestätigten Hostnamen
    String serviceName = "<Hostname>";

    private NsdManager nsdManager;
    private NsdManager.DiscoveryListener discoveryListener;
    private NsdManager.ResolveListener resolveListener;
    private NsdServiceInfo mService;

Initialisieren

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

        nsdManager = (NsdManager)(getApplicationContext().getSystemService(Context.NSD_SERVICE));
        initializeResolveListener();
        initializeDiscoveryListener();
        nsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, discoveryListener);
    }

Funktionsdefinition


    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) {
                //Kann gefunden werden<hostname>.local[<MAC-Adresse>]Es war wie, also korrespondierte ich mit enthält
                if (service.getServiceName().contains(serviceName)) {
                    nsdManager.resolveService(service, resolveListener);
                    Log.d(TAG, "Same machine: " + serviceName);
                } 
            }

            @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);
                nsdManager.stopServiceDiscovery(this);
            }

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


    public void initializeResolveListener() {
        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.e(TAG, "Resolve Succeeded. " + serviceInfo);

                if (serviceInfo.getServiceName().equals(serviceName)) {
                    Log.d(TAG, "Same IP.");
                    return;
                }
                mService = serviceInfo;
                int port = mService.getPort();
                InetAddress host = mService.getHost();
            }
        };
    }

Voller Text

MainActivity.java



public class MainActivity extends AppCompatActivity {

    String TAG = "MainActivity";
    //Wechseln Sie zum bestätigten Hostnamen
    String serviceName = "<Hostname>";

    private NsdManager nsdManager;
    private NsdManager.DiscoveryListener discoveryListener;
    private NsdManager.ResolveListener resolveListener;
    private NsdServiceInfo mService;

    // raspberry service type
    private static final String SERVICE_TYPE = "_workstation._tcp.";

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

        nsdManager = (NsdManager)(getApplicationContext().getSystemService(Context.NSD_SERVICE));
        initializeResolveListener();
        initializeDiscoveryListener();
        nsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, 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) {
                Log.d(TAG, "Service discovery success" + service);


                if (!service.getServiceType().equals(SERVICE_TYPE)) {
                    Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
                } else if (service.getServiceName().equals(serviceName)) {
                    Log.d(TAG, "Same machine: " + serviceName);
                } else if (service.getServiceName().contains("NsdChat")){
                    nsdManager.resolveService(service, resolveListener);
                }
            }

            @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);
                nsdManager.stopServiceDiscovery(this);
            }

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


    public void initializeResolveListener() {
        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.e(TAG, "Resolve Succeeded. " + serviceInfo);

                if (serviceInfo.getServiceName().equals(serviceName)) {
                    Log.d(TAG, "Same IP.");
                    return;
                }
                mService = serviceInfo;
                int port = mService.getPort();
                //Gesuchter Hostname
                InetAddress host = mService.getHost();
            }
        };
    }
}

Recommended Posts

Finden Sie Raspberry Pi von Android mit mDNS
Lesen Sie Temperatur / Luftfeuchtigkeit von Raspberry Pi 3 & DHT11 mit Java ab
Lesen Sie Druck und Temperatur von Raspberry Pi 3 & BMP180 mit Java ab
[Android] Mit zxing aus dem QR-Code-Bild lesen
Ich konnte Docker nicht mit Himbeer pi2 b + installieren.
Wie man javafx mit Raspeye ausführt veröffentlicht am 12.07.2020
Lassen Sie das Armbandgerät mit Bluetooth über die Android-App vibrieren
Zeigen Sie Zeichen auf dem I2C 1602 LCD mit Raspberry Pi 3 und Java an
Erstellen Sie mit Docker ein Android-Image für Orange Pi 4
Kompatibel mit Android 10 (API 29)
Suchen Sie die Adressklasse und den Adresstyp aus der IP-Adresse mit Java
[MT] Geben Sie die Artikelkategorie von Android mit Daten-API an
Überprüfen Sie die Kommunikation von Android zum node.js-Server mit Protokollpuffern
[MT] Geben Sie die Artikelkategorie von Android mit Daten-API an