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 für Entwickler allgemein verfügbar zu machen 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 drahtloses Protokoll für die Kommunikation zwischen Geräten für Anwendungen im Zuhause. OpenThread implementiert alle Thread-Netzwerkschichten, einschließlich IPv6, 6LoWPAN, IEEE 802.15.4 mit MAC-Sicherheit, Mesh-Link-Einrichtung 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-CLI-Binärdateien auf Entwicklungsboards erstellen und flashen
  • RCP aus einem Linux-Computer und einem Entwicklungsboard erstellen
  • Kommunikation mit einem RCP über OpenThread-Daemon und ot-ctl
  • Thread-Knoten manuell mit GNU Screen und der OpenThread-Befehlszeile verwalten
  • Sichere Inbetriebnahme von Geräten in einem Thread-Netzwerk
  • So funktioniert IPv6-Multicast
  • Nachrichten zwischen Threadknoten mit UDP übergeben

Voraussetzungen

Hardware:

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

Software:

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

2. Erste Schritte

OpenThread-Simulation

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

Serielle Terminals

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

Linux-Rechner

Dieses Codelab wurde für die Verwendung eines i386- oder x86-basierten Linux-Rechners entwickelt, der als Host für ein RCP-Thread-Gerät (Radio Co-Processor) dient und alle Thread-Entwicklungsboards flasht. 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 es 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-Befehlszeilentools können Sie die OpenThread-Binärdateien auf die nRF52840-Boards flashen. Installieren Sie die entsprechende Build-Version von nRF5x-Command-Line-Tools-<OS> auf Ihrem Linux-Computer.

Verschieben Sie das extrahierte Paket in den Stammordner ~/.

ARM GNU Toolchain installieren

Für den Build wird die ARM GNU Toolchain verwendet.

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

Installationsbildschirm (optional)

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

$ sudo apt-get install screen

3. Repositories klonen

OpenThread

Klonen und installieren Sie OpenThread. 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 kompilieren und auf die nRF52840-Boards flashen.

4. RCP-Joiner einrichten

Build und Flash

Erstellen Sie das OpenThread-Beispiel für nRF52840 mit Joiner und nativer USB-Funktion. Ein Gerät verwendet die Rolle „Teilnehmer“, um sich sicher zu authentifizieren und in einem Thread-Netzwerk in Betrieb zu nehmen. Natives 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

Rufen Sie das Verzeichnis mit der OpenThread-RCP-Binärdatei auf und konvertieren Sie sie 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-Port neben dem externen Stromversorgungsanschluss auf dem nRF52840-Board an und dann an den Linux-Computer. Stellen Sie den Schalter für die nRF-Stromversorgung auf dem nRF52840-Board auf VDD. Wenn die Verbindung richtig hergestellt ist, leuchtet LED5.

20a3b4b480356447.png

Wenn dies das erste Board ist, das an den Linux-Computer angeschlossen ist, wird es als serielle Schnittstelle /dev/ttyACM0 angezeigt. Alle nRF52840-Boards verwenden ttyACM als serielle Port-ID.

$ ls /dev/ttyACM*
/dev/ttyACM0

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

c00d519ebec7e5f0.jpeg

Rufen Sie den Speicherort der nRFx-Befehlszeilentools auf und flashen Sie die OpenThread-RCP-Hexdatei mit der Seriennummer des Boards auf das nRF52840-Board. 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.

Beschriften Sie das Board mit „RCP“, damit Sie die Rollen 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 Taste RESET an. Stellen Sie den Schalter für die nRF-Stromquelle 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 -v-Flag für ausführliche Ausgabe, damit Sie die Protokollausgabe sehen und prüfen können, ob das Programm ausgeführt wird:

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

Bei Erfolg generiert ot-daemon im ausführlichen Modus eine Ausgabe, die in etwa so aussieht:

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 Befehlszeile wie die OpenThread CLI App. Daher können Sie ot-daemon-Knoten auf die gleiche Weise wie andere simulierte Thread-Geräte steuern.

Starten Sie in einem zweiten Terminalfenster ot-ctl:

$ 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 Thread-Knoten in diesem Codelab sind Full Thread Devices (FTDs) mit dem Standard-SoC-Design (System-on-Chip). In einer Produktionsumgebung kann wpantund, ein Netzwerk-Interface-Treiber für die Produktion, verwendet werden, um OpenThread-NCP-Instanzen zu steuern. In diesem Codelab verwenden wir jedoch ot-ctl, die OpenThread-Befehlszeile.

Ein Gerät fungiert als Instanziierungsstelle, um Geräte sicher zu authentifizieren und in diesem Netzwerk in Betrieb zu nehmen. Das andere Gerät dient als Joiner, über den sich der Bevollmächtigte beim Thread-Netzwerk authentifizieren kann.

Build und Flash

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

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

Rufen Sie das Verzeichnis mit der OpenThread-FTD-CLI-Binärdatei auf 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 dann an den Linux-Computer. Wenn das RCP noch mit dem Linux-Computer verbunden ist, sollte dieses neue Board als serieller Port /dev/ttyACM1 angezeigt werden. Alle nRF52840-Boards verwenden ttyACM als serielle Port-ID.

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

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

c00d519ebec7e5f0.jpeg

Rufen Sie den Speicherort der nRFx-Befehlszeilentools auf und flashen Sie die OpenThread-CLI-FTD-Hexdatei mit der Seriennummer des Boards auf das nRF52840-Board:

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

Beschriften Sie das Board mit „Kommission“.

Mit nativem USB verbinden

Da die OpenThread-FTD-Build-Version 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 Taste RESET an. Stellen Sie den Schalter für die nRF-Stromquelle auf USB.

46e7b670d2464842.png

Build prüfen

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

$ screen /dev/ttyACM1

Drücken Sie im neuen Fenster mehrmals die Eingabetaste, um den OpenThread-Befehlszeilen-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-Befehlszeile zu trennen und zum Linux-Terminal zurückzukehren, damit das nächste Board geflasht werden kann. Wenn Sie die Befehlszeile jederzeit wieder aufrufen möchten, geben Sie in der Befehlszeile screen -r ein. 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. Schließen Sie das Board anschließend über den nRF-USB-Port wieder an den PC an und stellen Sie den Schalter für die nRF-Stromquelle auf VDD.

Wenn die anderen beiden Knoten mit dem Linux-Computer verbunden sind, während dieses dritte Board angeschlossen ist, sollte es als serielle Schnittstelle /dev/ttyACM2 angezeigt werden:

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

Beschriften Sie das Brett mit „Joiner“.

Wenn Sie die Überprüfung mit Screen durchführen, erstellen Sie nicht über die Befehlszeile eine neue Instanz von Screen, sondern verbinden Sie sich wieder mit der vorhandenen Instanz und erstellen Sie darin ein neues Fenster, das Sie für den FTD Commissioner verwendet haben:

$ screen -r

Erstellen Sie ein neues Fenster in Screen mit Strg + a → c.

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

$ screen /dev/ttyACM2

Drücken Sie in diesem neuen Fenster mehrmals die Eingabetaste, um den OpenThread-Befehlszeilen-Prompt > 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 Instanz von Screen wie die FTD Commissioner-Befehlszeile befindet, kannst du mit Strg + A → n zwischen ihnen wechseln.

Strg + A verwenden →

Sie können jederzeit die Taste d drücken, um den Bildschirmschoner zu beenden.

6. Terminalfenster einrichten

In Zukunft wechseln Sie häufig zwischen Thread-Geräten. Achten Sie daher darauf, dass alle Geräte aktiv und leicht zugänglich sind. Bisher haben wir Screen verwendet, um auf die beiden FTDs zuzugreifen. Dieses Tool ermöglicht auch den Splitscreen im selben Terminalfenster. So können Sie sehen, wie ein Knoten auf Befehle reagiert, die an einen 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 OpenThread-Befehlszeile

Wenn Sie Ihre eigene Terminal-/Serienportkonfiguration 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 geeignet ist.

Bildschirm verwenden

Starten Sie zur Vereinfachung nur eine Screen-Sitzung. Sie sollten bereits eine haben, die Sie beim Einrichten der beiden FTDs erstellt haben.

Alle Befehle in Screen beginnen mit Strg + A.

Grundlegende Befehle für das Display:

Über die Befehlszeile wieder mit der Screen-Sitzung verbinden

screen -r

Screen-Sitzung beenden

Strg + A → d

Neues Fenster in der Screen-Sitzung erstellen

Strg + A → c

Zwischen Fenstern in derselben Bildschirmsitzung wechseln

Strg + A → n (vorwärts)Strg + A → p (zurück)

Aktuelles Fenster in der Screen-Sitzung beenden

