Le SDK Thread Network fournit une fonctionnalité semblable à un trousseau numérique. Il permet à vos applications Android de partager les identifiants du réseau Thread avec les services Google Play. Cela permet à vos applications de configurer n'importe quel appareil Thread depuis n'importe quel écosystème de maison connectée, sans exposer directement les identifiants et les données utilisateur.
En quelques appels d'API, vous pouvez:
- Demandez vos identifiants de réseau Thread préférés aux services Google Play.
- Configurez de nouveaux routeurs de bordure et ajoutez vos identifiants de réseau Thread aux services Google Play.
- Si vous disposez déjà de routeurs de terrain sur le terrain, vous pouvez vérifier s'ils se trouvent sur le réseau préféré et les migrer si nécessaire.
Plusieurs parcours utilisateur et développeurs sont à prendre en compte. Nous aborderons la plupart d'entre elles dans ce guide, ainsi que d'autres fonctionnalités clés et l'utilisation recommandée.
Terminologie et concepts d'API clés
Avant de commencer, il est utile de comprendre les termes suivants:
Identifiants du réseau Thread:blob binaire des TLV de thread qui encode le nom, la clé et d'autres propriétés requis par un appareil Thread pour rejoindre un réseau Thread donné.
Identifiants de réseau Thread préférés:identifiants de réseau Thread sélectionnés automatiquement qui peuvent être partagés avec des applications de différents fournisseurs à l'aide de l'API
getPreferredCredentials
.Border Agent ID (ID de l'agent de bordure) : ID unique de 16 octets pour un appareil de routeur de bordure Thread. Cet ID est créé et géré par les fournisseurs de routeurs de bordure.
Application de configuration du routeur de bordure Thread:il s'agit de votre application Android qui configure de nouveaux appareils pour le routeur de bordure Thread et ajoute les identifiants du réseau Thread aux services Google Play. Votre application est le propriétaire officiel des identifiants ajoutés et y a accès.
De nombreuses API Thread Network renvoient une tâche qui se termine de manière asynchrone. Vous pouvez utiliser addOnSuccessListener et addOnFailureListener pour enregistrer les rappels destinés à recevoir le résultat. Pour en savoir plus, consultez la documentation sur Tasks.
Propriété et maintenance des identifiants
L'application qui ajoute les identifiants réseau Thread devient le propriétaire des identifiants et dispose de toutes les autorisations nécessaires pour y accéder. Si vous essayez d'accéder aux identifiants ajoutés par d'autres applications, vous recevrez un message d'erreur PERMISSION_DENIED
.
En tant que propriétaire de l'application, il est recommandé de maintenir à jour les identifiants stockés dans les services Google Play lorsque le réseau du routeur de bordure Thread est mis à jour. Cela signifie que vous devez ajouter des identifiants si nécessaire, les mettre à jour lorsque les identifiants du réseau de threads Thread du routeur de bordure changent, et les supprimer lorsque le routeur de bordure Thread est supprimé ou réinitialisé.
Détection des agents Border
Les identifiants doivent être enregistrés avec un ID d'agent de frontière. Vous devez vous assurer que votre application de configuration de routeurs de bordure Thread est en mesure de déterminer les ID d'agent de bordure de vos routeurs de bordure Thread.
Les routeurs de bordure Thread doivent utiliser le protocole mDNS pour annoncer les informations du réseau Thread, y compris le nom du réseau, l'ID de Pan étendu et l'ID de l'agent de bordure. Les valeurs txt
correspondantes pour ces attributs sont respectivement nn
, xp
et id
.
Pour les réseaux dotés de routeurs de bordure Google, les services Google Play obtiennent automatiquement les identifiants du réseau Google Thread.
Intégrer le SDK dans votre application Android
Pour commencer, procédez comme suit:
Suivez les instructions fournies dans Configurer les services Google Play.
Ajoutez la dépendance des services Google Play à votre fichier
build.gradle
:implementation 'com.google.android.gms:play-services-threadnetwork:16.0.0'
Facultatif:Définissez une classe de données
BorderAgent
pour stocker les informations sur le routeur de bordure. Nous utiliserons ces données tout au long de ce guide:data class BorderAgentInfo( // Network Name max 16 len val networkName: String = "", val extPanId: ByteArray = ByteArray(16), val borderAgentId: ByteArray = ByteArray(16), ... )
Nous allons ensuite passer en revue les étapes recommandées pour ajouter et gérer les identifiants préférés.
Nouvelles configurations du routeur de bordure
Avant de créer un réseau pour les nouveaux routeurs à la frontière, il est important d'essayer d'utiliser les identifiants réseau préférés. Cela garantit que les appareils Thread sont connectés à un seul réseau Thread lorsque cela est possible.
Un appel à getPreferredCredentials
lance une activité, invitant les utilisateurs à autoriser la requête réseau. Si des identifiants réseau ont été stockés dans le trousseau de clés numérique du SDK Thread, ils sont renvoyés à votre application.
Identifiants de requête
Pour demander à l'utilisateur ses identifiants préférés:
Déclarez une
ActivityLauncher
:private lateinit var preferredCredentialsLauncher: ActivityResultLauncher<IntentSenderRequest>
Gérez le résultat de l'activité renvoyé sous la forme
ThreadNetworkCredentials
:preferredCredentialsLauncher = registerForActivityResult( StartIntentSenderForResult() ) { result: ActivityResult -> if (result.resultCode == RESULT_OK) { val threadNetworkCredentials = ThreadNetworkCredentials.fromIntentSenderResultData(result.data!!) Log.d("debug", threadNetworkCredentials.networkName) } else { Log.d("debug", "User denied request.") } }
Appelez
preferredCredentials
et lancez l'activité:private fun getPreferredThreadNetworkCredentials() { ThreadNetwork.getClient(this) .preferredCredentials .addOnSuccessListener { intentSenderResult -> intentSenderResult.intentSender?.let { preferredCredentialsLauncher.launch(IntentSenderRequest.Builder(it).build()) } ?: Log.d("debug", "No preferred credentials found.") } .addOnFailureListener { e: Exception -> Log.d(TAG, "ERROR: [${e}]") } }
Créer un réseau Thread
Si aucun identifiant de réseau Thread préféré n'est disponible sur le réseau Thread d'un utilisateur, vous pouvez ajouter des identifiants aux services Google Play à l'aide de l'API addCredentials
. Pour ce faire, vous devez créer un ThreadBorderAgent
et fournir un objet ThreadNetworkCredentials
.
Pour créer un réseau aléatoire, appelez la méthode newRandomizeBuilder
:
val threadCredentials = ThreadNetworkCredentials.newRandomizedBuilder().build()
Pour spécifier le nom du réseau Thread:
val threadCredentials = ThreadNetworkCredentials.newRandomizedBuilder()
.setNetworkName("ThreadNetworkSDK")
.build()
Ajouter des identifiants
Pour que vos identifiants de réseau Thread soient disponibles pour les autres fournisseurs Thread, nous devons les ajouter aux services Google Play. Avant d'ajouter nos nouveaux identifiants, nous devons également savoir à quel routeur de bordure ce réseau Thread appartient.
Dans cet exemple, nous allons créer un ThreadBorderAgent
à partir d'un ID d'agent de frontière et transmettre les identifiants du réseau Thread que vous venez de créer:
private fun addCredentials(borderAgentInfo: BorderAgentInfo, credentialsToBeAdded: ThreadNetworkCredentials) {
val threadBorderAgent = ThreadBorderAgent.newBuilder(borderAgentInfo.borderAgentId).build()
Log.d("debug", "border router id:" + threadBorderAgent.id)
ThreadNetwork.getClient(this)
.addCredentials(threadBorderAgent, credentialsToBeAdded)
.addOnSuccessListener {
Log.d("debug", "Credentials added.")
}
.addOnFailureListener { e: Exception -> Log.d(TAG, "ERROR: [${e}]") }
}
Détecter et migrer des routeurs de terrain sur le terrain
Si vous disposez actuellement de routeurs de terrain sur le terrain, vous pouvez utiliser isPreferredCredentials
pour déterminer si vos routeurs de bordure appartiennent au réseau préféré. Cette API ne demande pas d'autorisation à l'utilisateur et vérifie les identifiants du routeur de bordure par rapport à ceux stockés dans les services Google Play.
isPreferredCredentails
renvoie 0
pour les correspondances sans correspondance et 1
pour les correspondances en tant que type de données Int
. Vous pouvez utiliser IsPreferredCredentialsResult
pour vérifier vos résultats.
public @interface IsPreferredCredentialsResult {
int PREFERRED_CREDENTIALS_NOT_FOUND = -1;
int PREFERRED_CREDENTIALS_NOT_MATCHED = 0;
int PREFERRED_CREDENTIALS_MATCHED = 1;
}
Pour utiliser isPreferredCredentials
, vous devez d'abord créer un objet ThreadNetworkCredentials
. Il existe plusieurs façons d'instancier ThreadNetworkCredentials
. Au cours des étapes suivantes, nous allons passer en revue ces options.
Regrouper les identifiants réseau par ensemble de données opérationnel
Dans certains cas, votre routeur de bordure Thread est déjà configuré avec un réseau Thread, et que vous souhaitez ajouter ce réseau aux services Google Play pour le partager avec d'autres fournisseurs. Vous pouvez créer une instance ThreadNetworkCredential
à partir d'une liste de TLV d'ensembles de données Thread actifs bruts:
Convertissez l'ensemble de données opérationnel en
ByteArray
. Exemple :val activeDataset = "0e080000000000010000000300000f35060004001fffe0020833333333...".dsToByteArray()
fun String.dsToByteArray(): ByteArray { return chunked(2).map { it.toInt(16).toByte() }.toByteArray() }
Utilisez
fromActiveOperationalDataset
pour créer leThreadNetworkCredentials
. Si l'opération réussit, vous pouvez obtenir le nom du réseau Thread, le canal et d'autres informations sur le réseau. Pour obtenir la liste complète des propriétés, consultez la section ThreadNetworkCredentials.val threadNetworkCredentials = ThreadNetworkCredentials.fromActiveOperationalDataset(activeDataset) Log.d( "threadNetworkCredentials", threadNetworkCredentials.channel.toString() + " - " + threadNetworkCredentials.networkName)
Appelez l'API
isPreferredCredentials
et transmettezThreadNetworkCredentials
.ThreadNetwork.getClient(this) .isPreferredCredentials(threadNetworkCredentials) .addOnSuccessListener { result -> when (result) { IsPreferredCredentialsResult.PREFERRED_CREDENTIALS_NOT_MATCHED -> Log.d("isPreferredCredentials", "Credentials not matched.") IsPreferredCredentialsResult.PREFERRED_CREDENTIALS_MATCHED -> Log.d("isPreferredCredentials", "Credentials matched.") } } .addOnFailureListener { e: Exception -> Log.d("isPreferredCredentials", "ERROR: [${e}]") }
Identifiants de réseau Thread par agent Border
Un ID d'agent de bordure identifie de manière unique un routeur de bordure. Pour utiliser l'API getCredentialsByBorderAgent
, vous devez d'abord créer un objet ThreadBorderAgent
et transmettre l'ID de l'agent Border.
Une fois l'objet ThreadBorderAgent
créé, appelez getCredentialsByBorderAgent
. Si les identifiants ont été enregistrés, vérifiez s'ils sont de préférence.
private fun isPreferredThreadNetworkByBorderAgent(borderAgentInfo: BorderAgentInfo) {
val threadBorderAgent = ThreadBorderAgent.newBuilder(borderAgentInfo.borderAgentId).build()
Log.d("debug", "border router id:" + threadBorderAgent.id)
var isPreferred = IsPreferredCredentialsResult.PREFERRED_CREDENTIALS_NOT_FOUND
var borderAgentCredentials: ThreadNetworkCredentials?
val taskByBorderAgent = ThreadNetwork.getClient(this)
taskByBorderAgent
.getCredentialsByBorderAgent(threadBorderAgent)
.addOnSuccessListener { result: ThreadNetworkCredentialsResult ->
borderAgentCredentials = result.credentials
result.credentials?.let {
taskByBorderAgent.isPreferredCredentials(it).addOnSuccessListener { result ->
isPreferred = result
}
}
}
.addOnFailureListener { e: Exception -> Log.d(TAG, "ERROR: [${e}]") }
}
Identifiants du réseau Thread par extension d'identifiant de panorama
Comme pour getPreferredCredentials
, vous pouvez également demander à l'utilisateur de saisir ses identifiants à partir de l'ID de panorama étendu d'un routeur de bordure. getCredentialsByExtendedPanId
renvoie un IntentSender
et le résultat d'activité contient un objet ThreadNetworkCredentials
lorsque l'utilisateur approuve.
private fun getCredentialsByExtPanId(borderAgentInfo: BorderAgentInfo) {
ThreadNetwork.getClient(this)
.getCredentialsByExtendedPanId(borderAgentInfo.extPanId)
.addOnSuccessListener { intentSenderResult ->
intentSenderResult.intentSender?.let {
preferredCredentialsLauncher.launch(IntentSenderRequest.Builder(it).build())
}
?: Log.d("debug", "No credentials found.")
}
.addOnFailureListener { e: Exception -> Log.d(TAG, "ERROR: [${e}]") }
}
Supprimer les identifiants
Lorsque votre routeur de bordure est supprimé de votre maison ou que vous avez rétabli la configuration d'usine, vous devez supprimer son réseau Thread des services Google Play.
private fun removeCredentials(borderAgentInfo: BorderAgentInfo) {
val threadBorderAgent = ThreadBorderAgent.newBuilder(borderAgentInfo.borderAgentId).build()
Log.d("debug", "border router id:" + threadBorderAgent.id)
ThreadNetwork.getClient(this)
.removeCredentials(threadBorderAgent)
.addOnSuccessListener { Log.d("debug", "Credentials removed.") }
.addOnFailureListener { e: Exception -> Log.d(TAG, "ERROR: [${e}]") }
}
Ressources
Pour en savoir plus sur le SDK Thread Network, consultez la documentation de référence sur l'API.