[JAVA] Trouvez Raspberry Pi d'Android avec mDNS

Raspberry Pi

paramètres avahi-daemon

Installez avahi-daemon (s'il n'est pas inclus)

sudo apt-get install avahi-daemon

changement de réglage

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

Si ce n'est pas le cas, la recherche n'a pas pu être effectuée du côté Android.

avahi-daemon.conf


[publish]
publish-workstation=yes

redémarrage de avahi-daemon.service

sudo systemctl restart avahi-daemon.service

confirmation du nom d'hôte

cat /etc/hostname
<Hostname>

Android

Je pense que c'est plus rapide de voir ça (référence) https://developer.android.com/training/connect-devices-wirelessly/nsd.html

Obtenir la permission

AndroidManifest.xml


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

Variables de membre


    String TAG = "MainActivity";
    //Changer pour le nom d'hôte confirmé
    String serviceName = "<Hostname>";

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

Initialiser

    @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);
    }

Définition des fonctions


    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) {
                //Peut être trouvé<hostname>.local[<Adresse Mac>]C'était comme, alors j'ai correspondu avec contient
                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();
            }
        };
    }

Texte intégral

MainActivity.java



public class MainActivity extends AppCompatActivity {

    String TAG = "MainActivity";
    //Changer pour le nom d'hôte confirmé
    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();
                //Nom d'hôte recherché
                InetAddress host = mService.getHost();
            }
        };
    }
}

Recommended Posts

Trouvez Raspberry Pi d'Android avec mDNS
Lire la température / l'humidité avec Java de Raspberry Pi 3 & DHT11
Lire la pression et la température de Raspberry Pi 3 et BMP180 avec Java
[Android] Lire à partir de l'image du code QR avec zxing
Je n'ai pas pu installer docker avec raspberry pi2 b +.
Comment exécuter javafx avec Raspeye publié le 12/07/2020
Faire vibrer le bracelet avec Bluetooth à partir de l'application Android
Afficher les caractères sur l'écran LCD I2C 1602 avec Raspberry Pi 3 et Java
Créer une image Android pour Orange Pi 4 avec Docker
Compatible avec Android 10 (API 29)
Trouvez la classe d'adresse et le type d'adresse à partir de l'adresse IP avec Java
[MT] Spécifiez la catégorie d'article d'Android avec l'API de données
Vérifiez la communication entre Android et le serveur node.js avec des tampons de protocole
[MT] Spécifiez la catégorie d'article d'Android avec l'API de données