1. מבוא
מהו שרשור?
Thread הוא פרוטוקול של רשת אלחוטית מבוססת-IP עם צריכת אנרגיה נמוכה. פרוטוקול זה מאפשר תקשורת מאובטחת בין מכשירים לבין מכשירים לענן. רשתות שרשור יכולות להסתגל לשינויים בטופולוגיה כדי להימנע מכשלים בנקודה אחת.
מהו OpenThread?
OpenThread פורסם על ידי Google הוא הטמעת קוד פתוח של Thread®.
מהו נתב גבול פתוח?
OpenThread Border Router (OTBR) שהושק על ידי Google הוא הטמעה של קוד פתוח של Thread Border Router.
Multi-1.2 מולטיקאסט
שרשור 1.2 מגדיר סדרת תכונות לתמיכה בריבוי שידורים ברשת הטרוגנית (פלחי רשת Thread ו-Wi-Fi/Ethernet) עבור כתובות מולטיקאסט עם היקף גדול יותר מאשר מקומי.
נתב Thread 1.2 Border רושם את מערך הנתונים של נתב השדרה (BBR) ושירות ה-BBR שנבחר הוא אחראי לנתב מרובה ערוצים (PBBR) האחראי על הניתוב הנכנס/היוצא.
מכשיר מסוג Thread 1.2 שולח הודעה ב-CoAP כדי לרשום את כתובת ה-Multicast ל-PBBR (רישום להאזנה ל-Multicast, בקיצור MLR) אם הכתובת גדולה מהמקומית. PBBR משתמשת ב-MLDv2 בממשק החיצוני כדי לתקשר עם IPv6 LAN/WAN הרחב יותר לגבי קבוצות מולטיקאסט מסוג IPv6 שהוא צריך להאזין להן, בשם רשת השרשורים המקומית שלה. שירות PBBR מעביר תנועה מרובת-ערוצים לרשת ה-Thread רק אם היעד רשום באמצעות מכשיר Thread אחד לפחות.
במכשירי קצה Thread 1.2 מינימליים, יכול להיות שההורים יצטרכו לצבור את כתובת ה-Multicast ולבצע MLR בשמם, או שירשמו את עצמם אם ההורה שלהם הוא ב-Thread 1.1.
לקבלת פרטים נוספים, ניתן לעיין בשרשור 1.2 של סעיף מפרט 5.24 העברות מרובות ערוצים בהיקפים גדולים יותר מ-Realm-Local Scope.
מה תפַתחו
בשיעור ה-Codelab הזה תגדירו נתב Thread Border Rout ושני מכשירי Thread, ואז תפעילו ותאמתו את התכונות של מולטיקאסט במכשירי Thread ובמכשירי Wi-Fi.
מה תלמדו
- איך בונים קושחה מסוג nRF52840 עם תכונות של Thread 1.2 Multicast.
- איך נרשמים לכתובות Multicast של IPv6 במכשירי Thread
מה דרוש לך
- מכשיר Rasperi Pi 3/4 וכרטיס SD עם נפח של 8 GB לפחות.
- 3 לוחות NdF Semiconductor nRF52840 DK.
- AP של Wi-Fi ללא אפוטרופוס לפרסום נתב IPv6 מופעל בנתב.
- Linux/macOS מחשב נייד (Raspney Pi פועל גם) כש-Python3 מותקן.
2. הגדרת OTBR
עליכם לפעול לפי Code Border Router - Bidirectional IPv6 Connectivity and DNS-based Service Discovery כדי להגדיר Thread Border Router ב-Raspery Pi.
עם השלמת התהליך, ה-Raspery 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. פיתוח מכשירי Flash ופרוטוקול Thread
בונים את אפליקציית Thread 1.2 CLI עם Multicast ומדליקים את שני לוחות ה-DRN nRF52840.
יצירת קושחה של 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
.
קושחה של nRF52840 DK
יש להכניס את הקושחה ל-nRF52840 DK באמצעות nrfjprog
, שהוא חלק מכלי שורת הפקודה של nRF.
$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset
4. חיבור מכשירים עם שרשור לרשת Thread
OTBR יצר רשת Thread בשלבים הקודמים. עכשיו אפשר להוסיף את ה-nRF52840 DK לרשת ה-Thread:
קבלת מערך נתונים גולמי פעיל מ-OTBR:
$ sudo ot-ctl dataset active -x 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
חיבור ללוח DRn55840 DK:
$ screen /dev/ttyACM0 115200
הגדרת מערך הנתונים הפעיל עבור nRF52840 DK:
> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff Done
יש להתחיל את סטאק השרשורים ולהמתין כמה שניות ולוודא שהמכשיר מחובר בהצלחה:
> ifconfig up Done > thread start Done > state child
חוזרים על השלבים שלמעלה כדי לחבר את לוח nRF52840 DK השני לרשת ה-Thread.
עכשיו הגדרנו בהצלחה את רשת ה-Thread עם שלושה מכשירי Thread: OTBR ושני לוחות nRF52840 DK.
5. הגדרת רשת Wi-Fi
צריך להגדיר את רשת ה-Wi-Fi ב-OTBR ובמחשב הנייד כדי שהם יהיו מחוברים לאותה AP ב-Wi-Fi.
אנחנו יכולים להשתמש ב-raspi-config כדי להגדיר את ה-SSID ואת ביטוי הסיסמה של רשת ה-Wi-Fi ב-OTBR של Raspney Pi OTBR.
הטופולוגיה הסופית של הרשת מוצגת למטה:
6. הרשמה לכתובת מולטיקאסט 6
הרשמה ל-ff05::abcd ב-nRF52840 מכשיר קצה 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
הרשמה ל-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 End 1 ברשת השרשורים וגם במחשב הנייד שברשת ה-Wi-Fi, בסעיפים הבאים אנחנו מתכוונים לאמת את פוטנציאל החשיפה הרב-כיווני באמצעות IPv6.
7. אימות של Inbound IPv6 Multicast
עכשיו אנחנו אמורים להיות מסוגלים להגיע גם למכשיר הקצה nRF52840 n ברשת ה-Thread וגם למחשב הנייד באמצעות כתובת ה-IPv6 של Multicast 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 יכול לקבל שתי תשובות להודעות פינג ממכשיר הקצה nRF52840 ומהמחשב הנייד, כי שניהם נרשמו ל-ff05::abcd
. כך ניתן לראות שה-OTBR יכול להעביר את חבילות ה-Multicast Ping של IPv6 מרשת ה-Wi-Fi לרשת ה-Thread.
8. אימות העברת תוכן יוצאת של IPv6 ב-Multicast
Ping ff05::abcd ב-nRF52840 מכשיר קצה 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 וגם מהמחשב הנייד. הנתונים האלה מראים ש-OTBR יכול להעביר את חבילות ה-Multicast PIP של תשובה מ-Threading לרשת ה-Wi-Fi לרשת ה-Wi-Fi.
9. מזל טוב
מזל טוב, הגדרת בהצלחה נתב גבולות לגבולות וביצעת אימות מרובה-כיווני של IPv6 דו-כיווני!
מידע נוסף על OpenThread זמין באתר openthread.io.
מסמכי עזר: