Android এর জন্য থ্রেড নেটওয়ার্ক SDK

থ্রেড নেটওয়ার্ক SDK একটি ডিজিটাল কীচেনের মতো কার্যকারিতা প্রদান করে, যা আপনার অ্যান্ড্রয়েড অ্যাপগুলিকে Google Play পরিষেবাগুলির সাথে থ্রেড নেটওয়ার্ক শংসাপত্রগুলি ভাগ করার অনুমতি দেয়৷ এটি আপনার অ্যাপগুলিকে যেকোনো স্মার্ট হোম ইকোসিস্টেম থেকে যেকোনো থ্রেড ডিভাইস সেট আপ করার অনুমতি দেয়, সরাসরি প্রমাণপত্র এবং ব্যবহারকারীর ডেটা প্রকাশ না করে।

মাত্র কয়েকটি API কলের মাধ্যমে, আপনি করতে পারেন:

  1. Google Play পরিষেবাগুলি থেকে পছন্দের থ্রেড নেটওয়ার্ক শংসাপত্রের অনুরোধ করুন৷
  2. নতুন বর্ডার রাউটার সেট আপ করুন এবং Google Play পরিষেবাগুলিতে আপনার থ্রেড নেটওয়ার্ক শংসাপত্র যোগ করুন৷
  3. আপনার যদি ইতিমধ্যেই ইন-ফিল্ড বর্ডার রাউটার থাকে, আপনি আপনার বর্ডার রাউটারগুলি পছন্দের নেটওয়ার্কে আছে কিনা তা পরীক্ষা করতে পারেন এবং প্রয়োজনে সেগুলি স্থানান্তর করতে পারেন।

বিবেচনা করার জন্য বেশ কয়েকটি ব্যবহারকারী এবং বিকাশকারীর যাত্রা রয়েছে। অন্যান্য মূল বৈশিষ্ট্য এবং প্রস্তাবিত ব্যবহারের সাথে আমরা এই গাইডে তাদের বেশিরভাগকে কভার করব।

মূল পরিভাষা এবং API ধারণা

আপনি শুরু করার আগে, নিম্নলিখিত শর্তাবলী বোঝা সহায়ক:

  • থ্রেড নেটওয়ার্ক শংসাপত্র: থ্রেড TLV-এর বাইনারি ব্লব যা থ্রেড নেটওয়ার্কের নাম, নেটওয়ার্ক কী এবং অন্যান্য বৈশিষ্ট্যগুলিকে এনকোড করে যা একটি প্রদত্ত থ্রেড নেটওয়ার্কে যোগদানের জন্য একটি থ্রেড ডিভাইসের প্রয়োজন হয়।

  • পছন্দের থ্রেড নেটওয়ার্ক শংসাপত্র: স্বয়ংক্রিয়ভাবে নির্বাচিত থ্রেড নেটওয়ার্ক শংসাপত্র যা getPreferredCredentials API ব্যবহার করে বিভিন্ন বিক্রেতার অ্যাপের সাথে ভাগ করা যেতে পারে।

  • বর্ডার এজেন্ট আইডি: একটি থ্রেড বর্ডার রাউটার ডিভাইসের জন্য একটি 16-বাইট বিশ্বব্যাপী অনন্য আইডি। এই আইডিটি বর্ডার রাউটার বিক্রেতাদের দ্বারা তৈরি এবং পরিচালিত হয়।

  • থ্রেড বর্ডার রাউটার সেটআপ অ্যাপ: এটি আপনার অ্যান্ড্রয়েড অ্যাপ যা নতুন থ্রেড বর্ডার রাউটার ডিভাইস সেট আপ করে এবং Google Play পরিষেবাতে থ্রেড নেটওয়ার্ক শংসাপত্র যোগ করে। আপনার অ্যাপটি যোগ করা শংসাপত্রের প্রামাণিক মালিক এবং সেগুলিতে অ্যাক্সেস রয়েছে৷

