Android Code Search पर सोर्स देखना
अगर आप Android डिवाइस या Thread चिप के वेंडर नहीं हैं, तो अब पढ़ना बंद करें.
इस दस्तावेज़ में, नए AOSP सोर्स कोड की मदद से, Android पर आधारित Thread Border Router डिवाइस बनाने का तरीका बताया गया है. इस दस्तावेज़ को पढ़कर, आपको इनके बारे में जानकारी मिलेगी:
- Android में Thread की सुविधा के पूरे आर्किटेक्चर और स्टेटस के बारे में जानकारी
- Thread HAL सेवा बनाने का तरीका
- अपने डिवाइस को Google Home के साथ काम करने लायक कैसे बनाएं
- Thread बॉर्डर राऊटर की जांच करने का तरीका
अगर आपको मदद चाहिए, तो GitHub पर समस्या दर्ज करें. अगर आपका कोई सवाल है, तो चर्चा शुरू करें.
खास जानकारी
Android Thread स्टैक, OpenThread और ot-br-posix
पर आधारित है. इन्हें Google ने GitHub पर ओपन सोर्स किया है. जिस तरह OpenThread को सार्वजनिक GitHub रिपॉज़िटरी में डेवलप किया गया है उसी तरह Android Thread स्टैक को सार्वजनिक AOSP कोडबेस में डेवलप किया गया है. सभी सुविधाएं और गड़बड़ियों को ठीक करने के तरीके, पहले AOSP में सबमिट किए जाते हैं. इससे वेंडर, Android के सामान्य रिलीज़ का इंतज़ार किए बिना, Thread के नए वर्शन का इस्तेमाल शुरू कर सकते हैं.
आर्किटेक्चर
पूरे Android Thread स्टैक में दो मुख्य कॉम्पोनेंट होते हैं: सामान्य सिस्टम सेगमेंट में मौजूद कोर Thread स्टैक और वेंडर सेगमेंट में मौजूद Thread HAL सेवा. आम तौर पर, डिवाइस वेंडर को सिर्फ़ एचएएल सेवा को ध्यान में रखकर बनाना होता है.
Android Thread स्टैक के काम करने के तरीके के बारे में यहां खास जानकारी दी गई है:
- सिस्टम सर्वर में एक Java Thread सिस्टम सेवा होती है, जो पूरे स्टैक को मैनेज करती है - Thread सिस्टम API उपलब्ध कराती है, thread-wpan
टनल इंटरफ़ेस बनाती है, Thread नेटवर्क को कनेक्टिविटी सेवा के साथ रजिस्टर करती है, और Border Routing और विज्ञापन प्रॉक्सी की सुविधाएं लागू करती है.
- मुख्य Thread / OpenThread स्टैक को बिना विशेषाधिकार वाली स्टैंडअलोन
नेटिव प्रोसेस में होस्ट किया जाता है, जिसे ot-daemon
कहा जाता है. ot-daemon
को सीधे तौर पर, निजी एआईडीएल एपीआई के ज़रिए Java सिस्टम सेवा मैनेज करती है. साथ ही, यह Thread HAL API के ज़रिए Thread हार्डवेयर रेडियो को ऐक्सेस करती है.
- वेंडर की ओर से दी गई Thread HAL सेवा में, Thread HAL API को लागू करना ज़रूरी है. यह आम तौर पर आरसीपी के तौर पर काम करता है और स्पिनल प्रोटोकॉल को लागू करता है.
कोड कहां है?
- Android Thread फ़्रेमवर्क / एपीआई और सेवा: 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 repo: https://cs.android.com/android/platform/superproject/main/+/main:external/openthread/
- इंपोर्ट किया गया ot-br-posix repo: https://cs.android.com/android/platform/superproject/main/+/main:external/ot-br-posix/
डेवलपमेंट एनवायरमेंट सेट अप करना
Android डिवाइस के वे वेंडर जो डिवाइस के लिए पहले से ही Android डेवलपमेंट एनवायरमेंट सेट अप कर चुके हैं वे इस सेक्शन को छोड़ सकते हैं.
अगर आपने हाल ही में Android नेटवर्क का इस्तेमाल शुरू किया है या आप सिलिकॉन वेंडर हैं और आपको अपनी Thread चिप को Android के साथ काम करने लायक बनाना है और डिवाइस वेंडर को सहायता देनी है, तो पढ़ना जारी रखें.
Android डेवलपर कोडलैब का इस्तेमाल करना
पहली बार Android डेवलपमेंट एनवायरमेंट सेट अप करने के लिए, इस कोडलैब का इस्तेमाल करें: https://source.android.com/docs/setup/start. इस कोडलैब के आखिर में, आपके पास सोर्स कोड से Cuttlefish डिवाइस का सिम्युलेशन बनाने और उसे चलाने का विकल्प होगा.
Thread HAL सेवा बनाना
Cuttlefish में थ्रेड की सुविधा आज़माएं
Cuttlefish, वर्चुअल Android डिवाइस है. अपनी HAL सेवा बनाने से पहले, Cuttlefish में Thread को आज़माना बेहतर होगा, ताकि HAL के काम करने का तरीका समझा जा सके.
Cuttlefish में डिफ़ॉल्ट Thread HAL सेवा उपलब्ध कराई गई है. इसे सिमुलेट किए गए आरसीपी के साथ लागू किया गया है. यह सिम्युलेट किए गए Thread (802.15.4) रेडियो से और उसमें UDP सॉकेट के ज़रिए पैकेट भेजता और पाता है.
Cuttlefish इंस्टेंस में, "ThreadNetworkDemoApp" पहले से इंस्टॉल होता है. Cuttlefish डिवाइस को डिफ़ॉल्ट Thread नेटवर्क से कनेक्ट करने के लिए, वह ऐप्लिकेशन खोलें.
टेस्टिंग के लिए, अपने Thread नेटवर्क को कॉन्फ़िगर करने के लिए, ot-ctl
और ot-cli-ftd
कमांड-लाइन टूल भी उपलब्ध हैं. ये टूल, उन सभी OpenThread सीएलआई निर्देशों के साथ काम करते हैं जिनके बारे में आपको पहले से पता हो.
Cuttlefish Thread HAL सेवा के लॉग को grep करने के लिए, यह तरीका अपनाएं:
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
इसके अलावा, ot-डेमन लॉग के लिए grep का इस्तेमाल करके, यह तरीका अपनाएं:
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]
Cuttlefish Thread HAL सेवा, डिफ़ॉल्ट Thread HAL सेवा के साथ-साथ, OpenThread की सिम्युलेट की गई आरसीपी बाइनरी का इस्तेमाल करती है. यह कैसे काम करती है, इसके बारे में जानने के लिए अगला सेक्शन देखें.
डिफ़ॉल्ट HAL सेवा
Thread HAL API के साथ-साथ, डिफ़ॉल्ट HAL सेवा भी शामिल की गई है. डिफ़ॉल्ट एचएएल सेवा, सिम्युलेट किए गए और असली आरसीपी डिवाइस, दोनों के साथ काम करती है. इसे आरसीपी डिवाइस का यूआरएल मिलता है. हालांकि, यह यूआरएल देना ज़रूरी नहीं है. अगर यूआरएल नहीं दिया जाता है, तो डिफ़ॉल्ट रूप से सिम्युलेट किए गए आरसीपी डिवाइस का इस्तेमाल किया जाता है.
फ़ाइल 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
असल आरसीपी डिवाइसों के लिए, यह SPI और UART इंटरफ़ेस, दोनों के साथ काम करता है. साथ ही, डिवाइस के बारे में बताने के लिए, स्कीमा spinel+spi://
, spinel+hdlc+uart://
, और
spinel+socket://
का इस्तेमाल किया जा सकता है.
वेंडर APEX को समझना
'टethering' के मुख्य मॉड्यूल में मौजूद थ्रेड स्टैक की तरह ही, Cuttlefish में डिफ़ॉल्ट थ्रेड
HAL सेवा को भी APEX मॉड्यूल में पैकेज किया गया है. हालांकि, यह एक वेंडर APEX मॉड्यूल है, जिसे /vendor/apex/
में इंस्टॉल किया जाएगा (मॉड्यूल में मौजूद आर्टफ़ैक्ट को /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 ], }
अपने HAL APEX मॉड्यूल को बनाते समय, आपको कुछ अहम कॉन्फ़िगरेशन पर ध्यान देने या उनमें बदलाव करने होंगे:
file_contexts
: इसमें इस APEX मॉड्यूल में डिलीवर की गई बाइनरी / डेटा फ़ाइलों के बारे में बताया गया है. इसके अलावा, इसमें उन फ़ाइलों के बारे में भी बताया गया है जिन्हें HAL सेवा को ऐक्सेस करना है. उदाहरण के लिए, आरसीपी डिवाइस. इससे, हार्डवेयर आरसीपी डिवाइस को ऐक्सेस करने के लिए, अपनी एचएएल सेवा के लिए खास sepolicy नियम तय किए जा सकते हैं.binaries
: इस APEX मॉड्यूल में डिलीवर की गई बाइनरी फ़ाइलthreadnetwork-service.rc
: एचएएल सेवा कैसे शुरू की जाएगी. आपको यहां आरसीपी डिवाइस का पाथ बताना होगा.android.hardware.thread_network.prebuilt.xml
: हार्डवेयर की सुविधा के बारे में बताता हैandroid.hardware.thread_network
. Android सिस्टम को यह जानने के लिए, यह ज़रूरी है कि आपके डिवाइस में Thread हार्डवेयर की सुविधा है. ऐसा न करने पर, Android थ्रेड स्टैक चालू नहीं होगा.
एचएएल सेवा बनाना
चाहे आप Android डिवाइस डेवलपर हों या सिलिकॉन वेंडर, आपको अपनी Thread चिप के लिए OT आरसीपी फ़र्मवेयर बनाने का तरीका पता होना चाहिए. यहां दिए गए निर्देशों के हिसाब से, यह माना जाता है कि हार्डवेयर चिप को सही तरीके से तार से जोड़ा गया है और उसकी पुष्टि की जा चुकी है.
HAL APEX बनाने का सबसे आसान तरीका यह है कि डिफ़ॉल्ट HAL APEX के बाइनरी और पहले से बने वर्शन की मदद से नया 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 के नियम
डिफ़ॉल्ट रूप से, आपकी Thread HAL सेवा के पास RCP डिवाइस (उदाहरण के लिए, /dev/ttyACM0
) का ऐक्सेस नहीं होता. इसलिए, sepolicy/
डायरेक्ट्री में कस्टम 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 जोड़ने के लिए ज़रूरी कोड जोड़ लिया है. आखिरी चरण में, आपको अपने डिवाइस की इमेज में 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
कस्टमाइज़ेशन
Thread का मुख्य मॉड्यूल (यह असल में "Tethering" मॉड्यूल का हिस्सा है) कुछ ओवरले किए जा सकने वाले कॉन्फ़िगरेशन उपलब्ध कराता है. वेंडर, स्टैक के व्यवहार को पसंद के मुताबिक बनाने के लिए इन कॉन्फ़िगरेशन का इस्तेमाल कर सकते हैं. पूरी सूची के लिए, config_thread.xml देखें.
आम तौर पर, अपने डिवाइस को Thread बॉर्डर राऊटर के तौर पर चालू करने के लिए, आपको config_thread_border_router_default_enabled
को true
पर सेट करना होगा. साथ ही, config_thread_vendor_name
, config_thread_vendor_oui
, और config_thread_model_name
को अपने वेंडर या प्रॉडक्ट की वैल्यू पर बदलना होगा. इन वैल्यू को _meshcop._udp
mDNS सेवा में शामिल किया जाएगा. इस सेवा का विज्ञापन, Thread बॉर्डर राउटर हमेशा करता है.
ओवरले जोड़ने के लिए, आपको अपने Orange डिवाइस के लिए नया ConnectivityOverlayOrange
runtime_resource_overlay टारगेट बनाना होगा. device/banana/orange/rro_overlays
में जाकर, एक नई ConnectivityOverlay/
डायरेक्ट्री बनाएं और उसमें यह कॉन्टेंट बनाएं:
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>
HAL APEX की तरह ही, आपको अपनी device.mk
फ़ाइल में ओवरले ऐप्लिकेशन जोड़ना होगा:
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 नेटवर्क के साथ करना है, तो config_thread.xml
में यह कॉन्फ़िगरेशन तय किया जा सकता है:
<string-array name="config_thread_mdns_vendor_specific_txts"> <item>vgh=1</item> </string-array>
टेस्ट करना
आपका डिवाइस, अब Thread 1.3+ बॉर्डर राऊटर के स्पेसिफ़िकेशन के साथ काम करना चाहिए. इसे Thread सर्टिफ़िकेट प्रोग्राम में भेजने से पहले, यह पक्का करने के लिए कुछ Android xTS टेस्ट किए जाने चाहिए कि यह डिवाइस Thread के साथ काम करता है या नहीं.
VTS टेस्ट से यह पक्का होता है कि आपके डिवाइस पर Thread HAL सेवा, उम्मीद के मुताबिक काम कर रही है. टेस्ट को कमांड की मदद से चलाया जा सकता है
atest VtsHalThreadNetworkTargetTest
सीटीएस टेस्ट से यह पक्का होता है कि आपके डिवाइस पर Thread API, उम्मीद के मुताबिक काम करते हैं. निर्देश की मदद से, टेस्ट चलाए जा सकते हैं
atest CtsThreadNetworkTestCases
इंटिग्रेशन टेस्ट से यह पक्का करने में मदद मिलती है कि आपके डिवाइस पर Thread का मुख्य कोड बेहतर तरीके से काम करता है या नहीं. टेस्ट को कमांड की मदद से चलाया जा सकता है
atest ThreadNetworkIntegrationTests
रिलीज़ किए गए टेस्ट सुइट की मदद से, वीटीएस/सीटीएस/एमटीएस टेस्ट चलाने के बारे में ज़्यादा निर्देश भी मिल सकते हैं:
- https://source.android.com/docs/core/tests/vts
- https://source.android.com/docs/compatibility/cts/run
- https://docs.partner.android.com/mainline/test/mts (इस लिंक को ऐक्सेस करने के लिए, आपके पास पार्टनर की भूमिका होनी चाहिए)
Thread के डेमो ऐप्लिकेशन की मदद से जांच करना
Cuttlefish डिवाइस की तरह ही, अपनी सिस्टम इमेज में Thread का डेमो ऐप्लिकेशन जोड़ा जा सकता है:
# ThreadNetworkDemoApp for testing PRODUCT_PACKAGES_DEBUG += ThreadNetworkDemoApp
ध्यान दें कि आपको इसे सिर्फ़ डीबग / eng वैरिएंट (उदाहरण के लिए,
PRODUCT_PACKAGES_DEBUG
) में जोड़ना चाहिए, क्योंकि इसे असली उपयोगकर्ताओं के लिए यूज़र
बिल्ड में शामिल नहीं किया जाना चाहिए.