1. Trước khi bắt đầu
Trong lớp học lập trình Bộ định tuyến biên Thread (TBR), chúng tôi trình bày cách tạo Bộ định tuyến biên Thread dựa trên Raspberry Pi. Trong lớp học lập trình đó, chúng ta
- Thiết lập kết nối IP hai chiều giữa mạng Thread và mạng Wi-Fi/Ethernet.
- Cung cấp dịch vụ khám phá hai chiều thông qua mDNS (trên đường liên kết Wi-Fi/Ethernet) và SRP (trên mạng Thread).
Lớp học lập trình này dựa trên lớp học lập trình trước đó, đề cập đến cách bộ định tuyến biên và ứng dụng của bạn có thể tương tác với các API của Google để tạo một Mạng Thread duy nhất. Việc hợp nhất thông tin đăng nhập Thread là rất quan trọng vì điều này giúp tăng cường độ tin cậy của mạng và đơn giản hoá hoạt động tương tác của người dùng với các ứng dụng dựa trên Thread.
Điều kiện tiên quyết
- Hoàn thành Lớp học lập trình OTBR
- Có kiến thức cơ bản về Linux, Android/Kotlin và mạng Thread
Kiến thức bạn sẽ học được
- Cách sử dụng Thread Sharing API để nhận và đặt bộ thông tin đăng nhập
- Cách thiết lập Bộ định tuyến biên OpenThread của riêng bạn bằng thông tin đăng nhập giống như mạng của Google
Bạn cần có
- Bo mạch Raspberry Pi 4 hoặc một bo mạch khác chạy Open Thread Border Router (OTBR) dựa trên Linux
- Bo mạch cung cấp khả năng kết nối IEEE 802.15.4 dưới dạng Bộ đồng xử lý vô tuyến (RCP). Xem danh sách các kho lưu trữ của nhiều nhà cung cấp SoC và hướng dẫn của họ trên trang OpenThread Github
2. Thiết lập dịch vụ HTTP
Khối xây dựng đầu tiên chúng ta cần là một giao diện cho phép chúng ta đọc Thông tin đăng nhập đang hoạt động và ghi Thông tin đăng nhập đang chờ xử lý vào OTBR của bạn. Khi tạo TBR, hãy sử dụng cơ chế độc quyền của riêng bạn, như minh hoạ ở đây với 2 ví dụ. Lựa chọn đầu tiên minh hoạ cách tương tác với tác nhân OTBR cục bộ thông qua DBUS, trong khi lựa chọn thứ hai tận dụng Rest API có thể được tạo trên OTBR.
Không có phương thức nào an toàn và bạn không nên sử dụng nguyên trạng trong môi trường phát hành công khai. Tuy nhiên, nhà cung cấp có thể tạo lớp mã hoá cho một trong hai phương thức để sử dụng trong môi trường thực tế, hoặc bạn có thể mở rộng dịch vụ giám sát của riêng mình để đưa ra các lệnh gọi HTTP vòng lặp hoặc DBUS cục bộ vốn có.
Lựa chọn 1: DBUS và HTTP API trên tập lệnh Python

Bước này tạo ra một dịch vụ HTTP cơ bản, cung cấp 2 điểm cuối để đọc và thiết lập thông tin đăng nhập, cuối cùng gọi các lệnh DBUS.
Trên RPi sẽ đóng vai trò là OTBR, hãy cài đặt các phần phụ thuộc Python 3:
$ pip install dbus-python shlex json
Chạy tập lệnh dưới dạng:
$ sudo python credentials_server.py 8081 serving at port 8081
Mẫu này thiết lập một máy chủ HTTP trên cổng 8081 và theo dõi đường dẫn gốc cho yêu cầu GET để truy xuất thông tin đăng nhập của Thread hoặc yêu cầu POST để đặt thông tin đăng nhập của Thread. Tải trọng luôn là một cấu trúc JSON có TLV.
Yêu cầu PUT sau đây đặt Thông tin đăng nhập mới cho giao thức Thread đang chờ xử lý cho OTBR bằng đường dẫn /node/dataset/pending. Trong trường hợp này, thông tin đăng nhập đang chờ xử lý sẽ được áp dụng trong 10 giây:
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
}
Yêu cầu GET đến /node/dataset/active sẽ tìm nạp Thông tin đăng nhập hiện đang hoạt động.
GET /node/dataset/active Host: <IP>:8081 ContentType = "application/json" acceptMimeType = "text/plain" ... <TLV encoded Thread Dataset>
Tập lệnh gọi các lệnh DBUS R/W đến đường dẫn bus io.openthread.BorderRouter.wpan0, đường dẫn đối tượng /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 cho phép tự xem xét các chức năng của nó. Bạn có thể làm như sau:
$ sudo dbus-send --system --dest=io.openthread.BorderRouter.wpan0 \
--type=method_call --print-reply /io/openthread/BorderRouter/wpan0 \
org.freedesktop.DBus.Introspectable.Introspect
Bạn cũng có thể xem các chức năng được hỗ trợ trong tài liệu tại đây.
Lựa chọn 2: OTBR Agent native HTTP Rest API

Theo mặc định, OpenThread Border Router sẽ tạo bằng cờ REST_API=1, cho phép API REST. Trong trường hợp bản dựng của bạn từ một lớp học lập trình trước không bật API REST, hãy nhớ tạo OTBR trên RPi bằng cờ đó:
$ REST_API=1 INFRA_IF_NAME=wlan0 ./script/setup
Bạn có thể khởi động lại tác nhân OTBR bằng cách chạy:
$ sudo systemctl restart otbr-agent.service
Tác nhân này khởi động một máy chủ HTTP trên cổng 8081. Máy chủ này cho phép người dùng hoặc chương trình giám sát thực hiện nhiều tác vụ trong OTBR (được ghi lại tại đây). Bạn có thể sử dụng trình duyệt, curl hoặc wget để kiểm tra nội dung của tệp này. Trong số nhiều đường dẫn được hỗ trợ, có các trường hợp sử dụng được mô tả ở trên, với động từ GET trên /node/dataset/active và động từ PUT trên /node/dataset/pending.
3. Thiết lập Khung thông tin xác thực trên Android
Thông tin đăng nhập ưu tiên
Dịch vụ Google Play trên Android cho phép và yêu cầu đăng ký thông tin đăng nhập cho tất cả TBR trong mạng của bạn. Mỗi thiết bị được xác định bằng Mã nhận dạng tác nhân bộ định tuyến biên (BAID). Bạn sẽ sử dụng phương thức addCredentials() của giao diện ThreadNetworkClient để thực hiện nhiệm vụ này. TBR đầu tiên được thêm vào bộ nhớ Dịch vụ Google Play sẽ xác định Thông tin đăng nhập ưu tiên cho thiết bị di động này.
Ứng dụng thêm một bộ thông tin xác thực mạng Thread vào BAID của ứng dụng đó sẽ trở thành chủ sở hữu của thông tin xác thực và có toàn quyền truy cập vào thông tin xác thực đó. Nếu cố gắng truy cập vào thông tin đăng nhập do các ứng dụng khác thêm, bạn sẽ nhận được lỗi PERMISSION_DENIED. Tuy nhiên, thông tin đăng nhập ưu tiên luôn có sẵn cho mọi ứng dụng khi người dùng đồng ý. Bạn nên cập nhật thông tin đăng nhập được lưu trữ trong Dịch vụ Google Play khi mạng Bộ định tuyến biên Thread được cập nhật. Mặc dù hiện tại chúng tôi không sử dụng thông tin đó, nhưng có thể chúng tôi sẽ cung cấp những hành trình nâng cao trong tương lai.
Ngay cả khi TBR đầu tiên sau đó bị loại trừ, Preferred Credentials vẫn sẽ tồn tại trên thiết bị Android. Sau khi được đặt, các Ứng dụng khác quản lý thông tin đăng nhập Thread có thể lấy thông tin đăng nhập từ lệnh gọi getPreferredCredentials().
Google TBR Sync
Các thiết bị Android tự động đồng bộ hoá với TBR của Google. Nếu không có thông tin đăng nhập nào trên Android, các thiết bị sẽ trích xuất thông tin đăng nhập đó từ TBR của Google trong mạng của bạn và thông tin đăng nhập đó sẽ trở thành Thông tin đăng nhập ưu tiên. Việc đồng bộ hoá giữa TBR và thiết bị Android chỉ diễn ra nếu TBR được ghép nối với một người dùng hoặc nếu TBR được ghép nối với hai người dùng trong cùng một Nhà thông minh (Cấu trúc).
Quy trình này cũng sẽ diễn ra khi một người dùng Google khác đang dùng GHA cho Android hoặc GHA cho iOS và người dùng đó ở trong cùng một Cấu trúc. Trong trường hợp GHA cho iOS, thông tin đăng nhập ưu tiên sẽ được đặt trên bộ nhớ iOS nếu không có thông tin đăng nhập ưu tiên.
Nếu có hai thiết bị Android (hoặc Android + iGHA) trong cùng một mạng với các bộ thông tin đăng nhập ưu tiên khác nhau, thì thiết bị đã định cấu hình TBR ban đầu sẽ chiếm ưu thế trên TBR.
Quy trình tham gia TBR của bên thứ ba
Bộ nhớ của thông tin đăng nhập hiện không được người dùng Nhà thông minh (Cấu trúc) giới hạn phạm vi. Mỗi thiết bị Android sẽ có bộ nhớ BAID riêng, nhưng khi có một TBR của Google trong mạng, các thiết bị Android khác và thiết bị iOS chạy Ứng dụng Google Home cho iOS sẽ đồng bộ hoá với TBR đó và cố gắng đặt thông tin đăng nhập cục bộ trên bộ nhớ điện thoại.
Trước khi TBR OOB mới tạo một mạng, điều quan trọng là phải kiểm tra xem có mạng ưu tiên nào đã tồn tại trong bộ nhớ của Android hay không.
- Nếu có mạng ưu tiên, nhà cung cấp nên sử dụng mạng đó. Điều này đảm bảo rằng các thiết bị Thread được kết nối với một mạng Thread duy nhất khi có thể.
- Khi không có mạng ưu tiên, hãy tạo một bộ thông tin xác thực mới và chỉ định bộ thông tin đó cho TBR trong Dịch vụ Google Play. Android sẽ tuân thủ những thông tin xác thực đó làm bộ thông tin xác thực tiêu chuẩn được đặt trên tất cả các TBR dựa trên Google và các nhà cung cấp khác sẽ có thể nâng cao phạm vi tiếp cận và độ ổn định của mạng lưới bằng các thiết bị bổ sung

