נתב חוט גבול – שרשור 1.2

1. מבוא

608c4c35050eb280.png

מה זה Thread?

שרשור הוא פרוטוקול רשת אלחוטי עם חשמל נמוך המבוסס על IP שמאפשר תקשורת מאובטחת בין מכשירים למכשיר. רשתות שרשורים יכולות להתאים את עצמן לשינויים בטופולוגיה כדי להימנע מכשלים של נקודה אחת.

מה זה OpenThread?

OpenThread שפורסם על ידי Google הוא הטמעה של קוד פתוח בתקן Thread®.

מהו נתב גבול OpenThread?

OpenThread Border Router (OTBR) שהושק על ידי Google הוא הטמעת קוד פתוח של נתב ה-Thread Border.

שרשור 1.2: שידורים מרובים

שרשור 1.2 מגדיר סדרה של תכונות לתמיכה בשידורים מרובים ברשת הטרוגנית (פלחי רשת חוטית ו-Wi-Fi)

נתב שרשור 1.2 גבול רושם את מערך הנתונים של נתב השדרה (BBR), ושירות ה-BBR שנבחר הוא נתב ה-Bbone (PBBR) הראשי, שאחראי על התקשורת הנכנסת והיוצאת בריבוי שידורים.

במכשיר Thread 1.2 נשלחת הודעת CoAP לרישום הכתובת של ריבוי המשתתפים ל-PBBR (רישום של Multicast listener, MLR) אם הכתובת גדולה יותר מהמדינה המקומית. PBBR משתמש ב-MLDv2 בממשק החיצוני כדי לתקשר עם פרוטוקול IPv6 LAN/WAN רחב יותר לגבי קבוצות מרובות שידורים מסוג IPv6, שעליו להאזין לאפליקציה, בשם רשת השרשורים המקומית שלה. כמו כן, שירות PBBR מעביר תנועה משידורים מרובים לרשת Thread רק אם היעד רשום במכשיר אחד של Thread אחד לפחות.

בשרשורים מינימליים של שרשור 1.2, הם צריכים להסתמך על ההורה שלהם כדי לאסוף את הכתובת של ה-MLD ולעשות MLR בשמם, או לרשום את עצמם אם שרשור 1.1 של ההורה שלהם מופעל.

לקבלת פרטים נוספים, מומלץ לעיין בהעברה למפרט שרשור 1.2 של שרשור 5.24 לגבי שידורים מרובים בקנה מידה גדול מ-Realm-Local Scope.

מה כדאי לבנות

ב-Codelab הזה, אתם מתכוונים להגדיר נתב Thread Border ושני מכשירים מסוג Thread, ולאחר מכן להפעיל ולאמת תכונות של שידורים מרובים במכשירי Thread ובמכשירי Wi-Fi.

מה תלמדו

  • איך לבנות קושחה מסוג nRF52840 עם תכונות Multicast של Thread 1.2.
  • איך נרשמים לכתובות שידור לקבוצה באמצעות IPv6 במכשירי Thread.

מה צריך

  • מכשיר Raspberry Pi 3/4 וכרטיס SD עם יכולות של 8 GB לפחות.
  • 3 מוליכים למחצה נורדיnRF52840 DK לוחות.
  • רשת AP של Wi-Fi ללא נאמן פרסום נתבי IPv6 מופעל בנתב.
  • מחשב נייד Linux/macOS (Raspberry Pi פועל גם) עם Python3 מותקן.

2. הגדרת OTBR

יש לעקוב אחרנתב שרשור השרשור - קישוריות דו-כיוונית של IPv6 וגילוי שירות מבוסס DNS כדי להגדיר נתב חוטי על פטל פ.

בסיום, אמור ה-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. בנייה ומכשירי Flash Thread

בונים את אפליקציית Cread 1.2 CLI עם שידורים מרובים ומהבהבים את שני לוחות 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 לרשת שרשור

OTBR יצר/ה רשת Thread בשלבים הקודמים. עכשיו אנחנו יכולים להוסיף את ה-dRF52840 DKs לרשת Thread:

קבלת מערך נתונים גולמי פעיל מ-OTBR:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

יש להתחבר ללוח nRF52840 DK:

$ screen /dev/ttyACM0 115200

הגדרת מערך הנתונים הפעיל עבור ה-dRF52840 DK:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

מפעילים את ערימת השרשורים וממתינים כמה שניות ומוודאים שהמכשיר מחובר בהצלחה:

> ifconfig up
Done
> thread start
Done
> state
child

חוזרים על השלבים האלה כדי לצרף את לוח ה-nRF52840 DK השני לרשת שרשור.

הגדרנו בהצלחה את רשת השרשור עם 3 מכשירי Thread: OTBR ושני לוחות dRF52840 DK.

5. הגדרת רשת Wi-Fi

יש להגדיר את רשת ה-Wi-Fi ב-OTBR ובמחשב הנייד כך שיהיו מחוברים לאותה רשת AP של Wi-Fi.

אנחנו יכולים להשתמש ב-raspi-config כדי להגדיר את ה-SSID של ה-Wi-Fi ואת ביטוי הסיסמה ב-OTBR של Raspberry Pi.

הטופולוגיה של הרשת האחרונה מוצגת למטה:

5d0f36fd69ebcc9a.png

6. הרשמה לכתובת שידור לקבוצה ב-IPv6

הרשמה ל-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.

טופולוגיית הרשת הסופית עם מנויי Multicast מוצגת בהמשך:

b118448c98b2d583.png

לאחר שרשמנו את כתובת ה-IPvcast של ה-IPv6 גם במכשיר ה-nRF52840 End Device 1 ברשת Thread וגם במחשב הנייד ברשת ה-Wi-Fi, אנחנו עומדים לאמת את הזמינות של שידורים מרובים ב-IPv6 דו-כיווני בקטעים הבאים.

7. אימות שידורים מרובים של IPv6 נכנס

כעת, נוכל להגיע הן ל-nRF52840 מכשיר קצה 1 ברשת Thread והן למחשב הנייד באמצעות כתובת Multicast של IPv6 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!)

ניתן לראות ש-OTBR יכול לקבל שתי תגובות לפינג'י הן מהתקן הקצה nRF52840 והן מהמחשב הנייד, מכיוון ששניהם נרשמו ל-ff05::abcd. זה מראה שה-OTBR יכול להעביר חבילות שידור לקבוצה של IPv6 Ping מרשת ה-Wi-Fi אל רשת Thread.

8. אימות שידורים מרובים של IPv6 יוצא

פינג 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 מכשיר הקצה 1 וגם מהמחשב הנייד. משמעות הדבר היא שה-OTBR יכול להעביר חבילות Multicast של ה-IPv תגובה ל-IPv מרשת שרשור לרשת ה-Wi-Fi.

9. נהדר

מזל טוב, הגדרת בהצלחה נתב לשרשורי גבול וביצעת אימות רב-כיווני מסוג IPv6 דו-כיווני!

אפשר לקרוא מידע נוסף על OpenThread בכתובת openthread.io.

מסמכים לעיון: