Google থ্রেড শংসাপত্র API এর সাথে থ্রেড নেটওয়ার্ক ভাগ করা

1. আপনি শুরু করার আগে

আমাদের থ্রেড বর্ডার রাউটার (TBR) কোডল্যাবে, আমরা দেখাই কিভাবে রাস্পবেরি পাই এর উপর ভিত্তি করে একটি থ্রেড বর্ডার রাউটার তৈরি করা যায়। সেই কোডল্যাবে আমরা

  • থ্রেড এবং ওয়াই-ফাই/ইথারনেট নেটওয়ার্কের মধ্যে দ্বিমুখী আইপি সংযোগ স্থাপন করুন।
  • mDNS (Wi-Fi/ইথারনেট লিঙ্কে) এবং SRP (থ্রেড নেটওয়ার্কে) এর মাধ্যমে দ্বিমুখী পরিষেবা আবিষ্কার সরবরাহ করুন।

এই কোডল্যাবটি আগেরটির উপর তৈরি করে, আপনার নিজের বর্ডার রাউটার এবং আপনার অ্যাপ কীভাবে একটি একক থ্রেড নেটওয়ার্ক তৈরি করতে Google API-এর সাথে ইন্টারঅ্যাক্ট করতে পারে। থ্রেড শংসাপত্রগুলিকে রূপান্তর করা গুরুত্বপূর্ণ কারণ এটি নেটওয়ার্কের দৃঢ়তা যোগ করে এবং থ্রেডের উপর নির্ভর করে এমন অ্যাপ্লিকেশনগুলির সাথে ব্যবহারকারীর মিথস্ক্রিয়াকে সহজ করে।

পূর্বশর্ত

  • OTBR কোডল্যাব সম্পূর্ণ করুন
  • লিনাক্স, অ্যান্ড্রয়েড/কোটলিন এবং থ্রেড নেটওয়ার্কিংয়ের প্রাথমিক জ্ঞান

আপনি কি শিখবেন

  • শংসাপত্র সেট পেতে এবং সেট করতে থ্রেড শেয়ারিং এপিআই কীভাবে ব্যবহার করবেন
  • গুগলের নেটওয়ার্কের মতো একই শংসাপত্র সহ আপনার নিজস্ব ওপেন থ্রেড বর্ডার রাউটার কীভাবে সেট আপ করবেন

আপনি কি প্রয়োজন হবে

  • রাস্পবেরি পাই 4 বোর্ড বা অন্য একটি লিনাক্স-ভিত্তিক বোর্ড যা ওপেন থ্রেড বর্ডার রাউটার (OTBR) চালাচ্ছে
  • একটি রেডিও কো-প্রসেসর (RCP) হিসাবে IEEE 802.15.4 সংযোগ প্রদানকারী বোর্ড। OpenThread Github পৃষ্ঠায় বিভিন্ন SoC বিক্রেতাদের সংগ্রহস্থল এবং তাদের নির্দেশাবলীর একটি তালিকা দেখুন

2. HTTP পরিষেবা সেট আপ করা

আমাদের প্রথম বিল্ডিং ব্লকটি প্রয়োজন একটি ইন্টারফেস যা আমাদের সক্রিয় শংসাপত্রগুলি পড়তে এবং আপনার OTBR-এ মুলতুবি শংসাপত্রগুলি লিখতে দেয়৷ একটি টিবিআর তৈরি করার সময়, আপনার নিজস্ব মালিকানা পদ্ধতি ব্যবহার করুন, যেমন দুটি উদাহরণ সহ এখানে দেখানো হয়েছে। প্রথম বিকল্পটি দেখায় কিভাবে OTBR এজেন্টের সাথে স্থানীয়ভাবে DBUS-এর মাধ্যমে ইন্টারফেস করা যায়, যখন দ্বিতীয়টি OTBR-তে তৈরি করা যেতে পারে এমন Rest API-এর সুবিধা দেয়।

কোনো পদ্ধতিই নিরাপদ নয়, এবং উৎপাদন পরিবেশে যেমন ব্যবহার করা উচিত নয়। যাইহোক, একটি বিক্রেতা একটি উত্পাদন পরিবেশে এটি ব্যবহার করার জন্য যে কোনও পদ্ধতির চারপাশে এনক্রিপশন তৈরি করতে পারে, অথবা আপনি লুপব্যাক HTTP বা অন্তর্নিহিত স্থানীয় DBUS কলগুলি ইস্যু করতে আপনার নিজস্ব মনিটর পরিষেবা প্রসারিত করতে পারেন।

বিকল্প 1: পাইথন স্ক্রিপ্টে DBUS এবং HTTP API

91e5fdeed83e9354.png

এই পদক্ষেপটি একটি বেয়ার-বোন এইচটিটিপি পরিষেবা তৈরি করে যা শংসাপত্রগুলি পড়তে এবং সেট করার জন্য দুটি শেষ পয়েন্ট প্রকাশ করে, শেষ পর্যন্ত DBUS কমান্ডকে কল করে।

RPi-এ যা আপনার OTBR হিসাবে কাজ করবে, পাইথন 3 নির্ভরতা ইনস্টল করুন:

$ pip install dbus-python shlex json

স্ক্রিপ্টটি এভাবে চালান:

$  sudo python credentials_server.py 8081
serving at port 8081

নমুনাটি পোর্ট 8081-এ একটি HTTP সার্ভার সেট আপ করে এবং থ্রেড শংসাপত্রগুলি পুনরুদ্ধার করার জন্য একটি GET অনুরোধের জন্য বা থ্রেড শংসাপত্র সেট করার জন্য একটি POST অনুরোধের জন্য রুট পাথে শোনে। পেলোড সবসময় TLV-এর সাথে একটি JSON কাঠামো।

নিম্নলিখিত PUT অনুরোধটি /node/dataset/pending পাথের মাধ্যমে OTBR-এ নতুন পেন্ডিং থ্রেড শংসাপত্র সেট করে। এই ক্ষেত্রে, মুলতুবি শংসাপত্রগুলি 10 সেকেন্ডের মধ্যে প্রয়োগ করা হয়:

PUT /node/dataset/pending
Host: <IP>:8081
ContentType: "application/json"
acceptMimeType: "application/json"
...
{
        "ActiveDataset": "<TLV encoded new Thread Dataset>"
"PendingTimestamp": {
        "Seconds": <Unix timestamp in seconds>,
        "Ticks": 0,
        "Authoritative": false
},
"Delay": 10000 // in milliseconds
}

/node/dataset/active এ একটি GET অনুরোধ বর্তমানে সক্রিয় শংসাপত্রগুলি নিয়ে আসে।

GET /node/dataset/active
Host: <IP>:8081
ContentType = "application/json"
acceptMimeType = "text/plain"
...
<TLV encoded Thread Dataset>

স্ক্রিপ্টটি বাস পাথ io.openthread.BorderRouter.wpan0 , অবজেক্ট পাথ /io/openthread/BorderRouter/wpan0 এ DBUS R/W কমান্ডকে কল করে

# D-BUS interface
def call_dbus_method(interface, method_name, *arguments):
    bus = dbus.SystemBus()
    obj = bus.get_object('io.openthread.BorderRouter.wpan0', '/io/openthread/BorderRouter/wpan0')
    iface = dbus.Interface(obj, interface)
    method = getattr(iface, method_name)
    res = method(*arguments)
    return res

def get_dbus_property(property_name):
    return call_dbus_method('org.freedesktop.DBus.Properties', 'Get', 'io.openthread.BorderRouter',
                                 property_name)

def set_dbus_property(property_name, property_value):
    return call_dbus_method('org.freedesktop.DBus.Properties', 'Set', 'io.openthread.BorderRouter',
                                 property_name, property_value)                               

DBUS এর ক্ষমতার আত্মদর্শনের অনুমতি দেয়। আপনি এটি এইভাবে করতে পারেন:

$ sudo dbus-send --system --dest=io.openthread.BorderRouter.wpan0 \
        --type=method_call --print-reply /io/openthread/BorderRouter/wpan0 \
        org.freedesktop.DBus.Introspectable.Introspect

আপনি এখানে নথিভুক্ত সমর্থিত ক্ষমতাগুলিও পরীক্ষা করতে পারেন।

বিকল্প 2: OTBR এজেন্ট নেটিভ HTTP রেস্ট API

c748ca5151b6cacb.png

OpenThread বর্ডার রাউটার REST_API=1 পতাকা দিয়ে ডিফল্টভাবে তৈরি করে, REST API সক্রিয় করে। যদি পূর্ববর্তী কোডল্যাব থেকে আপনার বিল্ড REST API সক্ষম না করে, তাহলে আপনার RPi-এ সেই পতাকা সহ OTBR তৈরি করা নিশ্চিত করুন:

$ REST_API=1 INFRA_IF_NAME=wlan0 ./script/setup

একটি OTBR এজেন্ট চালানোর মাধ্যমে পুনরায় চালু করা যেতে পারে:

$ sudo systemctl restart otbr-agent.service

এজেন্ট পোর্ট 8081 এ একটি HTTP সার্ভার শুরু করে। এই সার্ভারটি একটি ব্যবহারকারী বা মনিটর প্রোগ্রামকে OTBR-এ অনেক কাজ সম্পাদন করতে দেয় ( এখানে নথিভুক্ত করা হয়েছে)। আপনি এর বিষয়বস্তু পরিদর্শন করতে আপনার ব্রাউজার, curl বা wget ব্যবহার করতে পারেন। অনেক সমর্থিত পথের মধ্যে উপরে বর্ণিত ব্যবহারের ক্ষেত্রে রয়েছে, GET ক্রিয়াটি /node/dataset/active এ এবং PUT ক্রিয়াটি /node/dataset/pending

3. অ্যান্ড্রয়েডে ক্রেডেনশিয়াল ফ্রেমওয়ার্ক সেট আপ করা

পছন্দের শংসাপত্র

Android-এ Google Play পরিষেবাগুলি আপনার নেটওয়ার্কের সমস্ত TBR-এর জন্য শংসাপত্রের নিবন্ধনের অনুমতি দেয় এবং আশা করে৷ প্রতিটি তার বর্ডার রাউটার এজেন্ট আইডি (BAID) দ্বারা চিহ্নিত করা হয়। আপনি এই কাজটি সম্পাদন করতে ThreadNetworkClient ইন্টারফেসের addCredentials() পদ্ধতি ব্যবহার করবেন। Google Play পরিষেবা সঞ্চয়স্থানে যোগ করা প্রথম TBR এই মোবাইল ডিভাইসের জন্য পছন্দের শংসাপত্রগুলি নির্ধারণ করে৷

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

এমনকি যদি প্রথম টিবিআর পরে বাদ দেওয়া হয়, তবে পছন্দের শংসাপত্রগুলি Android ডিভাইসে বজায় থাকবে। একবার সেট হয়ে গেলে, থ্রেড শংসাপত্রগুলি পরিচালনা করে এমন অন্যান্য অ্যাপ একটি getPreferredCredentials() কল থেকে শংসাপত্রগুলি পেতে পারে।

Google TBR সিঙ্ক

অ্যান্ড্রয়েড ডিভাইসগুলি স্বয়ংক্রিয়ভাবে Google TBR-এর সাথে সিঙ্ক হয়। যদি অ্যান্ড্রয়েডে কোনো শংসাপত্র না থাকে, তাহলে ডিভাইসগুলি সেগুলিকে আপনার নেটওয়ার্কের Google TBR থেকে বের করে, এবং সেই শংসাপত্রগুলি পছন্দের শংসাপত্রে পরিণত হয়। টিবিআর এবং অ্যান্ড্রয়েড ডিভাইসের মধ্যে সিঙ্ক করা শুধুমাত্র তখনই ঘটবে যদি টিবিআর একটি একক ব্যবহারকারীর সাথে যুক্ত হয়, অথবা যদি এটি একই স্মার্ট হোমে থাকা দুই ব্যবহারকারীর সাথে যুক্ত থাকে ( কাঠামো )।

এই প্রক্রিয়াটি তখনও ঘটবে যখন অন্য Google ব্যবহারকারী Android-এর জন্য GHA বা iOS-এর GHA-এ থাকে যখন ব্যবহারকারী একই কাঠামোতে থাকে। iOS-এর জন্য GHA-এর ক্ষেত্রে, পছন্দের শংসাপত্রগুলি iOS স্টোরেজে সেট করা হয়, যদি কোনও পছন্দের শংসাপত্র না থাকে।

যদি দুটি অ্যান্ড্রয়েড ডিভাইস (বা Android + iGHA) একই নেটওয়ার্কে বিভিন্ন সেট পছন্দের শংসাপত্রের সাথে বিদ্যমান থাকে, তাহলে যে ডিভাইসটি মূলত TBR কনফিগার করেছে সেটি TBR-এ প্রাধান্য পাবে।

তৃতীয় পক্ষের TBR অনবোর্ডিং

শংসাপত্রের সঞ্চয়স্থান বর্তমানে ব্যবহারকারীর স্মার্ট হোম ( কাঠামো ) দ্বারা বিস্তৃত নয়৷ প্রতিটি অ্যান্ড্রয়েড ডিভাইসের BAID স্টোরেজ থাকবে, কিন্তু নেটওয়ার্কে Google TBR থাকলে, অন্যান্য Android ডিভাইস এবং iOS-এর জন্য Google Home অ্যাপ চালিত iOS ডিভাইসগুলি সেই TBR-এর সাথে সিঙ্ক করবে এবং ফোন স্টোরেজে স্থানীয় শংসাপত্র সেট করার চেষ্টা করবে।

একটি নতুন OOB TBR একটি নেটওয়ার্ক তৈরি করার আগে, Android এর স্টোরেজে একটি পছন্দের নেটওয়ার্ক ইতিমধ্যেই বিদ্যমান কিনা তা পরীক্ষা করা গুরুত্বপূর্ণ৷

  • একটি পছন্দের নেটওয়ার্ক বিদ্যমান থাকলে, বিক্রেতার এটি ব্যবহার করা উচিত। এটি নিশ্চিত করে যে থ্রেড ডিভাইসগুলি সম্ভব হলে একটি একক থ্রেড নেটওয়ার্কের সাথে সংযুক্ত থাকে।
  • যখন কোন পছন্দের নেটওয়ার্ক বিদ্যমান না থাকে, তখন একটি নতুন শংসাপত্র সেট তৈরি করুন এবং এটিকে Google Play পরিষেবাতে আপনার TBR-এ বরাদ্দ করুন। সমস্ত Google-ভিত্তিক TBR-এ সেট করা স্ট্যান্ডার্ড শংসাপত্র হিসাবে Android সেই শংসাপত্রগুলিকে সম্মান করবে, এবং অন্যান্য বিক্রেতারা অতিরিক্ত ডিভাইসগুলির সাথে আপনার জালের নাগাল এবং দৃঢ়তা বাড়াতে সক্ষম হবে

cd8bc726f67b1fa1.png

4. আপনার অ্যান্ড্রয়েড অ্যাপ ক্লোনিং এবং পরিবর্তন করা

আমরা একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করেছি যা থ্রেড এপিআই-তে সম্ভাব্য প্রধান কলগুলি দেখায়। আপনি আপনার অ্যাপে এই নিদর্শনগুলি ব্যবহার করতে পারেন। এই কোডল্যাবে আমরা Github থেকে ম্যাটারের জন্য Google হোম স্যাম্পল অ্যাপ ক্লোন করব।

এখানে দেখানো সমস্ত সোর্স কোড ইতিমধ্যেই নমুনা অ্যাপে কোড করা আছে। আপনার নিজের প্রয়োজনে এটিকে সংশোধন করার জন্য আপনাকে আমন্ত্রণ জানানো হয়েছে, তবে আপনি কার্যকারিতা পরিদর্শন করতে কেবল অ্যাপটি ক্লোন করতে পারেন বা পূর্ব-নির্মিত বাইনারি চালাতে পারেন।

  1. এটি ব্যবহার করে ক্লোন করুন:
$ git clone https://github.com/google-home/sample-apps-for-matter-android.git
  1. অ্যান্ড্রয়েড স্টুডিও ডাউনলোড করুন এবং খুলুন।
  2. ফাইল > খুলতে ক্লিক করুন এবং আপনার ক্লোন করা সংগ্রহস্থলের দিকে নির্দেশ করুন।
  3. আপনার অ্যান্ড্রয়েড ফোনে বিকাশকারী মোড সক্ষম করুন
  4. একটি USB তারের মাধ্যমে আপনার কম্পিউটারে এটি সংযুক্ত করুন৷
  5. Android স্টুডিও থেকে <Cmd+R> (OS X) বা <Ctrl+R> (উইন, লিনাক্স) এর মাধ্যমে অ্যাপটি চালান
  6. চাকাতে নেভিগেট করুন -> বিকাশকারী ইউটিলিটিস -> থ্রেড নেটওয়ার্ক
  7. উপলব্ধ বিভিন্ন বিকল্পের সাথে ইন্টারঅ্যাক্ট করুন। নীচের বিভাগে আমরা প্রতিটি বোতামে কার্যকর করা কোডটি আনপ্যাক করব।

পছন্দের শংসাপত্র বিদ্যমান?

টিবিআর প্রস্তুতকারকের প্রথম প্রশ্নটি Google-কে জিজ্ঞাসা করা উচিত তা হল ডিভাইসে ইতিমধ্যেই একটি পছন্দের শংসাপত্রের সেট বিদ্যমান কিনা। এটি আপনার প্রবাহের সূচনা বিন্দু হওয়া উচিত। নিচের কোডটি শংসাপত্রের অস্তিত্ব সম্পর্কে জিপিএসকে জিজ্ঞাসা করে। এটি ব্যবহারকারীর সম্মতির জন্য অনুরোধ করে না কারণ কোনো শংসাপত্র ভাগ করা হয় না।

/**
* Prompts whether credentials exist in storage or not. Consent from user is not necessary
*/

fun doGPSPreferredCredsExist(activity: FragmentActivity) {
 try {
   // Uses the ThreadNetwork interface for the preferred credentials, adding
   // a listener that will receive an intentSenderResult. If that is NULL, 
   // preferred credentials don't exist. If that isn't NULL, they exist.
   // In this case we'll not use it.

   ThreadNetwork.getClient(activity).preferredCredentials.addOnSuccessListener { intentSenderResult ->
     intentSenderResult.intentSender?.let { intentSender ->
       ToastTimber.d("threadClient: preferred credentials exist", activity)
       // don't post the intent on `threadClientIntentSender` as we do when
       // we really want to know which are the credentials. That will prompt a
       // user consent. In this case we just want to know whether they exist
     } ?: ToastTimber.d(
       "threadClient: no preferred credentials found, or no thread module found", activity
     )
   }.addOnFailureListener { e: Exception ->
     Timber.d("ERROR: [${e}]")
   }
 } catch (e: Exception) {
   ToastTimber.e("Error $e", activity)
 }
}

জিপিএস পছন্দের শংসাপত্র পাওয়া

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

আমাদের কোডে, প্রতিষ্ঠান/আর্কিটেকচারের উদ্দেশ্যে আমরা একটি MutableLiveData<IntentSender?> ব্যবহার করি কারণ আসল কোডটি ভিউমডেল (ThreadViewModel.kt) এবং অভিপ্রায় পর্যবেক্ষকরা অ্যাক্টিভিটি ফ্র্যাগমেন্টে ( ThreadFragment.kt ) রয়েছে৷ এইভাবে, একবার intentSenderResult লাইভ ডেটাতে পোস্ট করা হলে, আমরা এই পর্যবেক্ষকের বিষয়বস্তুগুলি কার্যকর করব:

viewModel.threadClientIntentSender.observe(viewLifecycleOwner) { sender ->
 Timber.d(
   "threadClient: intent observe is called with [${intentSenderToString(sender)}]"
 )
 if (sender != null) {
   Timber.d("threadClient: Launch GPS activity to get ThreadClient")
   threadClientLauncher.launch(IntentSenderRequest.Builder(sender).build())
   viewModel.consumeThreadClientIntentSender()
 }
}

এটি শেয়ারিং শংসাপত্রের সাথে ব্যবহারকারীর সম্মতি ট্রিগার করবে এবং অনুমোদিত হলে, এর মাধ্যমে বিষয়বস্তু ফিরিয়ে দেবে:

threadClientLauncher =
 registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
   if (result.resultCode == RESULT_OK) {
     val threadNetworkCredentials =
       ThreadNetworkCredentials.fromIntentSenderResultData(result.data!!)
     viewModel.threadPreferredCredentialsOperationalDataset.postValue(
       threadNetworkCredentials
     )
   } else {
     val error = "User denied request."
     Timber.d(error)
     updateThreadInfo(null, "")
   }
 }

MutableLiveData<ThreadNetworkCredentials?> এ শংসাপত্রগুলি পোস্ট করা নীচে বর্ণনা করা হয়েছে।

GPS শংসাপত্র সেট করা হচ্ছে

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

/**
* Last step in setting the GPS thread credentials of a TBR
*/
private fun associateGPSThreadCredentialsToThreadBorderRouterAgent(
 credentials: ThreadNetworkCredentials?,
 activity: FragmentActivity,
 threadBorderAgent: ThreadBorderAgent,
) {
 credentials?.let {
   ThreadNetwork.getClient(activity).addCredentials(threadBorderAgent, credentials)
     .addOnSuccessListener {
       ToastTimber.d("threadClient: Credentials added", activity)
     }.addOnFailureListener { e: Exception ->
       ToastTimber.e("threadClient: Error adding the new credentials: $e", activity)
     }
 }
}

আপনার টিবিআর পণ্যে শংসাপত্র সেট করা হচ্ছে

এই অংশটি প্রতিটি বিক্রেতার মালিকানাধীন, এবং এই কোডল্যাবে আমরা এটিকে DBUS+Python HTTP রেস্ট সার্ভার বা OTBR থেকে নেটিভ HTTP রেস্ট সার্ভারের মাধ্যমে প্রয়োগ করি।

/**
* Creates credentials in the format used by the OTBR HTTP server. See its documentation in
* https://github.com/openthread/ot-br-posix/blob/main/src/rest/openapi.yaml#L215
*/
fun createJsonCredentialsObject(newCredentials: ThreadNetworkCredentials): JSONObject {
 val jsonTimestamp = JSONObject()
 jsonTimestamp.put("Seconds", System.currentTimeMillis() / 1000)
 jsonTimestamp.put("Ticks", 0)
 jsonTimestamp.put("Authoritative", false)

 val jsonQuery = JSONObject()
 jsonQuery.put(
   "ActiveDataset",
   BaseEncoding.base16().encode(newCredentials.activeOperationalDataset)
 )
 jsonQuery.put("PendingTimestamp", jsonTimestamp)
 // delay of committing the pending set into active set: 10000ms
 jsonQuery.put("Delay", 10000)

 Timber.d(jsonQuery.toString())

 return jsonQuery
}

//(...)

var response = OtbrHttpClient.createJsonHttpRequest(
 URL("http://$ipAddress:$otbrPort$otbrDatasetPendingEndpoint"),
 activity,
 OtbrHttpClient.Verbs.PUT,
 jsonQuery.toString()
)

আপনার TBR পণ্য থেকে শংসাপত্র প্রাপ্ত করা

যেমন আগে দেখানো হয়েছে, আপনার TBR থেকে শংসাপত্রগুলি পাওয়ার জন্য GET HTTP ক্রিয়া ব্যবহার করুন। পাইথন স্ক্রিপ্টের নমুনা দেখুন।

নির্মাণ এবং আমদানি

আপনার Android অ্যাপ তৈরি করার সময়, আপনাকে Google Play পরিষেবা থ্রেড মডিউল সমর্থন করার জন্য আপনার ম্যানিফেস্ট, বিল্ড এবং আমদানিতে পরিবর্তন করতে হবে। নিম্নলিখিত তিনটি স্নিপেট বেশিরভাগ সংযোজন সংক্ষিপ্ত করে।

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

পরিবর্তনগুলি প্রকাশ করুন

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    (...)
    <!-- usesCleartextTraffic needed for OTBR local unencrypted communication -->
    <!-- Not needed for Thread Module, only used for HTTP -->
    <uses-feature
    (...)
        android:usesCleartextTraffic="true">

    <application>
    (...)
    <!-- GPS automatically downloads scanner module when app is installed -->
    <!-- Not needed for Thread Module, only used for scanning QR Codes -->
    <meta-data
        android:name="com.google.mlkit.vision.DEPENDENCIES"
        android:value="barcode_ui"/>
    </application>
</manifest>

বিল্ড.গ্রেডল

// Thread Network
implementation 'com.google.android.gms:play-services-threadnetwork:16.0.0'
// Thread QR Code Scanning
implementation 'com.google.android.gms:play-services-code-scanner:16.0.0'
// Thread QR Code Generation
implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
// Needed for using BaseEncoding class
implementation 'com.google.guava:guava:31.1-jre'

প্রাসঙ্গিক আমদানি

// Thread Network Module
import com.google.android.gms.threadnetwork.ThreadNetworkCredentials
import com.google.android.gms.threadnetwork.ThreadBorderAgent
import com.google.android.gms.threadnetwork.ThreadNetwork

// Conversion of credentials to/fro Base16 (hex)
import com.google.common.io.BaseEncoding

// HTTP
import java.io.BufferedInputStream
import java.io.InputStream
import java.net.HttpURLConnection
import java.net.URL
import java.nio.charset.StandardCharsets

// Co-routines for HTTP calls
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch


// JSON
import org.json.JSONObject

// Logs
import timber.log.Timber

// mDNS/SD
import android.net.nsd.NsdServiceInfo

// QR Code reader / writer
import com.google.mlkit.vision.barcode.common.Barcode
import com.google.mlkit.vision.codescanner.GmsBarcodeScannerOptions
import com.google.mlkit.vision.codescanner.GmsBarcodeScanning
import com.google.zxing.BarcodeFormat
import com.google.zxing.MultiFormatWriter
import com.journeyapps.barcodescanner.BarcodeEncoder

5. mDNS/SD আবিষ্কার

আমাদের নমুনা অ্যাপটি নেটওয়ার্কে উপলব্ধ থ্রেড বর্ডার রাউটারগুলির পাশাপাশি তাদের নিজ নিজ BAID-এর তালিকা তৈরি করতে mDNS/SD আবিষ্কার ব্যবহার করে।

GPS শংসাপত্রের সঞ্চয়স্থানে আপনার TBR-এর তথ্য প্রবেশ করার সময় এটি খুবই সহায়ক। যাইহোক, এর ব্যবহার এই কোডল্যাবের সুযোগের বাইরে। আমরা অ্যান্ড্রয়েড সার্ভিস ডিসকভারি লাইব্রেরি NSDManager ব্যবহার করি এবং সম্পূর্ণ সোর্স কোডটি ServiceDiscovery.kt এ স্যাম্পল অ্যাপে পাওয়া যায়।

6. সবকিছু একসাথে রাখা

একবার আপনি এই কলগুলি বাস্তবায়ন করলে বা স্যাম্পল অ্যাপ ব্যবহার করলে, আপনি সম্পূর্ণরূপে আপনার RPi OTBR-এ যেতে পারবেন। আমাদের নমুনা অ্যাপ 8টি বোতাম প্রকাশ করে:

91979bf065e9673d.png

আপনার TBR অনবোর্ড করার জন্য একটি সম্ভাব্য ক্রম হল:

  1. পছন্দের শংসাপত্র বিদ্যমান কিনা জিজ্ঞাসা করুন (নীল, ১ম সারি)
  2. উত্তরের উপর নির্ভর করে
  3. জিপিএস পছন্দের শংসাপত্র পান (নীল, ২য় সারি)
  4. GPS এ TBR শংসাপত্র সেট করুন (নীল, 3য় সারি) -> আপনার TBR নির্বাচন করুন -> র্যান্ডম তৈরি করুন -> নেটওয়ার্কের নাম লিখুন -> ঠিক আছে
  5. এখন আপনার পছন্দের শংসাপত্র আছে, সেগুলিকে আপনার OTBR-এ সেট করুন Set RPi OTBR শংসাপত্র ব্যবহার করে, যা সেই শংসাপত্রগুলি মুলতুবি সেটে প্রয়োগ করবে৷

নমুনা অ্যাপের জন্য ডিফল্ট হল 10 সেকেন্ড বিলম্ব ব্যবহার করা। এইভাবে এই সময়ের পরে, আপনার RPi TBR-এর শংসাপত্র (এবং অন্যান্য নোড যা এর নেটওয়ার্কে বিদ্যমান থাকতে পারে) নতুন ডেটাসেটে স্থানান্তরিত হবে।

7. উপসংহার

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

একই নেটওয়ার্কে ব্যবহারকারীর সমস্ত TBR থাকা থ্রেড নেটওয়ার্কের স্থিতিস্থাপকতা এবং নাগালের উন্নতি করে। এটি ত্রুটিপূর্ণ ব্যবহারকারীর যাত্রাকেও বাধা দেয় যেখানে অ্যাপ্লিকেশনগুলি থ্রেড ডিভাইসগুলিতে অনবোর্ড করতে পারে না কারণ তাদের শংসাপত্রগুলিতে অ্যাক্সেস নেই৷

আমরা আশা করি এই কোডল্যাব এবং নমুনা অ্যাপগুলি আপনাকে আপনার নিজস্ব অ্যাপ এবং আপনার থ্রেড বর্ডার রাউটার পণ্য ডিজাইন এবং বিকাশ করতে সহায়তা করবে।

8. তথ্যসূত্র

RCP সহ-প্রসেসর

DBUS