Android için Thread Network SDK'sı

Thread Network SDK, dijital ortama benzer bir işleve sahip anahtar zincirini kullanabilirsiniz. Bu özellik, Android uygulamalarınızın Thread ağ kimlik bilgilerini Google Play Hizmetleri. Bu işlem, uygulamalarınızın kimlik bilgileri ve kullanıcı verilerini doğrudan açığa çıkarmadan tüm akıllı ev ekosistemlerini destekler.

Yalnızca birkaç API çağrısıyla şunları yapabilirsiniz:

  1. Google Play Hizmetleri'nden tercih edilen Thread ağ kimlik bilgilerini isteyin.
  2. Yeni sınır yönlendiricileri ayarlayın ve Thread ağ kimlik bilgilerinizi Google'a ekleyin Play Hizmetleri.
  3. Halihazırda saha içi sınır yönlendiricileriniz varsa sınırınızın olup olmadığını kontrol edebilirsiniz. yönlendiriciler tercih edilen ağdadır ve gerekirse bunları taşır.

Göz önünde bulundurulması gereken birkaç kullanıcı ve geliştirici yolculuğu vardır. Risklerin çoğunu diğer temel özellikler ve önerilen kullanımlarla birlikte bu kılavuzda bulabilirsiniz.

Temel terminoloji ve API kavramları

Başlamadan önce aşağıdaki terimleri incelemeniz faydalı olacaktır:

  • Thread Network Credentials (İş Parçacığı Ağ Kimlik Bilgileri): Kodlayan iş parçacığı TLV'lerinin ikili blob'u belirli bir Thread ağına katılmak için bir Thread cihazı.

  • Tercih Edilen Thread Ağ Kimlik Bilgileri: Otomatik olarak seçilen Thread ağı kullanılarak farklı tedarikçilerin uygulamalarıyla paylaşılabilecek kimlik bilgileri getPreferredCredentials API.

  • Sınır Aracısı Kimliği: İş Parçacığı Yönlendiricisi için 16 baytlık genel olarak benzersiz kimlik olanak tanır. Bu kimlik, sınır yönlendirici satıcıları tarafından oluşturulur ve yönetilir.

  • Thread Kenarlık Yönlendirici Kurulumu uygulaması: Bu, Android uygulamanızı yapılandırarak Thread ağ kimlik bilgilerini ekler ve Thread ağ kimlik bilgilerini Google Play Hizmetleri. Uygulamanız, eklenen öğenin yetkili sahibidir ve bunlara erişebilmesi gerekir.

Thread Network API'lerinin çoğu bir Görev tamamlanabilmesini sağlar. Tekliflerinizi otomatikleştirmek ve optimize etmek için addOnSuccessListener ve addOnFailureListener kullanabilirsiniz. Daha fazla bilgi edinmek için Görev belgelerinden faydalanabilirsiniz.

Kimlik bilgisi sahipliği ve bakımı

Thread ağ kimlik bilgilerini ekleyen uygulama, kimlik bilgilerine sahip olması gerekir ve kimlik bilgilerine erişmek için tüm izinlere sahip olmalıdır. Denemek için diğer uygulamalar tarafından eklenen kimlik bilgilerine erişmek için bir PERMISSION_DENIED hatası.

Uygulama sahibi olarak, kimlik bilgilerinizi Google'da saklamanız önerilir. İş Parçacığı Yönlendirici ağı güncellendiğinde Play Hizmetleri güncel kalır. Bu gerektiğinde kimlik bilgileri eklemek, sınır olduğunda kimlik bilgilerinin güncellenmesi Thread ağ kimlik bilgileri değiştiğinde ve İş Parçacığı Sınır Yönlendiricisi kaldırıldı veya fabrika ayarlarına sıfırlandı.

Sınır aracısı bulma

Kimlik bilgileri bir Sınır Aracısı Kimliği ile kaydedilmelidir. Her bir web sitesi için İş Parçacığı Yönlendiricisi Kurulum uygulamanız, Sınır Aracısı Kimliklerini sınır yönlendiricinizin bir listesidir.

İş Parçacığı Sınırı Yönlendiricileri, Thread ağ bilgilerini tanıtmak için mDNS kullanmalıdır, Ağ Adı, Genişletilmiş Kaydırma Kimliği ve Sınır Aracısı Kimliği dahil. İlgili içeriği oluşturmak için kullanılan bu özelliklere karşılık gelen txt değerleri şunlardır: nn, xp ve id, tıklayın.

Google sınır yönlendiricileri olan ağlar için Google Play Hizmetleri otomatik olarak Google Thread ağ kimlik bilgilerini alır.

SDK'yı Android uygulamanıza entegre etme

Başlamak için aşağıdaki adımları tamamlayın:

  1. Şu adreste sağlanan talimatları uygulayın: Google Play Hizmetleri'ni kurun.

  2. Google Play Hizmetleri bağımlılığını build.gradle dosyanıza ekleyin:

    implementation 'com.google.android.gms:play-services-threadnetwork:16.0.0'
    
  3. İsteğe bağlı: Sınır yönlendiricinin depolanması için bir BorderAgent veri sınıfı tanımlayın. ekleyebilirsiniz. Bu verileri bu kılavuz boyunca kullanacağız:

    data class BorderAgentInfo(
      // Network Name max 16 len
      val networkName: String = "",
      val extPanId: ByteArray = ByteArray(16),
      val borderAgentId: ByteArray = ByteArray(16),
      ...
    )
    

Daha sonra, tercih edilen uygulamalarınızın eklenmesi ve yönetilmesi için önerilen adımları kimlik bilgileri.

Yeni sınır yönlendiricisi kurulumları

Yeni sınır yönlendiricileri için yeni bir ağ oluşturmadan önce ağ kimlik bilgilerini kullanmayı deneyin. Böylece proje daha Mümkün olduğunda Thread cihazları tek bir Thread ağına bağlanır.

getPreferredCredentials çağrısı başlatılır kullanıcılardan ağ isteğine izin vermelerini isteyen bir Etkinlik. Ağ kimlik bilgileri Thread SDK dijital anahtar zincirinde depolanmıştır. Kimlik bilgileri uygulamanıza döndürülür.

Kimlik bilgisi iste

Kullanıcıdan tercih edilen kimlik bilgilerini istemek için:

  1. ActivityLauncher bildiriminde bulunun:

    private lateinit var preferredCredentialsLauncher: ActivityResultLauncher<IntentSenderRequest>
    
  2. ThreadNetworkCredentials olarak döndürülen Etkinlik sonucunu işleme:

    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.")
       }
     }
    
  3. preferredCredentials numaralı telefonu arayıp Etkinliği başlatın:

    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}]") }
    }
    

Yeni Thread ağı oluşturma

Kullanıcının Thread ağı varsa addCredentials API'yi kullanarak şuraya kimlik bilgisi ekleyebilirsiniz: Google Play Hizmetleri. Bunun için bir ThreadBorderAgent oluşturmanız, ve ayrıca bir ThreadNetworkCredentials nesnesi sağlar.

Rastgele bir ağ oluşturmak için newRandomizeBuilder işlevini çağırın:

val threadCredentials = ThreadNetworkCredentials.newRandomizedBuilder().build()

Thread ağ adını belirtmek için:

val threadCredentials = ThreadNetworkCredentials.newRandomizedBuilder()
  .setNetworkName("ThreadNetworkSDK")
  .build()

Kimlik bilgisi ekleyin

Thread ağ kimlik bilgilerinizi diğer Thread tedarikçi firmaları tarafından kullanılabilir hale getirmek için onları Google Play hizmetlerine eklememiz gerekiyor. Yeni e-postalarımızı eklemeden önce bu Thread'in hangi sınır yönlendirici cihazına ait olduğunu da bilmemiz gerekir. ağın ait olduğu kişidir.

Bu örnekte, Sınır Aracısı Kimliğinden bir ThreadBorderAgent oluşturacağız ve yeni oluşturduğunuz Thread ağ kimlik bilgilerini iletin:

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}]") }
}

Saha içi sınır yönlendiricilerini tespit edin ve taşıyın

Saha içi sınır yönlendiricileriniz varsa şunları kullanabilirsiniz: Sınır yönlendiricilerinizin ait olup olmadığını belirlemek için isPreferredCredentials . Bu API, tarafından izin verilmesini sağlar ve sınır yönlendiricisinin kimlik bilgilerini depolananlarla karşılaştırarak kontrol eder. .

isPreferredCredentails, eşleşmemiş için 0, eşleşmemiş durumda ise 1 değerini döndürür. Int veri türü olarak eşleşiyor. IsPreferredCredentialsResult kullanabilirsiniz ve sonuçlarınızı kontrol edin.

public @interface IsPreferredCredentialsResult {
    int PREFERRED_CREDENTIALS_NOT_FOUND = -1;
    int PREFERRED_CREDENTIALS_NOT_MATCHED = 0;
    int PREFERRED_CREDENTIALS_MATCHED = 1;
}

isPreferredCredentials özelliğini kullanmak için bir Önce ThreadNetworkCredentials nesne. ThreadNetworkCredentials örneğini oluşturmanın birkaç yolu vardır. Sonraki adımlarda, bu seçenekleri gözden geçireceğiz.

Ağ kimlik bilgilerini Operasyonel Veri Kümesine göre sıralayın

İş Parçacığı Sınırı Yönlendiricinizin önceden bir Thread ağı ve bu Thread ağını Google Play Hizmetleri'ne eklemek istiyorsunuz paylaşmak istemezsiniz. ThreadNetworkCredential oluşturabilirsiniz ham İş Parçacığı Aktif Operasyonel Veri Kümesi TLV listesinden örnek:

  1. Operasyonel veri kümesini ByteArray biçimine dönüştürün. Örneğin:

    val activeDataset =
          "0e080000000000010000000300000f35060004001fffe0020833333333...".dsToByteArray()
    
    fun String.dsToByteArray(): ByteArray {
      return chunked(2).map { it.toInt(16).toByte() }.toByteArray()
    }
    
  2. ThreadNetworkCredentials oluşturmak için fromActiveOperationalDataset öğesini kullanın. Başarılı olduğunda Thread ağının adını, Kanalını ve diğer ağ bilgileri. Tesislerin tam listesi için şuraya bakın: ThreadNetworkCredentials.

    val threadNetworkCredentials =
        ThreadNetworkCredentials.fromActiveOperationalDataset(activeDataset)
    Log.d(
        "threadNetworkCredentials",
        threadNetworkCredentials.channel.toString() + " - " + threadNetworkCredentials.networkName)
    
  3. isPreferredCredentials API'yi çağırın ve ThreadNetworkCredentials.

    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}]") }
    

Sınır Aracısı'na göre iş parçacığı ağ kimlik bilgilerini

Sınır Aracısı Kimliği, bir sınır yönlendirici cihazını benzersiz şekilde tanımlar. Kullanılacak getCredentialsByBorderAgent API'sini kullanmak için öncelikle bir ThreadBorderAgent nesnesini tanımlayın ve Sınır Aracısı Kimliğini iletin.

ThreadBorderAgent nesnesini oluşturduktan sonra şunu çağırın: getCredentialsByBorderAgent. Kimlik bilgileri kaydedilmişse doğrulamanın tercih edilir.

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}]") }
}

Genişletilmiş Kaydırma Kimliği ile ileti dizisi ağ kimlik bilgilerini

getPreferredCredentials özelliğine benzer şekilde, kullanıcıdan kimlik bilgilerini bir sınır yönlendiricisinin Genişletilmiş Kaydırma Kimliğinden alır. İlgili içeriği oluşturmak için kullanılan getCredentialsByExtendedPanId bir IntentSender döndürür ve Etkinlik sonuç, kullanıcı onayladığında bir ThreadNetworkCredentials nesnesi içerir.

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}]") }
}

Kimlik Bilgilerini Kaldır

Sınır Yönlendirici cihazınız evinizden kaldırıldığında veya fabrika ayarlarına sıfırlandığında, Thread ağını Google Play hizmetlerinden kaldırması gerekiyor.

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}]") }
}

Kaynaklar

Thread Network SDK hakkında daha fazla bilgi edinmek için şuraya bakın: API Referansı.