สร้าง Border Router สำหรับ Android

ดูซอร์สโค้ดใน Android Code Search

หากคุณไม่ใช่ผู้ให้บริการอุปกรณ์ Android หรือชิปเทรด คุณก็หยุดอ่านได้ตอนนี้

เอกสารนี้จะแนะนำขั้นตอนการสร้างอุปกรณ์ Border Router ที่ใช้เทรดบน Android เครื่องใหม่ด้วยซอร์สโค้ด AOSP ล่าสุด เมื่อทำตามเอกสารนี้ คุณจะได้เรียนรู้สิ่งต่อไปนี้

  1. สถาปัตยกรรมและสถานะโดยรวมของการรองรับเทรดใน Android
  2. วิธีสร้างบริการ HAL ของ Thread ของคุณเอง
  3. วิธีทำให้อุปกรณ์ใช้งานร่วมกับ Google Home ได้
  4. วิธีทดสอบ Thread Border Router

หากต้องการการสนับสนุน โปรดแจ้งปัญหาใน GitHub หรือเปิดการสนทนาหากมีคำถาม

ภาพรวม

สแต็กเทรดของ Android อิงตาม OpenThread และ ot-br-posix ซึ่ง Google เผยแพร่เป็นโอเพนซอร์สใน GitHub เช่นเดียวกับที่ OpenThread ได้รับการพัฒนาในที่เก็บ GitHub สาธารณะ สแต็กเทรดของ Android จึงได้รับการพัฒนาในโค้ดเบส AOSP สาธารณะ ฟีเจอร์และการแก้ไขข้อบกพร่องทั้งหมดจะส่งใน AOSP ก่อน ซึ่งจะช่วยให้ผู้ให้บริการเริ่มใช้เทรดเวอร์ชันล่าสุดได้โดยไม่ต้องรอการเปิดตัว Android เวอร์ชันปกติ

สถาปัตยกรรม

สแต็ก Thread ทั้งหมดของ Android ประกอบด้วยคอมโพเนนต์หลัก 2 อย่าง ได้แก่ สแต็ก Thread หลักในพาร์ติชันระบบทั่วไปและบริการ Thread HAL ในพาร์ติชันของผู้ให้บริการ โดยปกติแล้ว ผู้ให้บริการอุปกรณ์จะต้องดูแลและสร้างบริการ HAL เท่านั้น

android-thread-arch

สรุปสั้นๆ เกี่ยวกับวิธีการทำงานของสแต็กเทรดของ Android มีดังนี้ - มีบริการระบบเทรด Java ในเซิร์ฟเวอร์ระบบซึ่งจัดการสแต็กทั้งหมด - ให้บริการ API ของระบบเทรด สร้างอินเทอร์เฟซ thread-wpan ของอุโมงค์ ลงทะเบียนเครือข่ายเทรดกับบริการการเชื่อมต่อ และใช้งานฟังก์ชันการทำงานของ Border Routing และ Advertising Proxy - สแต็ก Thread / OpenThread หลักจะโฮสต์ในกระบวนการเนทีฟแบบสแตนด์อโลนที่ไม่มีสิทธิ์ซึ่งมีชื่อว่า ot-daemon ot-daemon ได้รับการจัดการโดยตรงโดยบริการระบบ Java ผ่าน AIDL API ส่วนตัว และเข้าถึงวิทยุฮาร์ดแวร์เทรดผ่าน Thread HAL API - บริการ Thread HAL ที่ผู้ให้บริการจัดหาให้ต้องใช้ Thread HAL API โดยปกติแล้ว โปรแกรมนี้จะทํางานเป็น RCP และติดตั้งใช้งานโปรโตคอล spinel

รหัสอยู่ที่ไหน

ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์

ผู้ให้บริการอุปกรณ์ Android ที่สร้างสภาพแวดล้อมการพัฒนา Android สําหรับอุปกรณ์ไว้แล้วสามารถข้ามส่วนนี้ได้

หากคุณเพิ่งเริ่มใช้งานระบบนิเวศ Android หรือเป็นผู้ให้บริการชิปที่ต้องการทำให้ชิปเทรดของคุณเข้ากันได้กับ Android และมอบการสนับสนุนแก่ผู้ให้บริการอุปกรณ์ โปรดอ่านต่อ

ทำตาม Codelab สําหรับนักพัฒนาแอป Android

หากต้องการตั้งค่าสภาพแวดล้อมการพัฒนา Android เป็นครั้งแรก ให้ใช้ Codelab ต่อไปนี้ https://source.android.com/docs/setup/start เมื่อจบ Codelab นี้ คุณจะสามารถสร้างและเรียกใช้อุปกรณ์ Cuttlefish จำลองจากซอร์สโค้ดได้

สร้างบริการ HAL ของเทรด

ลองใช้ชุดข้อความใน Cuttlefish

Cuttlefish คืออุปกรณ์ Android เสมือน ก่อนเริ่มสร้างบริการ HAL ของคุณเอง คุณควรลองใช้ Thread ใน Cuttlefish เพื่อทําความเข้าใจวิธีการทํางานของ HAL

บริการ HAL ของ Thread เริ่มต้นมีให้ใช้งานใน Cuttlefish และติดตั้งใช้งานร่วมกับ RCP ที่จำลอง ซึ่งรับส่งแพ็กเก็ตผ่านซ็อกเก็ต UDP ไปยังและจากวิทยุ Thread (802.15.4) ที่จำลอง

ในอินสแตนซ์ Cuttlefish จะมีการติดตั้ง "ThreadNetworkDemoApp" ไว้ล่วงหน้า เปิดแอปดังกล่าวเพื่อเข้าร่วมอุปกรณ์ Cuttlefish กับเครือข่ายเทรดเริ่มต้น

demoapp-screenshot

นอกจากนี้ยังมีเครื่องมือบรรทัดคำสั่ง ot-ctl และ ot-cli-ftd ที่ให้ไว้เพื่อกำหนดค่าเครือข่ายเทรดสำหรับการทดสอบ เครื่องมือเหล่านี้รองรับคำสั่ง CLI ของ OpenThread ทั้งหมดที่คุณอาจคุ้นเคยอยู่แล้ว

คุณค้นหาบันทึกของบริการ HAL ของ Cuttlefish Thread ได้โดยทำดังนี้

adb logcat | egrep -i threadnetwork-service

07-21 10:43:05.048     0     0 I init    : Parsing file /apex/com.android.hardware.threadnetwork/etc/threadnetwork-service.rc...
07-21 10:59:27.233   580   580 W android.hardware.threadnetwork-service: ThreadChip binder is unlinked
07-21 10:59:27.233   580   580 I android.hardware.threadnetwork-service: Close IThreadChip successfully
07-21 10:59:27.385   580   580 I android.hardware.threadnetwork-service: Open IThreadChip successfully

หรือใช้ grep ค้นหาบันทึกของ ot-daemon โดยทำดังนี้

adb logcat | egrep -i ot-daemon
07-21 10:43:48.741     0     0 I init    : starting service 'ot-daemon'...
07-21 10:43:48.742     0     0 I init    : Created socket '/dev/socket/ot-daemon/thread-wpan.sock', mode 660, user 1084, group 1084
07-21 10:43:48.762     0     0 I init    : ... started service 'ot-daemon' has pid 2473
07-21 10:46:26.320  2473  2473 I ot-daemon: [I] P-Daemon------: Session socket is ready
07-21 10:46:30.290  2473  2473 W ot-daemon: [W] P-Daemon------: Daemon read: Connection reset by peer
07-21 10:48:07.264  2473  2473 I ot-daemon: [INFO]-BINDER--: Start joining...
07-21 10:48:07.267  2473  2473 I ot-daemon: [I] Settings------: Saved ActiveDataset
07-21 10:48:07.267  2473  2473 I ot-daemon: [I] DatasetManager: Active dataset set
07-21 10:48:07.273  2473  2473 I ot-daemon: [I] DnssdServer---: Started
07-21 10:48:07.273  2473  2473 I ot-daemon: [N] Mle-----------: Role disabled -> detached
07-21 10:48:07.273  2473  2473 I ot-daemon: [I] Mle-----------: AttachState Idle -> Start
07-21 10:48:07.273  2473  2473 I ot-daemon: [I] Notifier------: StateChanged (0x111fd11d) [Ip6+ Role LLAddr MLAddr KeySeqCntr Ip6Mult+ Channel PanId NetName ExtPanId ...
07-21 10:48:07.273  2473  2473 I ot-daemon: [I] Notifier------: StateChanged (0x111fd11d) ... NetworkKey PSKc SecPolicy NetifState ActDset]

