1. Einführung

OpenThread wurde vom Google Nest-Team veröffentlicht und ist eine Open-Source-Implementierung des Thread®-Netzwerkprotokolls, mit dem die Entwicklung von Produkten für das vernetzte Zuhause beschleunigt werden soll. Die Thread-Spezifikation definiert ein zuverlässiges, sicheres und energieeffizientes IPv6-basiertes Protokoll für die drahtlose Kommunikation zwischen Geräten für Anwendungen in Privathäusern und gewerblichen Gebäuden.
Espressif hat den OpenThread-Stack auf FreeRTOS und LwIP portiert, sodass Entwickler schnell Thread-Netzwerke erstellen können. Der zugehörige Quellcode ist auf GitHub verfügbar. Gleichzeitig hat Espressif auch einen Thread-Border-Router auf Basis von RTOS implementiert.
In diesem Codelab programmieren Sie OpenThread auf echter Hardware, erstellen und verwalten ein Thread-Netzwerk und übergeben Nachrichten zwischen Knoten.

Lerninhalte
- OpenThread-CLI-Binärdateien auf ESP-Boards erstellen und flashen
- Border-Router auf dem ESP-Thread-Border-Router-Board erstellen und flashen
- Thread-Knoten manuell mit ESP Monitor und der OpenThread-CLI verwalten
- Ein Thread-Netzwerk auf dem Thread-Border-Router erstellen
- Die Inbetriebnahme von Geräten in einem Thread-Netzwerk sichern
- IPv6-Adresse zwischen Thread-Knoten pingen
- Nachrichten mit UDP zwischen Thread-Knoten übergeben
Voraussetzungen
Hardware:
Software:
2. Erste Schritte
- ESP-IDF installieren
Folgen Sie der Anleitung im ESP-IDF-Programmierleitfaden, um die Softwareentwicklungsumgebung zu installieren.
- Das ESP-Thread-Border-Router-SDK klonen
ESP-THREAD-BR ist das offizielle ESP-Thread-Border-Router-SDK. Es unterstützt alle grundlegenden Netzwerkfunktionen zum Erstellen eines Thread-Border-Routers und bietet umfangreiche Funktionen auf Produktebene für eine schnelle Produktentwicklung.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. Erstellen und flashen
Weitere Informationen zum Erstellen und Flashen der ot-cli-ftd-Binärdatei auf ESP-Boards mit IEEE 802.15.4-Modulen finden Sie im ESP-IDF-Beispiel ot_cli:
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
Aktivieren Sie die Joiner-Funktion über menuconfig:
$ idf.py menuconfig
„Component config“ > „OpenThread“ > „Enable Joiner“ auswählen und dann erstellen und flashen.
$ idf.py -p <your-local-port> build flash monitor
Zum Erstellen und Flashen der ot-br-Binärdatei auf dem ESP-Thread-Border-Router-Board müssen Sie zuerst die RCP-Binärdatei erstellen. Diese RCP-Binärdatei muss nicht explizit auf das Gerät auf dem ESP-Thread-Border-Router-Board geflasht werden. Sie wird in die Border-Router-Binärdatei aufgenommen und beim ersten Start auf den ESP32-H2-Chip geflasht (oder wenn die RCP-Firmware geändert wurde). Weitere Informationen finden Sie in der Dokumentation zum ESP-Thread-Border-Router:
$ cd <your-idf-path>/examples/openthread/ot_rcp $ idf.py set-target esp32h2 $ idf.py build $ cd <your-esp-thread-br-path>/examples/basic_thread_border_router $ idf.py set-target esp32s3
Aktivieren Sie die Commissioner-Funktion über menuconfig:
$ idf.py menuconfig
„Component config“ > „OpenThread“ > „Enable Commissioner“ auswählen und dann erstellen und flashen.
$ idf.py -p <your-local-port> build flash monitor
4. Ein Thread-Netzwerk auf dem Thread-Border-Router erstellen
Jetzt können Sie ein Thread-Netzwerk mit der OpenThread-Befehlszeile auf dem ESP-Thread-Border-Router-Board (BR Commissioner) erstellen:
## BR Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 21 Channel Mask: 0x07fff800 Ext PAN ID: 151975d11bea97b5 Mesh Local Prefix: fd6a:b54b:d6a3:b05a::/64 Network Key: 731ab6a60a64a0a0b14b259b86b2be01 Network Name: OpenThread-1444 PAN ID: 0x1444 PSKc: 54e7f18d2575014da94db09df29c5df0 Security Policy: 672 onrc 0 Done
Dieses Dataset als aktiv festlegen:
> dataset commit active Done
Die IPv6-Schnittstelle aktivieren:
> ifconfig up I (59329) OPENTHREAD: Platform UDP bound to port 49153 Done I (59329) OT_STATE: netif up
Thread-Protokollvorgang starten:
> thread start I(61709) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(62469) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(69079) OPENTHREAD:[N] RouterTable---: Allocate router id 11 I(69079) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c00 I(69089) OPENTHREAD:[N] Mle-----------: Role detached -> leader I(69089) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 I (69099) OPENTHREAD: Platform UDP bound to port 49154
Prüfen Sie nach kurzer Zeit den Gerätestatus. Er sollte „Leader“ sein.
> state leader Done >
5. Über den Netzwerkschlüssel dem Thread-Netzwerk beitreten
In diesem Codelab werden zwei ESP-Boards mit IEEE 802.15.4-Modulen vorbereitet, um dem vom BR erstellten Netzwerk beizutreten. In dieser Sitzung fügen wir Board1 dem Netzwerk hinzu.
Den Netzwerkschlüssel vom BR abrufen:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
Diesen Netzwerkschlüssel auf einem ESP-Board (Board1 Joiner) mit IEEE 802.15.4-Modulen festlegen:
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
Dieses Dataset als aktiv festlegen:
> dataset commit active Done
Die IPv6-Schnittstelle aktivieren:
> ifconfig up Done I (20308) OT_STATE: netif up
Thread-Protokollvorgang starten:
> thread start I(23058) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(23408) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(30028) OPENTHREAD:[N] Mle-----------: Attach attempt 1 unsuccessful, will try again in 0.288 seconds I(30328) OPENTHREAD:[N] Mle-----------: Attach attempt 2, AnyPartition I(33498) OPENTHREAD:[N] Mle-----------: Delay processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Role detached -> disabled I(33758) OPENTHREAD:[N] Mle-----------: Role disabled -> detached I(34178) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition I(35068) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c01 I(35068) OPENTHREAD:[N] Mle-----------: Role detached -> child
Prüfen Sie nach kurzer Zeit den Gerätestatus. Er sollte „Child“ sein.
> state child Done
Legen Sie die Rolle auf „Mesh Extender“ fest (in der CLI und in den Logs als router bezeichnet).
> state router Done I(51028) OPENTHREAD:[N] Mle-----------: RLOC16 2c01 -> 2800 I(51028) OPENTHREAD:[N] Mle-----------: Role child -> router I(51028) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >

6. Über die sichere Inbetriebnahme dem Thread-Netzwerk beitreten
In dieser Sitzung fügen wir Board2 dem Netzwerk über die sichere Inbetriebnahme hinzu:
Den PSKc und die PAN-ID vom BR Commissioner abrufen:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Die Netzwerkinformationen für Board2 konfigurieren:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
Dieses Dataset als aktiv festlegen:
## Board2 Joiner ## ---------------------- > dataset commit active Done
Die IPv6-Schnittstelle aktivieren:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
Die EUI64 von Board2 abrufen:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
Starten Sie auf dem BR Commissioner den Commissioner und geben Sie die eui64 des Geräts an, das beitreten kann, sowie die Joiner-Anmeldedaten, z. B. J01NME. Die Joiner-Anmeldedaten sind ein gerätespezifischer String aus alphanumerischen Zeichen in Großbuchstaben (0–9 und A–Y, ohne I, O, Q und Z aus Gründen der Lesbarkeit) mit einer Länge von 6 bis 32 Zeichen.
## BR Commissioner ## ---------------------- > commissioner start Commissioner: petitioning Done Commissioner: active > commissioner joiner add 4831b7fffec02be1 J01NME Done
Wechseln Sie zum Board2 Joiner. Starten Sie die Joiner-Rolle mit den Joiner-Anmeldedaten, die Sie gerade auf dem BR Commissioner eingerichtet haben:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
Innerhalb einer Minute erhalten Sie eine Bestätigung der erfolgreichen Authentifizierung:
## Board2 Joiner ## ---------------------- > Join success
Danach können Sie das vom BR Commissioner erstellte Thread-Netzwerk starten und ihm beitreten.
Thread-Protokollvorgang starten:
> thread start I(35727) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(36197) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(37007) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2801 I(37007) OPENTHREAD:[N] Mle-----------: Role detached -> child
Legen Sie die Rolle auf „Mesh Extender“ fest (in der CLI und in den Logs als router bezeichnet).
> state router Done I(46057) OPENTHREAD:[N] Mle-----------: RLOC16 2801 -> 4400 I(46057) OPENTHREAD:[N] Mle-----------: Role child -> router I(46057) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >
Jetzt haben Sie ein Thread-Netzwerk mit der unten gezeigten Topologie:

7. IPv6-Adresse zwischen Thread-Knoten pingen
Mit dem Befehl „ping“ können Sie zwischen zwei beliebigen Boards kommunizieren. Verwenden Sie den Befehl ipaddr, um die IPv6-Adresse jedes Boards auszugeben:
## BR Commissioner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fd6a:b54b:d6a3:b05a:0:ff:fe00:2c00 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 # Mesh-Local EID (ML-EID) fe80:0:0:0:687c:7248:cc14:9c4d # Link-Local Address (LLA) Done >
## Board1 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:2800 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 # Mesh-Local EID (ML-EID) fe80:0:0:0:18ac:df04:4671:6a45 # Link-Local Address (LLA) Done
## Board2 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:4400 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc # Mesh-Local EID (ML-EID) fe80:0:0:0:a8cc:1483:f696:91a2 # Link-Local Address (LLA) Done
Wenn Sie beispielsweise die MLE-ID von Board2 vom BR Commissioner aus pingen möchten, können Sie diesen Befehl auf dem BR Commissioner ausführen:
## BR Commissioner ## ---------------------- > ping fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc 16 bytes from fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc: icmp_seq=1 hlim=255 time=123ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 123/123.0/123 ms. Done
8. Nachrichten mit UDP zwischen Thread-Knoten übergeben
In dieser Sitzung erfahren Sie, wie Sie eine Nachricht zwischen zwei Thread-Geräten senden. Öffnen Sie beispielsweise UDP, binden Sie es an Port 20617 und warten Sie auf alle Adressen auf dem BR:
## BR Commissioner ## ---------------------- > udp open Done > udp bind :: 20617 I (1298739) OPENTHREAD: Platform UDP bound to port 20617 Done
Senden Sie dann eine Nachricht von Board1 an die MLE-ID-Adresse und den Port 20617 des BR:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
Die Nachricht wird auf dem BR angezeigt:
## BR Commissioner ## ---------------------- 3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP
9. Glückwunsch!
Sie haben ein physisches Thread-Netzwerk mit ESP-Boards erstellt.

Sie wissen jetzt, wie Sie:
- OpenThread-CLI-Binärdateien auf ESP-Boards erstellen und flashen
- Border-Router auf dem ESP-Thread-Border-Router-Board erstellen und flashen
- Thread-Knoten manuell mit ESP Monitor und der OpenThread-CLI verwalten
- Ein Thread-Netzwerk auf dem Thread-Border-Router erstellen
- Die Inbetriebnahme von Geräten in einem Thread-Netzwerk sichern
- IPv6-Adresse zwischen Thread-Knoten pingen
- Nachrichten mit UDP zwischen Thread-Knoten übergeben
Weitere Informationen
Auf openthread.io und GitHub finden Sie eine Vielzahl von OpenThread-Ressourcen, darunter:
- Unterstützte Plattformen: Hier finden Sie alle Plattformen, die OpenThread unterstützen.
- OpenThread erstellen: Weitere Informationen zum Erstellen und Konfigurieren von OpenThread
- Thread Primer: Hier werden alle Thread-Konzepte behandelt, die in diesem Codelab verwendet werden.
Referenz: