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

১. শুরু করার আগে

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

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

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

পূর্বশর্ত

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

তুমি কি শিখবে

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

তোমার যা লাগবে

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

২. HTTP পরিষেবা সেট আপ করা হচ্ছে

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

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

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

91e5fdeed83e9354.png সম্পর্কে

এই ধাপটি একটি খালি HTTP পরিষেবা তৈরি করে যা দুটি এন্ডপয়েন্টকে শংসাপত্রগুলি পড়তে এবং সেট করতে উন্মুক্ত করে, অবশেষে DBUS কমান্ডগুলিকে কল করে।

আপনার OTBR হিসেবে কাজ করবে এমন RPi-তে, Python 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-তে নতুন Pending Thread Credentials সেট করে। এই ক্ষেত্রে, মুলতুবি থাকা Credentials 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>

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

# 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

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

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

c748ca5151b6cacb.png সম্পর্কে

ওপেনথ্রেড বর্ডার রাউটারটি ডিফল্টভাবে 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 ব্যবহার করে এর বিষয়বস্তু পরীক্ষা করতে পারেন। অনেক সমর্থিত পাথের মধ্যে উপরে বর্ণিত ব্যবহারের উদাহরণ রয়েছে, যেখানে /node/dataset/activeGET ক্রিয়া এবং /node/dataset/pendingPUT ক্রিয়া ব্যবহার করা হয়েছে।

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

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

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

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

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

গুগল টিবিআর সিঙ্ক

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

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

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

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

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

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

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

cd8bc726f67b1fa1.png

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

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

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

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

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

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

/**
* 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 পাওয়ার পরে, আপনি প্রেরকের কাছ থেকে সেই ফলাফল ব্যবহার করে একটি intent তৈরি এবং চালু করতে চান।

আমাদের কোডে, সংগঠন/স্থাপত্যের উদ্দেশ্যে আমরা একটি MutableLiveData<IntentSender?> ব্যবহার করি কারণ মূল কোডটি ViewModel (ThreadViewModel.kt) এ থাকে এবং intent পর্যবেক্ষকরা Activity Fragment ( 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?> এ শংসাপত্র পোস্ট করার পদ্ধতি নীচে বর্ণনা করা হয়েছে।

জিপিএস শংসাপত্র সেট করা হচ্ছে

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

/**
* 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)
     }
 }
}

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

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

/**
* 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 ক্রিয়াটি ব্যবহার করুন। নমুনা পাইথন স্ক্রিপ্টটি দেখুন।

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

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

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

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

<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

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

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

This is very helpful when entering the information of your TBR into GPS credential's storage. However, its usage is beyond the scope of this codelab. We use Android Service Discovery library NSDManager , and the full source code is available in the Sample App, in ServiceDiscovery.kt .

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

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

91979bf065e9673d.png সম্পর্কে

আপনার TBR-এ যোগদানের সম্ভাব্য ক্রম হল:

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

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

৭. উপসংহার

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

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

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

৮. তথ্যসূত্র

RCP co-processor

DBUS সম্পর্কে