অনেক থ্রেড নেটওয়ার্ক API একটি টাস্ক ফেরত দেয় যা অ্যাসিঙ্ক্রোনাসভাবে সম্পূর্ণ হয়। ফলাফল পাওয়ার জন্য কলব্যাক নিবন্ধন করতে আপনি addOnSuccessListener এবং addOnFailureListener ব্যবহার করতে পারেন। আরও জানতে, টাস্ক ডকুমেন্টেশন পড়ুন।

শংসাপত্রের মালিকানা এবং রক্ষণাবেক্ষণ

যে অ্যাপটি থ্রেড নেটওয়ার্ক শংসাপত্রগুলি যোগ করে তা শংসাপত্রগুলির মালিক হয়ে যায় এবং শংসাপত্রগুলিতে অ্যাক্সেস করার সম্পূর্ণ অনুমতি রয়েছে৷ আপনি যদি অন্যান্য অ্যাপ্লিকেশানগুলির দ্বারা যোগ করা শংসাপত্রগুলি অ্যাক্সেস করার চেষ্টা করেন তবে আপনি একটি PERMISSION_DENIED ত্রুটি পাবেন৷

অ্যাপের মালিক হিসেবে, থ্রেড বর্ডার রাউটার নেটওয়ার্ক আপডেট করার সময় আপনি Google Play পরিষেবাগুলিতে শংসাপত্রগুলি আপ-টু-ডেট সংরক্ষণ করার পরামর্শ দেওয়া হচ্ছে। এর মানে হল প্রয়োজনে শংসাপত্র যোগ করা, বর্ডার রাউটারের থ্রেড নেটওয়ার্ক শংসাপত্র পরিবর্তন হলে শংসাপত্রগুলি আপডেট করা এবং থ্রেড বর্ডার রাউটার সরানো বা ফ্যাক্টরি রিসেট হলে শংসাপত্রগুলি সরানো।

বর্ডার এজেন্ট আবিষ্কার

শংসাপত্র একটি বর্ডার এজেন্ট আইডি দিয়ে সংরক্ষণ করতে হবে। আপনাকে নিশ্চিত করতে হবে যে আপনার থ্রেড বর্ডার রাউটার সেটআপ অ্যাপ আপনার থ্রেড বর্ডার রাউটারের বর্ডার এজেন্ট আইডি নির্ধারণ করতে সক্ষম।

থ্রেড বর্ডার রাউটারগুলিকে অবশ্যই mDNS ব্যবহার করতে হবে নেটওয়ার্কের নাম, এক্সটেন্ডেড প্যান আইডি এবং বর্ডার এজেন্ট আইডি সহ থ্রেড নেটওয়ার্ক তথ্যের বিজ্ঞাপন দিতে। এই বৈশিষ্ট্যগুলির জন্য সংশ্লিষ্ট txt মানগুলি যথাক্রমে nn , xp এবং id

Google বর্ডার রাউটারগুলির সাথে নেটওয়ার্কগুলির জন্য, Google Play পরিষেবাগুলি স্বয়ংক্রিয়ভাবে Google থ্রেড নেটওয়ার্ক শংসাপত্রগুলি ব্যবহারের জন্য পায়৷

আপনার Android অ্যাপে SDK সংহত করুন

শুরু করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:

  1. সেট আপ Google Play পরিষেবাগুলিতে প্রদত্ত নির্দেশাবলী অনুসরণ করুন৷

  2. আপনার build.gradle ফাইলে Google Play পরিষেবা নির্ভরতা যোগ করুন:

    implementation 'com.google.android.gms:play-services-threadnetwork:16.0.0'
    
  3. ঐচ্ছিক: বর্ডার রাউটারের তথ্য সঞ্চয় করতে একটি BorderAgent ডেটা ক্লাস সংজ্ঞায়িত করুন। আমরা এই নির্দেশিকা জুড়ে এই ডেটা ব্যবহার করব:

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

এর পরে, আমরা পছন্দের শংসাপত্রগুলি যুক্ত এবং পরিচালনা করার জন্য প্রস্তাবিত পদক্ষেপগুলি অতিক্রম করব৷

নতুন বর্ডার রাউটার সেটআপ

আপনি নতুন বর্ডার রাউটারগুলির জন্য একটি নতুন নেটওয়ার্ক তৈরি করার আগে, এটি গুরুত্বপূর্ণ যে আপনি প্রথমে পছন্দের নেটওয়ার্ক শংসাপত্রগুলি ব্যবহার করার চেষ্টা করুন৷ এটি নিশ্চিত করে যে থ্রেড ডিভাইসগুলি সম্ভব হলে একটি একক থ্রেড নেটওয়ার্কের সাথে সংযুক্ত থাকে।

getPreferredCredentials এ একটি কল একটি অ্যাক্টিভিটি চালু করে, যা ব্যবহারকারীদের নেটওয়ার্ক অনুরোধের অনুমতি দেওয়ার জন্য অনুরোধ করে। নেটওয়ার্ক শংসাপত্রগুলি থ্রেড SDK ডিজিটাল কীচেইনে সংরক্ষণ করা থাকলে, শংসাপত্রগুলি আপনার অ্যাপে ফেরত দেওয়া হয়৷

শংসাপত্রের অনুরোধ করুন

পছন্দের শংসাপত্রের জন্য ব্যবহারকারীকে অনুরোধ করতে:

  1. একটি ActivityLauncher ঘোষণা করুন:

    private lateinit var preferredCredentialsLauncher: ActivityResultLauncher<IntentSenderRequest>
    
  2. 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.")
       }
     }
    
  3. preferredCredentials কল করুন এবং কার্যকলাপ চালু করুন:

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

একটি নতুন থ্রেড নেটওয়ার্ক তৈরি করুন

যদি ব্যবহারকারীর থ্রেড নেটওয়ার্কে কোনো পছন্দের থ্রেড নেটওয়ার্ক শংসাপত্র উপলব্ধ না থাকে, তাহলে আপনি Google Play পরিষেবাতে শংসাপত্র যোগ করতে addCredentials API ব্যবহার করতে পারেন। এটি করার জন্য, আপনাকে একটি ThreadBorderAgent তৈরি করতে হবে এবং একটি ThreadNetworkCredentials অবজেক্টও সরবরাহ করতে হবে।

একটি র্যান্ডম নেটওয়ার্ক তৈরি করতে, newRandomizeBuilder কল করুন:

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

থ্রেড নেটওয়ার্ক নাম নির্দিষ্ট করতে:

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

শংসাপত্র যোগ করুন

আপনার থ্রেড নেটওয়ার্ক শংসাপত্রগুলি অন্যান্য থ্রেড বিক্রেতাদের জন্য উপলব্ধ করতে, আমাদের সেগুলিকে Google Play পরিষেবাগুলিতে যুক্ত করতে হবে৷ আমরা আমাদের নতুন শংসাপত্র যোগ করার আগে, আমাদের জানতে হবে যে এই থ্রেড নেটওয়ার্কটি কোন বর্ডার রাউটার ডিভাইসের অন্তর্গত।

এই উদাহরণে, আমরা একটি বর্ডার এজেন্ট আইডি থেকে একটি ThreadBorderAgent তৈরি করব এবং আপনার তৈরি করা নতুন থ্রেড নেটওয়ার্ক শংসাপত্রগুলি পাস করব:

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

ইন-ফিল্ড বর্ডার রাউটার সনাক্ত করুন এবং স্থানান্তর করুন

আপনার যদি বর্তমানে ইন-ফিল্ড বর্ডার রাউটার থাকে, তাহলে আপনার বর্ডার রাউটারগুলি পছন্দের নেটওয়ার্কের অন্তর্গত কিনা তা নির্ধারণ করতে আপনি isPreferredCredentials ব্যবহার করতে পারেন। এই API ব্যবহারকারীকে অনুমতির জন্য অনুরোধ করে না এবং Google Play পরিষেবাগুলিতে যা সংরক্ষিত আছে তার বিরুদ্ধে বর্ডার রাউটার শংসাপত্র পরীক্ষা করে।

isPreferredCredentails একটি Int ডেটাটাইপ হিসাবে মিলিত না হওয়ার জন্য 0 এবং মিলিত হওয়ার জন্য 1 প্রদান করে। আপনি আপনার ফলাফল পরীক্ষা করতে IsPreferredCredentialsResult ব্যবহার করতে পারেন।

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

