1. מבוא

מה זה Thread?
Thread הוא פרוטוקול רשת אלחוטי מבוסס-IP שפועל בצריכת חשמל נמוכה ומאפשר תקשורת מאובטחת בין מכשירים ובין מכשירים לענן. רשתות Thread יכולות להתאים את עצמן לשינויים בטופולוגיה כדי להימנע מנקודות כשל יחידות.
מה זה OpenThread?
OpenThread שפורסם על ידי Google הוא הטמעה בקוד פתוח של Thread®.
מה זה OpenThread Border Router?
OpenThread Border Router (OTBR) שפורסם על ידי Google הוא הטמעה בקוד פתוח של Thread Border Router.
IPv6 Multicast
פרוטוקול Thread מגדיר סדרה של תכונות לתמיכה בשידור מרובה משתתפים ברשת הטרוגנית (פרוטוקול Thread ופרוטוקול Wi-Fi/פרוטוקול Ethernet, פלחים ברשת) לכתובות של שידור מרובה משתתפים עם היקף גדול יותר מהיקף מקומי.
נתב גבול של Thread רושם את מערך הנתונים של נתב הרשת הראשית (BBR), ושירות ה-BBR שנבחר הוא נתב הרשת הראשית הראשי (PBBR), שאחראי על העברה של נתונים נכנסים ויוצאים בשיטת Multicast.
מכשיר Thread שולח הודעת CoAP כדי לרשום את כתובת ה-multicast ל-PBBR (רישום מאזינים ל-multicast, או MLR בקיצור) אם הכתובת גדולה יותר מכתובת מקומית לתחום. פרוטוקול PBBR משתמש ב-MLDv2 בממשק החיצוני שלו כדי לתקשר עם רשת ה-LAN/WAN הרחבה יותר של IPv6 לגבי קבוצות multicast של IPv6 שהוא צריך להאזין להן, בשם רשת ה-Thread המקומית שלו. בנוסף, PBBR מעביר תנועת נתונים מסוג multicast לרשת Thread רק אם לפחות מכשיר Thread אחד רשום ליעד.
במכשירי קצה מינימליים של Thread, יכול להיות שהם יסתמכו על ההורה שלהם כדי לצבור את כתובת ה-multicast ולבצע MLR בשמם, או שהם יירשמו בעצמם אם ההורה שלהם הוא Thread 1.1.
פרטים נוספים זמינים במפרט של פרוטוקול Thread.
מה תפַתחו
ב-Codelab הזה מוסבר איך להגדיר נתב גבולות בפרוטוקול Thread ושני מכשירי Thread, ואז להפעיל ולאמת תכונות של multicast במכשירי Thread ובמכשירי Wi-Fi.
מה תלמדו
- איך ליצור קושחה של nRF52840 עם תמיכה ב-IPv6 Multicast.
- איך נרשמים לכתובות מולטיקאסט של IPv6 במכשירי Thread.
הדרישות
- תחנת עבודה עם Linux, לבנייה ולהפעלה של Thread RCP, OpenThread CLI ובדיקה של שידור מרובה משתתפים ב-IPv6.
- Raspberry Pi לנתב הגבולות עם פרוטוקול Thread.
- 2 מתאמי USB של Nordic Semiconductor nRF52840 (אחד ל-RCP ושניים למכשירי קצה של Thread).
2. הגדרת OTBR
הדרך המהירה ביותר להגדיר OTBR היא לפעול לפי מדריך ההגדרה של OTBR.
אחרי שמסיימים את ההגדרה של OTBR, משתמשים ב-ot-ctl כדי לוודא ש-OTBR הפך לנתב הראשי של הרשת תוך שניות.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. איך בונים מכשירי Thread ומעדכנים את התוכנה שלהם
מפתחים את אפליקציית Thread CLI באמצעות Multicast ומעדכנים את שני לוחות nRF52840 DK.
יצירת קושחה של nRF52840 DK
פועלים לפי ההוראות כדי לשכפל את הפרויקט וליצור קושחה של nRF52840.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
ממשיכים עם Build a Thread network with nRF52840 boards and OpenThread codelab כמו שכתוב. אחרי שמבצעים פלאשינג של תמונת ה-CLI במכשיר הקצה, פועלים לפי השלבים שבקטע הצטרפות לצומת השני ברשת Thread כדי להוסיף את מכשיר Thread לרשת Thread. חוזרים על הפעולה עבור מכשיר הקצה השני של Thread.
4. הרשמה לכתובת IPv6 Multicast
Subscribe to ff05::abcd on nRF52840 End Device 1:
> ipmaddr add ff05::abcd Done
מוודאים שהמינוי ל-ff05::abcd בוצע בהצלחה:
> ipmaddr ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 ff02:0:0:0:0:0:0:2 ff03:0:0:0:0:0:0:2 ff02:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:fc Done
הרשמה ל-ff05::abcd במחשב הנייד:
צריך סקריפט Python subscribe6.py כדי להירשם לכתובת מולטיקאסט במחשב הנייד.
מעתיקים את הקוד שבהמשך ושומרים אותו בשם subscribe6.py:
import ctypes
import ctypes.util
import socket
import struct
import sys
libc = ctypes.CDLL(ctypes.util.find_library('c'))
ifname, group = sys.argv[1:]
addrinfo = socket.getaddrinfo(group, None)[0]
assert addrinfo[0] == socket.AF_INET6
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
interface_index = libc.if_nametoindex(ifname.encode('ascii'))
mreq = group_bin + struct.pack('@I', interface_index)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
print("Subscribed %s on interface %s." % (group, ifname))
input('Press ENTER to quit.')
מריצים את הפקודה subscribe6.py כדי להירשם ff05::abcd בממשק רשת ה-Wi-Fi (לדוגמה, wlan0):
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
הטופולוגיה הסופית של הרשת עם מינויים לשידור מרובה משתתפים מוצגת בהמשך:

אחרי שרשמנו את כתובת ה-IPv6 multicast גם במכשיר הקצה nRF52840 1 ברשת פרוטוקול Thread וגם במחשב הנייד ברשת ה-Wi-Fi, נבדוק את יכולת ההגעה (reachability) של IPv6 multicast דו-כיוונית בקטעים הבאים.
5. אימות של Multicast נכנס ב-IPv6
עכשיו אמורה להיות לנו אפשרות להגיע גם למכשיר הקצה nRF52840 מספר 1 ברשת פרוטוקול Thread וגם למחשב הנייד באמצעות כתובת ה-IPv6 multicast ff05::abcd מרשת ה-Wi-Fi.
שולחים פינג ל-ff05::abcd ב-OTBR דרך ממשק ה-Wi-Fi:
$ ping -6 -b -t 5 -I wlan0 ff05::abcd PING ff05::abcd(ff05::abcd) from 2401:fa00:41:801:83c1:a67:ae22:5346 wlan0: 56 data bytes 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=1 ttl=64 time=57.4 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=1 ttl=64 time=84.9 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=2 ttl=64 time=54.8 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=2 ttl=64 time=319 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=3 ttl=64 time=57.5 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=3 ttl=64 time=239 ms (DUP!) # If using MacOS, use this command. The interface is typically not "wlan0" for Mac. $ ping6 -h 5 -I wlan0 ff05::abcd
אנחנו רואים ש-OTBR יכול לקבל שתי תשובות פינג גם ממכשיר הקצה nRF52840 מספר 1 וגם מהמחשב הנייד, כי שניהם נרשמו ל-ff05::abcd. אפשר לראות ש-OTBR יכול להעביר את חבילות הנתונים של בקשת הפינג של IPv6 משידור מרובב מרשת ה-Wi-Fi לרשת Thread.
6. אימות של Multicast יוצא ב-IPv6
Ping ff05::abcd on nRF52840 End Device 2:
> ping ff05::abcd 100 10 1 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=12 hlim=64 time=297ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=12 hlim=63 time=432ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=13 hlim=64 time=193ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=13 hlim=63 time=306ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=14 hlim=64 time=230ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=14 hlim=63 time=279ms
מכשיר הקצה nRF52840 End Device 2 יכול לקבל תשובות לפינג גם מ-nRF52840 End Device 1 וגם מהמחשב הנייד. אפשר לראות ש-OTBR יכול להעביר את חבילות ה-multicast של תשובת הפינג של IPv6 מרשת Thread לרשת ה-Wi-Fi.
7. מזל טוב
הגדרתם בהצלחה נתב גבולות לפרוטוקול Thread ואימתתם שידור מרובה כתובות IPv6 דו-כיווני!
מידע נוסף על OpenThread זמין באתר openthread.io.
מסמכי עזר: