נתב גבולות – Thread 1.2 Multicast

1. מבוא

608c4c35050eb280.png

מהו שרשור?

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.

הטופולוגיה הסופית של הרשת מוצגת למטה:

5d0f36fd69ebcc9a.png

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.

הטופולוגיה הסופית ברשת עם מינויי ריבוי שידורים מופיעה כאן:

b118448c98b2d583.png

עכשיו כשרשמנו את כתובת ה-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.

מסמכי עזר: