Chia sẻ mạng luồng với API thông tin xác thực luồng của Google

1. Trước khi bắt đầu

Trong lớp học lập trình Bộ định tuyến đường viền luồng (TBR), chúng ta sẽ tìm hiểu cách tạo một Bộ định tuyến đường viền luồng dựa trên Rspberry 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à Wi-Fi/Ethernet.
  • Cung cấp tính năng khám phá dịch vụ Hai chiều 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 được xây dựng dựa trên nội dung trước, giải quyết cách bộ định tuyến biên của bạ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 thành một Mạng luồng duy nhất. Việc hội tụ thông tin xác thực của Thread rất quan trọng vì việc này giúp tăng cường độ mạnh 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 vào Thread.

Điều kiện tiên quyết

Kiến thức bạn sẽ học được

  • Cách sử dụng API chia sẻ luồng để lấy và đặt bộ thông tin xác thực
  • Cách thiết lập Bộ định tuyến đường viền OpenThread của riêng bạn bằng thông tin đăng nhập tương tự như mạng của Google

Bạn cần

  • Bảng Rappberry Pi 4 hoặc bo mạch khác dựa trên Linux chạy Bộ định tuyến đường viền mở (OTBR)
  • Bảng cung cấp kết nối IEEE 802.15.4 dưới dạng Bộ đồng xử lý vô tuyến (RCP). Xem danh sách kho lưu trữ của các nhà cung cấp SoC khác nhau và hướng dẫn của họ trên trang OpenThread GitHub

2. Thiết lập dịch vụ HTTP

Thành phần đầu tiên chúng ta cần là một giao diện cho phép đọc Thông tin xác thực đang hoạt động và ghi Thông tin xác thực đang chờ xử lý vào OTBR của bạn. Khi xây dựng TBR, hãy sử dụng các cơ chế thuộc quyền sở hữu riêng của bạn, như trình bày hai ví dụ ở đây. Lựa chọn đầu tiên sẽ trình bày cách giao tiếp với tác nhân OTBR cục bộ thông qua DBUS, còn lựa chọn thứ hai tận dụng API còn lại có thể được xây dựng trên OTBR.

Không có phương pháp nào an toàn và không nên được sử dụng nguyên trạng trong môi trường phát hành chính thức. Tuy nhiên, nhà cung cấp có thể xây dựng phương thức mã hoá bằng một trong hai phương pháp đó để 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 để phát hành HTTP lặp lại hoặc các lệnh gọi DBUS vốn cục bộ.

Cách 1: DBUS và API HTTP trên Python Script

91e5fdeed83e9354.pngs

Bước này tạo ra một dịch vụ HTTP cơ bản cho thấy 2 điểm cuối để đọc và thiết lập thông tin xác thực, sau cùng sẽ gọi các lệnh DBUS.

Trên RPi mà sẽ đóng vai trò là OTBR của bạn, 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áy chủ HTTP trên cổng 8081 và theo dõi đường dẫn gốc để lấy yêu cầu GET để truy xuất thông tin xác thực Thread hoặc yêu cầu POST để thiết lập thông tin xác thực cho Thread (Luồng). Tải trọng luôn là cấu trúc JSON có TLV.

Yêu cầu PUT sau đây đặt Thông tin xác thực luồng mới đang chờ xử lý thành OTBR thông qua đườ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 sau 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 để /node/dataset/active tìm nạp Thông tin xác thực đ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 xe buýt 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 xem xét nội dung các chức năng của DBUS. Bạn có thể thực hiện thao tác này như:

$ 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 tính năng được hỗ trợ theo tài liệu tại đây.

Cách 2: API nghỉ ngơi HTTP gốc của tác nhân OTBR

c748ca5151b6cacb.png

