ดูซอร์สโค้ดใน Android Code Search
หากคุณไม่ใช่ผู้ให้บริการอุปกรณ์ Android หรือชิปเทรด คุณก็หยุดอ่านได้ตอนนี้
เอกสารนี้จะแนะนำขั้นตอนการสร้างอุปกรณ์ Border Router ที่ใช้เทรดบน Android เครื่องใหม่ด้วยซอร์สโค้ด AOSP ล่าสุด เมื่อทำตามเอกสารนี้ คุณจะได้เรียนรู้สิ่งต่อไปนี้
- สถาปัตยกรรมและสถานะโดยรวมของการรองรับเทรดใน Android
- วิธีสร้างบริการ HAL ของ Thread ของคุณเอง
- วิธีทำให้อุปกรณ์ใช้งานร่วมกับ Google Home ได้
- วิธีทดสอบ 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 มีดังนี้
- มีบริการระบบเทรด 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
รหัสอยู่ที่ไหน
- เฟรมเวิร์ก / API และบริการ Thread ของ Android: https://cs.android.com/android/platform/superproject/main/+/main:packages/modules/Connectivity/thread/
- Thread HAL API และการใช้งานบริการเริ่มต้น: https://cs.android.com/android/platform/superproject/main/+/main:hardware/interfaces/threadnetwork/
- รีโป OpenThread ที่นําเข้า: https://cs.android.com/android/platform/superproject/main/+/main:external/openthread/
- รีโป ot-br-posix ที่นําเข้า: https://cs.android.com/android/platform/superproject/main/+/main:external/ot-br-posix/
ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์
ผู้ให้บริการอุปกรณ์ 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 กับเครือข่ายเทรดเริ่มต้น
นอกจากนี้ยังมีเครื่องมือบรรทัดคำสั่ง 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 ด้วยชุดทดสอบที่เผยแพร่แล้วเหล่านั้นได้
- https://source.android.com/docs/core/tests/vts
- https://source.android.com/docs/compatibility/cts/run
- https://docs.partner.android.com/mainline/test/mts (คุณต้องเป็นพาร์ทเนอร์จึงจะเข้าถึงลิงก์นี้ได้)
ทดสอบด้วยแอปเดโมเทรด
คุณสามารถเพิ่มแอปสาธิตเทรดไปยังภาพระบบได้เช่นเดียวกับอุปกรณ์ Cuttlefish โดยทำดังนี้
# ThreadNetworkDemoApp for testing PRODUCT_PACKAGES_DEBUG += ThreadNetworkDemoApp
โปรดทราบว่าคุณควรเพิ่มลงในตัวแปรแก้ไขข้อบกพร่อง / เวอร์ชันสำหรับนักพัฒนาซอฟต์แวร์เท่านั้น (เช่น PRODUCT_PACKAGES_DEBUG
) เนื่องจากไม่ควรรวมไว้ในบิลด์สำหรับผู้ใช้ปลายทาง