Strg + A → k

Splitscreen

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

f1cbf1258cf0a5a.png

Mit Strg + A können Sie auf Befehle in screen zugreifen. 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 aufteilen möchten, müssen Sie zuerst Ihre vorhandene Screen-Sitzung aufrufen:

$ screen -r

Sie sollten sich auf einem der FTD-Geräte befinden. Gehen Sie auf dem Bildschirm 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 bewegen
  3. Strg + A → n, um von diesem neuen Fenster zum nächsten zu wechseln
  4. Wenn es mit dem Fenster oben übereinstimmt, drücken Sie noch einmal Strg + A → n, um das andere FTD-Gerät aufzurufen.

Sie sind jetzt beide sichtbar. Mit Strg + a → Tab können Sie zwischen ihnen wechseln. Wir empfehlen, jedem Fenster einen neuen Namen zu geben, indem Sie Strg + A → A drücken, um Verwechslungen zu vermeiden.

Erweiterte Nutzung

Wenn Sie den Bildschirm weiter in Quadranten unterteilen und die ot-daemon-Protokolle 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 als Übung überlassen.

Mit den folgenden Befehlen können Sie Fenster teilen 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 springen

Strg + A → Tab

Zum nächsten oder vorherigen angezeigten Fenster wechseln

Strg + A → n oder p

Aktuelles Fenster umbenennen

Strg + A → A

Sie können Screen jederzeit mit Strg + a → d verlassen und über die Befehlszeile mit screen -r wieder verbinden.

Weitere Informationen zu Screen finden Sie in der Kurzreferenz für GNU Screen.

7. Thread-Netzwerk erstellen

Nachdem Sie alle Terminalfenster und ‑bildschirme konfiguriert haben, erstellen wir nun unser Thread-Netzwerk. Erstellen Sie im FTD Commissioner einen neuen aktiven Datensatz. Der Betriebsdatensatz 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

Notieren Sie sich den Netzwerkschlüssel 1234c0de7ab51234c0de7ab51234c0de, der später verwendet wird.

Committen Sie diesen Datensatz als aktiven Datensatz:

> dataset commit active
Done

Rufen Sie die IPv6-Schnittstelle auf:

> ifconfig up
Done

Starten Sie den Thread-Protokollvorgang:

> thread start
Done

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

## 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 im 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 noch einmal, zu scannen.

8. RCP-Joiner hinzufügen

Die Thread-Inbetriebnahme ist im Netzwerk nicht aktiv. Das bedeutet, dass wir dem Thread-Netzwerk, das wir gerade erstellt haben, den RCP-Joiner mithilfe eines Out-of-Band-Inbetriebnahmeprozesses hinzufügen müssen.

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

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

Legen Sie als Nächstes im RCP Joiner den Netzwerkschlüssel des aktiven Datensatzes auf den Netzwerkschlüssel des FTD-Kommissars fest:

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

Prüfen Sie, ob der Datensatz richtig eingerichtet ist.

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

Öffnen Sie den Thread, damit der RCP-Joiner dem Netzwerk „codelab“ beitritt. Warten Sie einige Sekunden und prüfen Sie 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

Notieren Sie sich die mesh-lokale IPv6-Adresse (hier fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f). Sie benötigen sie später.

Prüfen Sie in der FTD Commissioner-Benutzeroberfläche in den Router- und untergeordneten Tabellen, ob sich beide Geräte im selben Netzwerk befinden. Verwenden Sie 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

Führen Sie einen Ping auf die Mesh-lokale Adresse des RCP-Joiners aus (die Mesh-lokale Adresse, die aus der ipaddr-Ausgabe des RCP-Joiners abgerufen wurde), 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 jedes Mal, wenn sich der Status des Netzwerks ändert, ein neues Thread-Topologiediagramm angezeigt. Knotenrollen werden folgendermaßen gekennzeichnet:

b75a527be4563215.png

Router sind immer Fünfecke und Endgeräte immer Kreise. Die Zahlen auf den einzelnen Knoten entsprechen der Router-ID oder untergeordneten ID, die in der Befehlszeilenausgabe angezeigt wird. Dies hängt von der aktuellen Rolle und dem aktuellen Status des jeweiligen Knotens ab.

9. FTD-Joiner in Betrieb nehmen

Fügen wir dem „codelab“-Netzwerk nun das dritte Thread-Gerät hinzu. Dieses Mal verwenden wir den sichereren In-Band-Bereitstellungsprozess und erlauben nur dem FTD-Joiner, beizutreten.

