اشتراک‌گذاری شبکه Thread با APIهای Google Thread Credentials

۱. قبل از شروع

در آزمایشگاه کدنویسی روتر مرزی نخ (TBR) ، نحوه ساخت یک روتر مرزی نخ بر اساس رزبری پای را نشان می‌دهیم. در آن آزمایشگاه کدنویسی، ما

  • اتصال IP دو طرفه بین شبکه‌های Thread و Wi-Fi/Ethernet برقرار کنید.
  • ارائه کشف سرویس دو طرفه از طریق mDNS (روی لینک Wi-Fi/Ethernet) و SRP (روی شبکه Thread).

این آزمایشگاه کد بر اساس آزمایشگاه کد قبلی ساخته شده است و به این موضوع می‌پردازد که چگونه روتر مرزی شما و برنامه شما می‌توانند با APIهای گوگل تعامل داشته باشند تا یک شبکه Thread واحد ایجاد کنند. همگرایی اعتبارنامه‌های Thread از اهمیت بالایی برخوردار است زیرا به استحکام شبکه می‌افزاید و تعاملات کاربر با برنامه‌هایی که به Thread متکی هستند را ساده می‌کند.

پیش‌نیازها

آنچه یاد خواهید گرفت

  • نحوه استفاده از APIهای اشتراک‌گذاری نخ برای دریافت و تنظیم مجموعه‌های اعتبارنامه
  • چگونه روتر مرزی OpenThread خود را با همان اعتبارنامه‌های شبکه گوگل راه‌اندازی کنیم

آنچه نیاز دارید

  • برد Raspberry Pi 4 یا برد مبتنی بر لینوکس دیگری که روتر Open Thread Border Router (OTBR) را اجرا می‌کند
  • بردی که اتصال IEEE 802.15.4 را به عنوان یک پردازنده کمکی رادیویی (RCP) فراهم می‌کند. فهرستی از مخازن فروشندگان مختلف SoC و دستورالعمل‌های آنها را در صفحه گیت‌هاب OpenThread مشاهده کنید.

۲. راه‌اندازی سرویس HTTP

اولین بلوک سازنده‌ای که نیاز داریم، رابطی است که به ما امکان خواندن اعتبارنامه‌های فعال (Active Credentials) و نوشتن اعتبارنامه‌های در انتظار (Pending Credentials) را در OTBR شما می‌دهد. هنگام ساخت یک TBR، از مکانیسم‌های اختصاصی خود استفاده کنید، همانطور که در اینجا با دو مثال نشان داده شده است. گزینه اول نحوه ارتباط با عامل OTBR به صورت محلی از طریق DBUS را نشان می‌دهد، در حالی که گزینه دوم از Rest API که می‌تواند روی OTBR ساخته شود، بهره می‌برد.

هیچ‌کدام از این روش‌ها امن نیستند و نباید به همین شکل در محیط عملیاتی استفاده شوند. با این حال، یک فروشنده می‌تواند برای استفاده از هر دو روش در محیط عملیاتی، رمزگذاری ایجاد کند، یا می‌توانید سرویس مانیتور خود را برای صدور loopback HTTP یا فراخوانی‌های DBUS ذاتاً محلی گسترش دهید.

گزینه ۱: DBUS و HTTP API روی اسکریپت پایتون

۹۱e5fdeed83e9354.png

این مرحله یک سرویس HTTP ساده ایجاد می‌کند که دو نقطه پایانی را برای خواندن و تنظیم اعتبارنامه‌ها در معرض نمایش قرار می‌دهد و در نهایت دستورات DBUS را فراخوانی می‌کند.

روی RPi که به عنوان OTBR شما عمل خواهد کرد، وابستگی‌های پایتون ۳ را نصب کنید:

$ pip install dbus-python shlex json

اسکریپت را به صورت زیر اجرا کنید:

$  sudo python credentials_server.py 8081
serving at port 8081

این نمونه یک سرور HTTP را روی پورت ۸۰۸۱ راه‌اندازی می‌کند و در مسیر ریشه منتظر درخواست GET برای بازیابی اعتبارنامه‌های Thread یا درخواست POST برای تنظیم اعتبارنامه‌های Thread می‌ماند. بار داده همیشه یک ساختار JSON با TLV است.

درخواست 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
}

یک درخواست GET به /node/dataset/active اطلاعات احراز هویت فعال فعلی را دریافت می‌کند.

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

همچنین می‌توانید قابلیت‌های پشتیبانی‌شده‌ی مستند شده را اینجا بررسی کنید.

گزینه ۲: HTTP Rest API بومی عامل OTBR

c748ca5151b6cacb.png

روتر مرزی OpenThread به طور پیش‌فرض با پرچم REST_API=1 ساخته می‌شود که REST API را فعال می‌کند. در صورتی که ساخت شما از یک آزمایشگاه کد قبلی REST API را فعال نکرده باشد، مطمئن شوید که OTBR را روی RPi خود با آن پرچم ساخته‌اید:

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

یک عامل OTBR را می‌توان با اجرای دستور زیر مجدداً راه‌اندازی کرد:

$ sudo systemctl restart otbr-agent.service

عامل، یک سرور HTTP را روی پورت ۸۰۸۱ راه‌اندازی می‌کند. این سرور به کاربر یا برنامه‌ی مانیتور اجازه می‌دهد تا وظایف زیادی را در OTBR ( که در اینجا مستند شده است) انجام دهد. می‌توانید از مرورگر، curl یا wget خود برای بررسی محتوای آن استفاده کنید. در میان مسیرهای پشتیبانی‌شده‌ی فراوان، موارد استفاده‌ای که در بالا توضیح داده شد، با فعل GET در /node/dataset/active و فعل PUT در /node/dataset/pending وجود دارد.

۳. راه‌اندازی چارچوب اعتبارسنجی در اندروید

مدارک تحصیلی ترجیحی

سرویس‌های گوگل پلی در اندروید، ثبت اعتبارنامه‌ها را برای همه TBRهای موجود در شبکه شما مجاز و انتظار دارد. هر کدام با شناسه عامل روتر مرزی (BAID) خود شناسایی می‌شوند. برای انجام این کار، از متد addCredentials() از رابط ThreadNetworkClient استفاده خواهید کرد. اولین TBR که به حافظه سرویس‌های گوگل پلی اضافه می‌شود، اعتبارنامه‌های ترجیحی را برای این دستگاه تلفن همراه تعیین می‌کند.

برنامه‌ای که مجموعه‌ای از اعتبارنامه‌های شبکه Thread را به BAID خود اضافه می‌کند، مالک اعتبارنامه‌ها می‌شود و مجوزهای کامل برای دسترسی به آنها را دارد. اگر سعی کنید به اعتبارنامه‌های اضافه شده توسط برنامه‌های دیگر دسترسی پیدا کنید، خطای PERMISSION_DENIED دریافت خواهید کرد. با این حال، اعتبارنامه‌های ترجیحی همیشه برای هر برنامه‌ای با رضایت کاربر در دسترس هستند. توصیه می‌کنیم هنگام به‌روزرسانی شبکه Thread Border Router، اعتبارنامه‌هایی را که در سرویس‌های Google Play ذخیره شده‌اند، به‌روز نگه دارید. اگرچه این اطلاعات امروز استفاده نمی‌شود، اما ممکن است در آینده سفرهای بهبود یافته‌ای ارائه دهیم.

حتی اگر اولین TBR بعداً حذف شود، اعتبارنامه‌های ترجیحی (Preferred Credentials) در دستگاه اندروید باقی خواهند ماند. پس از تنظیم، سایر برنامه‌هایی که اعتبارنامه‌های Thread را مدیریت می‌کنند، ممکن است اعتبارنامه‌ها را از فراخوانی getPreferredCredentials() دریافت کنند.

همگام‌سازی گوگل تی‌بی‌آر

دستگاه‌های اندروید به طور خودکار با TBRهای گوگل همگام‌سازی می‌شوند. اگر هیچ اعتبارنامه‌ای در اندروید وجود نداشته باشد، دستگاه‌ها آنها را از TBRهای گوگل در شبکه شما استخراج می‌کنند و آن اعتبارنامه‌ها به اعتبارنامه‌های ترجیحی تبدیل می‌شوند. همگام‌سازی بین TBRها و دستگاه اندروید فقط در صورتی اتفاق می‌افتد که TBR با یک کاربر جفت شده باشد، یا اگر با دو کاربر که در یک خانه هوشمند ( ساختار ) هستند جفت شده باشد.

این فرآیند همچنین زمانی اتفاق می‌افتد که کاربر دیگری از گوگل در GHA برای اندروید یا GHA برای iOS باشد، در حالی که کاربر در همان ساختار قرار دارد. در مورد GHA برای iOS، اگر هیچ اعتبارنامه ترجیحی وجود نداشته باشد، اعتبارنامه‌های ترجیحی روی فضای ذخیره‌سازی iOS تنظیم می‌شوند.

اگر دو دستگاه اندروید (یا اندروید + iGHA) در یک شبکه با مجموعه‌های مختلف از اعتبارنامه‌های ترجیحی وجود داشته باشند، دستگاهی که در ابتدا TBR را پیکربندی کرده است، بر TBR ارجحیت خواهد داشت.

پذیرش TBR توسط شخص ثالث

فضای ذخیره‌سازی اطلاعات کاربری در حال حاضر توسط خانه هوشمند کاربر ( Structure ) محدود نشده است. هر دستگاه اندروید فضای ذخیره‌سازی BAID خود را خواهد داشت، اما به محض اینکه یک TBR گوگل در شبکه وجود داشته باشد، سایر دستگاه‌های اندروید و دستگاه‌های iOS که برنامه Google Home برای iOS را اجرا می‌کنند، با آن TBR همگام‌سازی می‌شوند و سعی می‌کنند اطلاعات کاربری محلی را روی فضای ذخیره‌سازی تلفن تنظیم کنند.

قبل از اینکه یک OOB TBR جدید شبکه‌ای ایجاد کند، بررسی اینکه آیا شبکه‌ی مورد نظر از قبل در حافظه‌ی اندروید وجود دارد یا خیر، مهم است.

  • اگر شبکه‌ی ترجیحی وجود داشته باشد، فروشنده باید از آن استفاده کند. این تضمین می‌کند که دستگاه‌های Thread در صورت امکان به یک شبکه‌ی Thread واحد متصل باشند.
  • وقتی هیچ شبکه ترجیحی وجود ندارد، یک مجموعه اعتبارنامه جدید ایجاد کنید و آن را به TBR خود در سرویس‌های Google Play اختصاص دهید. اندروید این اعتبارنامه‌ها را به عنوان اعتبارنامه‌های استاندارد تنظیم شده در تمام TBRهای مبتنی بر گوگل در نظر می‌گیرد و سایر فروشندگان می‌توانند با دستگاه‌های اضافی، دسترسی و استحکام شبکه شما را افزایش دهند.

cd8bc726f67b1fa1.png

۴. شبیه‌سازی و اصلاح برنامه اندروید شما

ما یک برنامه اندروید ایجاد کرده‌ایم که فراخوانی‌های اصلی ممکن برای Thread API را نمایش می‌دهد. می‌توانید از این الگوها در برنامه خود استفاده کنید. در این آزمایشگاه کد، برنامه نمونه Google Home برای Matter را از Github کپی خواهیم کرد.

تمام کد منبع نشان داده شده در اینجا از قبل در برنامه نمونه کدگذاری شده است. از شما دعوت می‌شود تا آن را مطابق نیازهای خود تغییر دهید، اما می‌توانید به سادگی برنامه را کلون کنید یا فایل‌های باینری از پیش ساخته شده را اجرا کنید تا عملکرد آن را بررسی کنید.

  1. آن را با استفاده از دستور زیر کلون کنید:
$ git clone https://github.com/google-home/sample-apps-for-matter-android.git
  1. اندروید استودیو را دانلود و باز کنید.
  2. روی File > Open کلیک کنید و مخزن کلون شده خود را مشخص کنید.
  3. حالت توسعه‌دهنده (developer mode) را در گوشی اندروید خود فعال کنید .
  4. آن را از طریق کابل USB به رایانه خود وصل کنید.
  5. اجرای برنامه از اندروید استودیو از طریق <Cmd+R> (OS X) یا <Ctrl+R> (Win، Linux)
  6. به چرخ بروید -> ابزارهای توسعه‌دهنده -> شبکه نخ‌ها
  7. با گزینه‌های مختلف موجود تعامل داشته باشید. در بخش‌های زیر، کدی را که روی هر دکمه اجرا می‌شود، بررسی خواهیم کرد.

آیا مدارک تحصیلی ترجیحی وجود دارد؟

اولین سوالی که یک تولیدکننده‌ی TBR باید از گوگل بپرسد این است که آیا مجموعه‌ای از اعتبارنامه‌های ترجیحی از قبل در دستگاه وجود دارد یا خیر. این باید نقطه شروع جریان شما باشد. کد زیر از 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)
 }
}

دریافت اعتبارنامه‌های ترجیحی GPS

در صورتی که وجود داشته باشند، شما می‌خواهید اعتبارنامه‌ها را بخوانید. تنها تفاوت با کد قبلی این است که پس از دریافت 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?> در زیر توضیح داده شده است.

تنظیم اعتبارنامه‌های GPS

چه این اطلاعات وجود داشته باشند و چه نباشند، شما باید TBR خود را در سرویس‌های گوگل پلی ثبت کنید. برنامه شما تنها برنامه‌ای خواهد بود که می‌تواند اطلاعات احراز هویت مرتبط با شناسه عامل مرزی TBR شما را بخواند، اما اگر TBR شما اولین برنامه‌ای باشد که ثبت می‌شود، آن اطلاعات احراز هویت در مجموعه Preferred Credentials کپی می‌شوند. این اطلاعات برای هر برنامه‌ای روی گوشی قابل دسترسی است، البته تا زمانی که کاربر آن را تأیید کند.

/**
* 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 یا با HTTP Rest Server بومی OTBR پیاده‌سازی می‌کنیم.

/**
* 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 شما

همانطور که قبلاً نشان داده شد، از دستور GET HTTP برای دریافت اعتبارنامه‌ها از TBR خود استفاده کنید. به نمونه اسکریپت پایتون مراجعه کنید.

ساخت و واردات

هنگام ایجاد برنامه اندروید خود، باید تغییراتی در مانیفست، ساخت و ایمپورت‌های خود ایجاد کنید تا از ماژول Thread Services Google Play پشتیبانی کند. سه قطعه کد زیر خلاصه‌ای از اکثر موارد اضافه شده است.

توجه داشته باشید که برنامه نمونه ما در درجه اول برای راه‌اندازی Matter ساخته شده است. بنابراین، فایل‌های Manifest و Gradle آن پیچیده‌تر از موارد اضافی لازم برای استفاده از اعتبارنامه‌های Thread هستند.

تغییرات آشکار

<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>

ساخت.gradle

// 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 برای ایجاد فهرستی از روترهای Thread Border موجود در شبکه و همچنین BAID های مربوطه آنها استفاده می‌کند.

این قابلیت هنگام وارد کردن اطلاعات TBR شما در حافظه‌ی گواهی‌نامه‌ی GPS بسیار مفید است. با این حال، کاربرد آن فراتر از محدوده‌ی این آزمایشگاه کد است. ما از کتابخانه‌ی کشف سرویس اندروید NSDManager استفاده می‌کنیم و کد منبع کامل در برنامه‌ی نمونه، در ServiceDiscovery.kt ، موجود است.

۶. کنار هم قرار دادن همه چیز

پس از پیاده‌سازی این فراخوانی‌ها یا استفاده از برنامه نمونه، می‌توانید RPi OTBR خود را به طور کامل راه‌اندازی کنید. برنامه نمونه ما 8 دکمه را در معرض نمایش قرار می‌دهد:

۹۱۹۷۹bf065e9673d.png

یک ترتیب ممکن برای شروع TBR شما به صورت زیر است:

  1. استعلام کنید که آیا اعتبارنامه‌های ترجیحی وجود دارد یا خیر (آبی، ردیف اول)
  2. بسته به پاسخ
  3. دریافت اعتبارنامه‌های ترجیحی GPS (آبی، ردیف دوم)
  4. اعتبارنامه‌های TBR را در GPS تنظیم کنید (آبی، ردیف سوم) -> TBR خود را انتخاب کنید -> ایجاد تصادفی -> نام شبکه را وارد کنید -> تأیید
  5. اکنون که اعتبارنامه‌های مورد نظر خود را دارید، با استفاده از دستور Set RPi OTBR credentials ، آنها را روی OTBR خود تنظیم کنید، که این اعتبارنامه‌ها را روی مجموعه در حال انتظار اعمال می‌کند.

پیش‌فرض برنامه نمونه، استفاده از تأخیر ۱۰ ثانیه‌ای است. بنابراین پس از این مدت، اعتبارنامه‌های TBR مربوط به RPi شما (و سایر گره‌هایی که ممکن است در شبکه آن وجود داشته باشند) به مجموعه داده جدید منتقل می‌شوند.

۷. نتیجه‌گیری

در این آزمایشگاه کد، ما یک برنامه اندروید نمونه را کلون کردیم و چندین قطعه کد را که از APIهای ذخیره‌سازی نخ سرویس‌های گوگل پلی استفاده می‌کنند، تجزیه و تحلیل کردیم. ما از این APIها برای داشتن یک مجموعه داده مشترک که می‌توانیم روی یک TBR RPi نصب کنیم، استفاده کردیم که TBR یک فروشنده را نشان می‌دهد.

قرار دادن تمام TBRهای یک کاربر در یک شبکه، انعطاف‌پذیری و دسترسی شبکه Thread را بهبود می‌بخشد. همچنین از سفرهای کاربری ناقص که در آن برنامه‌ها نمی‌توانند دستگاه‌های Thread را به دلیل عدم دسترسی به اعتبارنامه‌ها، فعال کنند، جلوگیری می‌کند.

ما امیدواریم که این آزمایشگاه کد و برنامه‌های نمونه به شما در طراحی و توسعه برنامه و محصول Thread Border Router خود کمک کنند.

۸. منابع

کمک پردازنده RCP

دی‌بی‌اس