4. Sao chép và sửa đổi ứng dụng Android
Chúng tôi đã tạo một Ứng dụng Android minh hoạ các lệnh gọi chính có thể có đến Thread API. Bạn có thể sử dụng các mẫu này trong ứng dụng của mình. Trong lớp học lập trình này, chúng ta sẽ sao chép Ứng dụng mẫu Google Home cho Matter từ GitHub.
Tất cả mã nguồn xuất hiện ở đây đều đã được mã hoá trong ứng dụng mẫu. Bạn có thể sửa đổi mã nguồn đó theo nhu cầu của riêng mình, hoặc chỉ cần sao chép ứng dụng hoặc chạy các tệp nhị phân được tạo sẵn để kiểm tra chức năng.
- Sao chép bằng cách sử dụng:
$ git clone https://github.com/google-home/sample-apps-for-matter-android.git
- Tải xuống và mở Android Studio.
- Nhấp vào File > Open (Tệp > Mở) rồi trỏ đến kho lưu trữ bạn đã sao chép.
- Bật chế độ nhà phát triển trên điện thoại Android.
- Kết nối thiết bị với máy tính bằng cáp USB.
- Chạy ứng dụng trong Android Studio thông qua <Cmd+R> (OS X) hoặc <Ctrl+R> (Win, Linux)
- Chuyển đến phần Wheel (Bánh xe) -> Developer Utilities (Tiện ích dành cho nhà phát triển) -> Thread Network (Mạng Thread)
- Tương tác với các lựa chọn hiện có. Trong các phần bên dưới, chúng ta sẽ phân tích đoạn mã được thực thi trên mọi nút.
Có thông tin đăng nhập ưu tiên không?
Câu hỏi đầu tiên mà nhà sản xuất TBR nên hỏi Google là liệu thiết bị có sẵn một bộ thông tin đăng nhập ưu tiên hay không. Đây phải là điểm xuất phát của quy trình. Mã bên dưới truy vấn GPS về sự tồn tại của thông tin đăng nhập. Thao tác này không nhắc người dùng đồng ý vì không có thông tin đăng nhập nào được chia sẻ.
/**
* 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)
}
}
Lấy thông tin đăng nhập ưu tiên của GPS
Nếu có, bạn nên đọc thông tin đăng nhập. Điểm khác biệt duy nhất so với mã trước là sau khi nhận được intentSenderResult, bạn muốn tạo và khởi chạy một ý định bằng kết quả đó từ người gửi.
Trong mã của chúng ta, vì mục đích tổ chức/kiến trúc, chúng ta sử dụng MutableLiveData<IntentSender?> vì mã ban đầu nằm trong ViewModel (ThreadViewModel.kt) và các đối tượng theo dõi ý định nằm trong Phân đoạn Hoạt động (ThreadFragment.kt). Do đó, sau khi intentSenderResult được đăng lên dữ liệu trực tiếp, chúng ta sẽ thực thi nội dung của đối tượng theo dõi này:
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()
}
}
Thao tác này sẽ kích hoạt sự đồng ý của người dùng khi chia sẻ thông tin đăng nhập và nếu được phê duyệt, sẽ trả về nội dung thông qua:
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, "")
}
}
Dưới đây là nội dung mô tả về cách đăng thông tin đăng nhập lên MutableLiveData<ThreadNetworkCredentials?>.
Thiết lập thông tin đăng nhập GPS
Cho dù có hay không, bạn cũng nên đăng ký TBR vào Dịch vụ Google Play. Ứng dụng của bạn sẽ là ứng dụng duy nhất có thể đọc thông tin xác thực liên kết với Mã nhận dạng nhân viên biên phòng của TBR, nhưng nếu TBR của bạn là TBR đầu tiên đăng ký, thì thông tin xác thực đó sẽ được sao chép vào bộ Thông tin xác thực ưu tiên. Mọi ứng dụng trên điện thoại đều có thể truy cập vào thông tin đó, miễn là người dùng cho phép.
/**
* 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)
}
}
}
Thiết lập thông tin đăng nhập cho Sản phẩm TBR
Phần này thuộc quyền sở hữu riêng của từng nhà cung cấp và trong lớp học lập trình này, chúng ta sẽ triển khai phần này bằng DBUS+Python HTTP Rest Server hoặc HTTP Rest Server gốc từ 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()
)
Lấy thông tin đăng nhập từ Sản phẩm TBR
Như đã trình bày trước đó, hãy sử dụng GET HTTP Verb để lấy thông tin đăng nhập từ TBR. Xem tập lệnh Python mẫu.
Xây dựng và nhập
Khi tạo Ứng dụng Android, bạn cần thực hiện các thay đổi đối với tệp kê khai, bản dựng và các mục nhập để hỗ trợ Mô-đun luồng Dịch vụ Google Play. 3 đoạn mã sau đây tóm tắt hầu hết các nội dung bổ sung.
Xin lưu ý rằng ứng dụng mẫu của chúng tôi chủ yếu được tạo cho quy trình thiết lập Matter. Do đó, các tệp Manifest và Gradle của ứng dụng này phức tạp hơn những tệp cần thiết chỉ để sử dụng Thông tin đăng nhập của giao thức Thread.
Các thay đổi về tệp kê khai
<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'
Nhập dữ liệu liên quan
// 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. Khám phá mDNS/SD
Ứng dụng mẫu của chúng tôi sử dụng tính năng khám phá mDNS/SD để tạo danh sách các Bộ định tuyến biên sử dụng giao thức Thread có sẵn trong mạng, cũng như BAID tương ứng của các bộ định tuyến đó.
Điều này rất hữu ích khi bạn nhập thông tin về TBR vào bộ nhớ của thông tin đăng nhập GPS. Tuy nhiên, việc sử dụng lớp này nằm ngoài phạm vi của lớp học lập trình này. Chúng tôi sử dụng thư viện Khám phá dịch vụ Android NSDManager và mã nguồn đầy đủ có trong Ứng dụng mẫu, trong ServiceDiscovery.kt.
6. Mối tương quan giữa các yếu tố
Sau khi triển khai các lệnh gọi này hoặc sử dụng Ứng dụng mẫu, bạn có thể hoàn tất quy trình tham gia OTBR RPi. Ứng dụng mẫu của chúng tôi có 8 nút:

Sau đây là một trình tự có thể có để triển khai TBR:
- Truy vấn xem có thông tin đăng nhập ưu tiên hay không (màu xanh dương, hàng thứ nhất)
- Tuỳ thuộc vào câu trả lời
- Nhận thông tin đăng nhập ưu tiên GPS (màu xanh dương, hàng thứ 2)
- Đặt thông tin xác thực TBR trong GPS (màu xanh dương, hàng thứ 3) -> Chọn TBR của bạn -> Tạo ngẫu nhiên -> Nhập tên mạng -> Ok
- Giờ đây, bạn đã có thông tin đăng nhập ưu tiên, hãy đặt thông tin đăng nhập đó cho OTBR bằng cách sử dụng Đặt thông tin đăng nhập OTBR cho RPi. Thao tác này sẽ áp dụng thông tin đăng nhập đó cho tập hợp đang chờ xử lý.
Ứng dụng mẫu mặc định sẽ dùng độ trễ 10 giây. Do đó, sau khoảng thời gian này, thông tin đăng nhập của TBR trên RPi (và các nút khác có thể tồn tại trên mạng của nút này) sẽ di chuyển sang tập dữ liệu mới.
7. Kết luận
Trong lớp học lập trình này, chúng ta đã sao chép một Ứng dụng Android mẫu và phân tích một số đoạn mã sử dụng API Lưu trữ luồng của Dịch vụ Google Play. Chúng tôi đã sử dụng những API đó để có một tập dữ liệu chung mà chúng tôi có thể tích hợp trên TBR của RPi, qua đó giới thiệu TBR của một nhà cung cấp.
Việc có tất cả TBR của người dùng trong cùng một mạng giúp cải thiện khả năng phục hồi và phạm vi tiếp cận của Mạng lưới Thread. Điều này cũng ngăn chặn những hành trình người dùng có lỗi khi các ứng dụng không thể tích hợp Thiết bị Thread vì không có quyền truy cập vào thông tin đăng nhập.
Chúng tôi hy vọng lớp học lập trình này và Các ứng dụng mẫu sẽ giúp bạn thiết kế và phát triển Ứng dụng của riêng mình cũng như sản phẩm Bộ định tuyến biên Thread.
8. Tài liệu tham khảo
Bộ đồng xử lý RCP
DBUS