1. מבוא
מה זה Thread?
Thread הוא פרוטוקול רשתות רשתות רשתות אלחוטיות מבוסס-IP עם צריכת אנרגיה נמוכה, שמאפשר תקשורת מאובטחת בין מכשירים ומכשירים לענן. רשתות של חוטים יכולות להתאים את עצמן לשינויים בטופולוגיה כדי למנוע נקודות כשל בודדות.
מהו OpenThread?
OpenThread שפורסם על ידי Google הוא הטמעה של Thread® בקוד פתוח.
מהו נתב גבולות לפרוטוקול Thread?
נתב גבול של Thread מחבר רשת Thread לרשתות אחרות מבוססות-IP, כמו Wi-Fi או Ethernet. כדי להתחבר לרשתות אחרות, נדרש נתב גבולות ברשת 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 Border Router.
מה תפַתחו
בקודלאב הזה תלמדו להגדיר נתב גבולות ל-Thread ולחבר את הטלפון הנייד למכשיר קצה של Thread דרך נתב הגבולות.
מה תלמדו
- איך מגדירים OTBR
- איך יוצרים רשת Thread באמצעות OTBR
- איך יוצרים מכשיר OpenThread CLI עם תכונת SRP
- איך רושמים שירות ב-SRP
- איך מאתרים מכשיר קצה מסוג Thread ומגיעים אליו
מה נדרש
- תחנת עבודה של Linux, ליצירה ולתוכנת קושחת של Thread RCP, של CLI של OpenThread ולבדיקת 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) בנתוני רשת השרשור.
$ 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
פיתוח והעברה (flash) של OT CLI
פועלים לפי שלב 5 בקודלאב יצירת רשת Thread באמצעות לוחות nRF52840 ו-OpenThread כדי ליצור מכשיר קצה מסוג nRF52840 CLI ולבצע בו הפעלה מחדש (flash).
אבל במקום להפעיל את 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. עכשיו אפשר לשלוח הודעה ל-ping לכתובת 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 ברשת מקומית מקושרת. עם זאת, הודעות של שידור מרובה צריכות יותר מדי רוחב פס ומתרוקנות מהר מדי את הסוללה במכשירים עם צריכת אנרגיה נמוכה. Thread משתמש בפרוטוקול SRP של שידור unicast כדי לרשום את השירותים שלו בנתב הגבול, ומסתמך על נתב הגבול כדי לפרסם את השירותים בקישור ה-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. שליחת פינג למכשיר הקצה
שליחת הודעות Ping מטלפון נייד
לדוגמה, בטלפון Pixel אפשר למצוא את כתובת ה-OMR של השירות 'ot-service' שרשום בעבר בדף הפרטים של מכונה של השירות באפליקציית Service Browser.
עכשיו אפשר לשלוח הודעות ping לכתובת ה-OMR באמצעות אפליקציית Network Analyzer אחרת.
לצערנו, גרסת Android של אפליקציית Network Analyzer לא תומכת בשאילתות mDNS לכלי ה-ping, ואין לנו אפשרות לשלוח הודעות ping ישירות לשם המארח ot-host.local
(אפשר לשלוח הודעות ping לשם המארח באמצעות גרסת iOS של האפליקציה).
שליחת פינג ממארח Linux/macOS
Thread Border Router שולח מודעות של נתב (RA) ב-ICMPv6 כדי לפרסם תחיליות (דרך האפשרות 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
ברירת המחדל של האפשרות accept_ra_rt_info_max_plen
ברוב הפצות Linux היא 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 לא מרצון יכול להיות כמה מאות שניות. אחת מהדרכים היא לנתק את ה-AP של ה-Wi-Fi ולחבר אותו מחדש כדי לשלוח הודעות של בקשה לנתב (RS), כך ש-OTBR יגיב בהודעות RA מתוזמנות. אפשרות אחרת היא להפעיל מחדש את פונקציית Border Routing בנתב הגבול:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
אם אתם מנסים לחבר מחדש את ה-Wi-Fi או להפעיל מחדש את ממשק ה-Ethernet, חשוב לוודא ש-dhcpcd לא משמש לניהול רשת ה-IPv6 של ה-Wi-Fi או ה-Ethernet. כי dhcpcd תמיד מבטל את האפשרות accept_ra
בכל פעם שמפעילים מחדש את הממשק, וההגדרה של accept_ra
תימחק. כדי להשבית את IPv6 ב-dhcpcd באופן מפורש, מוסיפים את השורות הבאות לקובץ התצורה של dhcpcd (למשל /etc/dhcpcd.conf
):
noipv6 noipv6rs
כדי שהשינוי ייכנס לתוקף, צריך להפעיל מחדש את המחשב.
הכנת המארח ב-macOS
שתי האפשרויות של accept_ra*
מופעלות כברירת מחדל, אבל צריך לשדרג את המערכת ל-macOS Big Sur לפחות.
שליחת הודעות Ping לשם המארח או לכתובת ה-IPv6
עכשיו אפשר לשלוח הודעות ping לשם המארח 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
כמובן, תמיד אפשר לשלוח הודעה ל-ping לכתובת ה-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.
מה השלב הבא?
כדאי לעיין בחלק מהקורסים האלה ב-Codelab…