থ্রেড নেটওয়ার্ক এসডিকে একটি ডিজিটাল কীচেইনের মতো কার্যকারিতা প্রদান করে, যা আপনার অ্যান্ড্রয়েড অ্যাপগুলোকে গুগল প্লে সার্ভিসের সাথে থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল শেয়ার করার সুযোগ দেয়। এর ফলে, আপনার অ্যাপগুলো সরাসরি ক্রেডেনশিয়াল এবং ব্যবহারকারীর ডেটা প্রকাশ না করেই যেকোনো স্মার্ট হোম ইকোসিস্টেমের যেকোনো থ্রেড ডিভাইস সেট আপ করতে পারে।
মাত্র কয়েকটি এপিআই কলের মাধ্যমে আপনি যা করতে পারেন:
- গুগল প্লে পরিষেবা থেকে পছন্দের থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল অনুরোধ করুন।
- নতুন Thread Border Router (TBR) সেট আপ করুন এবং আপনার থ্রেড নেটওয়ার্কের ক্রেডেনশিয়ালগুলো গুগল প্লে সার্ভিসে যোগ করুন।
- আপনার যদি ইতিমধ্যেই মাঠে TBR পড়ার তালিকা) থাকে, তাহলে আপনি যাচাই করে দেখতে পারেন যে আপনার TBR গুলো পছন্দের নেটওয়ার্কে আছে কিনা এবং প্রয়োজনে সেগুলোকে স্থানান্তর করতে পারেন।
ব্যবহারকারী এবং ডেভেলপারদের জন্য বিবেচনা করার মতো বেশ কয়েকটি পর্যায় রয়েছে। এই নির্দেশিকায় আমরা সেগুলোর বেশিরভাগই আলোচনা করব, সাথে থাকবে অন্যান্য গুরুত্বপূর্ণ বৈশিষ্ট্য এবং প্রস্তাবিত ব্যবহারবিধি।
মূল পরিভাষা এবং এপিআই ধারণা
শুরু করার আগে, নিম্নলিখিত পরিভাষাগুলো বুঝে নিলে সুবিধা হবে:
থ্রেড নেটওয়ার্ক ক্রেডেনশিয়ালস: থ্রেড টিএলভি-এর একটি বাইনারি ব্লব যা থ্রেড নেটওয়ার্কের নাম, নেটওয়ার্ক কী এবং অন্যান্য বৈশিষ্ট্যসমূহকে এনকোড করে, যেগুলো একটি নির্দিষ্ট থ্রেড নেটওয়ার্কে যোগদানের জন্য কোনো থ্রেড ডিভাইসের প্রয়োজন হয়।
পছন্দের থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল: স্বয়ংক্রিয়ভাবে নির্বাচিত থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল যা
getPreferredCredentialsAPI ব্যবহার করে বিভিন্ন ভেন্ডরের অ্যাপের সাথে শেয়ার করা যায়।বর্ডার এজেন্ট আইডি: একটি TBR ডিভাইসের জন্য ১৬-বাইটের একটি বিশ্বব্যাপী অনন্য আইডি। এই আইডিটি border router বিক্রেতাদের দ্বারা তৈরি এবং পরিচালিত হয়।
TBR সেটআপ অ্যাপ: এটি আপনার অ্যান্ড্রয়েড অ্যাপ যা নতুন TBR ডিভাইস সেট আপ করে এবং গুগল প্লে পরিষেবাগুলিতে থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল যুক্ত করে। আপনার অ্যাপটি যুক্ত করা ক্রেডেনশিয়ালগুলির কর্তৃত্বপূর্ণ মালিক এবং সেগুলিতে এর অ্যাক্সেস রয়েছে।
থ্রেড নেটওয়ার্ক এপিআইগুলোর মধ্যে অনেকগুলোই একটি Task রিটার্ন করে যা অ্যাসিঙ্ক্রোনাসভাবে সম্পন্ন হয়। ফলাফল গ্রহণের জন্য কলব্যাক রেজিস্টার করতে আপনি addOnSuccessListener এবং addOnFailureListener ব্যবহার করতে পারেন। আরও জানতে, Task ডকুমেন্টেশন দেখুন।
পরিচয়পত্রের মালিকানা এবং রক্ষণাবেক্ষণ
যে অ্যাপটি থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল যোগ করে, সেটিই ক্রেডেনশিয়ালগুলোর মালিক হয়ে যায় এবং সেগুলো অ্যাক্সেস করার সম্পূর্ণ অনুমতি পায়। আপনি যদি অন্য অ্যাপের যোগ করা ক্রেডেনশিয়াল অ্যাক্সেস করার চেষ্টা করেন, তাহলে আপনি একটি PERMISSION_DENIED এরর পাবেন।
অ্যাপের মালিক হিসেবে, TBR নেটওয়ার্ক আপডেট করার সময় গুগল প্লে সার্ভিসে সংরক্ষিত ক্রেডেনশিয়ালগুলো হালনাগাদ রাখার পরামর্শ দেওয়া হচ্ছে। এর অর্থ হলো, প্রয়োজন অনুযায়ী ক্রেডেনশিয়াল যোগ করা, border router থ্রেড নেটওয়ার্কের ক্রেডেনশিয়াল পরিবর্তিত হলে তা হালনাগাদ করা, এবং TBR সরানো বা ফ্যাক্টরি রিসেট করা হলে ক্রেডেনশিয়াল মুছে ফেলা।
সীমান্ত এজেন্টের আবিষ্কার
ক্রেডেনশিয়াল অবশ্যই একটি বর্ডার এজেন্ট আইডি দিয়ে সেভ করতে হবে। আপনাকে নিশ্চিত করতে হবে যে আপনার TBR সেটআপ অ্যাপটি আপনার TBR -গুলোর বর্ডার এজেন্ট আইডি শনাক্ত করতে সক্ষম।
TBR গুলিকে অবশ্যই mDNS ব্যবহার করে থ্রেড নেটওয়ার্কের তথ্য, যেমন—নেটওয়ার্কের নাম, এক্সটেন্ডেড প্যান আইডি এবং বর্ডার এজেন্ট আইডি প্রচার করতে হবে। এই অ্যাট্রিবিউটগুলির জন্য সংশ্লিষ্ট txt ভ্যালুগুলি হলো যথাক্রমে nn , xp এবং id ।
যেসব নেটওয়ার্কে Google Thread Border Router (gTBR) থাকে, সেগুলিতে গুগল প্লে সার্ভিসেস ব্যবহারের জন্য স্বয়ংক্রিয়ভাবে গুগল থ্রেড নেটওয়ার্কের ক্রেডেনশিয়াল পেয়ে যায়।
আপনার অ্যান্ড্রয়েড অ্যাপে SDK একীভূত করুন
শুরু করার জন্য, নিম্নলিখিত ধাপগুলো সম্পন্ন করুন:
Google Play পরিষেবা সেট আপ করার জন্য দেওয়া নির্দেশাবলী অনুসরণ করুন।
আপনার
build.gradleফাইলে Google Play services ডিপেন্ডেন্সিটি যোগ করুন: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 কল করলে একটি অ্যাক্টিভিটি চালু হয়, যা ব্যবহারকারীদের নেটওয়ার্ক অনুরোধটি অনুমোদন করতে বলে। যদি নেটওয়ার্ক ক্রেডেনশিয়ালগুলো থ্রেড এসডিকে ডিজিটাল কীচেইনে সংরক্ষিত থাকে, তবে ক্রেডেনশিয়ালগুলো আপনার অ্যাপে ফেরত পাঠানো হয়।
পরিচয়পত্র অনুরোধ করুন
ব্যবহারকারীর কাছে পছন্দের পরিচয়পত্র জানতে চাওয়ার জন্য:
একটি
ActivityLauncherঘোষণা করুন:private lateinit var preferredCredentialsLauncher: ActivityResultLauncher<IntentSenderRequest>ThreadNetworkCredentialsহিসাবে ফেরত আসা Activity-র ফলাফলটি পরিচালনা করুন: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কল করে Activity চালু করার পরামর্শ দেওয়া হচ্ছে। এই কলটি নিশ্চিত করবে যে আপনার নতুন 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}]") } }যদি আপনার ব্যবহারের ক্ষেত্রটি নন-টিবিআর ডিভাইস, যেমন একটি নতুন ম্যাটার-ওভার-থ্রেড এন্ড ডিভাইস, সেট আপ করার সাথে সম্পর্কিত হয়, তবে ক্রেডেনশিয়াল আনার জন্য
allActiveCredentialsএপিআই ব্যবহার করার পরামর্শ দেওয়া হয়। এই কলটি স্থানীয় নেটওয়ার্কে থাকা টিবিআর-গুলির জন্য স্ক্যান করবে এবং এর ফলে এমন কোনো ক্রেডেনশিয়াল ফেরত দেবে না যা স্থানীয়ভাবে বিদ্যমান কোনো টিবিআর-এর কাছে উপলব্ধ নয়।// 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 }
একটি নতুন থ্রেড নেটওয়ার্ক তৈরি করুন
যদি কোনো ব্যবহারকারীর থ্রেড নেটওয়ার্কে পছন্দের বা সক্রিয় কোনো ক্রেডেনশিয়াল না থাকে, তাহলে আপনি Google Play পরিষেবাগুলিতে ক্রেডেনশিয়াল যোগ করার জন্য addCredentials API ব্যবহার করতে পারেন। এটি করার জন্য, আপনাকে একটি ThreadBorderAgent তৈরি করতে হবে এবং একটি ThreadNetworkCredentials অবজেক্টও সরবরাহ করতে হবে।
একটি র্যান্ডম নেটওয়ার্ক তৈরি করতে, newRandomizeBuilder কে কল করুন:
val threadCredentials = ThreadNetworkCredentials.newRandomizedBuilder().build()
থ্রেড নেটওয়ার্কের নাম নির্দিষ্ট করতে:
val threadCredentials = ThreadNetworkCredentials.newRandomizedBuilder()
.setNetworkName("ThreadNetworkSDK")
.build()
পরিচয়পত্র যোগ করুন
অন্যান্য থ্রেড ভেন্ডরদের জন্য আপনার থ্রেড নেটওয়ার্ক ক্রেডেনশিয়ালগুলো উপলব্ধ করতে, সেগুলোকে গুগল প্লে সার্ভিসে যুক্ত করতে হবে। আমাদের নতুন ক্রেডেনশিয়ালগুলো যুক্ত করার আগে, এই থ্রেড নেটওয়ার্কটি কোন TBR ডিভাইসের অন্তর্গত, সেটাও আমাদের জানতে হবে।
এই উদাহরণে, আমরা একটি Border Agent ID থেকে একটি 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 services-এ সংরক্ষিত তথ্যের সাথে border router ক্রেডেনশিয়াল মিলিয়ে দেখে।
isPreferredCredentials অমিলের জন্য 0 এবং মিলের জন্য 1 , একটি Int ডেটা টাইপ হিসাবে রিটার্ন করে। আপনি আপনার ফলাফল যাচাই করতে 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 services-এ যোগ করতে চান। আপনি একটি সাধারণ থ্রেড অ্যাক্টিভ অপারেশনাল ডেটাসেট (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}]") }
বর্ডার এজেন্ট দ্বারা থ্রেড নেটওয়ার্কের পরিচয়পত্র
একটি বর্ডার এজেন্ট আইডি একটি 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}]") }
}
এক্সটেন্ডেড প্যান আইডি দ্বারা থ্রেড নেটওয়ার্ক ক্রেডেনশিয়াল
getPreferredCredentials মতোই, আপনি একটি TBR এর Extended Pan ID থেকেও ব্যবহারকারীর কাছে ক্রেডেনশিয়াল চাইতে পারেন। getCredentialsByExtendedPanId একটি IntentSender রিটার্ন করে, এবং ব্যবহারকারী অনুমোদন করলে Activity-র ফলাফলে একটি 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 ডিভাইসটি বাড়ি থেকে সরানো হয় বা ফ্যাক্টরি রিসেট করা হয়, তখন আপনাকে গুগল প্লে সার্ভিসেস থেকে এর থ্রেড নেটওয়ার্কটি সরিয়ে ফেলতে হবে।
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 রেফারেন্স দেখুন।