isPreferredCredentials ব্যবহার করতে, আপনাকে প্রথমে একটি ThreadNetworkCredentials অবজেক্ট তৈরি করতে হবে। ThreadNetworkCredentials instantiate করার বিভিন্ন উপায় আছে। পরের ধাপে, আমরা এই বিকল্পগুলি নিয়ে যাব।

অপারেশনাল ডেটাসেট দ্বারা থ্রেড নেটওয়ার্ক শংসাপত্র

এমন কিছু ক্ষেত্রে রয়েছে যে আপনার থ্রেড বর্ডার রাউটার ইতিমধ্যেই একটি থ্রেড নেটওয়ার্কের সাথে সেট আপ করা আছে এবং আপনি অন্য বিক্রেতাদের সাথে শেয়ার করার জন্য এই থ্রেড নেটওয়ার্কটিকে Google Play পরিষেবাগুলিতে যোগ করতে চান৷ আপনি একটি কাঁচা থ্রেড সক্রিয় অপারেশনাল ডেটাসেট TLV তালিকা থেকে একটি ThreadNetworkCredential উদাহরণ তৈরি করতে পারেন:

  1. অপারেশনাল ডেটাসেটকে ByteArray রূপান্তর করুন। উদাহরণ স্বরূপ:

    val activeDataset =
          "0e080000000000010000000300000f35060004001fffe0020833333333...".dsToByteArray()
    
    fun String.dsToByteArray(): ByteArray {
      return chunked(2).map { it.toInt(16).toByte() }.toByteArray()
    }
    
  2. ThreadNetworkCredentials তৈরি করতে fromActiveOperationalDataset ব্যবহার করুন। সফল হলে, আপনি থ্রেড নেটওয়ার্কের নাম, চ্যানেল এবং অন্যান্য নেটওয়ার্ক তথ্য পেতে সক্ষম হবেন। বৈশিষ্ট্যের সম্পূর্ণ তালিকার জন্য, ThreadNetworkCredentials পড়ুন।

    val threadNetworkCredentials =
        ThreadNetworkCredentials.fromActiveOperationalDataset(activeDataset)
    Log.d(
        "threadNetworkCredentials",
        threadNetworkCredentials.channel.toString() + " - " + threadNetworkCredentials.networkName)
    
  3. isPreferredCredentials API-কে কল করুন এবং 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}]") }
    

বর্ডার এজেন্ট দ্বারা থ্রেড নেটওয়ার্ক শংসাপত্র

একটি বর্ডার এজেন্ট আইডি অনন্যভাবে একটি বর্ডার রাউটার ডিভাইস সনাক্ত করে। getCredentialsByBorderAgent API ব্যবহার করতে, প্রথমে আপনাকে একটি ThreadBorderAgent অবজেক্ট তৈরি করতে হবে এবং বর্ডার এজেন্ট আইডি পাস করতে হবে।

একবার আপনি ThreadBorderAgent অবজেক্ট তৈরি করলে, getCredentialsByBorderAgent কল করুন। শংসাপত্রগুলি সংরক্ষণ করা থাকলে, সেগুলি পছন্দের কিনা তা পরীক্ষা করে দেখুন৷

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

এক্সটেন্ডেড প্যান আইডি দ্বারা থ্রেড নেটওয়ার্ক শংসাপত্র

getPreferredCredentials এর মতোই, আপনি বর্ডার রাউটারের এক্সটেন্ডেড প্যান আইডি থেকেও ব্যবহারকারীকে শংসাপত্রের জন্য অনুরোধ করতে পারেন। getCredentialsByExtendedPanId একটি IntentSender ফেরত দেয় এবং ব্যবহারকারী অনুমোদন করলে কার্যকলাপ ফলাফলে একটি ThreadNetworkCredentials অবজেক্ট থাকে।

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

শংসাপত্র সরান

যখন আপনার বর্ডার রাউটার ডিভাইসটি আপনার বাড়ি থেকে সরানো হয় বা ফ্যাক্টরি রিসেট করা হয়, তখন আপনাকে 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}]") }
}

সম্পদ

থ্রেড নেটওয়ার্ক SDK সম্পর্কে আরও জানতে, API রেফারেন্স দেখুন।