1. परिचय
थ्रेड क्या है?
Thread, आईपी पर आधारित कम पावर वाला वायरलेस मेश नेटवर्किंग प्रोटोकॉल है. यह डिवाइस-से-डिवाइस और डिवाइस-से-क्लाउड कम्यूनिकेशन को सुरक्षित बनाता है. सिंगल-पॉइंट फ़ेलियर से बचने के लिए, थ्रेड नेटवर्क टोपोलॉजी में बदलाव कर सकते हैं.
OpenThread क्या है?
Google की ओर से रिलीज़ किया गया OpenThread, Thread® का ओपन-सोर्स वर्शन है.
Thread बॉर्डर राऊटर क्या होता है?
Thread बॉर्डर राऊटर, Thread नेटवर्क को आईपी पर आधारित अन्य नेटवर्क से कनेक्ट करता है. जैसे, वाई-फ़ाई या ईथरनेट. Thread नेटवर्क को अन्य नेटवर्क से कनेक्ट करने के लिए, बॉर्डर राऊटर की ज़रूरत होती है. Thread बॉर्डर राऊटर में कम से कम ये फ़ंक्शन होने चाहिए:
- Thread और वाई-फ़ाई/ईथरनेट नेटवर्क के बीच, दोनों तरफ़ से आईपी कनेक्टिविटी.
- mDNS (वाई-फ़ाई/ईथरनेट लिंक पर) और SRP (Thread नेटवर्क पर) के ज़रिए, दोनों दिशाओं में सेवा की खोज की जा सकती है.
- यह एक ऐसा इंफ़्रास्ट्रक्चर है जो आईपी पर आधारित लिंक के ज़रिए, Thread के अलग-अलग हिस्सों को एक साथ जोड़ता है.
- Thread डिवाइस को Thread नेटवर्क से जोड़ने और उसकी पुष्टि करने के लिए, बाहरी Thread कमीशनिंग (उदाहरण के लिए, मोबाइल फ़ोन).
Google ने OpenThread Border Router (OTBR) रिलीज़ किया है. यह Thread Border Router का ओपन-सोर्स वर्शन है.
आपको क्या बनाना है
इस कोडलैब में, आपको Thread बॉर्डर राऊटर सेट अप करना है. साथ ही, अपने फ़ोन को बॉर्डर राऊटर के ज़रिए Thread एंड डिवाइस से कनेक्ट करना है.
आपको क्या सीखने को मिलेगा
- OTBR को सेट अप करने का तरीका
- OTBR की मदद से Thread नेटवर्क बनाने का तरीका
- एसआरपी सुविधा के साथ OpenThread CLI डिवाइस बनाने का तरीका
- एसआरपी के साथ किसी सेवा को रजिस्टर करने का तरीका
- Thread एंड डिवाइस को खोजने और उससे कनेक्ट करने का तरीका
आपको किन चीज़ों की ज़रूरत होगी
- Linux वर्कस्टेशन, ताकि Thread RCP और OpenThread CLI बनाया और फ़्लैश किया जा सके. साथ ही, IPv6 मल्टीकास्ट की टेस्टिंग की जा सके.
- Thread बॉर्डर राऊटर के लिए Raspberry Pi.
- Nordic Semiconductor के दो nRF52840 यूएसबी डोंगल (एक आरसीपी के लिए और एक थ्रेड एंड डिवाइस के लिए).
- कम से कम iOS 14 वाला iOS फ़ोन या कम से कम Android 8.1 वाला Android फ़ोन.
2. OTBR सेट अप करना
OTBR सेटअप गाइड को फ़ॉलो करके, OTBR को तुरंत सेट अप किया जा सकता है.
OTBR का सेटअप पूरा होने के बाद, ot-ctl
का इस्तेमाल करके यह पुष्टि करें कि OTBR, थ्रेड leader
के तौर पर काम कर रहा है.
$ sudo ot-ctl state leader Done
यह भी पुष्टि करें कि OTBR ने थ्रेड नेटवर्क डेटा में, off-mesh-routable
(ओएमआर) प्रीफ़िक्स को अपने-आप कॉन्फ़िगर कर दिया है.
$ sudo ot-ctl netdata show Prefixes: Prefixes: fd76:a5d1:fcb0:1707::/64 paos med 4000 Routes: fd49:7770:7fc5:0::/64 s med 4000 Services: 44970 5d c000 s 4000 44970 01 9a04b000000e10 s 4000 Done $ sudo ot-ctl ipaddr fda8:5ce9:df1e:6620:0:ff:fe00:fc11 fda8:5ce9:df1e:6620:0:0:0:fc38 fda8:5ce9:df1e:6620:0:ff:fe00:fc10 fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9 fda8:5ce9:df1e:6620:0:ff:fe00:fc00 fda8:5ce9:df1e:6620:0:ff:fe00:4000 fda8:5ce9:df1e:6620:3593:acfc:10db:1a8d fe80:0:0:0:a6:301c:3e9f:2f5b Done
3. एसआरपी क्लाइंट एंड डिवाइस सेट अप करना
OT CLI को बिल्ड और फ़्लैश करना
nRF52840 CLI एंड डिवाइस बनाने और उसे फ़्लैश करने के लिए, nRF52840 बोर्ड और OpenThread की मदद से थ्रेड नेटवर्क बनाने वाले कोडलैब के पांचवें चरण में दिया गया तरीका अपनाएं.
हालांकि, CLI नोड के लिए OT_COMMISSIONER
और OT_JOINER
के बजाय, OT_SRP_CLIENT
और OT_ECDSA
सुविधाएं ज़रूरी होती हैं.
इसलिए, पूरे बिल्ड इनवोकेशन को ऐसा दिखना चाहिए:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Thread नेटवर्क से जुड़ना
Thread नेटवर्क से जुड़ने के लिए, हमें OTBR डिवाइस से Active Operational Dataset पाना होगा. आइए, ot-ctl
पर वापस जाएं और चालू डेटासेट पाएं:
$ sudo ot-ctl dataset active -x 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
एसआरपी क्लाइंट नोड स्क्रीन सेशन पर वापस जाएं और ऐक्टिव डेटासेट सेट करें:
> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
इसके बाद, Thread इंटरफ़ेस शुरू करें:
> ifconfig up Done > thread start Done
कुछ सेकंड इंतज़ार करें और पुष्टि करें कि थ्रेड नेटवर्क में शामिल होने की प्रोसेस पूरी हो गई है या नहीं:
> state child Done > netdata show Prefixes: fd76:a5d1:fcb0:1707::/64 paos med 4000 Routes: fd49:7770:7fc5:0::/64 s med 4000 Services: 44970 5d c000 s 4000 44970 01 9a04b000000e10 s 4000 Done > ipaddr fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 fda8:5ce9:df1e:6620:0:ff:fe00:4001 fda8:5ce9:df1e:6620:ed74:123:cc5d:74ba fe80:0:0:0:d4a9:39a0:abce:b02e Done
पक्का करें कि नेटवर्क का डेटा, OTBR पर प्रिंट किए गए डेटा से मेल खाता हो. अब हम OTBR के OMR पते को पिंग कर सकते हैं:
> ping fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9 Done > 16 bytes from fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9: icmp_seq=1 hlim=64 time=49ms
4. एंड डिवाइस पर सेवा पब्लिश करना
mDNS का इस्तेमाल, लिंक-लोकल पर DNS-SD सेवा को पब्लिश करने के लिए बड़े पैमाने पर किया जाता है. हालांकि, मल्टीकास्ट मैसेज में बहुत ज़्यादा बैंडविड्थ का इस्तेमाल होता है. साथ ही, कम पावर वाले डिवाइसों की बैटरी बहुत तेज़ी से खत्म हो जाती है. थ्रेड, बॉर्डर राउटर के साथ अपनी सेवाओं को रजिस्टर करने के लिए, यूनिकास्ट SRP प्रोटोकॉल का इस्तेमाल करता है. साथ ही, वाई-फ़ाई या ईथरनेट लिंक पर सेवाओं का विज्ञापन दिखाने के लिए, बॉर्डर राउटर पर निर्भर रहता है.
हम srp client
कमांड का इस्तेमाल करके, किसी सेवा को रजिस्टर कर सकते हैं.
एसआरपी क्लाइंट नोड स्क्रीन सेशन पर जाएं और एसआरपी क्लाइंट को अपने-आप शुरू होने की सुविधा चालू करें:
> srp client autostart enable Done
उस होस्टनेम को सेट करें जिसे वाई-फ़ाई/ईथरनेट लिंक पर विज्ञापन के तौर पर दिखाया जाएगा:
> srp client host name ot-host Done
अगर वाई-फ़ाई/ईथरनेट लिंक पर मौजूद किसी डिवाइस को Thread एंड डिवाइस तक पहुंचना है, तो एंड डिवाइस के ओएमआर पते का विज्ञापन दिखाना होगा:
> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 Done
आखिर में, फ़र्ज़ी _ipps._tcp
सेवा रजिस्टर करें:
> srp client service add ot-service _ipps._tcp 12345 Done
कुछ सेकंड इंतज़ार करें. इसके बाद, हमें रजिस्टर की गई सेवा दिखनी चाहिए:
> srp client service instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0 Done
हमने सेटअप से जुड़ा सारा काम पूरा कर लिया है. साथ ही, _ipps._tcp
सेवा का विज्ञापन, वाई-फ़ाई/ईथरनेट लिंक पर दिखाया जाना चाहिए. अब एंड डिवाइस को खोजने और उस तक पहुंचने का समय है!
5. सेवा के बारे में जानें
मोबाइल फ़ोन से सेवा के बारे में जानना
हम Android फ़ोन पर mDNS सेवाओं का पता लगाने के लिए, Service Browser ऐप्लिकेशन का इस्तेमाल करते हैं. iOS मोबाइल डिवाइसों के लिए, इसी तरह का ऐप्लिकेशन भी उपलब्ध है. ऐप्लिकेशन खोलें और सेवा _ipps._tcp
दिखनी चाहिए.
Linux होस्ट के साथ सेवा ढूंढना
अगर आपको किसी अन्य Linux होस्ट से सेवा का पता लगाना है, तो avahi-browse
कमांड का इस्तेमाल करें.
avahi-daemon
और avahi-utils
इंस्टॉल करें:
$ sudo apt-get install -y avahi-daemon avahi-utils
सेवा से जुड़ी समस्या हल करें:
$ sudo service avahi-daemon start # Ensure the avahi daemon is started. $ avahi-browse -r _ipps._tcp + wlan0 IPv6 ot-service Secure Internet Printer local = wlan0 IPv6 ot-service Secure Internet Printer local hostname = [ot-host.local] address = [fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927] port = [12345] txt = [] ...
macOS होस्ट की मदद से सेवा ढूंढना
macOS पर dns-sd
का इस्तेमाल करके, सेवा से जुड़ी समस्या हल की जा सकती है:
$ dns-sd -Z _ipps._tcp local. Browsing for _ipps._tcp.local. DATE: ---Sun 14 Mar 2021--- 21:31:42.125 ...STARTING... ; To direct clients to browse a different domain, substitute that domain in place of '@' lb._dns-sd._udp PTR @ ; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names. ; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local ; names with the correct fully-qualified (unicast) domain name of the target host offering the service. _ipps._tcp PTR ot-service._ipps._tcp ot-service._ipps._tcp SRV 0 0 12345 ot-host.local. ; Replace with unicast FQDN of target host ot-service._ipps._tcp TXT "" ...
6. एंड डिवाइस को पिंग करें
मोबाइल फ़ोन से पिंग करना
उदाहरण के लिए, Pixel फ़ोन में, सर्विस ब्राउज़र ऐप्लिकेशन में जाकर, सर्विस इंस्टेंस के जानकारी वाले पेज पर, पहले से रजिस्टर की गई "ot-service" सेवा का ओएमआर पता देखा जा सकता है.
अब हम किसी दूसरे Network Analyzer ऐप्लिकेशन की मदद से, ओएमआर पते को पिंग कर सकते हैं.
माफ़ करें, Network Analyzer ऐप्लिकेशन के Android वर्शन में, पिंग यूटिलिटी के लिए mDNS क्वेरी का इस्तेमाल नहीं किया जा सकता. इसलिए, हम सीधे तौर पर होस्टनेम ot-host.local
को पिंग नहीं कर सकते. हालांकि, हम ऐप्लिकेशन के iOS वर्शन का इस्तेमाल करके होस्टनेम को पिंग कर सकते हैं.
Linux/macOS होस्ट से पिंग करना
थ्रेड बॉर्डर राउटर, ICMPv6 राउटर विज्ञापन (आरए) भेजता है. इससे, वाई-फ़ाई/ईथरनेट लिंक पर प्रीफ़िक्स (प्रीफ़िक्स की जानकारी देने वाले विकल्प के ज़रिए) और रास्तों (रास्ते की जानकारी देने वाले विकल्प के ज़रिए) का विज्ञापन दिखाया जाता है.
Linux होस्ट तैयार करना
यह पक्का करना ज़रूरी है कि आपके होस्ट पर RA और RIO चालू हों:
- अगर आईपी फ़ॉरवर्डिंग चालू नहीं है, तो
net.ipv6.conf.wlan0.accept_ra
कम से कम1
होना चाहिए. अगर आईपी फ़ॉरवर्डिंग चालू है, तोnet.ipv6.conf.wlan0.accept_ra
कम से कम2
होना चाहिए. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
की वैल्यू,64
की वैल्यू से कम नहीं होनी चाहिए.
ज़्यादातर डिस्ट्रिब्यूशन के लिए, accept_ra
को डिफ़ॉल्ट रूप से 1
पर सेट किया जाता है. हालांकि, ऐसे अन्य नेटवर्क डेमॉन हो सकते हैं जो इस विकल्प को बदल देंगे. उदाहरण के लिए, Raspberry Pi पर dhcpcd
, accept_ra
को 0
पर बदल देगा. accept_ra
की वैल्यू की जांच करने के लिए, यह तरीका अपनाएं:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
इसके बाद, वैल्यू को 1
(अगर आईपी फ़ॉरवर्डिंग चालू है, तो 2
) पर सेट करें. इसके लिए:
$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1 Net.ipv6.conf.wlan0.accept_ra = 1
ज़्यादातर Linux डिस्ट्रिब्यूशन में, accept_ra_rt_info_max_plen
विकल्प डिफ़ॉल्ट रूप से 0
पर सेट होता है. इसे 64
पर सेट करने के लिए, यह कमांड चलाएं:
$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen=64 net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
होस्ट को रीबूट करने के बाद, बदलाव हट जाएगा. उदाहरण के लिए, RIO को हमेशा के लिए चालू करने के लिए, /etc/sysctl.conf
में यहां दिए गए कमांड जोड़ें:
$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
इन कॉन्फ़िगरेशन को बदलने में बहुत देर हो सकती है, क्योंकि OTBR पहले ही RA मैसेज भेज रहा है. साथ ही, बिना मांगे भेजे गए दो RA मैसेज के बीच का अंतराल कई सौ सेकंड हो सकता है. राउटर सॉलिसिटेशन मैसेज भेजने के लिए, वाई-फ़ाई एपी से डिसकनेक्ट करें और फिर से कनेक्ट करें. इससे OTBR, अनुरोध किए गए आरए के साथ जवाब देगा. इसके अलावा, बॉर्डर राऊटर पर बॉर्डर राऊटिंग फ़ंक्शन को रीस्टार्ट करने का विकल्प भी है:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
अगर आपको वाई-फ़ाई को फिर से कनेक्ट करना है या ईथरनेट इंटरफ़ेस को रीस्टार्ट करना है, तो पक्का करें कि dhcpcd का इस्तेमाल, वाई-फ़ाई/ईथरनेट IPv6 नेटवर्क को मैनेज करने के लिए न किया जा रहा हो. ऐसा इसलिए होता है, क्योंकि इंटरफ़ेस को हर बार रीस्टार्ट करने पर, dhcpcd हमेशा accept_ra
विकल्प को बदल देता है. इससे आपका accept_ra
कॉन्फ़िगरेशन मिट जाएगा. dhcpcd में IPv6 को साफ़ तौर पर बंद करने के लिए, नीचे दी गई लाइनों को dhcpcd कॉन्फ़िगरेशन फ़ाइल (जैसे, /etc/dhcpcd.conf
) में जोड़ें:
noipv6 noipv6rs
बदलाव को लागू करने के लिए, आपको डिवाइस को रीबूट करना होगा.
macOS होस्ट तैयार करना
accept_ra*
दोनों विकल्प डिफ़ॉल्ट रूप से चालू होते हैं. हालांकि, आपको अपने सिस्टम को कम से कम macOS Big Sur पर अपग्रेड करना होगा.
होस्टनेम या IPv6 पते को पिंग करें
अब हम कमांड ping -6
(macOS के लिए ping6
) की मदद से, होस्टनेम ot-host.local
को पिंग कर सकते हैं:
$ ping -6 ot-host.local. PING ot-host.local.(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927)) 56 data bytes 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=1 ttl=63 time=170 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=2 ttl=63 time=64.2 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=3 ttl=63 time=22.8 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=4 ttl=63 time=37.7 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=5 ttl=63 time=28.7 ms ...
यह कमांड, Linux होस्ट पर "Name or service not known"
गड़बड़ी के साथ काम नहीं कर सकती. ऐसा इसलिए है, क्योंकि ping
कमांड, mDNS क्वेरी के साथ ot-host.local.
नाम को हल नहीं कर रही है. /etc/nsswitch.conf
खोलें और mdns6_minimal
से शुरू होने वाली लाइन में hosts
जोड़ें:
hosts: files mdns4_minimal mdns6_minimal dns
हालांकि, IPv6 पते को सीधे तौर पर पिंग किया जा सकता है:
$ ping -6 fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 PING fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927) 56 data bytes 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=1 ttl=63 time=32.9 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=2 ttl=63 time=27.8 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=3 ttl=63 time=29.9 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=4 ttl=63 time=73.5 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=5 ttl=63 time=26.4 ms ...
7. एंड डिवाइस पर सेवा को अनपब्लिश करना
एसआरपी क्लाइंट नोड से रजिस्टर किए गए पते और सेवा को हटाने के लिए:
> srp client host remove Done
अब आपको _ipps._tcp
सेवा नहीं दिखनी चाहिए.
8. बधाई हो
बधाई हो, आपने OTBR को Thread बॉर्डर राऊटर के तौर पर सेट अप कर लिया है. इससे Thread एंड डिवाइसों के लिए, दोनों दिशाओं में आईपी कनेक्टिविटी और सेवा की खोज की जा सकेगी.
आगे क्या करना है?
यहां दिए गए कुछ कोडलैब देखें...