Theo mặc định, Bộ định tuyến đường viền OpenThread tạo với cờ REST_API=1, bật API REST. Trong trường hợp bản dựng 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 của bạn 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á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 thao tác trong OTBR (tài liệu 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 trình duyệt. Trong số nhiều đường dẫn được hỗ trợ, có những 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à dự kiến đăng ký thông tin xác thực cho tất cả TBR trong mạng của bạn. Mỗi tham số được xác định bằng Mã 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 tác vụ này. TBR đầu tiên được thêm vào bộ nhớ của 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 tập hợp thông tin xác thực của mạng Thread vào BAID sẽ trở thành chủ sở hữu của thông tin đăng nhập và có toàn quyền truy cập vào những thông tin đó. Nếu cố truy cập vào thông tin đăng nhập do các ứng dụng khác thêm vào, bạn sẽ gặp lỗi PERMISSION_DENIED. Tuy nhiên, các thông tin đăng nhập ưu tiên luôn có sẵn cho mọi ứng dụng khi có sự đồng ý của người dùng. Bạn nên cập nhật thông tin đăng nhập lưu trữ trong Dịch vụ Google Play khi mạng Thread Border Router được cập nhật. Mặc dù thông tin đó hiện không được sử dụng, nhưng chúng tôi có thể cung cấp các hành trình nâng cao trong tương lai.

Ngay cả khi TBR đầu tiên bị loại trừ sau đó, Thông tin xác thực ưu tiên sẽ vẫn tồn tại trên thiết bị Android. Sau khi đặt, các ứng dụng khác quản lý thông tin xác thực Thread có thể lấy thông tin xác thực từ lệnh gọi getPreferredCredentials().

Google TBR Sync

Thiết bị Android tự động đồng bộ hoá với Google TBR. Nếu không có thông tin xác thực nào trên Android, các thiết bị trích xuất thông tin đó từ TBR của Google trong mạng của bạn và những thông tin đăng nhập đó sẽ trở thành Thông tin xác thực ưu tiên. Quá trình đồ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 duy nhất 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).

Quá trình này cũng sẽ xảy ra khi một người dùng khác của Google sử dụng GHA đối với Android hoặc GHA đối với iOS khi người dùng đó đang ở trong cùng một Structure (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) tồn tại trong cùng một mạng có các bộ thông tin xác thực ưu tiên khác nhau, thì thiết bị đã định cấu hình TBR ban đầu sẽ được ưu tiên áp dụng trên TBR.

Giới thiệu về TBR của bên thứ ba

Bộ nhớ của thông tin xác thực hiện không nằm trong phạm vi giới hạn của Nhà thông minh của người dùng ( Cấu trúc). Mỗi thiết bị Android sẽ có bộ nhớ BAID. Tuy nhiên, sau khi có một TBR của Google trong mạng, các thiết bị Android và thiết bị iOS khác chạy Ứng dụng Google Home dành 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 OOB TBR mới tạo mạng, điều quan trọng là bạn phải kiểm tra xem mạng ưu tiên đã tồn tại trong bộ nhớ của Android hay chưa.

  • Nếu tồn tại một mạng ưu tiên, nhà cung cấp sẽ sử dụng mạng đó. Điều này đảm bảo các thiết bị Thread được kết nối với một mạng Thread khi có thể.
  • Khi không có mạng ưu tiên nào, hãy tạo một bộ thông tin xác thực mới rồi chỉ định mạng đó cho TBR của bạn trong Dịch vụ Google Play. Android sẽ tôn trọng các thông tin đăng nhập đó làm thông tin đăng nhập tiêu chuẩn được thiết lập trên tất cả TBR có trụ sở tại Google, và các nhà cung cấp khác sẽ có thể nâng cao phạm vi tiếp cận của lưới và độ mạnh của hệ thống nhờ các thiết bị bổ sung

cd8bc726f67b1fa1.png

4. Sao chép và sửa đổi ứng dụng Android

Chúng ta đã tạo một ứng dụng Android để trình bày các lệnh gọi chính có thể dùng đến Thread API. Bạn có thể 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 đã được mã hoá trong ứng dụng mẫu. Bạn được mời sửa đổi mã nguồn theo nhu cầu của riêng mình, nhưng bạn 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.

  1. Sao chép bằng cách sử dụng:
$ git clone https://github.com/google-home/sample-apps-for-matter-android.git
  1. Tải xuống rồi mở Android Studio.
  2. Nhấp vào File > Open (Tệp > Mở) rồi trỏ đến kho lưu trữ đã sao chép.
  3. Bật chế độ nhà phát triển trên điện thoại Android của bạn.
  4. Kết nối thiết bị với máy tính qua cáp USB.
  5. Chạy Ứng dụng trong Android Studio qua <Cmd+R> (OS X) hoặc <Ctrl+R> (Win, Linux)
  6. Chuyển đến Bánh xe -> Tiện ích dành cho nhà phát triển -> Mạng luồng
  7. Tương tác với các lựa chọn hiện có. Trong phần dưới đây, chúng tôi sẽ giải mã 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 đã có bộ thông tin đăng nhập ưu tiên nào trong thiết bị hay chưa. Đây nên là điểm bắt đầu của luồng. Mã bên dưới truy vấn GPS dựa trên sự tồn tại của thông tin đăng nhập. Chính sách 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 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 cách sử dụng kết quả đó từ người gửi.

Trong mã của chúng ta, để phục vụ cho mục đích tổ chức/cấu trúc, chúng ta sử dụng MutableLiveData<IntentSender?> vì mã gốc nằm trong ViewModel (ThreadViewModel.kt) và đối tượng tiếp nhận dữ liệu ý định nằm trong Mảnh 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 trình quan sát 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ẽ cho phép người dùng đồng ý chia sẻ thông tin đăng nhập. Nếu được phê duyệt, hệ thống 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, "")
   }
 }

Cách đăng thông tin đăng nhập vào MutableLiveData<ThreadNetworkCredentials?> được mô tả dưới đây.

Đặt thông tin xác thực GPS

Cho dù các chế độ này có tồn tại hay không thì bạn vẫn nên đăng ký TBR của mình với Dịch vụ Google Play. Ứng dụng của bạn sẽ là ứng dụng duy nhất có thể đọc bằng chứng xác thực được liên kết với Mã nhân viên hỗ trợ biên giới trong TBR, nhưng nếu TBR là đơn vị đầu tiên đăng ký, thì những thông tin đăng nhập đó sẽ được sao chép vào tập hợp 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)
     }
 }
}

Đặt thông tin xác thực cho Sản phẩm TBR

Phần này thuộc quyền sở hữu riêng của mỗi 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 qua Máy chủ nghỉ ngơi HTTP DBUS+Python hoặc Máy chủ nghỉ HTTP gốc của 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 xác thực từ Sản phẩm TBR của bạn

Như đã trình bày trước đó, hãy sử dụng GET HTTP Verb để lấy thông tin xác thực từ TBR của bạn. Xem tập lệnh Python mẫu.

Tạo và nhập

Khi tạo ứng dụng Android, bạn cần thay đổi tệp kê khai, bản dựng và dữ liệu nhập để hỗ trợ Mô-đun chuỗi của Dịch vụ Google Play. Ba đoạn mã sau đây tóm tắt hầu hết những nội dung bổ sung.

Xin lưu ý rằng ứng dụng mẫu của chúng ta chủ yếu được xây dựng để vận hành theo chuẩn Matter. Do đó, các tệp kê khai và Gradle phức tạp hơn so với các phần bổ sung cần thiết để chỉ sử dụng Thông tin xác thực luồng.

Thay đổi trong 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'

Các dữ liệu nhập có 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 ta sử dụng tính năng khám phá mDNS/SD để tạo danh sách Bộ định tuyến vùng biên theo luồng có sẵn trong mạng, cũng như các BAID tương ứng.

Điều này rất hữu ích khi nhập thông tin TBR của bạn vào bộ nhớ của thông tin xác thực GPS. Tuy nhiên, việc sử dụng API này nằm ngoài phạm vi lớp học lập trình này. Chúng tôi sử dụng thư viện Android Service Discovery NSDManager và mã nguồn đầy đủ có trong Ứng dụng mẫu tại 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ể tích hợp đầy đủ RPi OTBR của mình. Ứng dụng mẫu của chúng ta hiển thị 8 nút:

91979bf065e9673d.png.

Trình tự có thể áp dụng để bắt đầu sử dụng TBR là:

  1. Truy vấn xem có thông tin đăng nhập ưu tiên hay không (màu xanh dương, hàng đầu tiên)
  2. Tuỳ vào câu trả lời
  3. Lấy thông tin đăng nhập ưu tiên GPS (màu xanh dương, hàng thứ 2)
  4. Đặt thông tin đăng nhập 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
  5. Giờ khi bạn đã có thông tin đăng nhập ưu tiên, hãy đặt thông tin đăng nhập đó thành OTBR bằng cách sử dụng thao tác Đặt thông tin đăng nhập RPi OTBR. Thao tác này sẽ áp dụng những thông tin đăng nhập đó vào nhóm đang chờ xử lý.

Mặc định cho ứng dụng mẫu là sử dụng độ trễ 10 giây. Do đó, sau khoảng thời gian này, thông tin xác thực của RPi TBR (và các nút khác có thể tồn tại trên mạng của RPi) 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 Thread Storage API (API Lưu trữ luồng) của Dịch vụ Google Play. Chúng tôi đã sử dụng các API đó để xây dựng một tập dữ liệu chung mà chúng tôi có thể đưa vào TBR RPi, nơi thể hiện TBR của nhà cung cấp.

Việc đưa tất cả TBR của người dùng vào cùng một mạng sẽ 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 chuỗi. Giải pháp này cũng ngăn chặn những sai sót trong hành trình của người dùng, trong đó ứng dụng không thể tích hợp Thiết bị Thread vì ứng dụng không có quyền truy cập vào thông tin xác thực.

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 có thể 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 Thread Borderr (Bộ định tuyến đường viền luồng).

8. Tài liệu tham khảo

Đơn vị đồng xử lý RCP

Hàm DBUS