Thread-Netzwerk mit nRF52840-Boards und OpenThread erstellen

1. Einführung

26b7f4f6b3ea0700.png

OpenThread von Google ist eine Open-Source-Implementierung des Thread®-Netzwerkprotokolls. Google Nest hat OpenThread veröffentlicht, um die in Nest-Produkten verwendete Technologie Entwicklern zur Verfügung zu stellen und so die Entwicklung von Produkten für das vernetzte Zuhause zu beschleunigen.

Die Thread-Spezifikation definiert ein zuverlässiges, sicheres und energieeffizientes IPv6-basiertes Protokoll für die drahtlose Kommunikation zwischen Geräten für Anwendungen im Haushalt. OpenThread implementiert alle Thread-Netzwerkschichten, einschließlich IPv6, 6LoWPAN, IEEE 802.15.4 mit MAC-Sicherheit, Mesh Link Establishment und Mesh Routing.

In diesem Codelab programmieren Sie OpenThread auf echter Hardware, erstellen und verwalten ein Thread-Netzwerk und übergeben Nachrichten zwischen Knoten.

4806d16a8c137c6d.jpeg

Lerninhalte

  • OpenThread-Befehlszeilenbinärdateien für Entwicklerboards erstellen und flashen
  • RCP aus einer Linux-Maschine und einem Entwicklungsboard erstellen
  • Kommunikation mit einem RCP über OpenThread Daemon und ot-ctl
  • Thread-Knoten manuell mit GNU Screen und der OpenThread-CLI verwalten
  • Sichere Inbetriebnahme von Geräten in einem Thread-Netzwerk
  • So funktioniert IPv6-Multicast
  • Nachrichten zwischen Thread-Knoten mit UDP übergeben

Voraussetzungen

Hardware:

  • 3 Nordic Semiconductor nRF52840-Entwicklerboards
  • 3 USB-zu-Micro-USB-Kabel zum Verbinden der Boards
  • Ein Linux-Computer mit mindestens drei USB-Anschlüssen

Software:

  • GNU-Toolchain
  • Nordic nRF5x-Befehlszeilentools
  • Segger J-Link-Software
  • OpenThread
  • Git

2. Erste Schritte

OpenThread-Simulation

Bevor Sie beginnen, sollten Sie das OpenThread-Simulations-Codelab durcharbeiten, um sich mit den grundlegenden Thread-Konzepten und der OpenThread-Befehlszeile vertraut zu machen.

Terminals für serielle Ports

Sie sollten wissen, wie Sie über ein Terminal eine Verbindung zu einem seriellen Port herstellen. In diesem Codelab wird GNU Screen verwendet. Es wird eine Übersicht zur Verwendung bereitgestellt, aber Sie können auch jede andere Terminalsoftware verwenden.

Linux-Computer

Dieses Codelab wurde für die Verwendung einer i386- oder x86-basierten Linux-Maschine als Host für ein Radio Co-Processor (RCP) Thread-Gerät und zum Flashen aller Thread-Entwicklungsboards entwickelt. Alle Schritte wurden unter Ubuntu 14.04.5 LTS (Trusty Tahr) getestet.

Nordic Semiconductor nRF52840-Boards

In diesem Codelab werden drei nRF52840 PDK-Boards verwendet.

a6693da3ce213856.png

Wir verwenden SEGGER J-Link, um die nRF52840-Boards zu programmieren, die integrierte JTAG-Module haben. Installieren Sie das Tool auf Ihrem Linux-Computer.

Laden Sie das entsprechende Paket für Ihren Computer herunter und installieren Sie es am richtigen Speicherort. Unter Linux ist das /opt/SEGGER/JLink.

nRF5x-Befehlszeilentools installieren

Mit den nRF5x Command Line Tools können Sie die OpenThread-Binärdateien auf die nRF52840-Boards flashen. Installieren Sie den entsprechenden Build von nRF5x-Command-Line-Tools-<OS> auf Ihrem Linux-Computer.

Legen Sie das extrahierte Paket in den Stammordner ~/.

ARM GNU Toolchain installieren

Die ARM GNU Toolchain wird für den Build verwendet.

Wir empfehlen, das extrahierte Archiv auf Ihrem Linux-Computer in /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ zu platzieren. Folgen Sie der Anleitung in der Datei readme.txt des Archivs.

Bildschirm installieren (optional)

Screen ist ein einfaches Tool für den Zugriff auf Geräte, die über einen seriellen Port verbunden sind. In diesem Codelab wird Screen verwendet. Sie können aber auch eine beliebige andere Terminalanwendung für den seriellen Port verwenden.

$ sudo apt-get install screen

3. Repositorys klonen

OpenThread

OpenThread klonen und installieren. Mit den script/bootstrap-Befehlen wird sichergestellt, dass die Toolchain installiert und die Umgebung richtig konfiguriert ist:

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap

OpenThread-Daemon erstellen:

$ script/cmake-build posix -DOT_DAEMON=ON

Jetzt können Sie OpenThread für die nRF52840-Boards erstellen und flashen.