บริการ Thread HAL ของ Cuttlefish ใช้บริการ Thread HAL เริ่มต้นร่วมกับไบนารี RCP ที่จำลองของ OpenThread โปรดดูวิธีการทำงานของบริการนี้ในส่วนถัดไป

บริการ HAL เริ่มต้น

บริการ HAL เริ่มต้นจะรวมอยู่ด้วย Thread HAL API บริการ HAL เริ่มต้นรองรับทั้งอุปกรณ์ RCP จำลองและอุปกรณ์จริง โดยจะได้รับ URL อุปกรณ์ RCP ที่ไม่บังคับ และหากไม่ได้ระบุ URL ระบบจะใช้อุปกรณ์ RCP ที่จำลองไว้เป็นค่าเริ่มต้น

ในไฟล์ hardware/interfaces/threadnetwork/aidl/default/threadnetwork-service.rc

service vendor.threadnetwork_hal /apex/com.android.hardware.threadnetwork/bin/hw/android.hardware.threadnetwork-service
    class hal
    user thread_network

ซึ่งเทียบเท่ากับ

service vendor.threadnetwork_hal /apex/com.android.hardware.threadnetwork/bin/hw/android.hardware.threadnetwork-service spinel+hdlc+forkpty:///apex/com.android.hardware.threadnetwork/bin/ot-rcp?forkpty-arg=1
    class hal
    user thread_network

สําหรับอุปกรณ์ RCP จริง อุปกรณ์จะรองรับทั้งอินเทอร์เฟซ SPI และ UART และคุณสามารถระบุอุปกรณ์ด้วยสคีมา spinel+spi://, spinel+hdlc+uart:// และ spinel+socket:// ตามลําดับ

ทําความเข้าใจ APEX ของผู้ให้บริการ

บริการ Thread HAL เริ่มต้นใน Cuttlefish ได้รับการบรรจุไว้ในโมดูล APEX ด้วยเช่นกัน ซึ่งคล้ายกับสแต็กเทรดในโมดูลหลักของการเทอร์เทอร์ แต่นี่เป็นโมดูล APEX ของผู้ให้บริการที่จะติดตั้งใน /vendor/apex/ (ระบบจะแตกไฟล์ ZIP ของอาร์ติแฟกต์ในโมดูลไปยัง /apex/com.android.hardware.threadnetwork/)

apex {
    name: "com.android.hardware.threadnetwork",
    manifest: "manifest.json",
    file_contexts: "file_contexts",
    key: "com.android.hardware.key",
    certificate: ":com.android.hardware.certificate",
    updatable: false,
    vendor: true,

    binaries: [
        "android.hardware.threadnetwork-service",
        "ot-rcp",
    ],

    prebuilts: [
        "threadnetwork-default.xml", // vintf_fragment
        "threadnetwork-service.rc", // init_rc
        "android.hardware.thread_network.prebuilt.xml", // permission
    ],
}

การกำหนดค่าที่สำคัญ 2-3 อย่างที่คุณจะต้องให้ความสนใจหรือทำการเปลี่ยนแปลงเมื่อสร้างโมดูล HAL APEX ของคุณเองมีดังนี้

  • file_contexts: อธิบายไฟล์ไบนารี / ข้อมูลซึ่งส่งในโมดูล APEX นี้หรือไฟล์ที่บริการ HAL จําเป็นต้องเข้าถึง (เช่น อุปกรณ์ RCP) ซึ่งช่วยให้คุณระบุกฎ sepolicy ที่เฉพาะเจาะจงสำหรับบริการ HAL เพื่อเข้าถึงอุปกรณ์ RCP ของฮาร์ดแวร์ได้

  • binaries: ไฟล์ไบนารีที่ส่งในโมดูล APEX นี้

  • threadnetwork-service.rc: วิธีเริ่มบริการ HAL คุณต้องระบุเส้นทางอุปกรณ์ RCP ที่นี่

  • android.hardware.thread_network.prebuilt.xml: กำหนดฟีเจอร์ฮาร์ดแวร์ android.hardware.thread_network ซึ่งจำเป็นต้องใช้เพื่อให้ระบบ Android ทราบว่าอุปกรณ์ของคุณรองรับฮาร์ดแวร์เทรด มิเช่นนั้น ระบบจะไม่เปิดใช้สแต็กเธรด Android

สร้างบริการ HAL

ไม่ว่าคุณจะเป็นนักพัฒนาแอปอุปกรณ์ Android หรือผู้จำหน่ายชิป คุณควรคุ้นเคยกับการสร้างเฟิร์มแวร์ OT RCP สำหรับชิปเทรด วิธีการต่อไปนี้จะถือว่าชิปฮาร์ดแวร์ได้รับการเดินสายและตรวจสอบอย่างถูกต้องแล้ว

วิธีที่ง่ายที่สุดในการสร้าง HAL APEX คือการสร้าง APEX ใหม่ด้วยไฟล์ไบนารีและไฟล์ที่สร้างไว้ล่วงหน้าของ HAL APEX เริ่มต้น ตัวอย่างเช่น หากบริษัทของคุณคือ Banana และอุปกรณ์ RCP ในอุปกรณ์คือ /dev/ttyACM0 รูปแบบ Thread HAL APEX จะเป็นดังนี้

  • Android.bp:
  prebuilt_etc {
    name: "banana-threadnetwork-service.rc",
    src: "banana-threadnetwork-service.rc",
    installable: false,
  }

  apex {
    name: "com.banana.android.hardware.threadnetwork",
    manifest: "manifest.json",
    file_contexts: "file_contexts",
    key: "com.android.hardware.key",
    certificate: ":com.android.hardware.certificate",
    updatable: false,
    vendor: true,

    binaries: [
        "android.hardware.threadnetwork-service",
    ],

    prebuilts: [
        "banana-threadnetwork-service.rc",
        "threadnetwork-default.xml",
        "android.hardware.thread_network.prebuilt.xml",
    ],
  }
  • file_contexts:
  (/.*)?                                                      u:object_r:vendor_file:s0
  /etc(/.*)?                                                  u:object_r:vendor_configs_file:s0
  /bin/hw/android\.hardware\.threadnetwork-service            u:object_r:hal_threadnetwork_default_exec:s0
  /dev/ttyACM0                                                u:object_r:threadnetwork_rcp_device:s0

เส้นทางไฟล์ในคอลัมน์แรกเกี่ยวข้องกับ /apex/com.android.hardware.threadnetwork/

  • threadnetwork-service.rc:
  service vendor.threadnetwork_hal /apex/com.android.hardware.threadnetwork/bin/hw/android.hardware.threadnetwork-service spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200
    class hal
    user root
  • manifest.json:
  {
    "name": "com.android.hardware.threadnetwork",
    "version": 1
  }

สมมติว่าคุณกําลังสร้างอุปกรณ์ใหม่ชื่อ Orange ไดเรกทอรีการกําหนดค่าเฉพาะอุปกรณ์จะมีลักษณะดังนี้

device/banana/orange/threadnetwork/
    sepolicy/
    Android.bp
    file_contexts
    manifest.json
    threadnetwork-default.xml
    threadnetwork-service.rc

ดูหัวข้อถัดไปเพื่อดูว่าควรเพิ่มกฎ sepolicy ใดในไดเรกทอรีย่อย sepolicy/

กฎ Sepolicy สําหรับอุปกรณ์ RCP

โดยค่าเริ่มต้น บริการ Thread HAL จะไม่มีสิทธิ์เข้าถึงอุปกรณ์ RCP (เช่น /dev/ttyACM0) คุณจึงต้องเพิ่มกฎนโยบายความปลอดภัยที่กำหนดเองลงในไดเรกทอรี sepolicy/

สร้างไฟล์ sepolicy/threadnetwork_hal.te ใหม่ที่มีเนื้อหาด้านล่าง

type threadnetwork_rcp_device, dev_type;

# Allows the Thread HAL service to read / write the Thread RCP device
allow hal_threadnetwork_default threadnetwork_rcp_device:chr_file rw_file_perms;

รวบรวม

ตอนนี้คุณเขียนโค้ดเกือบทั้งหมดที่จำเป็นสำหรับการเพิ่มเทรดเสร็จแล้ว ขั้นตอนสุดท้ายคือการเพิ่ม Thread HAL APEX และกฎ sepolicy ลงในรูปภาพของอุปกรณ์

ซึ่งทำได้โดยการเพิ่มโค้ดด้านล่างลงใน Makefile ของอุปกรณ์ (เช่น device.mk)

PRODUCT_PACKAGES += com.banana.hardware.threadnetwork
BOARD_SEPOLICY_DIRS += device/banana/orange/threadnetwork/sepolicy

หากทุกอย่างทำงานได้ คุณจะเห็นบันทึกบริการ Thread HAL คล้ายกับตัวอย่างต่อไปนี้

adb logcat | egrep -i threadnetwork-service
08-13 13:26:41.751   477   477 I android.hardware.threadnetwork-service: ServiceName: android.hardware.threadnetwork.IThreadChip/chip0, Url: spinel+spi
08-13 13:26:41.751   477   477 I android.hardware.threadnetwork-service: Thread Network HAL is running
08-13 13:26:55.165   477   477 I android.hardware.threadnetwork-service: Open IThreadChip successfully

และบันทึก ot-daemon จะมีลักษณะดังนี้

adb logcat -s ot-daemon
08-13 13:26:55.157  1019  1019 I ot-daemon: [NOTE]-AGENT---: Running OTBR_AGENT/Unknown
08-13 13:26:55.157  1019  1019 I ot-daemon: [NOTE]-AGENT---: Thread version: 1.3.0
08-13 13:26:55.157  1019  1019 I ot-daemon: [NOTE]-AGENT---: Thread interface: thread-wpan
08-13 13:26:55.157  1019  1019 I ot-daemon: [NOTE]-AGENT---: Backbone interface is not specified
08-13 13:26:55.157  1019  1019 I ot-daemon: [NOTE]-AGENT---: Radio URL: threadnetwork_hal://binder?none
08-13 13:26:55.157  1019  1019 I ot-daemon: [NOTE]-ILS-----: Infra link selected:
08-13 13:26:55.160  1019  1019 I ot-daemon: [I] Platform------: [HAL] Wait for getting the service android.hardware.threadnetwork.IThreadChip/chip0 ...
08-13 13:26:55.165  1019  1019 I ot-daemon: [I] Platform------: [HAL] Successfully got the service android.hardware.threadnetwork.IThreadChip/chip0
08-13 13:26:55.275  1019  1019 I ot-daemon: [I] P-RadioSpinel-: RCP reset: RESET_UNKNOWN
08-13 13:26:55.276  1019  1019 I ot-daemon: [I] P-RadioSpinel-: Software reset RCP successfully
08-13 13:26:55.277  1019  1019 I ot-daemon: [I] P-RadioSpinel-: RCP reset: RESET_POWER_ON
08-13 13:26:55.322  1019  1019 I ot-daemon: [I] ChildSupervsn-: Timeout: 0 -> 190
08-13 13:26:55.324  1019  1019 I ot-daemon: [I] RoutingManager: Initializing - InfraIfIndex:0
08-13 13:26:55.324  1019  1019 I ot-daemon: [I] InfraIf-------: Init infra netif 0
08-13 13:26:55.324  1019  1019 I ot-daemon: [I] Settings------: Read BrUlaPrefix fd7b:cc45:ff06::/48
08-13 13:26:55.324  1019  1019 I ot-daemon: [N] RoutingManager: BR ULA prefix: fd7b:cc45:ff06::/48 (loaded)
08-13 13:26:55.324  1019  1019 I ot-daemon: [I] RoutingManager: Generated local OMR prefix: fd7b:cc45:ff06:1::/64
08-13 13:26:55.324  1019  1019 I ot-daemon: [N] RoutingManager: Local on-link prefix: fdde:ad00:beef:cafe::/64
08-13 13:26:55.324  1019  1019 I ot-daemon: [I] RoutingManager: Enabling

