1. قبل البدء
في الدرس التطبيقي حول ترميز Thread Border Router (TBR)، نوضّح كيفية تصميم جهاز توجيه حدود Thread استنادًا إلى جهاز Raspberry Pi. في هذا التمرين المعملي حول الترميز،
- إنشاء اتصال عنوان IP ثنائي الاتجاه بين شبكة Thread وشبكات Wi-Fi/Ethernet
- توفير إمكانية اكتشاف الخدمة ثنائية الاتجاه عبر mDNS (على رابط Wi-Fi/Ethernet) وSRP (على شبكة Thread).
يعتمد هذا الدرس التطبيقي على الدرس السابق، ويوضّح كيفية تفاعل جهاز توجيه الحدود الخاص بك وتطبيقك مع Google APIs لإنشاء شبكة Thread واحدة. من المهم دمج بيانات اعتماد Thread لأنّها تعزّز قوة الشبكة وتبسّط تفاعلات المستخدم مع التطبيقات التي تعتمد على Thread.
المتطلبات الأساسية
- أكمِل الدرس التطبيقي حول ترميز OTBR
- معرفة أساسية بشبكات Linux وAndroid/Kotlin وThread
المعلومات التي ستطّلع عليها
- كيفية استخدام واجهات برمجة تطبيقات Thread Share API للحصول على مجموعات بيانات الاعتماد وضبطها
- كيفية إعداد جهاز توجيه الحدود 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 API التي يمكن إنشاؤها على OTBR.
ولا يعتبر أي من الطريقتين آمنتين، ولا يجب استخدامهما كما هو الحال في بيئة إنتاج. ومع ذلك، يمكن للمورّد إنشاء تشفير استنادًا إلى أي من الطريقتين لاستخدامه في بيئة إنتاج، أو يمكنك توسيع خدمة المراقبة لديك لإصدار استرجاع HTTP أو استدعاءات DBUS المحلية بطبيعتها.
الخيار 1: DBUS وHTTP API على لغة البرمجة Python
تؤدي هذه الخطوة إلى إنشاء خدمة 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 لاسترداد بيانات اعتماد 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 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
يتم إنشاء جهاز توجيه الحدود OpenThread تلقائيًا مع العلامة REST_API=1
، ما يؤدي إلى تفعيل واجهة برمجة تطبيقات REST. إذا لم تفعّل REST API بعد درسك التطبيقي السابق حول الترميز، احرص على إنشاء 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 Border Router. وعلى الرغم من عدم استخدام هذه المعلومات في الوقت الحالي، إلا أنّنا قد نوفّر رحلات محسَّنة في المستقبل.
حتى إذا تم استبعاد سجل TBR الأول في وقت لاحق، ستظل بيانات الاعتماد المفضلة قائمة على جهاز Android. وبعد الضبط، قد تحصل التطبيقات الأخرى التي تدير بيانات اعتماد Thread على بيانات الاعتماد من مكالمة getPreferredCredentials()
.
مزامنة TBR من Google
تتم مزامنة أجهزة Android مع حسابات TBR من Google تلقائيًا. وفي حال عدم توفّر بيانات اعتماد على نظام التشغيل Android، يتم استخراج هذه البيانات من سجلات TBR من Google في شبكتك، وستصبح بيانات الاعتماد هذه بيانات الاعتماد المفضَّلة. لا تحدث المزامنة بين السجلّ TBR وجهاز Android إلا إذا تم إقرانه بمستخدم واحد، أو إذا تم إقرانه بمستخدمَين في المنزل الذكي نفسه ( البنية).
ستحدث هذه العملية أيضًا عندما يستخدم مستخدم آخر من Google حساب Google Workspace للأجهزة الجوّالة (GHA) لنظام التشغيل Android أو تطبيق GHA لنظام التشغيل iOS عندما يكون المستخدم في البنية نفسها. في حال استخدام GHA لنظام التشغيل iOS، يتم ضبط بيانات الاعتماد المفضّلة على مساحة تخزين iOS، في حال عدم توفّر بيانات اعتماد مفضّلة.
إذا كان هناك جهازان من أجهزة Android (أو Android + iGHA) متصلان بالشبكة نفسها ولهما مجموعات مختلفة من بيانات الاعتماد المفضَّلة، سيسري الجهاز الذي أجرى في الأصل ضبطًا على TBR.
إعداد حساب TBR التابع لجهة خارجية
لا يتم حاليًا تحديد نطاق تخزين بيانات الاعتماد من خلال المنزل الذكي للمستخدم ( البنية). سيكون لكل جهاز Android مساحة تخزين BAID، ولكن بعد إضافة TBR في الشبكة، ستتم مزامنة أجهزة Android وأجهزة iOS الأخرى التي تستخدم تطبيق Google Home لنظام التشغيل iOS مع سجل TBR هذا ومحاولة ضبط بيانات الاعتماد المحلية على مساحة تخزين الهاتف.
قبل أن ينشئ OOB TBR جديد شبكة، من المهم التحقّق مما إذا كانت هناك شبكة مفضَّلة متوفّرة حاليًا في مساحة تخزين Android أم لا.
- في حال توفُّر شبكة مفضَّلة، على المورِّد استخدامها. ويضمن ذلك ربط أجهزة Thread بشبكة Thread واحدة متى أمكن.
- في حال عدم توفُّر شبكة مفضَّلة، أنشِئ مجموعة بيانات اعتماد جديدة وخصِّصها إلى سجل كلمات المرور في "خدمات Google Play". سيحترم Android بيانات الاعتماد هذه باعتبارها بيانات الاعتماد العادية المضبوطة على جميع حسابات TBR المستندة إلى Google، وسيتمكّن المورّدون الآخرون من تحسين مدى وصول الشبكة المتداخلة ومتانتها باستخدام أجهزة إضافية.
4. استنساخ تطبيق Android وتعديله
لقد أنشأنا تطبيقًا متوافقًا مع Android يعرض الطلبات الرئيسية المحتملة لواجهة برمجة تطبيقات Thread. يمكنك استخدام هذه الأنماط في تطبيقك. في هذا الدرس التطبيقي حول الترميز، سننسخ نموذج تطبيق Google Home النموذجي لمعيار Matter من GitHub.
لقد سبق أن تم ترميز كل رموز المصدر المعروضة هنا في نموذج التطبيق. أنت مدعو لتعديله وفقًا لاحتياجاتك الخاصة، ولكن يمكنك ببساطة استنساخ التطبيق أو تشغيل البرامج الثنائية المنشأة مسبقًا لفحص الوظائف.
- استنساخه باستخدام:
$ git clone https://github.com/google-home/sample-apps-for-matter-android.git
- نزِّل تطبيق استوديو Android وافتحه.
- انقر على ملف > افتح المستودع المستنسخ وأشِر إليه.
- فعِّل وضع مطور البرامج على هاتف Android.
- وصِّله بجهاز الكمبيوتر باستخدام كابل USB.
- تشغيل التطبيق من "استوديو Android" عبر <Cmd+R> (OS X) أو <Ctrl+R> (نظام التشغيل Win، Linux)
- انتقل إلى العجلة -> أدوات مساعدة المطوّرين -> شبكة Thread
- تفاعَل مع الخيارات المختلفة المتاحة. في الأقسام أدناه، سنفكك حزمة الرمز الذي يتم تنفيذه على كل زر.
هل تتوفّر بيانات الاعتماد المفضّلة؟
السؤال الأول الذي يجب أن تطرحه الشركة المصنعة لـ 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). وبالتالي، بعد نشر 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". سيكون تطبيقك هو الوحيد القادر على قراءة بيانات الاعتماد المرتبطة برقم تعريف وكيل الحدود الخاص بك في 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 أو خادم HTTP Rest من 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
كما هو موضح سابقًا، استخدم فعل HTTP GET للحصول على بيانات الاعتماد من TBR. اطّلِع على نموذج نص Python البرمجي.
الإنشاء والاستيراد
عند إنشاء تطبيق Android، يجب إجراء تغييرات على ملف البيان والإصدار وعمليات الاستيراد لإتاحة استخدام وحدة سلسلة محادثات خدمات Google Play. تلخّص المقتطفات الثلاثة التالية معظم الإضافات.
يُرجى العلم أنّ نموذج التطبيق الخاص بنا مصمّم في الأساس لمنح الأولوية لمعيار Matter. لذلك، تعد ملفات البيان و 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>
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 لإنشاء قائمة بأجهزة توجيه حدود Thread المتاحة في الشبكة، بالإضافة إلى معرّفات BAID الخاصة بها.
وهذا مفيد للغاية عند إدخال معلومات TBR في تخزين بيانات اعتماد نظام تحديد المواقع العالمي (GPS). ومع ذلك، فإن استخدامه خارج نطاق هذا الدرس التطبيقي حول الترميز. نستخدم مكتبة NSDManager في مكتبة Android Service Discovery، ويتوفّر رمز المصدر الكامل في Sample App في ServiceDiscovery.kt
.
6- الخلاصة
بعد تنفيذ هذه الطلبات أو استخدام "نموذج التطبيق"، يمكنك إعداد ميزة RPi OTBR بالكامل. يعرض "نموذج التطبيق" 8 أزرار:
في ما يلي التسلسل المحتمل لإعداد "نظام التشغيل المرجعي":
- طلب بحث عمّا إذا كانت بيانات الاعتماد التفضيلية موجودة (أزرق، الصف الأول)
- استنادًا إلى الإجابة
- الحصول على بيانات الاعتماد المفضلة لنظام تحديد المواقع العالمي (GPS) (أزرق، الصف الثاني)
- تعيين بيانات اعتماد TBR في نظام تحديد المواقع العالمي (GPS) (الأزرق، الصف الثالث) -> اختَر سجلّ TBR -> إنشاء عشوائي -> أدخِل اسم الشبكة ->. حسنًا
- الآن بعد أن أصبحت لديك بيانات الاعتماد المُفضَّلة، يمكنك ضبطها على OTBR باستخدام Set RPi OTBR (ضبط بيانات اعتماد RPi OTBR)، وبذلك سيتم تطبيق بيانات الاعتماد هذه على المجموعة التي في انتظار المراجعة.
الإعداد التلقائي لعيّنة التطبيق هو استخدام مهلة 10 ثوانٍ. وبالتالي، بعد هذه الفترة، سيتم نقل بيانات اعتماد سجل RPi (والعُقد الأخرى التي قد تكون متوفّرة على الشبكة) إلى مجموعة البيانات الجديدة.
7. الخاتمة
في هذا الدرس التطبيقي حول الترميز، استنسخنا نموذجًا لتطبيق Android وحللنا عدة مقتطفات من الرموز البرمجية التي تستخدم "خدمات Google Play". واجهات برمجة تطبيقات تخزين Thread. استخدمنا واجهات برمجة التطبيقات هذه للحصول على مجموعة بيانات مشتركة يمكننا إعدادها على سجل RPi، وهي تعرض مقياس TBR للمورّد.
يؤدي وجود كل من TBR للمستخدم في نفس الشبكة إلى تحسين مرونة شبكة Thread ومدى وصولها. وتمنع هذه الميزات أيضًا تجارب المستخدمين المعيبة التي لا يمكن للتطبيقات الوصول إليها على أجهزة Thread بسبب عدم إمكانية الوصول إلى بيانات الاعتماد.
نأمل أن يساعدك هذا الدرس التطبيقي حول الترميز ونموذج التطبيقات في تصميم وتطوير تطبيقك ومنتج Thread Border Router.
8. المراجع
المعالج المساعِد RCP
DBUS