Connetti le cose di Android a uno smartphone con connessioni vicine 2.0

Una delle prime cose che gli utenti vorranno fare con un nuovo dispositivo di casa intelligente è scaricarlo sulla rete wireless. Molti dispositivi IoT mancano di uno schermo o di una tastiera, quindi un modo per farlo è consentire agli utenti di associare uno smartphone al dispositivo in modo che possano controllare e configurare il dispositivo. Nest e Google Home funzionano così, tra le altre cose, e l'API Near Connections 2.0 lo rende possibile.

In questo articolo riceverai un'introduzione all'API Nearby Connections 2.0 e a come può essere utilizzato per associare uno smartphone Android a un dispositivo Android Things per offrire agli utenti un'esperienza di dispositivo companion.

Qual è l'API delle connessioni vicine?

L'API Connections Nearby consente a due dispositivi di comunicare tra loro direttamente tramite Bluetooth o wireless senza l'uso di un punto di accesso centralizzato. Ci sono due ruoli che un dispositivo può assumere: inserzionista, che consente ad altri dispositivi di sapere che è disponibile per la connessione, e scopritore, che tenta di trovare inserzionisti e connettersi a loro. Una volta che una serie di dispositivi (noti anche come "endpoint" in questa fase) sono collegati insieme, possono inviare dati a qualsiasi altro endpoint sulla rete Connections Nearby. 

Esistono due strategie che l'API Connections Nearby può utilizzare per connettere i dispositivi. Il primo, P2P_STAR, è il più semplice con cui lavorare. Consiste di un inserzionista in grado di supportare più scopritori che si connettono ad esso. Il secondo, P2P_CLUSTER, consente a qualsiasi numero di dispositivi di connettersi e accettare connessioni da qualsiasi altro numero di dispositivi. Ciò crea una rete mesh con un punto di errore meno centralizzato, anche se richiede anche una maggiore larghezza di banda. Questa strategia è ideale per payload più piccoli che non devono passare attraverso un dispositivo centrale, ad esempio per i giochi. 

Questo tutorial si concentrerà sull'utilizzo della più semplice strategia a stella per connettere il dispositivo IoT come un inserzionista e utilizzerà lo smartphone dell'utente come scopritore. Tuttavia, alla fine, dovresti anche avere abbastanza informazioni per implementare una strategia di cluster.

Prepariamoci!

Ci saranno due moduli per questo tutorial: l'app mobile e l'app Android Things. Dopo aver creato quelli in Android Studio, dovrai includere la dipendenza di Google Play Services per le connessioni nelle vicinanze a livello di modulo build.gradle file per entrambe le app.

compila "com.google.android.gms: play-services-nearby: 11.6.2"

Dopo aver eseguito una sincronizzazione gradle, apri il AndroidManifest.xml file per entrambi i moduli e include le seguenti autorizzazioni all'interno di applicazione nodi.

    

I dispositivi Android Things avranno queste autorizzazioni concesse al dispositivo dopo il riavvio, anche se sarà necessario richiedere l'autorizzazione di posizione dagli utenti nell'app del telefono.

Il Attività principale classe in entrambi i cose e mobile i moduli dovranno implementare le interfacce utilizzate per i callback di Google Play Services, in questo modo:

public class MainActivity estende FragmentActivity implementa GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener @Override public void onConnected (@Nullable Bundle bundle)  @Override public void onConnectionSuspended (int i)  @Override public void onConnectionFailed (@NonNull ConnectionResult connectionResult)  

Dopo aver verificato che l'utente disponga delle autorizzazioni di posizione appropriate in onCreate (), puoi iniziare a connetterti a Google Play Services per utilizzare l'API delle connessioni vicine.

mGoogleApiClient = new GoogleApiClient .Builder (this, this, this) .addApi (Nearby.CONNECTIONS_API) .enableAutoManage (this, this) .build ();

Quando il GoogleApiClient ha finito di connettere, il onConnected () il metodo sarà chiamato. Qui è dove inizierai la pubblicità o il processo di scoperta del tuo dispositivo. Inoltre, entrambe le applicazioni avranno bisogno di un ID di servizio, che è univoco Stringa identificatore.

stringa statica privata privata SERVICE_ID = "UNIQUE_SERVICE_ID";

Pubblicità su connessioni vicine

Quando si lavora con l'API delle connessioni vicine, sarà necessario creare un ConnectionLifecycleCallback questo, come suggerisce il nome, verrà attivato in vari eventi del ciclo di vita della connessione. Per questa demo, useremo solo il onConnectionInitiated () metodo. Salva un riferimento al primo endpoint che tenta di connettersi ad esso, accetta la connessione e quindi interrompe la pubblicità. Se la connessione non riesce, l'app può riavviare la pubblicità.

private final ConnectionLifecycleCallback mConnectionLifecycleCallback = new ConnectionLifecycleCallback () @Override public void onConnectionInitiated (String endpointId, ConnectionInfo connectionInfo) endpoint = endpointId; Nearby.Connections.acceptConnection (mGoogleApiClient, endpointId, mPayloadCallback) .setResultCallback (nuovo ResultCallback() @Override public void onResult (@NonNull com.google.android.gms.common.api.Status status) if (status.isSuccess ()) // Connessione accettata); Nearby.Connections.stopAdvertising (mGoogleApiClient);  @Override public void onConnectionResult (String endpointId, ConnectionResolution result)  @Override public void onDisconnected (String endpointId) ;

Potresti aver notato che il metodo sopra fa riferimento anche a PayloadCallback oggetto. Questo oggetto ha metodi che vengono chiamati quando un carico utile di dati viene inviato dall'inserzionista a un endpoint, nonché quando i dati vengono ricevuti da un endpoint. Il onPayloadReceived () il metodo è dove gestiremo qualsiasi dato inviato al nostro dispositivo Android. Questo metodo contiene il Carico utile oggetto che può essere trasformato in una matrice di byte e a Stringa rappresenta l'indirizzo endpoint del dispositivo mittente.

private PayloadCallback mPayloadCallback = new PayloadCallback () @Override public void onPayloadReceived (Endpoint stringa, Payload payload) Log.e ("Tuts +", new String (payload.asBytes ()));  @Override public void onPayloadTransferUpdate (Endpoint stringa, PayloadTransferUpdate payloadTransferUpdate) ;

A questo punto, puoi iniziare a fare pubblicità sul tuo dispositivo IoT con il seguente metodo:

Nearby.Connections.startAdvertising (mGoogleApiClient, "Device Name", SERVICE_ID, mConnectionLifecycleCallback, new AdvertisingOptions (Strategy.P2P_STAR));

Potresti notare che è qui che applichiamo la strategia P2P_STAR alla nostra rete di connessioni nelle vicinanze.

Quando si desidera inviare un carico utile a un altro dispositivo, è possibile utilizzare il Nearby.Connections.sendPayload () metodo con il riferimento del client API di Google, il nome del tuo endpoint e una matrice di byte dei dati che desideri inviare.

Nearby.Connections.sendPayload (mGoogleApiClient, endpoint, Payload.fromBytes ("Message" .getBytes ()));

Suggerimento: abilitare WiFi al riavvio

Un trucco che ho trovato utile durante il lavoro con l'API Nearby Connections su un dispositivo Android Things è riattivare il WiFi al riavvio, in quanto il dispositivo può essere disattivato senza fili se il dispositivo viene spento o perde potenza durante la pubblicità. Puoi farlo recuperando il WifiManager servizio di sistema e chiamata setWifiEnabled ().

wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE); wifiManager.setWifiEnabled (true);

Scopri i dispositivi con connessioni vicine

La scoperta di un dispositivo segue un modello per lo più simile alla pubblicità. Il dispositivo si connetterà al client dell'API di Google e inizierà a scoprire. Quando viene trovato un inserzionista, lo scopritore richiederà di connettersi all'inserzionista. Se l'inserzionista approva la richiesta, i due dispositivi si connetteranno e saranno in grado di inviare payload avanti e indietro. Lo scopritore utilizzerà a PayloadCallback proprio come l'inserzionista.

private PayloadCallback mPayloadCallback = new PayloadCallback () @Override public void onPayloadReceived (String s, Payload payload) Log.e ("Tuts +", new String (payload.asBytes ()));  @Override public void onPayloadTransferUpdate (String s, PayloadTransferUpdate payloadTransferUpdate) ;

Lo scopritore (l'app mobile) ConnectionLifecycleCallback sarà anche simile a quello dell'inserzionista:

private final ConnectionLifecycleCallback mConnectionLifecycleCallback = new ConnectionLifecycleCallback () @Override public void onConnectionInitiated (String endpointId, ConnectionInfo connectionInfo) Nearby.Connections.acceptConnection (mGoogleApiClient, endpointId, mPayloadCallback); mEndpoint = endpointId; Nearby.Connections.stopDiscovery (mGoogleApiClient);  @Override public void onConnectionResult (String endpointId, ConnectionResolution result)  @Override public void onDisconnected (String endpointId) ;

Ciò che è diverso è che gli scopritori richiedono un EndpointDiscoveryCallback che verrà utilizzato quando viene trovato un inserzionista ma non ancora connesso. Questo oggetto avvierà la richiesta di connessione all'inserzionista.

private final EndpointDiscoveryCallback mEndpointDiscoveryCallback = new EndpointDiscoveryCallback () @Override public void onEndpointFound (String endpointId, DiscoveredEndpointInfo discoverEndpointInfo) if (discoverEndpointInfo.getServiceId (). equalsIgnoreCase (SERVICE_ID)) Nearby.Connections.requestConnection (mGoogleApiClient, "Name", endpointId , mConnectionLifecycleCallback);  @Override public void onEndpointLost (String endpointId) Log.e ("Tuts +", "Disconnected"); ;

Una volta che lo scopritore si è connesso a Google Play Services, puoi avviare la scoperta con il seguente comando:

Nearby.Connections.startDiscovery (mGoogleApiClient, SERVICE_ID, mEndpointDiscoveryCallback, nuove DiscoveryOptions (Strategy.P2P_STAR));

Infine, quando si desidera disconnettersi da un inserzionista, è possibile utilizzare il disconnectFromEndpoint () metodo dall'API Nearby Connections. In genere è una buona idea farlo nel tuo Attività'S OnDestroy () richiama.

Nearby.Connections.disconnectFromEndpoint (mGoogleApiClient, mEndpoint);

Conclusione

In questo articolo hai appreso l'API Near Connections 2.0 per Android nel contesto della creazione di un'app complementare per un dispositivo IoT Android. 

Vale la pena notare che questa API può essere utilizzata per qualsiasi dispositivo Android che desideri collegare in rete, dai telefoni e tablet ai box Android TV e agli smartwatch Android Wear. L'API fornisce un modo semplice per connettersi e comunicare senza l'uso di Internet o di un router centralizzato e aggiunge una grande utilità alla raccolta di strumenti per lo sviluppo Android.

!