4. RCP Joiner einrichten

Erstellen und flashen

Erstellen Sie das OpenThread-Beispiel für nRF52840 mit Joiner- und nativer USB-Funktionalität. Ein Gerät verwendet die Joiner-Rolle, um sicher authentifiziert und in einem Thread-Netzwerk in Betrieb genommen zu werden. Native USB ermöglicht die Verwendung von USB CDC ACM als seriellen Transport zwischen dem nRF52840 und dem Host.

Bereinigen Sie das Repository immer zuerst von vorherigen Builds, indem Sie rm -rf build ausführen.

$ cd ~/src
$ git clone --recursive https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx
$ script/build nrf52840 USB_trans

Wechseln Sie in das Verzeichnis mit dem OpenThread RCP-Binärprogramm und konvertieren Sie es in das Hexadezimalformat:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex

Schließen Sie das USB-Kabel an den Micro-USB-Debug-Anschluss neben dem externen Stromanschluss auf dem nRF52840-Board an und verbinden Sie es dann mit dem Linux-Computer. Stellen Sie den Schalter nRF power source auf dem nRF52840-Board auf VDD ein. Bei korrekter Verbindung leuchtet LED5.

20a3b4b480356447.png

Wenn dies das erste Board ist, das an die Linux-Maschine angeschlossen wird, wird es als serieller Port /dev/ttyACM0 angezeigt. Alle nRF52840-Boards verwenden ttyACM als Kennung für den seriellen Port.

$ ls /dev/ttyACM*
/dev/ttyACM0

Notieren Sie sich die Seriennummer des nRF52840-Boards, das für die RCP verwendet wird:

c00d519ebec7e5f0.jpeg

Rufen Sie den Speicherort der nRFx Command Line Tools auf und flashen Sie die OpenThread RCP-Hex-Datei auf das nRF52840-Board. Verwenden Sie dazu die Seriennummer des Boards. Wenn Sie das Flag --verify weglassen, wird eine Warnmeldung angezeigt, dass der Flash-Vorgang ohne Fehler fehlschlagen kann.

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924  --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset

Bei Erfolg wird die folgende Ausgabe generiert:

Parsing hex file.
Erasing user available code and UICR flash areas.
Applying system reset.
Checking that the area to write is not protected.
Programing device.
Applying system reset.
Run.

Labeln Sie das Board mit „RCP“, damit Sie die Boardrollen später nicht verwechseln.

Mit nativem USB verbinden

Da der OpenThread-RCP-Build die Verwendung von nativem USB CDC ACM als seriellen Transport ermöglicht, müssen Sie den nRF USB-Port auf dem nRF52840-Board verwenden, um mit dem RCP-Host (Linux-Computer) zu kommunizieren.

Trennen Sie das Micro-USB-Ende des USB-Kabels vom Debug-Port des geflashten nRF52840-Boards und schließen Sie es dann wieder an den Micro-USB-Port nRF USB neben der RESET-Taste an. Stellen Sie den Schalter nRF power source auf USB.

46e7b670d2464842.png

OpenThread-Daemon starten

Verwenden Sie im RCP-Design den OpenThread-Daemon, um mit dem Thread-Gerät zu kommunizieren und es zu verwalten. Starten Sie ot-daemon mit dem Verbose-Flag -v, damit Sie die Log-Ausgabe sehen und bestätigen können, dass der Dienst ausgeführt wird:

$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800'

Bei erfolgreicher Ausführung wird in ot-daemon im ausführlichen Modus eine Ausgabe ähnlich der folgenden generiert:

ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05
ot-daemon[12463]: Thread version: 4
ot-daemon[12463]: Thread interface: wpan0
ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10

Lassen Sie dieses Terminalfenster geöffnet, damit Logs von ot-daemon angezeigt werden können.

Verwenden Sie ot-ctl, um mit dem RCP-Knoten zu kommunizieren. ot-ctl verwendet dieselbe CLI wie die OpenThread-CLI-App. Daher können Sie ot-daemon-Knoten auf dieselbe Weise wie die anderen simulierten Thread-Geräte steuern.

Starten Sie ot-ctl in einem zweiten Terminalfenster:

$ sudo ./build/posix/src/posix/ot-ctl
>

Prüfen Sie die state von Knoten 2 (dem RCP-Knoten), den Sie mit ot-daemon gestartet haben:

> state
disabled
Done

5. FTDs einrichten

Die beiden anderen in diesem Codelab verwendeten Thread-Knoten sind Full Thread Devices (FTDs) auf dem Standard-System-on-Chip-Design (SoC). Ein Gerät fungiert als Commissioner, um Geräte in diesem Netzwerk sicher zu authentifizieren und in Betrieb zu nehmen. Das andere Gerät fungiert als Joiner, den der Commissioner für das Thread-Netzwerk authentifizieren kann.

Erstellen und flashen

Erstellen Sie das OpenThread FTD-Beispiel für die nRF52840-Plattform mit aktivierten Commissioner- und Joiner-Rollen:

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON

Wechseln Sie zum Verzeichnis mit der binären Datei der OpenThread FTD-CLI (Full Thread Device) und konvertieren Sie sie in das Hexadezimalformat:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex

Schließen Sie das USB-Kabel an den Micro-USB-Anschluss neben dem externen Stromanschluss auf dem nRF52840-Board an und verbinden Sie es dann mit dem Linux-Computer. Wenn das RCP noch an den Linux-Computer angeschlossen ist, sollte das neue Board als serieller Port /dev/ttyACM1 angezeigt werden. Alle nRF52840-Boards verwenden ttyACM als Kennung für den seriellen Port.

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1

Notieren Sie sich wie zuvor die Seriennummer des für die FTD verwendeten nRF52840-Boards:

c00d519ebec7e5f0.jpeg

Rufen Sie den Speicherort der nRFx Command Line Tools auf und flashen Sie die OpenThread CLI FTD-Hex-Datei auf das nRF52840-Board. Verwenden Sie dazu die Seriennummer des Boards:

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

Geben Sie dem Board den Namen „Commissioner“.

Mit nativem USB verbinden

Da der OpenThread FTD-Build die Verwendung von nativem USB CDC ACM als seriellen Transport ermöglicht, müssen Sie den nRF USB-Port auf dem nRF52840-Board verwenden, um mit dem RCP-Host (Linux-Computer) zu kommunizieren.

Trennen Sie das Micro-USB-Ende des USB-Kabels vom Debug-Port des geflashten nRF52840-Boards und schließen Sie es dann wieder an den Micro-USB-Port nRF USB neben der RESET-Taste an. Stellen Sie den Schalter nRF power source auf USB.

46e7b670d2464842.png

Build überprüfen

Prüfen Sie, ob der Build erfolgreich war, indem Sie über ein Terminalfenster mit GNU Screen auf die OpenThread-CLI zugreifen.

$ screen /dev/ttyACM1

Drücken Sie im neuen Fenster einige Male die Eingabetaste, um den OpenThread-CLI-Prompt > aufzurufen. Rufen Sie die IPv6-Schnittstelle auf und prüfen Sie, ob Adressen vorhanden sind:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:1cd6:87a9:cb9d:4b1d
Done

Strg+A verwenden  →

d um die Verbindung zur FTD Commissioner CLI zu trennen und zum Linux-Terminal zurückzukehren, damit das nächste Board geflasht werden kann. Wenn Sie die CLI jederzeit wieder aufrufen möchten, verwenden Sie screen -r in der Befehlszeile. Mit screen -ls können Sie eine Liste der verfügbaren Bildschirme aufrufen:

$ screen -ls
There is a screen on:
        74182.ttys000.mylinuxmachine        (Detached)
1 Socket in /tmp/uscreens/S-username.

FTD Joiner einrichten

Wiederholen Sie den obigen Vorgang, um das dritte nRF52840-Board mit dem vorhandenen ot-cli-ftd.hex-Build zu flashen. Verbinden Sie die Platine anschließend wieder über den nRF-USB-Anschluss mit dem PC und stellen Sie den Schalter nRF power source auf VDD.

Wenn die anderen beiden Knoten an den Linux-Computer angeschlossen sind, wenn diese dritte Platine angeschlossen wird, sollte sie als serieller Port /dev/ttyACM2 angezeigt werden:

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1  /dev/ttyACM2

Geben Sie dem Board den Namen „Joiner“.

Wenn Sie die Überprüfung mit Screen durchführen, erstellen Sie keine neue Instanz von Screen über die Befehlszeile, sondern stellen Sie die Verbindung zur vorhandenen Instanz wieder her und erstellen Sie darin ein neues Fenster (das Sie für den FTD Commissioner verwendet haben):

$ screen -r

Neues Fenster in Screen erstellen: Strg + a → c.

Eine neue Eingabeaufforderung wird angezeigt. Greifen Sie auf die OpenThread-Befehlszeile für den FTD-Joiner zu:

$ screen /dev/ttyACM2

Drücken Sie in diesem neuen Fenster einige Male die Eingabetaste, um den >-Prompt der OpenThread-Befehlszeile aufzurufen. Rufen Sie die IPv6-Schnittstelle auf und prüfen Sie, ob Adressen vorhanden sind:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:6c1e:87a2:df05:c240
Done

Da sich die FTD Joiner-Befehlszeile jetzt in derselben Screen-Instanz wie der FTD Commissioner befindet, können Sie mit Strg+a → n zwischen den beiden wechseln.

Strg+A verwenden  →

d um den Screen zu verlassen.

6. Terminalfenster einrichten

Künftig werden Sie häufig zwischen Thread-Geräten wechseln. Achten Sie daher darauf, dass alle Geräte aktiv und leicht zugänglich sind. Bisher haben wir über „Screen“ auf die beiden FTDs zugegriffen. Mit diesem Tool ist auch der Splitscreen-Modus im selben Terminalfenster möglich. So können Sie sehen, wie ein Knoten auf Befehle reagiert, die auf einem anderen Knoten ausgegeben werden.

Idealerweise sollten Sie vier Fenster zur Verfügung haben:

  1. ot-daemon-Dienst / Protokolle
  2. RCP Joiner über ot-ctl
  3. FTD-Commissioner über die OpenThread-Befehlszeile
  4. FTD-Joiner über die OpenThread-Befehlszeile

Wenn Sie Ihr eigenes Terminal bzw. Ihre eigene Konfiguration für den seriellen Port oder Ihr eigenes Tool verwenden möchten, können Sie mit dem nächsten Schritt fortfahren. Konfigurieren Sie die Terminalfenster für alle Geräte so, wie es für Sie am besten passt.

Bildschirm verwenden

Der Einfachheit halber sollten Sie nur eine Screen-Sitzung starten. Sie sollten bereits eines haben, da Sie beide FTDs eingerichtet haben.

Alle Befehle in Screen beginnen mit Strg + a.

Grundlegende Bildschirmbefehle:

Wiederverbinden mit der Screen-Sitzung (über die Befehlszeile)

screen -r

Screen-Sitzung verlassen

Strg+A → d

Neues Fenster in der Screen-Sitzung erstellen

Strg+A → c

Zwischen Fenstern in derselben Screen-Sitzung wechseln

Strg+A → n (vorwärts)Strg+A → p (rückwärts)

Aktuelles Fenster in der Screen-Sitzung schließen

Strg+A → k

Splitscreen

Mit Screen können Sie das Terminal in mehrere Fenster aufteilen:

f1cbf1258cf0a5a.png

Auf Befehle in screen wird mit Strg+a zugegriffen. Jeder Befehl sollte mit dieser Tastenkombination beginnen.

Wenn Sie dem Codelab genau gefolgt sind, sollten Sie zwei Fenster (FTD Commissioner, FTD Joiner) auf derselben Bildschirminstanz haben. Wenn Sie den Bildschirm zwischen den beiden aufteilen möchten, rufen Sie zuerst Ihre bestehende Screen-Sitzung auf:

$ screen -r

Sie sollten sich auf einem der FTD-Geräte befinden. Gehen Sie in Screen so vor:

  1. Strg + a → S, um das Fenster horizontal zu teilen
  2. Strg + A → Tab, um den Cursor in das neue leere Fenster zu verschieben
  3. Strg + A → n, um das neue Fenster zum nächsten zu wechseln
  4. Wenn es dasselbe wie das obere Fenster ist, drücken Sie noch einmal Strg + A → n, um das andere FTD-Gerät aufzurufen.

Beide sind jetzt sichtbar. Mit Strg + a → Tab können Sie zwischen den beiden wechseln. Es wird empfohlen, jedes Fenster mit Strg + A → A umzubenennen, um Verwirrung zu vermeiden.

Erweiterte Nutzung

Wenn Sie den Bildschirm weiter in Quadranten aufteilen und die ot-daemon-Logs und den RCP-Joiner ot-ctl aufrufen möchten, müssen diese Dienste in derselben Bildschirminstanz gestartet werden. Beenden Sie dazu ot-daemon und ot-ctl und starten Sie sie in neuen Screen-Fenstern neu (Strg+a → c).

Diese Einrichtung ist nicht erforderlich und wird dem Nutzer überlassen.

Mit den folgenden Befehlen können Sie Fenster aufteilen und zwischen ihnen wechseln:

Neues Fenster erstellen

Strg+A → c

Fenster vertikal teilen

Strg + A →

Fenster horizontal teilen

Strg+A → S

Zum nächsten angezeigten Fenster wechseln

Strg+A → Tab

Das angezeigte Fenster vor- oder zurückschalten

Strg + A → n oder p

Aktuelles Fenster umbenennen

Strg+A → A

Sie können Screen jederzeit mit Strg + A → d verlassen und mit screen -r über die Befehlszeile wieder anhängen.

Weitere Informationen zu Screen finden Sie in der GNU Screen-Kurzübersicht.

7. Thread-Netzwerk erstellen

Nachdem Sie alle Terminalfenster und Bildschirme konfiguriert haben, erstellen wir nun unser Thread-Netzwerk. Erstellen Sie auf dem FTD Commissioner ein neues Operational Dataset und legen Sie es als aktives Dataset fest. Das operative Dataset ist die Konfiguration für das Thread-Netzwerk, das Sie erstellen.

## FTD Commissioner ##
----------------------

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 11
Channel Mask: 07fff800
Ext PAN ID: c0de7ab5c0de7ab5
Mesh Local Prefix: fdc0:de7a:b5c0/64
Network Key: 1234c0de7ab51234c0de7ab51234c0de
Network Name: OpenThread-c0de
PAN ID: 0xc0de
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

Notiere dir den Netzwerkschlüssel 1234c0de7ab51234c0de7ab51234c0de, der später verwendet wird.

Übernehmen Sie dieses Dataset als das aktive:

> dataset commit active
Done

IPv6-Schnittstelle aktivieren:

> ifconfig up
Done

Thread-Protokollvorgang starten:

> thread start
Done

Prüfe nach einem Moment den Gerätestatus. Es sollte der Leiter sein. Notieren Sie sich auch die RLOC16 für die Zukunft.

## FTD Commissioner ##
----------------------

> state
leader
Done
> rloc16
0c00
Done

Prüfen Sie die IPv6-Adressen des Geräts:

## FTD Commissioner ##
----------------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:c00         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a    # Mesh-Local EID (ML-EID)
fe80:0:0:0:1cd6:87a9:cb9d:4b1d         # Link-Local Address (LLA)

Das Netzwerk „codelab“ ist jetzt sichtbar, wenn es von anderen Thread-Geräten gescannt wird.

Über ot-ctl auf der Seite RCP Joiner:

## RCP Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

Über die OpenThread-Befehlszeile auf dem FTD-Joiner:

## FTD Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

Wenn das Netzwerk „codelab“ nicht in der Liste angezeigt wird, versuchen Sie es noch einmal.

8. RCP Joiner hinzufügen

Die Thread-Inbetriebnahme ist im Netzwerk nicht aktiv. Daher müssen wir den RCP-Joiner dem Thread-Netzwerk, das wir gerade erstellt haben, über einen Out-of-Band-Inbetriebnahmeprozess hinzufügen.

Auf dem FTD Commissioner haben wir uns den Netzwerkschlüssel notiert, z. B. 1234c0de7ab51234c0de7ab51234c0de. Wenn Sie den Netzwerkschlüssel noch einmal nachschlagen müssen, führen Sie den folgenden Befehl auf dem FTD-Commissioner aus:

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

Legen Sie als Nächstes auf dem RCP-Joiner den aktiven Dataset-Netzwerkschlüssel auf den FTD-Commissioner-Netzwerkschlüssel fest:

## RCP Joiner ##
----------------

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

Prüfen Sie, ob das Dataset richtig festgelegt ist.

## RCP Joiner ##
----------------

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

Stellen Sie Thread so ein, dass der RCP-Joiner dem Netzwerk „codelab“ beitritt. Warten Sie einige Sekunden und prüfen Sie dann den Status, RLOC16 und die IPv6-Adressen:

## RCP Joiner ##
----------------

> ifconfig up
Done
> thread start
Done
> state
child
Done
> rloc16
0c01
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:0c01         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f    # Mesh-Local EID (ML-EID)
fe80:0:0:0:18e5:29b3:a638:943b          # Link-Local Address (LLA)
Done

Notiere dir die Mesh-lokale IPv6-Adresse (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f). Du benötigst sie später.

Prüfen Sie auf dem FTD-Commissioner in den Router- und untergeordneten Tabellen, ob beide Geräte Teil desselben Netzwerks sind. Verwenden Sie den RLOC16, um den RCP-Joiner zu identifizieren.

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  35 | 1ed687a9cb9d4b1d |

Done
> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|VER| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+---+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|  2| 1ae529b3a638943b |
Done

Pinge die Mesh-Local-Adresse des RCP-Joiners (die Mesh-Local-Adresse aus der ipaddr-Ausgabe des RCP-Joiners), um die Verbindung zu prüfen:

## FTD Commissioner ##
----------------------

> ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
> 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms

Wir haben jetzt ein Thread-Netzwerk mit zwei Knoten, wie in diesem Topologiediagramm dargestellt:

otcodelab_top01C_2nodes.png

Topologiediagramme

Im weiteren Verlauf des Codelabs wird immer dann ein neues Thread-Topologiediagramm angezeigt, wenn sich der Status des Netzwerks ändert. Knotenrollen werden so angegeben:

b75a527be4563215.png

Router sind immer Fünfecke und Endgeräte immer Kreise. Die Zahlen auf jedem Knoten stellen die Router-ID oder die untergeordnete ID dar, die in der CLI-Ausgabe angezeigt wird, je nach aktueller Rolle und aktuellem Status des jeweiligen Knotens zu diesem Zeitpunkt.

9. FTD Joiner in Betrieb nehmen

Fügen wir dem Netzwerk „codelab“ nun das dritte Thread-Gerät hinzu. Dieses Mal verwenden wir das sicherere In-Band-Verfahren und lassen nur den FTD-Joiner zu.

Rufen Sie auf dem FTD Joiner die eui64 ab, damit der FTD-Commissioner sie identifizieren kann:

## FTD Joiner ##
----------------

> eui64
2f57d222545271f1
Done

Starten Sie auf dem FTD-Commissioner den Commissioner und geben Sie die eui64 des Geräts an, das beitreten kann, sowie die Joiner-Anmeldedaten, z. B. J01NME. Das Joiner-Anmeldedaten sind ein gerätespezifischer String aus alphanumerischen Zeichen in Großbuchstaben (0–9 und A–Y, ohne I, O, Q und Z zur besseren Lesbarkeit) mit einer Länge zwischen 6 und 32 Zeichen.

## FTD Commissioner ##
----------------------

> commissioner start
Done
> commissioner joiner add 2f57d222545271f1 J01NME
Done

Wechseln Sie zum FTD Joiner. Starten Sie die Joiner-Rolle mit den Joiner-Anmeldedaten, die Sie gerade auf dem FTD-Commissioner eingerichtet haben:

## FTD Joiner ##
----------------

> ifconfig up
Done
> joiner start J01NME
Done

Innerhalb einer Minute erhalten Sie eine Bestätigung der erfolgreichen Authentifizierung:

## FTD Joiner ##
----------------

>
Join success

Starte Thread, damit der FTD-Joiner dem Netzwerk „codelab“ beitritt, und prüfe sofort den Status und RLOC16:

## FTD Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c02
Done

Prüfen Sie die IPv6-Adressen des Geräts. Beachten Sie, dass es keine ALOC gibt. Das liegt daran, dass dieses Gerät nicht das Leader ist und auch keine Anycast-spezifische Rolle hat, für die ein ALOC erforderlich ist.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:c02         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)

Wechsle sofort zum FTD Commissioner und prüfe die Router- und untergeordneten Tabellen, um zu bestätigen, dass im Netzwerk „codelab“ drei Geräte vorhanden sind:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   2 | 0x0c02 |        240 |         15 |     3 |   44 |1|1|1|1| e6cdd2d93249a243 |
Done

Anhand des RLOC16 hat sich der FTD-Joiner als Endgerät (untergeordnetes Gerät) mit dem Netzwerk verbunden. Hier ist unsere aktualisierte Topologie:

otcodelab_top01C_ed01.png

10. Unterhaltung in Aktion

Die Thread-Geräte in diesem Codelab sind eine spezielle Art von Full Thread Device (FTD), die als Router Eligible End Device (REED) bezeichnet wird. Das bedeutet, dass sie entweder als Router oder als Endgerät fungieren und sich von einem Endgerät zu einem Router hochstufen können.

Thread kann bis zu 32 Router unterstützen, versucht aber, die Anzahl der Router zwischen 16 und 23 zu halten. Wenn ein REED als Endgerät (untergeordnetes Gerät) verbunden wird und die Anzahl der Router unter 16 liegt, wird es nach einem zufälligen Zeitraum von maximal zwei Minuten automatisch zum Router hochgestuft.

Wenn Sie nach dem Hinzufügen des FTD-Joiners zwei untergeordnete Geräte in Ihrem Thread-Netzwerk hatten, warten Sie mindestens zwei Minuten und prüfen Sie dann die Router- und untergeordneten Tabellen auf dem FTD-Commissioner noch einmal:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
Done

Der FTD-Joiner (erweiterte MAC-Adresse = e6cdd2d93249a243) hat sich selbst zum Router hochgestuft. Beachten Sie, dass sich der RLOC16 unterscheidet (b800 statt 0c02). Das liegt daran, dass der RLOC16 auf der Router-ID und der untergeordneten ID eines Geräts basiert. Wenn das Gerät vom Endgerät zum Router wechselt, ändern sich die Werte für Router-ID und untergeordnete ID sowie die RLOC16.

otcodelab_top01C.png

Bestätigen Sie den neuen Status und RLOC16 auf dem FTD-Joiner:

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

Downgrade des FTD Joiner

Sie können dieses Verhalten testen, indem Sie den FTD-Joiner manuell von einem Router auf ein Endgerät downgraden. Ändern Sie den Status in „child“ und prüfen Sie den RLOC16:

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

Zurück auf dem FTD Commissioner sollte der FTD-Joiner jetzt in der untergeordneten Tabelle (ID = 3) angezeigt werden. Möglicherweise ist sie während der Umstellung sogar in beiden Apps verfügbar:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   3 | 0x0c03 |        240 |         16 |     3 |   94 |1|1|1|1| e6cdd2d93249a243 |
Done

Nach einiger Zeit wird wieder ein Router mit dem RLOC b800 verwendet.

otcodelab_top01C.png

Führungsperson entfernen

Der Leader wird von allen Thread-Routern selbst ausgewählt. Wenn der aktuelle Leader aus dem Thread-Netzwerk entfernt wird, wird einer der anderen Router zum neuen Leader.

Schalte auf dem FTD-Commissioner Thread aus, um ihn aus dem Thread-Netzwerk zu entfernen:

## FTD Commissioner ##
----------------------

> thread stop
Done
> ifconfig down
Done

Innerhalb von zwei Minuten wird der FTD Joiner zum neuen Thread-Leader. Prüfen Sie den Status und die IPv6-Adressen des FTD-Joiners, um Folgendes zu bestätigen:

## FTD Joiner ##
----------------

> state
leader
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00       # Now it has the Leader ALOC!
fdc0:de7a:b5c0:0:0:ff:fe00:b800
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd
fe80:0:0:0:e4cd:d2d9:3249:a243
Done

otcodelab_top02C_01.png

Prüfen Sie die untergeordnete Tabelle. Beachten Sie, dass es einen neuen RLOC16 gibt. Dies ist der RCP-Joiner, wie durch seine ID und erweiterte MAC-Adresse angegeben. Damit das Thread-Netzwerk zusammenbleibt, hat er den übergeordneten Router gewechselt, vom FTD-Commissioner zum FTD-Joiner. Dies führt zu einem neuen RLOC16 für den RCP-Joiner, da sich seine Router-ID von 3 zu 46 geändert hat.