การปรับแต่ง

โมดูลหลักของเทรด (จริงๆ แล้วเป็นส่วนหนึ่งของโมดูล "การเทอร์มินัล") มีการกำหนดค่าที่วางซ้อนได้ 2-3 รายการ ซึ่งผู้ให้บริการระบุได้เพื่อปรับแต่งลักษณะการทำงานของสแต็ก ดูรายการทั้งหมดได้ที่ config_thread.xml

โดยทั่วไป คุณต้องตั้งค่า config_thread_border_router_default_enabled เป็น true เพื่อเปิดใช้อุปกรณ์เป็น Thread Border Router และเปลี่ยน config_thread_vendor_name, config_thread_vendor_oui และ config_thread_model_name เป็นค่าของผู้ให้บริการหรือผลิตภัณฑ์ ค่าเหล่านั้นจะรวมอยู่ในบริการ _meshcop._udp mDNS ซึ่ง Thread Border Router จะประกาศเสมอ

หากต้องการเพิ่มการวางซ้อน คุณจะต้องสร้างเป้าหมาย ConnectivityOverlayOrange runtime_resource_overlay ใหม่สำหรับอุปกรณ์ Orange สร้างไดเรกทอรี ConnectivityOverlay/ ใหม่ในส่วน device/banana/orange/rro_overlays และสร้างเนื้อหาด้านล่างในไดเรกทอรีดังกล่าว

device/banana/orange/rro_overlays/ConnectivityOverlay/
  res
    values
      config_thread.xml
  Android.bp
  AndroidManifest.xml
  • Android.bp:
  package {
      default_applicable_licenses: ["Android-Apache-2.0"],
  }

  runtime_resource_overlay {
      name: "ConnectivityOverlayOrange",
      manifest: "AndroidManifest.xml",
      resource_dirs: ["res"],
      certificate: "platform",
      product_specific: true,
      sdk_version: "current",
  }
  • AndroidManifest.xml:
  <!-- Orange overlays for the Connectivity module -->
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.banana.android.connectivity.resources.orange"
      android:versionCode="1"
      android:versionName="1.0">
      <application android:hasCode="false" />

      <!-- If your device uses google-signed mainline modules, the targetPackage
      needs to be "com.google.android.connectivity.resources", otherise, it
      should be "com.android.connectivity.resources"
      -->
      <overlay
          android:targetPackage="com.google.android.connectivity.resources"
          android:targetName="ServiceConnectivityResourcesConfig"
          android:isStatic="true"
          android:priority="1"/>
  </manifest>
  
  • config_thread.xml:
  <bool name="config_thread_border_router_default_enabled">true</bool>
  <string translatable="false" name="config_thread_vendor_name">Banana Inc.</string>
  <string translatable="false" name="config_thread_vendor_oui">AC:DE:48</string>
  <string translatable="false" name="config_thread_model_name">Orange</string>
  

คุณต้องเพิ่มแอปวางซ้อนลงในไฟล์ device.mk เช่นเดียวกับ HAL APEX โดยทำดังนี้

PRODUCT_PACKAGES += \
    ConnectivityOverlayOrange</code>

หากทุกอย่างทำงานได้ คุณจะเห็นot-daemonบันทึกชื่อผู้ให้บริการและรุ่นไว้ที่ตอนต้นของบันทึก

adb logcat -s ot-daemon
07-22 15:31:37.693  1472  1472 I ot-daemon: [I] P-Daemon------: Session socket is ready
07-22 15:31:37.693  1472  1472 I ot-daemon: [I] Cli-----------: Input: state
07-22 15:31:37.693  1472  1472 I ot-daemon: [I] Cli-----------: Output: disabled
07-22 15:31:37.693  1472  1472 I ot-daemon: [I] Cli-----------: Output: Done
07-22 15:31:37.693  1472  1472 W ot-daemon: [W] P-Daemon------: Daemon read: Connection reset by peer
07-22 15:31:50.091  1472  1472 I ot-daemon: [I] P-Daemon------: Session socket is ready
07-22 15:31:50.091  1472  1472 I ot-daemon: [I] Cli-----------: Input: factoryreset
07-22 15:31:50.092  1472  1472 I ot-daemon: [I] Settings------: Wiped all info
07-22 15:31:50.092  1472  1472 I ot-daemon: [INFO]-ADPROXY-: Stopped
07-22 15:31:50.092  1472  1472 I ot-daemon: [INFO]-DPROXY--: Stopped
07-22 15:31:50.092  1472  1472 I ot-daemon: [INFO]-BA------: Stop Thread Border Agent
07-22 15:31:50.092  1472  1472 I ot-daemon: [INFO]-BA------: Unpublish meshcop service Banana Inc. Orange #4833._meshcop._udp.local
07-22 15:31:50.092  1472  1472 I ot-daemon: [INFO]-MDNS----: Removing service Banana Inc. Orange #4833._meshcop._udp
07-22 15:31:50.092  1472  1472 I ot-daemon: [INFO]-MDNS----: Unpublishing service Banana Inc. Orange #4833._meshcop._udp listener ID = 0

ใช้งานร่วมกับ Google Home ได้

นอกจากนี้ หากต้องการให้ระบบนิเวศ Google Home ใช้ Border Router ของคุณ ให้ระบุการกําหนดค่านี้ใน config_thread.xml

<string-array name="config_thread_mdns_vendor_specific_txts">
  <item>vgh=1</item>
</string-array>

การทดสอบ

อุปกรณ์ของคุณควรเข้ากันได้กับข้อกำหนดของ Border Router ที่ใช้ Thread 1.3 ขึ้นไปในตอนนี้ ก่อนส่งไปยังโปรแกรมการรับรองเทรด คุณควรทำการทดสอบ Android xTS 2-3 รายการเพื่อให้แน่ใจว่าอุปกรณ์เข้ากันได้

  • การทดสอบ VTS ช่วยให้มั่นใจว่าบริการ Thread HAL ทำงานได้ตามที่คาดไว้บนอุปกรณ์ คุณทำการทดสอบได้ด้วยคําสั่ง

    atest VtsHalThreadNetworkTargetTest

  • การทดสอบ CTS ช่วยให้มั่นใจว่า Thread API ทำงานตามที่คาดไว้บนอุปกรณ์ของคุณ คุณเรียกใช้การทดสอบด้วยคําสั่งได้

    atest CtsThreadNetworkTestCases

  • การทดสอบการผสานรวมช่วยรับประกันคุณภาพเพิ่มเติมเกี่ยวกับวิธีที่โค้ดเทรดสำหรับเวอร์ชันหลักทำงานในอุปกรณ์ของคุณ คุณทำการทดสอบได้ด้วยคําสั่ง

    atest ThreadNetworkIntegrationTests

นอกจากนี้ คุณยังดูวิธีการเพิ่มเติมเกี่ยวกับวิธีเรียกใช้การทดสอบ VTS/CTS/MTS ด้วยชุดทดสอบที่เผยแพร่แล้วเหล่านั้นได้

ทดสอบด้วยแอปเดโมเทรด

คุณสามารถเพิ่มแอปสาธิตเทรดไปยังภาพระบบได้เช่นเดียวกับอุปกรณ์ Cuttlefish โดยทำดังนี้

# ThreadNetworkDemoApp for testing
PRODUCT_PACKAGES_DEBUG += ThreadNetworkDemoApp

โปรดทราบว่าคุณควรเพิ่มลงในตัวแปรแก้ไขข้อบกพร่อง / เวอร์ชันสำหรับนักพัฒนาซอฟต์แวร์เท่านั้น (เช่น PRODUCT_PACKAGES_DEBUG) เนื่องจากไม่ควรรวมไว้ในบิลด์สำหรับผู้ใช้ปลายทาง