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

1. قبل البدء

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

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

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

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

أهداف الدورة التعليمية

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

المتطلبات

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

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

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

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

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

91e5fdeed83e9354.png

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

على جهاز Raspberry Pi الذي سيعمل كجهاز OTBR، ثبِّت ملحقات Python 3:

$ pip install dbus-python shlex json

شغِّل النص البرمجي على النحو التالي:

$  sudo python credentials_server.py 8081
serving at port 8081

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

يضبط طلب PUT التالي بيانات اعتماد جديدة في انتظار المراجعة في 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 إلى مسار الحافلة 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: واجهة برمجة تطبيقات OTBR Agent الأصلية لبروتوكول HTTP Rest

c748ca5151b6cacb.png

يتم إنشاء OpenThread Border Router تلقائيًا باستخدام العلامة REST_API=1، ما يتيح استخدام واجهة REST API. في حال لم يتم تفعيل واجهة REST API في الإصدار الذي أنشأته من خلال درس تطبيقي حول الترميز سابق، احرص على إنشاء OTBR على جهاز Raspberry Pi باستخدام العلامة التالية:

$ 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- إعداد Credential Framework على Android

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

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

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

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

Google TBR Sync

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

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

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

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

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

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

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

cd8bc726f67b1fa1.png

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

لقد أنشأنا تطبيق Android يعرض الطلبات الرئيسية المحتملة إلى Thread API. يمكنك استخدام هذه الأنماط في تطبيقك. في هذا الدرس التطبيقي حول الترميز، سنستنسخ "تطبيق Google Home التجريبي لـ Matter" من Github.

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

  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" باستخدام <Cmd+R> (OS X) أو <Ctrl+R> (نظام التشغيل Windows وLinux)
  6. انتقِل إلى "العجلة" -> "أدوات المطوّرين" -> "شبكة Thread"
  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، عليك إنشاء هدف وتشغيله باستخدام تلك النتيجة من المُرسِل.

في الرمز البرمجي، نستخدم MutableLiveData<IntentSender?> لأغراض التنظيم/البنية، لأنّ الرمز البرمجي الأصلي موجود في ViewModel (ملف ThreadViewModel.kt)، بينما تقع أدوات مراقبة الأهداف في 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 في "خدمات 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)
     }
 }
}

ضبط بيانات اعتماد منتج 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. اطّلِع على نموذج نص Python البرمجي.

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

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

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

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

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

Relevant Imports

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

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

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

6. الخلاصة

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

91979bf065e9673d.png

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

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

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

7. الخاتمة

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

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

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

8. المراجع

معالج RCP المساعد

DBUS