1. מבוא
מה זה Thread?
Thread הוא פרוטוקול רשת אלחוטית מבוסס-IP שצורכת מעט חשמל, ומאפשרת תקשורת מאובטחת בין מכשירים ובין מכשירים לענן. רשתות Thread יכולות להתאים את עצמן לשינויים בטופולוגיה כדי להימנע מכשל בנקודה אחת.
מה זה OpenThread?
OpenThread שפורסם על ידי Google הוא הטמעה בקוד פתוח של Thread®.
מהו נתב גבולות לפרוטוקול Thread?
נתב גבולות עם פרוטוקול Thread מחבר רשת עם פרוטוקול Thread לרשתות אחרות שמבוססות על IP, כמו Wi-Fi או אתרנט. כדי להתחבר לרשתות אחרות, רשת עם פרוטוקול Thread צריכה נתב גבולות. נתב גבולות עם פרוטוקול Thread תומך לכל הפחות בפונקציות הבאות:
- קישוריות IP דו-כיוונית בין רשתות Thread ו-Wi-Fi/Ethernet.
- זיהוי שירותים דו-כיווני באמצעות mDNS (בקישור Wi-Fi/Ethernet) ו-SRP (ברשת Thread).
- פרוטוקול Thread-over-infrastructure שמאחד מחיצות של Thread באמצעות קישורים מבוססי-IP.
- הפעלה חיצונית של מכשיר Thread (לדוגמה, טלפון נייד) כדי לאמת ולהצטרף למכשיר Thread ברשת Thread.
OpenThread Border Router (OTBR) שפורסם על ידי Google הוא הטמעה בקוד פתוח של נתב גבולות עם פרוטוקול Thread.
מה תפַתחו
ב-codelab הזה תגדירו נתב גבולות לפרוטוקול Thread ותחברו את הטלפון הנייד למכשיר קצה לפרוטוקול Thread באמצעות נתב הגבולות.
מה תלמדו
- איך מגדירים OTBR
- איך יוצרים רשת Thread באמצעות OTBR
- איך יוצרים מכשיר OpenThread CLI עם תכונת ה-SRP
- איך רושמים שירות ב-SRP
- איך מאתרים מכשיר קצה של Thread ויוצרים איתו קשר
מה נדרש
- תחנת עבודה של Linux, ליצירה ולהפעלה של Thread RCP, OpenThread CLI ובדיקה של IPv6 multicast.
- Raspberry Pi לנתב הגבולות עם פרוטוקול Thread.
- 2 מתאמי USB של Nordic Semiconductor nRF52840 (אחד ל-RCP ואחד למכשיר הקצה של Thread).
- טלפון iOS עם iOS 14 ומעלה או טלפון Android עם Android 8.1 ומעלה.
2. הגדרת OTBR
הדרך המהירה ביותר להגדיר OTBR היא באמצעות מדריך ההגדרה של OTBR.
אחרי שמשלימים את ההגדרה של OTBR, משתמשים ב-ot-ctl
כדי לוודא ש-OTBR פועל כ-Thread leader
.
$ sudo ot-ctl state leader Done
בנוסף, צריך לוודא ש-OTBR הגדיר באופן אוטומטי קידומת off-mesh-routable
(OMR) בנתוני רשת Thread.
$ 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. הגדרת מכשיר קצה של לקוח SRP
פיתוח והפעלה של OT CLI
פועלים לפי שלב 5 ב-codelab Build a Thread network with nRF52840 boards and OpenThread כדי ליצור ולהפעיל מכשיר קצה nRF52840 CLI.
אבל במקום להפעיל את OT_COMMISSIONER
ו-OT_JOINER
, צומת ה-CLI דורש את התכונות OT_SRP_CLIENT
ו-OT_ECDSA
.
לכן, הקריאה המלאה ל-build צריכה להיראות כך:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
הצטרפות לרשת בפרוטוקול Thread
כדי להצטרף לרשת עם פרוטוקול Thread, אנחנו צריכים לקבל את מערך הנתונים הפעיל של הפעולה ממכשיר ה-OTBR. נחזור אל ot-ctl
ונביא את מערך הנתונים הפעיל:
$ sudo ot-ctl dataset active -x 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
חוזרים לסשן של צומת הלקוח של SRP ומגדירים את מערך הנתונים הפעיל:
> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
לאחר מכן, מפעילים את הממשק של Thread:
> ifconfig up Done > thread start Done
מחכים כמה שניות ומוודאים שההצטרפות לרשת Thread הצליחה:
> 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. עכשיו אפשר לשלוח פינג לכתובת ה-OMR של OTBR:
> 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 מסוג unicast משמש את Thread כדי לרשום את השירותים שלו בנתב הגבול, והוא מסתמך על נתב הגבול כדי לפרסם את השירותים בקישור Wi-Fi או Ethernet.
אפשר לרשום שירות באמצעות הפקודה srp client
.
עוברים לסשן המסך של צומת הלקוח SRP ומפעילים אוטומטית את לקוח ה-SRP:
> srp client autostart enable Done
מגדירים את שם המארח שיפורסם בקישור Wi-Fi/Ethernet:
> srp client host name ot-host Done
כדי שמכשיר שמחובר ל-Wi-Fi או ל-Ethernet יוכל להגיע למכשיר קצה של Thread, צריך לפרסם את כתובת ה-OMR של מכשיר הקצה:
> 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
אמור להתפרסם בקישור Wi-Fi/Ethernet. הגיע הזמן לגלות את מכשיר הקצה ולהגיע אליו!
5. גילוי השירות
היכרות עם השירות באמצעות טלפון נייד
אנחנו משתמשים באפליקציית Service Browser כדי לגלות שירותי mDNS באמצעות טלפון Android. אפשר למצוא גם אפליקציה מקבילה למכשירים ניידים עם 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
אפשר להשתמש ב-dns-sd
ב-macOS כדי לפתור את הבעיה בשירות:
$ 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, אפשר למצוא את כתובת ה-OMR של השירות 'ot-service' שנרשם קודם בדף הפרטים של מופע השירות באפליקציית דפדפן השירותים.
עכשיו אפשר לשלוח פינג לכתובת OMR באמצעות אפליקציית Network Analyzer אחרת.
לצערנו, הגרסה של אפליקציית Network Analyzer ל-Android לא תומכת בשאילתות mDNS עבור כלי הפינג, ואין לנו אפשרות לבצע פינג ישירות לשם המארח ot-host.local
(אפשר לבצע פינג לשם המארח באמצעות הגרסה של האפליקציה ל-iOS).
פינג ממארח Linux/macOS
נתב הגבול של Thread שולח הודעות ICMPv6 Router Advertisements (RA) כדי לפרסם קידומות (באמצעות Prefix Information Option) ומסלולים (באמצעות Route Information Option) בקישור Wi-Fi/Ethernet.
הכנת מארח Linux
חשוב לוודא שהאפשרויות RA ו-RIO מופעלות במארח:
- הערך של
net.ipv6.conf.wlan0.accept_ra
צריך להיות לפחות1
אם העברת ה-IP לא מופעלת, ו2
אם היא מופעלת. - הערך של
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
לא יכול להיות קטן מהערך של64
.
ברוב ההפצות, ברירת המחדל של accept_ra
היא 1
. אבל יכול להיות שיש שדים אחרים ברשת שיבטלו את האפשרות הזו (לדוגמה, dhcpcd
ב-Raspberry Pi יבטל את accept_ra
ויגדיר אותו ל-0
). אפשר לבדוק את הערך של accept_ra
באמצעות הפקודה:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
מגדירים את הערך ל-1
(או ל-2
אם העברת ה-IP מופעלת) באמצעות:
$ 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 לא רצויות יכול להיות כמה מאות שניות. אחת הדרכים היא לנתק את הגישה ל-Wi-Fi ולחבר אותה מחדש כדי לשלוח הודעות Router Solicitation, כך ש-OTBR יגיב עם הודעות RA שנדרשו. אפשרות נוספת היא להפעיל מחדש את פונקציית ניתוב הגבולות בנתב הגבולות:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
אם אתם מנסים להתחבר מחדש ל-Wi-Fi או להפעיל מחדש את ממשק האתרנט, ודאו שלא נעשה שימוש ב-dhcpcd לניהול רשת ה-IPv6 של ה-Wi-Fi או האתרנט. כי dhcpcd תמיד מבטל את האפשרות accept_ra
בכל פעם שמפעילים מחדש את הממשק, וההגדרה של accept_ra
תאבד. מוסיפים את השורות הבאות לקובץ התצורה של dhcpcd (לדוגמה, /etc/dhcpcd.conf
) כדי להשבית באופן מפורש את IPv6 ב-dhcpcd:
noipv6 noipv6rs
כדי שהשינוי ייכנס לתוקף, צריך להפעיל מחדש את המחשב.
הכנת מארח macOS
שתי האפשרויות accept_ra*
מופעלות כברירת מחדל, אבל צריך לשדרג את המערכת ל-macOS Big Sur לפחות.
פינג לשם המארח או לכתובת IPv6
עכשיו אפשר לבצע פינג לשם המארח ot-host.local
באמצעות הפקודה ping -6
(ping6
ב-macOS):
$ 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
לא פותרת את השם ot-host.local.
באמצעות שאילתות mDNS. פותחים את /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:
> srp client host remove Done
עכשיו לא אמורה להיות אפשרות לגלות את השירות _ipps._tcp
.
8. מזל טוב
הגדרתם בהצלחה את OTBR כנתב גבולות עם פרוטוקול Thread כדי לספק קישוריות IP דו-כיוונית ואיתור שירותים למכשירי קצה עם פרוטוקול Thread.
מה השלב הבא?
כדאי לעיין בכמה מה-codelabs האלה…