Rufe auf dem FTD Joiner die eui64 ab, damit der FTD-Beauftragte sie identifizieren kann:

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

> eui64
2f57d222545271f1
Done

Starten Sie den FTD Commissioner und geben Sie die eui64 des Geräts, das beitreten kann, sowie die Anmeldedaten für den Teilnehmer an, z. B. J01NME. Die Anmeldedaten für den Teilnehmer sind ein gerätespezifischer String aus ausschließlich alphanumerischen Großbuchstaben (0–9 und A–Y, ausgenommen I, O, Q und Z aus Gründen der Lesbarkeit) mit einer Länge von 6 bis 32 Zeichen.

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

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

Wechseln Sie zum FTD Joiner. Starte die Rolle „Teilnehmer“ mit den Anmeldedaten für Teilnehmer, die du gerade im FTD Commissioner eingerichtet hast:

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

> ifconfig up
Done
> joiner start J01NME
Done

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

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

>
Join success

Starten Sie Thread, damit der FTD-Joiner dem Netzwerk „codelab“ beitritt, und prüfen Sie 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 der Leader ist und auch keine Anycast-spezifische Rolle hat, für die eine 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)

Wechseln Sie sofort zum FTD Commissioner und prüfen Sie die Router- und untergeordneten Tabellen, um sicherzustellen, dass sich im Netzwerk „codelab“ drei Geräte befinden:

## 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

Basierend auf dem RLOC16 ist der FTD-Joiner als Endgerät (untergeordnet) mit dem Netzwerk verbunden. Hier ist die aktualisierte Topologie:

otcodelab_top01C_ed01.png

10. Thread 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 Endgerät fungieren und sich von einem Endgerät zu einem Router hochstufen können.

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

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 noch einmal die Router- und untergeordneten Tabellen auf dem FTD-Kommissär:

## 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 zu einem Router gemacht. Beachten Sie, dass die RLOC16-Adresse unterschiedlich ist (b800 anstelle von 0c02). Das liegt daran, dass die RLOC16-Adresse auf der Router-ID und der untergeordneten ID eines Geräts basiert. Wenn es vom Endgerät zum Router wechselt, ändern sich die Werte für die Router-ID und die 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

FTD Joiner auf eine niedrigere Version zurücksetzen

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

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

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

Zurück auf der Seite FTD Commissioner sollte der FTD-Teilnehmer jetzt in der untergeordneten Tabelle (ID = 3) angezeigt werden. Während der Umstellung kann es sogar in beiden Konten angezeigt werden:

## 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 wechselt er wieder zu einem Router mit einem RLOC von b800.

otcodelab_top01C.png

Führungsperson entfernen

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

Deaktivieren Sie Thread im FTD Commissioner, 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-Leiter. 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 ein neues RLOC16 gibt. Dies ist der RCP-Joiner, wie seine ID und erweiterte MAC-Adresse zeigen. Um das Thread-Netzwerk zusammenzuhalten, hat er den übergeordneten Router vom FTD-Kommissär zum FTD-Joiner gewechselt. Dies führt zu einem neuen RLOC16 für den RCP-Joiner, da sich seine Router-ID von 3 auf 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 der RCP-Joiner als untergeordnetes Element an den 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-Beauftragten wieder verknüpfen

Ein Thread-Netzwerk mit zwei Knoten ist nicht besonders nützlich. Lassen Sie uns den FTD-Beauftragten wieder online stellen.

Starte den Thread im FTD Commissioner neu:

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

> ifconfig up
Done
> thread start
Done

Innerhalb von zwei Minuten wird es automatisch wieder als Endgerät mit dem „codelab“-Netzwerk verbunden und befördert sich dann selbst zu einem Router.

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

> state
router
Done

Prüfe die Router- und untergeordneten Tabellen im 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 auf 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 verlaufen (zu viele Screen-Fenster oder Screens in Screens), beenden Sie die Screen-Fenster mit Strg + a → k, bis keine mehr vorhanden sind und screen -ls in der Befehlszeile No Sockets found zurückgibt. Erstellen Sie dann für jedes Gerät neue Bildschirmfenster. Gerätestatus bleiben erhalten, auch wenn der Bildschirm beendet wird.

Thread-Knoten

Wenn die Thread-Netzwerktopologie nicht der in diesem Codelab beschriebenen entspricht oder Knoten aus irgendeinem Grund getrennt werden (z. B. weil der Linux-Computer, der sie steuert, in den Ruhezustand versetzt wurde), sollten Sie Thread beenden, die Netzwerkanmeldedaten löschen und mit dem Schritt Thread-Netzwerk erstellen neu 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 die gleiche 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 je nach Umfang für die Multicast-Nutzung mit verschiedenen Gerätegruppen reserviert.

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-lokal

Alle FTDs und MEDs

ff03::2

Mesh-lokal

Alle FTDs und Border-Router

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

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

Ping ff02::1 vom FTD Commissioner aus:

## 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 Address (LLA) des FTD Joiners 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

Führen Sie jetzt einen Ping auf ff02::1 vom FTD Joiner aus:

## 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! Bei der Überprüfung der IPv6-Adressen der anderen Geräte sehen wir, dass die erste (die auf 4b1d endet) die LLA des FTD-Kommissars und die zweite (die auf 943b endet) die LLA des RCP-Teilnehmers ist.

otcodelab_top02C_02_LL02.png

Das bedeutet, dass der FTD-Joiner sowohl mit dem FTD-Kommissionär als auch mit dem RCP-Joiner direkt verbunden ist, was unsere Topologie bestätigt.

Mesh-lokal

Der Mesh-lokale Bereich umfasst alle Thread-Schnittstellen, die innerhalb desselben Thread-Netzwerks erreichbar sind. Sehen wir uns die Antworten auf einen Ping an die Multicast-Adresse ff03::1 an.

Ping ff03::1 vom FTD Commissioner aus:

## 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

Diesmal erhielt der FTD-Koordinator zwei Antworten, eine vom Routing Locator (RLOC, endet auf b800) des FTD-Teilnehmers und eine von der Mesh-Local EID (ML-EID, endet auf d55f) des RCP-Teilnehmers. Das liegt daran, dass der mesh-lokale Bereich das gesamte Thread-Netzwerk umfasst. Unabhängig davon, wo sich ein Gerät im Netzwerk befindet, wird es der ff03::1-Adresse zugewiesen.

otcodelab_top02C_02_ML.png

Pingen Sie ff03::1 vom FTD Joiner aus, 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-Kommissioner (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-Kommissioner zu erreichen, verglichen mit einem Hop für den FTD-Joiner.

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

Prüfen Sie den Status des RCP Joiners:

## 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 weiterzuleiten (z. B. an das Internet, wenn das Thread-Netzwerk einen Border-Router hat).

UDP-Sockets werden über die OpenThread-Befehlszeile bereitgestellt. Verwenden wir ihn, um Nachrichten zwischen den beiden FTDs zu übergeben.

Rufen Sie die Mesh-lokale EID-Adresse für den FTD-Joiner ab. Wir verwenden diese Adresse, da 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

Wechseln Sie zum FTD Commissioner, starten Sie UDP und stellen Sie über die ML-EID eine Verbindung zum Socket her, den Sie auf dem FTD Joiner eingerichtet haben:

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

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

Die UDP-Verbindung zwischen den beiden Knoten sollte aktiv sein. So senden Sie eine Nachricht vom FTD-Kommissar:

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

> udp send hellothere
Done

Die UDP-Nachricht wurde vom FTD Joiner empfangen.

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

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

14. Glückwunsch!

Sie haben ein physisches Thread-Netzwerk erstellt.

b915c433e7027cc7.png

Sie wissen jetzt:

  • den Unterschied zwischen Thread-Gerätetypen, -Rollen und -Bereichen
  • wie Thread-Geräte ihren Status im Netzwerk verwalten
  • wie einfache Nachrichten mit UDP zwischen Knoten übergeben werden

Nächste Schritte

Versuchen Sie, anhand dieses Codelabs die folgenden Übungen auszuführen:

  • Flashen Sie das FTD-Joiner-Board mit der ot-cli-mtd-Binärdatei als MTD neu und achten Sie darauf, dass es sich nie selbst zu einem 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.
  • NCP mit pyspinel steuern
  • Konvertieren Sie den NCP mit dem OpenThread Border Router in einen Border Router und verbinden Sie Ihr Thread-Netzwerk mit dem Internet.

Weitere Informationen

Unter openthread.io und GitHub finden Sie eine Vielzahl von OpenThread-Ressourcen, darunter:

Referenz: