Android बॉर्डर राऊटर बनाना

Android Code Search पर सोर्स देखना

अगर आप Android डिवाइस या Thread चिप के वेंडर नहीं हैं, तो अब पढ़ना बंद करें.

इस दस्तावेज़ में, नए AOSP सोर्स कोड की मदद से, Android पर आधारित Thread Border Router डिवाइस बनाने का तरीका बताया गया है. इस दस्तावेज़ को पढ़कर, आपको इनके बारे में जानकारी मिलेगी:

  1. Android में Thread की सुविधा के पूरे आर्किटेक्चर और स्टेटस के बारे में जानकारी
  2. Thread HAL सेवा बनाने का तरीका
  3. अपने डिवाइस को Google Home के साथ काम करने लायक कैसे बनाएं
  4. 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-arch

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 डिवाइस के वे वेंडर जो डिवाइस के लिए पहले से ही 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 नेटवर्क से कनेक्ट करने के लिए, वह ऐप्लिकेशन खोलें.

demoapp-screenshot

टेस्टिंग के लिए, अपने 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

रिलीज़ किए गए टेस्ट सुइट की मदद से, वीटीएस/सीटीएस/एमटीएस टेस्ट चलाने के बारे में ज़्यादा निर्देश भी मिल सकते हैं:

Thread के डेमो ऐप्लिकेशन की मदद से जांच करना

Cuttlefish डिवाइस की तरह ही, अपनी सिस्टम इमेज में Thread का डेमो ऐप्लिकेशन जोड़ा जा सकता है:

# ThreadNetworkDemoApp for testing
PRODUCT_PACKAGES_DEBUG += ThreadNetworkDemoApp

ध्यान दें कि आपको इसे सिर्फ़ डीबग / eng वैरिएंट (उदाहरण के लिए, PRODUCT_PACKAGES_DEBUG) में जोड़ना चाहिए, क्योंकि इसे असली उपयोगकर्ताओं के लिए यूज़र बिल्ड में शामिल नहीं किया जाना चाहिए.