مشاركة شبكة Thread مع واجهات برمجة تطبيقات بيانات اعتماد Google Thread

1- قبل البدء

في الدرس التطبيقي حول ترميز Thread BorderRouter (TBR)، نعرض طريقة إنشاء جهاز توجيه حدود Thread استنادًا إلى جهاز Raspberry Pi. في هذا الدرس التطبيقي حول الترميز،

  • إنشاء اتصال IP ثنائي الاتجاه بين شبكات Thread وشبكات Wi-Fi/Ethernet
  • توفير رصد الخدمة الثنائية الاتجاه من خلال mDNS (على رابط Wi-Fi/Ethernet) وSRP (على شبكة Thread)

يعتمد هذا الدرس التطبيقي حول الترميز على الدرس السابق، حيث يتناول كيفية تفاعل جهاز التوجيه الحدودي وتطبيقك مع Google APIs لإنشاء Thread Network واحد. إنّ دمج بيانات اعتماد Thread مهم جدًا لأنّه يزيد من قوة الشبكة ويبسِّط تفاعلات المستخدم مع التطبيقات التي تعتمد على Thread.

المتطلبات الأساسية

المعلومات التي ستطّلع عليها

  • كيفية استخدام واجهات برمجة تطبيقات مشاركة سلسلة التعليمات للحصول على مجموعات بيانات الاعتماد وإعدادها
  • كيفية إعداد جهاز توجيه الحدود OpenThread باستخدام بيانات الاعتماد نفسها المستخدَمة لشبكة Google

المتطلبات

  • لوحة Raspberry Pi 4 أو لوحة أخرى تعمل بنظام التشغيل Linux وتشغّل جهاز توجيه الحدود Open Thread (OTBR)
  • لوح يوفر اتصال IEEE 802.15.4 كمعالج لاسلكي مساعد (RCP). اطّلِع على قائمة بمستودعات مورّدي المنظومة على الرقاقة (SoC) المختلفين وتعليماتهم على صفحة OpenThread GitHub

2- إعداد خدمة HTTP

الوحدة الأساسية الأولى التي نحتاجها هي واجهة تتيح لنا قراءة "بيانات الاعتماد النشطة" وكتابة "بيانات الاعتماد المعلّقة" في خدمة OTBR. عند إنشاء تقرير TBR، يُرجى استخدام آليات الملكية الخاصة بك، كما هو موضَّح هنا مع مثالَين. يعرض الخيار الأول كيفية التفاعل مع وكيل OTBR محليًا من خلال قاعدة بيانات المسجّلين في الوقت الفعلي، في حين يستفيد الخيار الثاني من واجهة برمجة تطبيقات Rest API التي يمكن إنشاؤها على خدمة OTBR.

ولا تكون أي من الطريقتين آمنة، ويجب عدم استخدامها كما هي في بيئة الإنتاج. ومع ذلك، يمكن لمورد إنشاء التشفير حول أي من الطريقتين لاستخدامه في بيئة إنتاج أو يمكنك توسيع خدمة المراقبة الخاصة بك لإصدار استرجاع HTTP أو استدعاءات DBUS المحلية بطبيعتها.

الخيار 1: DBUS وHTTP API على لغة Python البرمجية

91e5fdeed83e9354.png

تؤدي هذه الخطوة إلى إنشاء خدمة HTTP أساسية تعرض نقطتَي نهاية لقراءة بيانات الاعتماد وإعدادها، ما يؤدي في النهاية إلى استدعاء أوامر DBUS.

على RPi الذي سيكون بمثابة OTBR، قم بتثبيت تبعيات Python 3:

$ pip install dbus-python shlex json

شغِّل النص البرمجي كـ:

$  sudo python credentials_server.py 8081
serving at port 8081

يقوم النموذج بإعداد خادم HTTP على المنفذ 8081 ويستمع إلى المسار الجذري إما لطلب GET لاسترداد بيانات اعتماد سلسلة التعليمات، أو طلب POST لتعيين بيانات اعتماد Thread. تكون الحمولة دائمًا بتنسيق JSON مع TLV.

في ما يلي طلب PUT الذي يضبط بيانات اعتماد سلسلة التعليمات Pending Thread الجديدة على خدمة OTBR من خلال المسار /node/dataset/pending. في هذه الحالة، يتم تطبيق بيانات الاعتماد المعلّقة في غضون 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

يمكنك أيضًا الاطّلاع على الإمكانات المتاحة الموثَّقة هنا.

الخيار 2: واجهة برمجة تطبيقات HTTP Rest API الأصلية لوكيل OTBR

c748ca5151b6cacb.png

يتم إنشاء جهاز توجيه الحدود OpenThread بشكل تلقائي باستخدام العلامة REST_API=1، ما يؤدي إلى تفعيل واجهة برمجة تطبيقات REST. إذا كان إصدارك من درس تطبيقي سابق حول الترميز لم يفعِّل واجهة برمجة تطبيقات REST، احرِص على إنشاء OTBR على RPi باستخدام العلامة التالية:

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

يمكن إعادة تشغيل وكيل OTBR من خلال تشغيل:

$ sudo systemctl restart otbr-agent.service

يبدأ الوكيل خادم HTTP على المنفذ 8081. يسمح هذا الخادم للمستخدم أو برنامج المراقبة بتنفيذ العديد من المهام في خدمة OTBR (الموثَّقة هنا). يمكنك استخدام المتصفّح curl أو wget لفحص محتواه. من بين المسارات العديدة المتوافقة حالات الاستخدام الموضّحة أعلاه، مع الفعل GET في /node/dataset/active والفعل PUT في /node/dataset/pending.

3- إعداد "إطار بيانات الاعتماد" على نظام التشغيل Android

بيانات الاعتماد المفضَّلة

تتيح "خدمات Google Play" على نظام التشغيل Android إمكانية تسجيل بيانات الاعتماد لجميع قوائم الأسعار في شبكتك وتوقّعها. ويتم تحديد كل نقطة من خلال رقم تعريف وكيل جهاز التوجيه الحدودي (BAID). ستستخدم طريقة addCredentials() من واجهة ThreadNetworkClient لتنفيذ هذه المهمة. يحدّد سجلّ الأسعار الأول (TBR) الذي تتم إضافته إلى مساحة تخزين "خدمات Google Play" "بيانات الاعتماد المفضّلة" لهذا الجهاز الجوّال.

ويصبح التطبيق الذي يضيف مجموعة من بيانات اعتماد شبكة Thread إلى BAID مالك بيانات الاعتماد ويصبح لديه أذونات كاملة للوصول إليها. إذا حاولت الوصول إلى بيانات الاعتماد التي أضافتها تطبيقات أخرى، سيظهر لك خطأ Permission_DENIED. ومع ذلك، تتوفّر بيانات الاعتماد المفضَّلة دائمًا لأي تطبيق عند الحصول على موافقة المستخدم. ننصحك بإبقاء بيانات الاعتماد المُخزَّنة في "خدمات Google Play" محدَّثة عند تحديث شبكة جهاز توجيه حدود Thread. وعلى الرغم من عدم استخدام هذه المعلومات في الوقت الحالي، إلا أننا قد نوفّر رحلات محسَّنة في المستقبل.

وحتى في حال استبعاد أول تقرير معّين (TBR) لاحقًا، ستظل "بيانات الاعتماد المفضَّلة" محفوظة على جهاز Android. بعد ضبط الإعدادات، قد تحصل التطبيقات الأخرى التي تدير بيانات اعتماد Thread على بيانات الاعتماد من مكالمة getPreferredCredentials().

مزامنة Google TBR

تتم مزامنة أجهزة Android مع "TBRs" من Google تلقائيًا. في حال عدم توفّر بيانات اعتماد على نظام التشغيل Android، تستخرج الأجهزة من قوائم الأسعار الذكية على Google في شبكتك، وتصبح بيانات الاعتماد هذه "بيانات الاعتماد المفضّلة". لا تتم المزامنة بين غرف الأسعار القصوى" وجهاز Android إلا إذا تم إقرانها مع مستخدم واحد أو إذا تم إقرانها بمستخدمَين في المنزل المزوّد بأجهزة ذكية نفسه ( البنية).

ستحدث هذه العملية أيضًا عندما يكون مستخدم Google آخر يستخدم GHA لنظام التشغيل Android أو GHA لنظام التشغيل iOS عندما يكون المستخدم في البنية نفسها. وفي حال استخدام GHA لنظام التشغيل iOS، يتم ضبط بيانات الاعتماد المفضَّلة على مساحة تخزين iOS، وذلك في حال عدم توفُّر بيانات اعتماد مفضّلة.

إذا كان هناك جهازان من Android (أو Android + iGHA) على الشبكة نفسها مع مجموعات مختلفة من بيانات الاعتماد المفضَّلة، سيسود الجهاز الذي هيأت خادم TBR في الأصل على هذا النظام.

إعداد TBR التابع لجهة خارجية

لا يتم حاليًا تحديد مساحة تخزين بيانات الاعتماد من خلال المنزل المزوّد بأجهزة ذكية للمستخدم ( البنية). سيكون لكل جهاز Android مساحة تخزين BAID، ولكن بعد إدراج Google TBR في الشبكة، ستتم مزامنة أجهزة Android وأجهزة iOS الأخرى التي تستخدم تطبيق Google Home لنظام التشغيل iOS مع هذا التطبيق وستحاول ضبط بيانات الاعتماد المحلية على مساحة تخزين الهاتف.

قبل أن ينشئ OOB TBR جديد شبكة، من المهم التحقّق مما إذا كانت تتوفّر شبكة مفضَّلة في مساحة تخزين Android.

  • في حال توفُّر شبكة مفضلة، يجب على المورد استخدامها. يضمن ذلك أن أجهزة Thread متصلة بشبكة Thread واحدة إن أمكن.
  • في حال عدم توفّر شبكة مفضَّلة، أنشِئ مجموعة بيانات اعتماد جديدة وخصِّصها إلى حسابك على "TBR" في "خدمات Google Play". سيحترم نظام Android بيانات الاعتماد هذه باعتبارها بيانات الاعتماد العادية التي تم ضبطها في جميع طلبات الحجز المستندة إلى Google المستندة إلى Google، وسيتمكّن المورّدون الآخرون من تحسين مدى وصول الشبكة المتداخلة ومتانتها باستخدام أجهزة إضافية.

cd8bc726f67b1fa1.png

4- استنساخ تطبيق Android وتعديله

لقد أنشأنا تطبيق Android يعرض الاتصالات الرئيسية المحتملة لواجهة Thread API. يمكنك استخدام هذه الأنماط في تطبيقك. وفي هذا الدرس التطبيقي حول الترميز، سننسخ تطبيق Google Home Sample App for Matter من جيت هب.

جميع رموز المصدر المعروضة هنا مُرمَّزة مسبقًا في نموذج التطبيق. وتمّت دعوتك لتعديلها وفقًا لاحتياجاتك، ولكن يمكنك ببساطة استنساخ التطبيق أو تشغيل البرامج الثنائية المُنشأة مسبقًا لفحص الوظائف.

  1. استنساخه باستخدام:
$ git clone https://github.com/google-home/sample-apps-for-matter-android.git
  1. نزِّل استوديو Android وافتحه.
  2. انقر على "File" (ملف) > "Open" (فتح) وأشِر إلى المستودع الذي تم استنساخه.
  3. فعِّل وضع مطوّر البرامج على هاتف Android.
  4. عليك توصيله بجهاز الكمبيوتر باستخدام كابل USB.
  5. تشغيل التطبيق من Android Studio عبر <Cmd+R> (OS X) أو <Ctrl+R> (Win، Linux)
  6. انتقِل إلى العجلة -> أدوات المطوّرين -> Thread Network
  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)
 }
}

الحصول على بيانات الاعتماد المفضّلة لنظام تحديد المواقع العالمي (GPS)

وفي حال توفُّرها، يجب الاطّلاع على بيانات الاعتماد. الفرق الوحيد عن الرمز السابق هو أنّه بعد تلقّي intentSenderResult، تريد إنشاء هدف وإطلاقه باستخدام تلك النتيجة من المُرسِل.

في الرمز الخاص بنا، نستخدم علامة MutableLiveData<IntentSender?> لأغراض متعلقة بالمؤسسات أو البنية، لأنّ الرمز الأصلي يكون في ViewModel (ThreadViewModel.kt) ومراقبو الهدف (ThreadFragment.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"، بغض النظر عمّا إذا كان متوفّرًا. سيكون تطبيقك هو الوحيد القادر على قراءة بيانات الاعتماد المرتبطة بـ "رقم تعريف وكيل الحدود في 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 أو خادم HTTP Rest (استراحة HTTP) الأصلي من 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 Verb للحصول على بيانات الاعتماد من TBR. اطّلِع على نموذج نص Python البرمجي.

الإنشاء واستيراد

عند إنشاء تطبيق Android، عليك إجراء تغييرات على ملف البيان والإصدار وعمليات الاستيراد لتتوافق مع وحدة سلاسل محادثات "خدمات Google Play". تلخص المقتطفات الثلاثة التالية معظم الإضافات.

تجدر الإشارة إلى أنّ نموذج التطبيق مصمَّم في الأساس لإجراء تكليف باستخدام معيار Matter. لذلك، تعد ملفات البيان و Gradle أكثر تعقيدًا من الإضافات اللازمة لاستخدام بيانات اعتماد سلسلة المحادثات فقط.

التغييرات في البيان

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

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

5- استكشاف mDNS/SD

يستخدم نموذج التطبيق ميزة الاكتشاف mDNS/SD لإنشاء قائمة بأجهزة توجيه حدود سلسلة التعليمات المتاحة في الشبكة، بالإضافة إلى معرّفات BAID الخاصة بها.

ويعد هذا مفيدًا للغاية عند إدخال معلومات سجل الوصول الاحتياطي (TBR) في تخزين بيانات اعتماد نظام تحديد المواقع العالمي (GPS). ومع ذلك، فإن استخدامه خارج نطاق هذا الدرس التطبيقي حول الترميز. نستخدم مكتبة NSDManager في مكتبة استكشاف خدمات Android، ويتوفّر رمز المصدر الكامل في نموذج التطبيق في ServiceDiscovery.kt.

6- الخلاصة

بعد تنفيذ هذه المكالمات أو استخدام "نموذج التطبيق"، يمكنك إعداد برنامج RPi OTBR بشكل كامل. يعرض "نموذج التطبيق" 8 أزرار:

91979bf065e9673d.png

في ما يلي التسلسل المُحتمَل لإعدادTBR:

  1. الاستعلام عما إذا كانت بيانات الاعتماد التفضيلية موجودة (الأزرق، الصف الأول)
  2. حسب الإجابة
  3. الحصول على بيانات الاعتماد المفضّلة لنظام تحديد المواقع العالمي (GPS) (الأزرق، الصف الثاني)
  4. ضبط بيانات اعتماد TBR في GPS (الأزرق، الصف الثالث) -> اختيار TBR -> إنشاء عشوائي -> إدخال اسم الشبكة -> موافق
  5. بعد أن أصبحت لديك بيانات الاعتماد المفضّلة، عليك ضبطها على خدمة OTBR باستخدام ضبط بيانات اعتماد RPi OTBR، وسيؤدي ذلك إلى تطبيق بيانات الاعتماد هذه على المجموعة المعلّقة.

الإعداد التلقائي لنموذج التطبيق هو استخدام مهلة 10 ثوانٍ. وبالتالي بعد هذه الفترة، سيتم نقل بيانات اعتماد RPi TBR (والعُقد الأخرى التي قد تكون موجودة على شبكته) إلى مجموعة البيانات الجديدة.

7- الخلاصة

في هذا الدرس التطبيقي حول الترميز، استنسخنا نموذجًا من تطبيق Android وحلّلنا عدة مقتطفات من الرمز تستفيد من واجهات برمجة تطبيقات Thread Storage في "خدمات Google Play". لقد استخدمنا واجهات برمجة التطبيقات هذه لإنشاء مجموعة بيانات مشتركة يمكننا إضافتها إلى مستند RPi TBR الذي يعرض تقرير TBR الخاص بالمورد.

يؤدي وجود كل تحديث مخصص للمستخدم في الشبكة نفسها إلى تحسين مرونة شبكة Thread Network ومدى وصولها. ويمنع أيضًا تجارب المستخدمين التي تتضمّن عيوبًا، حيث لا يمكن للتطبيقات إضافة أجهزة Thread بسبب عدم إمكانية الوصول إلى بيانات الاعتماد.

نأمل أن يساعدك هذا الدرس التطبيقي حول الترميز ونماذج التطبيقات في تصميم وتطوير تطبيقك ومنتج Thread Border Router.

8- المراجع

المعالج المساعد لسرعة عرض أكبر محتوى مرئي (RCP)

قاعدة بيانات المسجّلين