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 về Trình định tuyến biên luồng (TBR), chúng tôi sẽ hướng dẫn cách tạo Trình định tuyến biên luồng 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 tính năng Khám phá dịch vụ 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, giải quyết cách bộ định tuyến biên và ứng dụng của riêng bạn có thể tương tác với các API của Google để tạo một Mạng luồng duy nhất. Việc hợp nhất thông tin xác thực của Luồng là rất quan trọng vì nó giúp tăng cường độ ổn đị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 trên Luồng.

Đ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 biên OpenThread của riêng bạn bằng thông tin xác thực giống với mạng của Google

Bạn cần có

  • Bảng Raspberry Pi 4 hoặc một bảng khác dựa trên Linux chạy Trình định tuyến biên Open Thread (OTBR)
  • Bảng 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 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 GitHub của OpenThread

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 xác thực đang hoạt động và ghi Thông tin xác thực đang chờ xử lý vào OTBR. Khi tạo TBR, hãy sử dụng các cơ chế độc quyền của riêng bạn, như minh hoạ trong hai ví dụ sau. Tuỳ chọn đầu tiên cho thấy cách giao tiếp với tác nhân OTBR cục bộ thông qua DBUS, trong khi tuỳ chọn thứ hai tận dụng API Rest có thể được tạo trên OTBR.

Cả hai phương thức này đều không 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 công khai. Tuy nhiên, nhà cung cấp có thể xây dựng phương thức mã hoá xung quanh một trong hai phương thức này để sử dụng trong môi trường sản xuấ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 vòng lặp hoặc các lệnh gọi DBUS vốn có tại địa phương.

Cách 1: DBUS và HTTP API trên tập lệnh Python

91e5fdeed83e9354.png

Bước này tạo một dịch vụ HTTP cơ bản hiển thị hai điểm cuối để đọc và đặt thông tin xác thực, cuối cùng là 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 trên đường dẫn gốc cho một yêu cầu GET để truy xuất thông tin xác thực Luồng hoặc một yêu cầu POST để đặt thông tin xác thực Luồng. Tải trọng luôn là cấu trúc JSON có TLV.

Yêu cầu PUT sau đây sẽ đặt Thông tin xác thực luồng đang chờ xử lý mới thành OTBR bằng đường dẫn /node/dataset/pending. Trong trường hợp này, thông tin xác thực đ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 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 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ể thực hiện việc này 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ợ được ghi nhận tại đây.

Cách 2: API REST HTTP gốc của Tác nhân OTBR

c748ca5151b6cacb.png

Theo mặc định, Trình định tuyến biên OpenThread 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 một tác nhân OTBR bằng cách chạy:

$ sudo systemctl restart otbr-agent.service

Tác nhân 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. 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 xác thực ưu tiên

Dịch vụ Google Play trên Android cho phép và yêu cầu đăng ký thông tin xác thực cho tất cả TBR trong mạng của bạn. Mỗi trình điều khiển được xác định bằng mã nhận dạng của Trình điều khiể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 xác thực ư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 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 thông tin xác thực do các ứng dụng khác thêm, bạn sẽ gặp lỗi PERMISSION_DENIED. Tuy nhiên, thông tin xác thực ư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 xác thực đượ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ù 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 này, Thông tin xác thực ưu tiên 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 xác thực của Luồng 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 TBR của Google. Nếu không có thông tin xác thực nào trên Android, thì các thiết bị sẽ trích xuất thông tin xác thực đó từ TBR của Google trong mạng của bạn và thông tin xác thực đó 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 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ẽ xảy ra khi một người dùng Google khác đang sử dụng GHA cho Android hoặc GHA cho iOS khi người dùng đó thuộc cùng một Cấu trúc. Trong trường hợp GHA dành cho iOS, thông tin xác thực ưu tiên sẽ được đặt trên bộ nhớ iOS, nếu không có thông tin xác thực ưu tiên nào.

Nếu hai thiết bị Android (hoặc Android + iGHA) tồn tại trong cùng một mạng với các bộ thông tin xác thực ưu tiên khác nhau, thì thiết bị ban đầu đã định cấu hình TBR sẽ chiếm ưu thế 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 thuộc phạm vi của Nhà thông minh (Cấu trúc) của người dùng. Mỗi thiết bị Android sẽ có bộ nhớ BAID, nhưng khi có 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 cho iOS sẽ đồng bộ hoá với TBR đó và cố gắng đặt thông tin xác thực cục bộ trên bộ nhớ điện thoại.

Trước khi một TBR OOB mới tạo một mạng, điều quan trọng là 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 có mạng ưu tiên, nhà cung cấp phải 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 xác thực đó cho TBR trong Dịch vụ Google Play. Android sẽ coi những thông tin xác thực đó là thông tin xác thực chuẩn được đặt trên tất cả TBR dựa trên Google, đồng thời các nhà cung cấp khác có thể tăng phạm vi tiếp cận và độ mạnh của mạng lưới bằng các thiết bị bổ sung

cd8bc726f67b1fa1.png

4. Nhân bản và sửa đổi ứng dụng Android

Chúng tôi đã tạo một Ứng dụng Android giới thiệu các lệnh gọi chính có thể thực hiện đượ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ẽ nhân bản Ứng dụng mẫu Google Home cho Matter trên GitHub.

Tất cả mã nguồn hiển thị ở đây đều đã được mã hoá trong ứng dụng mẫu. Bạn nên 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 tạo sẵn để kiểm tra chức năng.

  1. Sao chép bằng:
$ git clone https://github.com/google-home/sample-apps-for-matter-android.git
  1. Tải và mở Android Studio.
  2. Nhấp vào File (Tệp) > Open (Mở) rồi trỏ đến kho lưu trữ được sao chép.
  3. Bật chế độ nhà phát triển trên điện thoại Android.
  4. Kết nối thiết bị với máy tính qua cáp USB.
  5. Chạy ứng dụng từ Android Studio thông qua <Cmd+R> (OS X) hoặc <Ctrl+R> (Win, Linux)
  6. Chuyển đến Wheel (Bánh xe) -> Developer Utilities (Tiện ích dành cho nhà phát triển) -> Thread Network (Mạng luồng)
  7. Tương tác với các tuỳ chọn có sẵn. Trong các phần bên dưới, chúng ta sẽ giải nén mã được thực thi trên mọi nút.

Có thông tin xác thực ưu tiên không?

Câu hỏi đầu tiên mà nhà sản xuất thiết bị TBR nên hỏi Google là liệu thiết bị có một bộ thông tin xác thực ưu tiên hay không. Đây sẽ là điểm bắt đầu của luồng. Mã bên dưới truy vấn GPS về sự tồn tại của thông tin xác thực. Loại 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 xác thực ưu tiên của GPS

Trong trường hợp có, bạn muốn đọc thông tin xác thực. Đ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ừ trình gửi.

Trong mã của chúng ta, vì 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à trình quan sát ý đị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ẽ kích hoạt sự đồng ý của người dùng bằng thông tin đăng nhập để chia sẻ 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, "")
   }
 }

Phần dưới đây mô tả cách đăng thông tin xác thực lên MutableLiveData<ThreadNetworkCredentials?>.

Thiết lập thông tin xác thực GPS

Dù có hay không, bạn vẫn 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 kiểm soát biên giới của TBR. Tuy nhiên, nếu TBR là ứng dụng đầu tiên đăng ký, thì thông tin xác thực đó 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)
     }
 }
}

Thiết lập thông tin xác thực cho Sản phẩm TBR

Phần này thuộc quyền sở hữu 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 Máy chủ REST HTTP DBUS+Python hoặc Máy chủ REST HTTP 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 xác thực từ Sản phẩm TBR

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

Tạo và nhập

Khi tạo Ứng dụng Android, bạn cần thực hiện thay đổi đối với tệp kê khai, bản dựng và nội dung nhập để hỗ trợ Mô-đun luồng Dịch vụ Google Play. Ba đ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 xây dựng để uỷ quyền Matter. Do đó, tệp Tệp kê khai và Gradle của ứng dụng này phức tạp hơn so với các tệp bổ sung cần thiết để chỉ sử dụng Thông tin xác thực luồng.

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

Nội dung 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 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 Thread 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 của TBR vào bộ nhớ của thông tin xác thực GPS. Tuy nhiên, cách sử dụng của 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 ta sử dụng thư viện Khám phá dịch vụ Android NSDManager và mã nguồn đầy đủ có trong ServiceDiscovery.kt của Ứng dụng mẫu.

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ể triển khai đầy đủ RPi OTBR. Ứng dụng mẫu của chúng ta hiển thị 8 nút:

91979bf065e9673d.png

Bạn có thể thực hiện các bước sau để giới thiệu TBR:

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

Chế độ 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 TBR) 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 đã nhân bản 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 các API đó để có một tập dữ liệu chung mà chúng tôi có thể đưa vào TBR RPi, trong đó trình bày TBR của nhà cung cấp.

Việc tất cả TBR của người dùng đều nằm trong cùng một mạng sẽ cải thiện khả năng phục hồi và phạm vi tiếp cận của Mạng luồng. Điều này cũng ngăn chặn hành trình người dùng không hoàn hảo, trong đó các ứng dụng không thể tham gia Thiết bị Thread vì 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 và Ứng dụng mẫu này sẽ giúp bạn thiết kế và phát triển Ứng dụng cũng như sản phẩm Bộ định tuyến biên Thread của riêng mình.

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

Bộ đồng xử lý RCP

DBUS