## FTD Joiner ##
----------------

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |         27 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

Es kann einige Minuten dauern, bis das RCP Joiner als untergeordnetes Element an das FTD Joiner angehängt wird. Prüfen Sie den Status und den RLOC16, um Folgendes zu bestätigen:

## RCP Joiner ##
--------------

> state
child
> rloc16
b801

FTD Commissioner wieder anbringen

Ein Thread-Netzwerk mit zwei Knoten ist nicht sehr nützlich. Wir bringen den FTD Commissioner wieder online.

Starte Thread auf dem FTD-Commissioner neu:

## FTD Commissioner ##
----------------------

> ifconfig up
Done
> thread start
Done

Innerhalb von zwei Minuten wird es automatisch wieder als Endgerät mit dem Netzwerk „codelab“ verbunden und dann zum Router hochgestuft.

## FTD Commissioner ##
----------------------

> state
router
Done

Prüfen Sie die Router- und untergeordneten Tabellen auf dem FTD Joiner, um Folgendes zu überprüfen:

## FTD Joiner ##
----------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |       63 |         0 |     3 |      3 |   0 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       46 |         0 |     0 |      0 |  15 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |        184 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

otcodelab_top02C_02.png

Unser Thread-Netzwerk besteht wieder aus drei Knoten.

11. Fehlerbehebung

Die Verwaltung eines Thread-Netzwerks mit mehreren Geräten in verschiedenen Terminal- oder Bildschirmfenstern kann kompliziert sein. Mit diesen Tipps können Sie den Status des Netzwerks oder Ihres Arbeitsbereichs zurücksetzen, wenn Probleme auftreten.

Bildschirm

Wenn Sie sich in Ihrer Konfiguration verirren (zu viele Screen-Fenster oder Screens in Screen), beenden Sie Screen-Fenster mit Strg+a → k, bis keine mehr vorhanden sind und screen -ls in der Befehlszeile No Sockets found ausgibt. Erstellen Sie dann für jedes Gerät Bildschirmfenster neu. Gerätestatus wird beibehalten, auch wenn der Bildschirm geschlossen wird.

Thread-Knoten

Wenn die Thread-Netzwerktopologie nicht wie in diesem Codelab beschrieben ist oder Knoten aus irgendeinem Grund getrennt werden (vielleicht, weil der Linux-Computer, auf dem sie ausgeführt werden, in den Ruhemodus gewechselt ist), ist es am besten, Thread zu beenden, die Netzwerkanmeldedaten zu löschen und mit dem Schritt Thread-Netzwerk erstellen neu zu beginnen.

So setzen Sie die FTDs zurück:

## FTD Commissioner or FTD Joiner ##
------------------------------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

Der RCP kann auf dieselbe Weise über ot-ctl zurückgesetzt werden:

## RCP Joiner ##
----------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

12. Multicast verwenden

Multicast wird verwendet, um Informationen gleichzeitig an eine Gruppe von Geräten zu senden. In einem Thread-Netzwerk sind bestimmte Adressen für die Multicast-Verwendung mit verschiedenen Gerätegruppen reserviert, je nach Bereich.

IPv6-Adresse

Ebene

Geliefert an

ff02::1

Link-Local

Alle FTDs und MEDs

ff02::2

Link-Local

Alle FTDs und Border-Router

ff03::1

Mesh-Local

Alle FTDs und MEDs

ff03::2

Mesh-Local

Alle FTDs und Border-Router

Da wir in diesem Codelab keinen Border Router verwenden, konzentrieren wir uns auf die beiden Multicast-Adressen für FTD und MED.

Der Link-Local-Bereich umfasst alle Thread-Schnittstellen, die durch eine einzelne Funkübertragung oder einen einzelnen „Hop“ erreichbar sind. Die Netzwerktopologie bestimmt, welche Geräte auf einen Ping an die Multicast-Adresse ff02::1 reagieren.

Pingen Sie ff02::1 über den FTD Commissioner an:

## FTD Commissioner ##
----------------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms

Es gibt zwei weitere Geräte im Netzwerk (FTD Joiner und RCP Joiner), aber der FTD Commissioner hat nur eine Antwort von der Link-Local-Adresse (LLA) des FTD Joiner erhalten. Das bedeutet, dass der FTD-Joiner das einzige Gerät ist, das der FTD-Commissioner mit einem einzigen Hop erreichen kann.

otcodelab_top02C_02_LL.png

Pinge jetzt ff02::1 über den FTD Joiner:

## FTD Joiner ##
----------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms
8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms

Zwei Antworten! Wenn wir die IPv6-Adressen der anderen Geräte prüfen, sehen wir, dass die erste (mit 4b1d) die LLA des FTD-Commissioners und die zweite (mit 943b) die LLA des RCP-Joiners ist.

otcodelab_top02C_02_LL02.png

Das bedeutet, dass der FTD-Joiner direkt mit dem FTD-Commissioner und dem RCP-Joiner verbunden ist, was unsere Topologie bestätigt.

Mesh-Local

Der Mesh-Local-Bereich umfasst alle Thread-Schnittstellen, die im selben Thread-Netzwerk erreichbar sind. Sehen wir uns die Antworten auf einen Ping an die Multicast-Adresse ff03::1 an.

Pingen Sie ff03::1 über den FTD Commissioner an:

## FTD Commissioner ##
----------------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms

Dieses Mal hat der FTD-Commissioner zwei Antworten erhalten: eine vom Routing Locator (RLOC) des FTD-Joiners (endet mit b800) und eine von der Mesh-Local EID (ML-EID) des RCP-Joiners (endet mit d55f). Das liegt daran, dass der Mesh-Local-Bereich das gesamte Thread-Netzwerk umfasst. Unabhängig davon, wo sich ein Gerät im Netzwerk befindet, ist es für die ff03::1-Adresse registriert.

otcodelab_top02C_02_ML.png

Pinge ff03::1 vom FTD Joiner an, um das gleiche Verhalten zu bestätigen:

## FTD Joiner ##
----------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms

otcodelab_top02C_02_LL02.png

Notieren Sie sich die Antwortzeit für den RCP-Joiner in beiden Ping-Ausgaben. Es hat viel länger gedauert, bis der RCP-Joiner den FTD-Commissioner (68 ms) erreicht hat, als bis er den FTD-Joiner (23 ms) erreicht hat. Das liegt daran, dass es zwei Hops benötigt, um den FTD-Commissioner zu erreichen, während der FTD-Joiner nur einen Hop benötigt.

Möglicherweise haben Sie auch bemerkt, dass der Mesh-lokale Multicast-Ping nur für die beiden FTDs mit dem RLOC beantwortet wurde, nicht für den RCP-Joiner. Das liegt daran, dass die FTDs Router im Netzwerk sind, während der RCP ein Endgerät ist.

Prüfe den Status von RCP Joiner, um dies zu bestätigen:

## RCP Joiner ##
----------------

> state
child

13. Nachrichten mit UDP senden

Einer der Anwendungsdienste, die OpenThread bietet, ist das User Datagram Protocol (UDP), ein Protokoll der Transportschicht. Eine auf OpenThread basierende Anwendung kann die UDP API verwenden, um Nachrichten zwischen Knoten in einem Thread-Netzwerk oder an andere Geräte in einem externen Netzwerk (z. B. im Internet, wenn das Thread-Netzwerk einen Border Router hat) zu senden.

UDP-Sockets werden über die OpenThread-Befehlszeile bereitgestellt. Wir verwenden sie, um Nachrichten zwischen den beiden FTDs zu übergeben.

Rufen Sie die Mesh-Local EID-Adresse für den FTD-Joiner ab. Wir verwenden diese Adresse, weil sie von überall im Thread-Netzwerk erreichbar ist.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:b800        # Routing Locator (RLOC)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
Done

Starten Sie UDP und binden Sie es an einen Socket für eine beliebige IPv6-Adresse:

## FTD Joiner ##
----------------

> udp open
Done
> udp bind :: 1212

Wechsle zum FTD Commissioner, starte UDP und stelle mit der ML-EID eine Verbindung zum Socket her, den du auf dem FTD Joiner eingerichtet hast:

## FTD Commissioner ##
----------------------

> udp open
Done
> udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212
Done

Die UDP-Verbindung sollte zwischen den beiden Knoten aktiv sein. Nachricht vom FTD Commissioner senden:

## FTD Commissioner ##
----------------------

> udp send hellothere
Done

Die UDP-Nachricht wurde auf dem FTD-Joiner empfangen.

## FTD Joiner ##
----------------

> 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere

14. Glückwunsch!

Du hast ein physisches Thread-Netzwerk erstellt.

b915c433e7027cc7.png

Sie wissen jetzt:

  • Unterschiede zwischen Thread-Gerätetypen, ‑Rollen und ‑Bereichen
  • wie Thread-Geräte ihre Status im Netzwerk verwalten
  • Einfache Nachrichten zwischen Knoten über UDP übergeben

Nächste Schritte

Versuchen Sie, die folgenden Übungen zu absolvieren:

  • Flashen Sie das FTD-Joiner-Board mit der Binärdatei ot-cli-mtd als MTD neu und beobachten Sie, dass es sich nie auf einen Router aktualisiert oder versucht, der Leader zu werden.
  • Fügen Sie dem Netzwerk weitere Geräte hinzu (probieren Sie eine andere Plattform aus!) und skizzieren Sie die Topologie mithilfe von Router- und untergeordneten Tabellen sowie Pings an die Multicast-Adressen.
  • pyspinel zur Steuerung des NCP verwenden
  • NCP mit OpenThread Border Router in einen Border-Router umwandeln und das Thread-Netzwerk mit dem Internet verbinden

Weitere Informationen

Auf openthread.io und GitHub finden Sie verschiedene OpenThread-Ressourcen, darunter:

Referenz: