Connectez Android Things à un smartphone avec les connexions à proximité 2.0

L'une des premières choses que les utilisateurs voudront faire avec un nouvel appareil domestique intelligent est de l'obtenir sur leur réseau sans fil. De nombreux périphériques IoT n’ayant ni écran ni clavier, une solution consiste à autoriser les utilisateurs à associer un smartphone à l’appareil afin de pouvoir contrôler et configurer celui-ci. C’est ainsi que Nest et Google Home fonctionnent, entre autres, et que l’API Nearby Connections 2.0 le permet..

Dans cet article, vous découvrirez l’API Nearby Connections 2.0 et comment l’utiliser pour associer un smartphone Android à un appareil Android Things afin de fournir à vos utilisateurs une expérience d’appareil compagnon.

Qu'est-ce que l'API Connexions à proximité??

L'API Connexions à proximité permet à deux appareils de communiquer l'un avec l'autre directement via Bluetooth ou sans fil sans utiliser de point d'accès centralisé. Un périphérique peut jouer deux rôles: annonceur, qui fait savoir aux autres appareils qu’il est disponible pour être connecté, et découvreur, qui tente de trouver des annonceurs et se connecter à eux. Une fois qu'un ensemble de périphériques (également appelés "points d'extrémité" à ce stade) se sont connectés ensemble, ils peuvent envoyer des données à tout autre point d'extrémité du réseau Connexions à proximité.. 

L'API de connexions à proximité peut utiliser deux stratégies pour connecter des périphériques ensemble. La première, P2P_STAR, est le plus simple de travailler avec. Il se compose d'un annonceur pouvant prendre en charge plusieurs détecteurs s'y connectant. La deuxième, P2P_CLUSTER, permet à un nombre quelconque de périphériques de se connecter à et d'accepter des connexions à partir de tout autre nombre de périphériques. Cela crée un réseau maillé avec un point de défaillance moins centralisé, bien que cela prenne également plus de bande passante. Cette stratégie est idéale pour les charges utiles plus petites qui n'ont pas besoin de passer par un périphérique central, comme pour les jeux.. 

Ce tutoriel se concentrera sur l'utilisation de la stratégie d'étoile plus simple pour connecter l'appareil IoT en tant qu'annonceur et utilisera le smartphone de l'utilisateur en tant que découvreur. Cependant, à la fin, vous devriez également avoir suffisamment d’informations pour mettre en œuvre une stratégie de cluster.

Préparons-nous!

Il y aura deux modules pour ce tutoriel: l'application mobile et l'application Android Things. Une fois ceux-ci créés dans Android Studio, vous devez inclure la dépendance des services Google Play pour les connexions à proximité au niveau du module. build.gradle fichier pour les deux applications.

compilez 'com.google.android.gms: play-services-nearby: 11.6.2'

Après avoir exécuté une synchronisation de dégradé, ouvrez le AndroidManifest.xml fichiers pour les deux modules et incluent les autorisations suivantes dans la application noeuds.

    

Les appareils Android Things se verront octroyer ces autorisations après le redémarrage, mais vous devrez demander l'autorisation d'emplacement aux utilisateurs de l'application téléphonique..

le Activité principale classe à la fois des choses et mobile les modules devront implémenter les interfaces utilisées pour les rappels des services Google Play, comme suit:

publicActivity étend FragmentActivity implémente GoogleApiClient.ConnectionCallbacks, GoogleApiClient.Avant, 

Une fois que vous avez validé que l’utilisateur dispose des autorisations d’emplacement appropriées dans onCreate (), vous pouvez commencer à vous connecter aux services Google Play pour utiliser l'API Nearby Connections.

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

Quand le GoogleApiClient a fini de se connecter, le onConnected () la méthode sera appelée. C’est à cet endroit que vous lancerez le processus de publicité ou de découverte de votre appareil. De plus, les deux applications auront besoin d’un identifiant de service, qui est un identifiant unique. Chaîne identifiant.

private static final String SERVICE_ID = "UNIQUE_SERVICE_ID";

Publicité sur les connexions à proximité

Lorsque vous travaillez avec l’API Near Connections, vous devez créer un ConnectionLifecycleCallback comme son nom l'indique, cela sera déclenché sur divers événements du cycle de vie d'une connexion. Pour cette démo, nous n’utiliserons que le onConnectionInitiated () méthode. Cela enregistre une référence au premier point de terminaison qui tente de s'y connecter, accepte la connexion, puis arrête la publicité. Si la connexion échoue, l'application peut redémarrer la publicité..

final final privé ConnectionLifecycleCallback mConnectionLifecycleCallback = new ConnectionLifecycleCallback () @Override public void onConnectionInitiated (String endpointId, ConnectionInfo connectionInfo) endpoint = endpointId; Nearby.Connections.acceptConnection (mGoogleApiClient, endpointId, mPayloadCallback) .setResultCallback (nouveau ResultCallback() @Override public void onResult (@NonNull com.google.android.gms.common.api.Status status) if (status.isSuccess ()) // Connexion acceptée); Nearby.Connections.stopAdvertising (mGoogleApiClient);  @Override public void onConnectionResult (String endpointId, résultat ConnectionResolution)  @Override public void onDisconnected (String endpointId) ;

Vous avez peut-être remarqué que la méthode ci-dessus fait également référence à PayloadCallback objet. Cet objet comporte des méthodes appelées lorsque des données utiles sont envoyées par l'annonceur à un noeud final, ainsi que lorsque des données sont reçues d'un noeud final. le onPayloadReceived () Cette méthode consiste à gérer toutes les données envoyées à notre appareil Android Things. Cette méthode contient les Charge utile objet qui peut être transformé en un tableau d'octets, et un Chaîne représentant l'adresse du noeud final du périphérique d'envoi.

private PayloadCallback mPayloadCallback = new PayloadCallback () @Override public void onPayloadReceived (point de terminaison de la chaîne, charge utile utile) Log.e ("Tuts +", nouvelle chaîne (payload.asBytes ()));  @Override public void onPayloadTransferUpdate (noeud final de chaîne, PayloadTransferUpdate payloadTransferUpdate) ;

À ce stade, vous pouvez commencer à annoncer sur votre appareil IoT avec la méthode suivante:

Nearby.Connections.startAdvertising (mGoogleApiClient, "Nom du périphérique", SERVICE_ID, mConnectionLifecycleCallback, new AdvertisingOptions (Strategy.P2P_STAR));

Vous remarquerez peut-être que c'est là que nous appliquons la stratégie P2P_STAR à notre réseau de connexions à proximité..

Lorsque vous souhaitez envoyer un payload à un autre appareil, vous pouvez utiliser le Nearby.Connections.sendPayload () méthode avec la référence client de l'API Google, le nom de votre point de terminaison et un tableau d'octets des données que vous souhaitez envoyer.

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

Astuce: Activer le WiFi au redémarrage

Une astuce que j’ai trouvée utile lorsque je travaillais avec l’API Connexions à proximité sur un appareil Android Things est de réactiver le WiFi au redémarrage, car l’appareil peut se voir désactivé sans fil si l’appareil est éteint ou tombe en panne de publicité. Vous pouvez le faire en récupérant le WifiManager service système et appel setWifiEnabled ().

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

Découvrir des appareils avec des connexions proches

La découverte d'un appareil suit un schéma similaire à celui de la publicité. L'appareil se connecte au client Google API et commence à découvrir. Lorsqu'un annonceur est trouvé, le découvreur demande à se connecter à l'annonceur. Si l'annonceur approuve la demande, les deux appareils se connecteront et pourront envoyer des charges utiles dans les deux sens. Le découvreur utilisera un PayloadCallback tout comme l'annonceur.

private PayloadCallback mPayloadCallback = new PayloadCallback () @Override public void onPayloadReceived (Chaîne s, charge utile) Log.e ("Tuts +", nouvelle chaîne (payload.asBytes ()));  @Override public void onPayloadTransferUpdate (Chaîne s, PayloadTransferUpdate payloadTransferUpdate) ;

Le découvreur (l'application mobile) ConnectionLifecycleCallback ressemblera également à l'annonceur:

final final privé ConnectionLifecycleCallback mConnectionLifecycleCallback = new ConnectionLifecycleCallback () @Override public void onConnectionInitiated (String endpointId, ConnectionInfo connectionInfo) Nearby.Connections.acceptConnection (mGoogleApiClient, endpointId, mPayloadall); mEndpoint = endpointId; Nearby.Connections.stopDiscovery (mGoogleApiClient);  @Override public void onConnectionResult (String endpointId, résultat ConnectionResolution)  @Override public void onDisconnected (String endpointId) ;

Ce qui est différent, c’est que les découvreurs auront besoin d’un EndpointDiscoveryCallback qui sera utilisé lorsqu'un annonceur est trouvé mais n'est pas encore connecté. Cet objet lancera la demande de connexion à l'annonceur..

EndpointDiscoveryCallback m EndpointDiscovery = new EndpointDiscoveryCoverback () (@ endoveride public void onEndpointFound (Bande enfermée dans le sien). , mConnectionLifecycleCallback);  @Override public void onEndpointLost (String endpointId) Log.e ("Tuts +", "Disconnected"); ;

Une fois que votre découvreur s'est connecté aux services Google Play, vous pouvez lancer la découverte à l'aide de la commande suivante:

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

Enfin, lorsque vous souhaitez vous déconnecter d’un annonceur, vous pouvez utiliser le disconnectFromEndpoint () méthode de l'API Connexions à proximité. C'est généralement une bonne idée de le faire dans votre Activitéde onDestroy () rappeler.

Nearby.Connections.disconnectFromEndpoint (mGoogleApiClient, mEndpoint);

Conclusion

Dans cet article, vous avez découvert l'API Nearby Connections 2.0 pour Android dans le contexte de la création d'une application compagnon pour un appareil Android Things IoT.. 

Il convient de noter que cette API peut être utilisée pour tous les appareils Android que vous souhaitez mettre en réseau, des téléphones et tablettes aux téléviseurs Android et aux smartwatches Android Wear. L'API offre un moyen simple de se connecter et de communiquer sans utiliser Internet ou un routeur centralisé, et ajoute un excellent utilitaire à votre collection d'outils de développement Android..

!