נתב Thread-Border – פרוטוקול Thread 1.2 Multicast

1. מבוא

608c4c35050eb280.png

מה זה 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.

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

5d0f36fd69ebcc9a.png

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.

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

b118448c98b2d583.png

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

מסמכי עזר: