1. מבוא
מה זה Thread?
פרוטוקול Thread הוא פרוטוקול רשת אלחוטית מבוסס-IP בעל מתח נמוך, שמאפשר תקשורת מאובטחת ממכשיר למכשיר וממכשירים לענן. רשתות פרוטוקול Thread יכולות להסתגל לשינויים בטופולוגיה כדי להימנע מכשלים בנקודה אחת.
מה זה OpenThread
OpenThread שהשקנו על ידי Google היא הטמעת קוד פתוח של Thread®.
מהו נתב גבול של OpenThread?
OpenThread Border Router (OTBR) שהושק על ידי Google הוא הטמעת קוד פתוח של נתב Thread Border.
פרוטוקול Thread 1.2 Multicast
בפרוטוקול Thread 1.2 מוגדרת סדרה של תכונות לתמיכה בריבוי שידורים ברשת הטרוגנית (פלחים של פרוטוקול Thread ושל רשת Wi-Fi/אתרנט) לכתובות Multicast שההיקף שלהן גדול מההיקף המקומי ברמת התחום.
נתב גבולות 1.2 מסוג Thread
מכשיר בפרוטוקול Thread 1.2 שולח הודעת CoAP כדי לרשום את כתובת ה-Multicast ל-PBBR (רישום האזנה ל-Multicast, MLR בקיצור) אם הכתובת גדולה יותר מהכתובת המקומית. PBBR משתמש ב-MLDv2 בממשק החיצוני שלו כדי לתקשר עם רשתות LAN/WAN רחבות יותר של IPv6 לגבי קבוצות Multicast של IPv6 שהוא צריך להאזין להן, בשם רשת פרוטוקול Thread המקומית. כמו כן, PBBR מעבירה תנועה מרובת ערוצים אל רשת פרוטוקול Thread רק אם היעד רשום אליו על ידי מכשיר פרוטוקול Thread אחד לפחות.
במכשירי קצה מינימליים מסוג Thread 1.2, יכול להיות שהם מסתמכים על כך שהורה יקבץ את כתובת ה-Multicast ויבצע MLR בשמו, או שירשום את עצמם אם ההורה שלהם הוא פרוטוקול Thread 1.1.
לפרטים נוספים, אפשר לעיין בסעיף 1.2 מפרט של פרוטוקול Thread 5.24 העברה מרובת ערוצים (Multicast) להעברה בהיקף גדול יותר מהיקף Realm-Local.
מה תפַתחו
ב-Codelab הזה, אתם צריכים להגדיר נתב Thread-Border ושני מכשירי Thread ואז להפעיל ולאמת תכונות של Multicast במכשירי Thread ובמכשירי Wi-Fi.
מה תלמדו
- איך לפתח קושחה של nRF52840 באמצעות תכונות Thread 1.2 Multicast.
- איך להירשם לכתובות Multicast של IPv6 במכשירי Thread.
מה צריך להכין
- מכשיר Raspberry Pi 3/4 וכרטיס SD עם יכולת של 8GB לפחות.
- 3 לוחות של מוליכים למחצה נורדיים nRF52840 DK.
- נקודת גישה ל-Wi-Fi ללא IPv6 Router Ad Guard בנתב.
- מחשב נייד עם Linux או macOS (אפשר להשתמש גם ב-Raspberry Pi) ו-Python3 מותקן בו.
2. הגדרת OTBR
פועלים לפי Thread Border Router – קישוריות דו-כיוונית של IPv6 וגילוי שירות מבוסס-DNS כדי להגדיר נתב Thread Border ב-Raspberry Pi.
כשהתהליך הושלם, ה-Raspberry Pi היה צריך ליצור רשת פרוטוקול Thread פעילה ולהיות מחובר לרשת Wi-Fi.
OTBR צריך להפוך לנתב הראשי בדרך כלל תוך שניות.
$ sudo ot-ctl bbr state Primary Done $ sudo ot-ctl bbr BBR Primary: server16: 0xD800 seqno: 23 delay: 1200 secs timeout: 3600 secs Done
3. מכשירי Build ו-Flash Thread
בונים את האפליקציה Thread 1.2 CLI באמצעות Multicast ומריצים את שני הלוחות nRF52840 DK.
בניית קושחה של nRF52840 DK
פועלים לפי ההוראות כדי לשכפל את הפרויקט וליצור קושחה של nRF52840.
$ mkdir -p ~/src $ cd ~/src $ git clone --recurse-submodules --depth 1 https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx/ $ script/build nrf52840 USB_trans -DOT_MLR=ON -DOT_THREAD_VERSION=1.2 $ arm-none-eabi-objcopy -O ihex build/bin/ot-cli-ftd ot-cli-ftd.hex
אפשר למצוא את קושחת ה-HEX שנוצרה בהצלחה בכתובת ot-cli-ftd.hex
.
קושחת Flash nRF52840 DK
מעדכנים את הקושחה ל-nRF52840 DK באמצעות nrfjprog
, שהוא חלק מכלי שורת הפקודה nRF.
$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset
4. חיבור מכשירים בפרוטוקול Thread לרשת של פרוטוקול Thread
OTBR יצר רשת של פרוטוקול Thread בשלבים הקודמים. עכשיו אפשר להוסיף את ה-nRF52840 DK לרשת בפרוטוקול Thread:
קבלת מערך נתונים פעיל גולמי מ-OTBR:
$ sudo ot-ctl dataset active -x 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
התחברות ללוח nRF52840 DK:
$ screen /dev/ttyACM0 115200
מגדירים את מערך הנתונים הפעיל ל-nRF52840 DK:
> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff Done
מפעילים את מקבץ ה-thread, ממתינים כמה שניות ומוודאים שהמכשיר מחובר:
> ifconfig up Done > thread start Done > state child
חוזרים על השלבים שלמעלה כדי לחבר את לוח nRF52840 DK השני לרשת בפרוטוקול Thread.
הגדרנו בהצלחה את רשת פרוטוקול Thread עם 3 מכשירי Thread: OTBR ושני לוחות nRF52840 DK.
5. הגדרת רשת Wi-Fi
מגדירים את רשת ה-Wi-Fi ב-OTBR ובמחשב הנייד כך שהם יהיו מחוברים לאותו נקודת Wi-Fi AP.
אנחנו יכולים להשתמש ב-raspi-config כדי להגדיר את ה-SSID של Wi-Fi ואת ביטוי הסיסמה ב-OTBR של Raspberry Pi.
הטופולוגיה הסופית של הרשת מוצגת למטה:
6. הרשמה לכתובת Multicast של IPv6
הרשמה ל-ff05::abcd on nRF52840 End Device 1:
> ipmaddr add ff05::abcd Done
אימות ההרשמה של ff05::abcd
בהצלחה:
> ipmaddr ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed 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
Subscribe to ff05::abcd on the Laptop:
אנחנו צריכים סקריפט Python subscribe6.py
כדי להירשם לכתובת Multicast במחשב הנייד.
מעתיקים את הקוד שבהמשך ושומרים אותו בשם 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.
הטופולוגיה הסופית של הרשת עם מינויים לכמה שידורים חיים מוצגת בהמשך:
עכשיו, לאחר שנרשמתם לכתובת Multicast של IPv6 גם ב-nRF52840 End Device 1 ברשת בפרוטוקול Thread וגם במחשב הנייד ברשת ה-Wi-Fi, נאמת את יכולת ההגעה (reachability) של פרוטוקול IPv6 דו-כיווני של IPv6 בקטעים הבאים.
7. אימות Multicast של IPv6 נכנס
עכשיו נוכל להגיע למכשיר קצה nRF52840 1 ברשת פרוטוקול Thread וגם למחשב הנייד באמצעות כתובת ה-Multicast של IPv6 ff05::abcd
מרשת ה-Wi-Fi.
Ping 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 יכול לקבל שתי תגובות פינג גם ממכשיר קצה 1 של nRF52840 וגם מהמחשב הנייד, כי שניהם נרשמו למינוי ff05::abcd
. פעולה זו מראה שה-OTBR יכול להעביר את חבילות ה-multicast של IPv6 [בקשות ה-multicast] של IPv6 מרשת ה-Wi-Fi אל רשת פרוטוקול Thread.
8. אימות 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 מכשיר קצה 2 יכול לקבל תשובות פינג גם ממכשיר nRF52840 קצה 1 וגם מהמחשב הנייד. פעולה זו מראה שה-OTBR יכול להעביר את חבילות Multicast של IPv6 Ping Response מרשת פרוטוקול Thread לרשת ה-Wi-Fi.
9. מזל טוב
מזל טוב, הגדרת בהצלחה נתב Thread Border (נתב Thread) וביצעת אימות של פרוטוקול IPv6 דו-כיווני!
מידע נוסף על OpenThread זמין בכתובת openthread.io.
מסמכי עזר: