Thread Network SDK ডিজিটাল কীচেনের মতো কার্যকারিতা প্রদান করে, যা আপনার Android অ্যাপকে Google Play পরিষেবার সাথে Thread নেটওয়ার্ক ক্রেডেনশিয়াল শেয়ার করার অনুমতি দেয়। এর ফলে, আপনার অ্যাপ ক্রেডেনশিয়াল ও ব্যবহারকারীর ডেটা সরাসরি প্রকাশ না করেই যেকোনও স্মার্ট হোম ইকোসিস্টেম থেকে যেকোনও থ্রেড ডিভাইস সেট-আপ করতে পারে।
মাত্র কয়েকটি API কলের মাধ্যমে আপনি এগুলি করতে পারবেন:
- Google Play পরিষেবা থেকে পছন্দের Thread নেটওয়ার্ক ক্রেডেনশিয়ালের জন্য অনুরোধ করুন।
- নতুন Thread Border Router (TBR) সেট-আপ করুন এবং Google Play পরিষেবায় আপনার থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল যোগ করুন।
- আপনার কাছে আগে থেকেই ইন-ফিল্ড TBR থাকলে, আপনার TBR পছন্দের নেটওয়ার্কে আছে কিনা তা চেক করে দেখতে এবং প্রয়োজন হলে, সেগুলি মাইগ্রেট করতে পারবেন।
ব্যবহারকারী ও ডেভেলপারদের জন্য বিভিন্ন ধরনের জার্নি বিবেচনা করতে হবে। আমরা এই গাইডে সেগুলির বেশিরভাগই কভার করব, সাথে অন্যান্য মূল ফিচার এবং সাজেস্ট করা ব্যবহারও থাকবে।
মূল পরিভাষা ও API সংক্রান্ত ধারণা
শুরু করার আগে, নিম্নলিখিত শব্দগুলি বুঝে নিলে সুবিধা হবে:
থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল: থ্রেড TLV-এর বাইনারি ব্লব যা থ্রেড নেটওয়ার্কের নাম, নেটওয়ার্ক কী এবং অন্যান্য প্রপার্টি এনকোড করে। কোনও থ্রেড ডিভাইসকে নির্দিষ্ট থ্রেড নেটওয়ার্কে যোগ দিতে হলে এগুলি প্রয়োজন হয়।
পছন্দের Thread নেটওয়ার্ক ক্রেডেনশিয়াল: অটোমেটিক বেছে নেওয়া Thread নেটওয়ার্ক ক্রেডেনশিয়াল যা
getPreferredCredentialsAPI ব্যবহার করে বিভিন্ন ভেন্ডরের অ্যাপের সাথে শেয়ার করা যেতে পারে।বর্ডার এজেন্ট আইডি: TBR ডিভাইসের জন্য ১৬-বাইটের বিশ্বব্যাপী অনন্য আইডি। এই আইডি border router ভেন্ডর তৈরি ও ম্যানেজ করে।
TBR সেট-আপ অ্যাপ: এটি আপনার Android অ্যাপ যা নতুন TBR ডিভাইস সেট-আপ করে এবং Google Play পরিষেবায় থ্রেড নেটওয়ার্কের ক্রেডেনশিয়াল যোগ করে। আপনার অ্যাপ হল যোগ করা ক্রেডেনশিয়ালের প্রামাণিক মালিক এবং সেটির কাছে ক্রেডেনশিয়ালের অ্যাক্সেস আছে।
অনেক থ্রেড নেটওয়ার্ক API একটি টাস্ক ফেরত দেয় যা অ্যাসিঙ্ক্রোনাসভাবে সম্পূর্ণ হয়। ফলাফল পাওয়ার জন্য কলব্যাক রেজিস্টার করতে আপনি addOnSuccessListener এবং addOnFailureListener ব্যবহার করতে পারবেন। আরও জানতে, Task ডকুমেন্টেশন দেখুন।
ক্রেডেনশিয়ালের মালিকানা ও রক্ষণাবেক্ষণ
যে অ্যাপ থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল যোগ করে, সেটি ক্রেডেনশিয়ালের মালিক হয়ে যায় এবং
ক্রেডেনশিয়াল অ্যাক্সেস করার সম্পূর্ণ অনুমতি পায়। অন্য অ্যাপের মাধ্যমে যোগ করা ক্রেডেনশিয়াল অ্যাক্সেস করার চেষ্টা করলে, আপনি PERMISSION_DENIED
সমস্যা দেখতে পাবেন।
অ্যাপের মালিক হিসেবে, TBR নেটওয়ার্ক আপডেট করা হলে, Google Play পরিষেবায় স্টোর করা ক্রেডেনশিয়াল আপ-টু-ডেট রাখার জন্য সাজেস্ট করা হয়। এর অর্থ হল, প্রয়োজন হলে ক্রেডেনশিয়াল যোগ করা, border router-এর থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল পরিবর্তন হলে ক্রেডেনশিয়াল আপডেট করা এবং TBR সরিয়ে দেওয়া হলে বা ফ্যাক্টরি রিসেট করা হলে ক্রেডেনশিয়াল সরিয়ে দেওয়া।
Border Agent ডিসকভারি
Border Agent আইডির সাথে ক্রেডেনশিয়াল সেভ করতে হবে। আপনাকে নিশ্চিত করতে হবে যে আপনার TBR সেট-আপ অ্যাপ যেন আপনার TBR-এর বর্ডার এজেন্ট আইডি নির্ধারণ করতে পারে।
TBR-কে অবশ্যই mDNS ব্যবহার করে Thread নেটওয়ার্কের তথ্য বিজ্ঞাপন করতে হবে,
যার মধ্যে নেটওয়ার্কের নাম, এক্সটেন্ডেড প্যান আইডি এবং বর্ডার এজেন্ট আইডি অন্তর্ভুক্ত। এইসব অ্যাট্রিবিউটের জন্য
সংশ্লিষ্ট txt ভ্যালু হল যথাক্রমে nn, xp এবং id।
Google Thread Border Router (gTBR)-এর সাথে নেটওয়ার্কের জন্য, Google Play পরিষেবা অটোমেটিক ব্যবহারের জন্য Google Thread নেটওয়ার্ক ক্রেডেনশিয়াল পায়।
আপনার Android অ্যাপে SDK ইন্টিগ্রেট করা
শুরু করতে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:
Google Play পরিষেবা সেট-আপ করুন লিঙ্কে দেওয়া নির্দেশাবলী অনুসরণ করুন।
আপনার
build.gradleফাইলে Google Play পরিষেবার ডিপেন্ডেন্সি যোগ করুন:implementation 'com.google.android.gms:play-services-threadnetwork:16.2.1'ঐচ্ছিক: TBR তথ্য স্টোর করার জন্য
BorderAgentডেটা ক্লাস নির্ধারণ করুন। এই গাইডে আমরা এই ডেটা ব্যবহার করব:data class BorderAgentInfo( // Network Name max 16 len val networkName: String = "", val extPanId: ByteArray = ByteArray(16), val borderAgentId: ByteArray = ByteArray(16), ... )
এরপর, আমরা পছন্দসই ক্রেডেনশিয়াল যোগ ও ম্যানেজ করার জন্য সাজেস্ট করা ধাপগুলি পর্যালোচনা করব।
নতুন থ্রেড বর্ডার রাউটার সেট-আপ
নতুন বর্ডার রাউটারের জন্য নতুন নেটওয়ার্ক তৈরি করার আগে, এটি গুরুত্বপূর্ণ যে আপনি প্রথমে পছন্দের নেটওয়ার্ক ক্রেডেনশিয়াল ব্যবহার করার চেষ্টা করুন। এটি নিশ্চিত করে যে সম্ভব হলে থ্রেড ডিভাইসগুলি একটি থ্রেড নেটওয়ার্কের সাথে কানেক্ট করা আছে।
getPreferredCredentials-এ কল করলে একটি অ্যাক্টিভিটি
লঞ্চ হয়, যা ব্যবহারকারীকে নেটওয়ার্ক অনুরোধের অনুমতি দিতে প্রম্পট করে। থ্রেড SDK ডিজিটাল কীচেনে নেটওয়ার্ক ক্রেডেনশিয়াল স্টোর করা থাকলে, ক্রেডেনশিয়াল আপনার অ্যাপে ফিরিয়ে দেওয়া হয়।
ক্রেডেনশিয়ালের জন্য অনুরোধ করুন
ব্যবহারকারীকে পছন্দের ক্রেডেনশিয়াল প্রম্পট করতে:
ActivityLauncherঘোষণা করুন:private lateinit var preferredCredentialsLauncher: ActivityResultLauncher<IntentSenderRequest>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.") } }আপনি নতুন TBR সেট-আপ করলে, আপনাকে
preferredCredentials-কে কল করে অ্যাক্টিভিটি লঞ্চ করার পরামর্শ দেওয়া হচ্ছে। এই কলটি নিশ্চিত করবে যে আপনার নতুন TBR ফোনে আগে থেকেই পছন্দের হিসেবে স্টোর করা একই ক্রেডেনশিয়াল ব্যবহার করবে, যা একই নেটওয়ার্কে বিভিন্ন TBR-এর কনভারজেন্সকে প্রমোট করবে।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}]") } }আপনার ব্যবহারের কেস যদি নন-TBR ডিভাইস সেট-আপ করার সাথে সম্পর্কিত হয়, যেমন নতুন Matter-over-Thread এন্ড ডিভাইস, তাহলে ক্রেডেনশিয়াল ফেচ করার জন্য আপনাকে
allActiveCredentialsAPI ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই কলটি লোকাল নেটওয়ার্কে পাওয়া TBR স্ক্যান করবে এবং তাই লোকাল নেটওয়ার্কে আগে থেকে থাকা TBR-এ উপলভ্য নয় এমন ক্রেডেনশিয়াল রিটার্ন করবে না।// Creates the IntentSender result launcher for the getAllActiveCredentials API private val getAllActiveCredentialsLauncher = registerForActivityResult( StartIntentSenderForResult() ) { result: ActivityResult -> if (result.resultCode == RESULT_OK) { val activeCredentials: List<ThreadNetworkCredentials> = ThreadNetworkCredentials.parseListFromIntentSenderResultData( result.data!! ) // Use the activeCredentials list } else { // The user denied to share! } } // Invokes the getAllActiveCredentials API and starts the dialog activity with the returned // IntentSender threadNetworkClient .getAllActiveCredentials() .addOnSuccessListener { intentSenderResult: IntentSenderResult -> val intentSender = intentSenderResult.intentSender if (intentSender != null) { getAllActiveCredentialsLauncher.launch( IntentSenderRequest.Builder(intentSender).build() ) } else { // No active network credentials found! } } // Handles the failure .addOnFailureListener { e: Exception -> // Handle the exception }
নতুন Thread নেটওয়ার্ক তৈরি করুন
ব্যবহারকারীর Thread নেটওয়ার্কে যদি কোনও পছন্দসই Thread নেটওয়ার্ক ক্রেডেনশিয়াল বা অ্যাক্টিভ Thread ক্রেডেনশিয়াল উপলভ্য না থাকে, তাহলে আপনি Google Play পরিষেবায় ক্রেডেনশিয়াল যোগ করতে addCredentials API ব্যবহার করতে পারবেন। এটি করতে, আপনাকে একটি ThreadBorderAgent তৈরি করতে হবে,
এবং একটি ThreadNetworkCredentials অবজেক্টও প্রদান করতে হবে।
র্যান্ডম নেটওয়ার্ক তৈরি করতে, newRandomizeBuilder কল করুন:
val threadCredentials = ThreadNetworkCredentials.newRandomizedBuilder().build()
থ্রেড নেটওয়ার্কের নাম নির্দিষ্ট করতে:
val threadCredentials = ThreadNetworkCredentials.newRandomizedBuilder()
.setNetworkName("ThreadNetworkSDK")
.build()
ক্রেডেনশিয়াল যোগ করুন
অন্যান্য থ্রেড ভেন্ডরের জন্য আপনার থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল উপলভ্য করতে, আমাদের সেগুলি Google Play পরিষেবায় যোগ করতে হবে। আমাদের নতুন ক্রেডেনশিয়াল যোগ করার আগে, আমাদের জানতে হবে যে এই থ্রেড নেটওয়ার্কটি কোন TBR ডিভাইসের সাথে যুক্ত।
এই উদাহরণে, আমরা বর্ডার এজেন্ট আইডি থেকে একটি 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}]") }
}
ইন-ফিল্ড border router শনাক্ত ও মাইগ্রেট করুন
আপনার ইন-ফিল্ড border router থাকলে, আপনার border router
পছন্দের নেটওয়ার্কের অন্তর্গত কিনা তা নির্ধারণ করতে
isPreferredCredentials ব্যবহার করতে পারবেন। এই API ব্যবহারকারীর কাছে অনুমতির জন্য প্রম্পট করে না এবং Google Play পরিষেবায় যা স্টোর করা আছে তার সাথে border router ক্রেডেনশিয়াল চেক করে।
isPreferredCredentials, 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 ইনস্ট্যান্টিয়েট করার একাধিক উপায় আছে। পরবর্তী ধাপে, আমরা এইসব বিকল্পের ব্যাপারে আলোচনা করব।
অপারেশনাল ডেটাসেট অনুযায়ী থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল
এমনও হতে পারে যে আপনার TBR আগে থেকেই কোনও থ্রেড নেটওয়ার্কের সাথে সেট-আপ করা আছে এবং আপনি এই থ্রেড নেটওয়ার্কটি Google Play পরিষেবায় যোগ করতে চান যাতে অন্যান্য ভেন্ডরের সাথে এটি শেয়ার করা যায়। আপনি র Thread অ্যাক্টিভ অপারেশনাল ডেটাসেট TLV তালিকা থেকে একটি ThreadNetworkCredential
ইনস্ট্যান্স তৈরি করতে পারেন:
অপারেশনাল ডেটাসেটকে
ByteArray-এ কনভার্ট করুন। যেমন:val activeDataset = "0e080000000000010000000300000f35060004001fffe0020833333333...".dsToByteArray()fun String.dsToByteArray(): ByteArray { return chunked(2).map { it.toInt(16).toByte() }.toByteArray() }ThreadNetworkCredentialsতৈরি করতেfromActiveOperationalDatasetব্যবহার করুন। এটি সম্পূর্ণ হলে, আপনি থ্রেড নেটওয়ার্কের নাম, চ্যানেল ও অন্যান্য নেটওয়ার্ক সংক্রান্ত তথ্য দেখতে পাবেন। প্রপার্টির সম্পূর্ণ তালিকার জন্য, ThreadNetworkCredentials দেখুন।val threadNetworkCredentials = ThreadNetworkCredentials.fromActiveOperationalDataset(activeDataset) Log.d( "threadNetworkCredentials", threadNetworkCredentials.channel.toString() + " - " + threadNetworkCredentials.networkName)isPreferredCredentialsAPI কল করুন এবং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}]") }
Border Agent-এর মাধ্যমে Thread নেটওয়ার্ক ক্রেডেনশিয়াল
বর্ডার এজেন্ট আইডি অনন্যভাবে একটি TBR ডিভাইস শনাক্ত করে। 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}]") }
}
এক্সটেন্ডেড প্যান আইডি অনুযায়ী Thread নেটওয়ার্কের ক্রেডেনশিয়াল
getPreferredCredentials-এর মতো, আপনিও TBR-এর এক্সটেন্ডেড প্যান আইডি থেকে
ক্রেডেনশিয়ালের জন্য ব্যবহারকারীকে প্রম্পট করতে পারবেন। 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}]") }
}
ক্রেডেনশিয়াল সরান
আপনার border router ডিভাইস আপনার হোম থেকে সরিয়ে দিলে বা ফ্যাক্টরি রিসেট করলে, আপনাকে 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}]") }
}
রিসোর্স
Thread Network SDK সম্পর্কে আরও জানতে, API রেফারেন্স দেখুন।