1. Einführung
OpenThread wurde vom Google Nest-Team veröffentlicht und ist eine Open-Source-Implementierung des Thread®-Netzwerkprotokolls, mit der die Entwicklung von Produkten für das vernetzte Zuhause beschleunigt werden soll. Die Thread-Spezifikation definiert ein IPv6-basiertes, zuverlässiges, sicheres und energiesparendes Kommunikationsprotokoll für drahtlose Geräte-zu-Gerät-Verbindungen für Heim- und Gewerbebauanwendungen.
Espressif hat den OpenThread-Stack auf der Grundlage von FreeRTOS und LwIP portiert, sodass Entwickler schnell Thread-Netzwerke aufbauen können. Den entsprechenden Quellcode können Sie von GitHub herunterladen. Gleichzeitig hat Espressif einen auf RTOS basierenden Thread-Border-Router implementiert.
In diesem Codelab programmieren Sie OpenThread auf echter Hardware, erstellen und verwalten ein Thread-Netzwerk und leiten Nachrichten zwischen Knoten weiter.
Lerninhalte
- Erstellen und Flashen von OpenThread-CLI-Binärdateien auf ESP-Boards
- Ein Border-Router wird aufgebaut und auf die ESP-Thread-Border-Router-Platine gelegt.
- Thread-Knoten manuell mit ESP Monitor und OpenThread CLI verwalten.
- Thread-Netzwerk auf dem Thread-Border-Router erstellen
- Inbetriebnahme von Geräten in einem Thread-Netzwerk sichern
- IPv6-Adresse zwischen Thread-Knoten wird mit Ping gepingt.
- Nachrichten zwischen Thread-Knoten mit UDP weiterleiten.
Voraussetzungen
Hardware:
Software:
- ESP-IDF.
- ESP-THREAD-BR hinzu.
2. Erste Schritte
- ESP-IDF-Installation.
Folgen Sie der Anleitung im ESP-IDF-Programmierhandbuch, um die Softwareentwicklungsumgebung zu installieren.
- Klonen Sie das ESP Thread Border Router SDK.
ESP-THREAD-BR ist das offizielle ESP Thread Border Router SDK. Es unterstützt alle grundlegenden Netzwerkfunktionen zum Erstellen eines Thread-Border-Routers und integriert umfangreiche Funktionen auf Produktebene für eine schnelle Produktisierung.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. Build und Flash
Zum Erstellen und zum Flashen der Binärdatei "ot-cli-ftd" auf ESP-Boards mit IEEE 802.15.4-Modulen finden Sie weitere Informationen 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
Komponentenkonfiguration > OpenThread > Aktivieren Sie Joiner und erstellen Sie dann Build und Flash.
$ 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. Er ist in der Binärdatei des Border Routers enthalten und wird beim ersten Start auf den ESP32-H2-Chip geflasht (oder die RCP-Firmware wurde geändert). Weitere Informationen finden Sie in der ESP-Thread-BR-Dokumentation:
$ 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 Provisioner-Funktion über Menuconfig:
$ idf.py menuconfig
Komponentenkonfiguration > OpenThread > Aktivieren Sie Commissioner, erstellen Sie dann Build und Flash.
$ idf.py -p <your-local-port> build flash monitor
4. Thread-Netzwerk mit dem Thread-Border-Router erstellen
Jetzt können Sie mit der OpenThread-Befehlszeile auf dem ESP Thread Border Router Board (BR Commissioner) ein Thread-Netzwerk bilden:
## 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
Übernehmen Sie für dieses Dataset ein Commit als aktives Dataset:
> dataset commit active Done
Rufen Sie die IPv6-Schnittstelle auf:
> 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. Es sollte der Leader sein.
> state leader Done >
5. Thread-Netzwerk über networkkey beitreten
In diesem Codelab werden zwei ESP-Boards mit IEEE 802.15.4-Modulen für den Beitritt zum BR-Netzwerk vorbereitet. In dieser Sitzung fügen wir Board1 dem Netzwerk hinzu.
Rufen Sie den Netzwerkschlüssel von BR ab:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
Legen Sie diesen Netzwerkschlüssel auf ein ESP-Board (Board1 Joiner) mit IEEE 802.15.4-Modulen fest:
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
Übernehmen Sie für dieses Dataset ein Commit als aktives Dataset:
> dataset commit active Done
Rufen Sie die IPv6-Schnittstelle auf:
> 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. Es sollte das untergeordnete Element sein.
> state child Done
Legen Sie als Rolle „Router“ fest.
> 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 sichere Inbetriebnahme dem Thread-Netzwerk beitreten
In dieser Sitzung fügen wir Board2 über Sicherheitsinbetriebnahme zum Netzwerk hinzu:
Hol dir das PSKc und die Panid von BR Commissioner:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Konfigurieren Sie die Netzwerkinformationen für Board2:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
Übernehmen Sie für dieses Dataset ein Commit als aktives Dataset:
## Board2 Joiner ## ---------------------- > dataset commit active Done
Rufen Sie die IPv6-Schnittstelle auf:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
Holen Sie sich die eui64 auf Board2:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
Starte den BR Commissioner und gib die eui64
des Geräts an, das teilnehmen darf, zusammen mit den Anmeldedaten für den Joiner, z. B. J01NME
. Die Joiner-Anmeldedaten sind ein gerätespezifischer String zwischen 6 und 32 Zeichen, der alle Großbuchstaben alphanumerischen Zeichen (0–9 und A–Y, ausgenommen I, O, Q und Z) enthält, die zur besseren Lesbarkeit verwendet werden.
## BR Commissioner ## ---------------------- > commissioner start Commissioner: petitioning Done Commissioner: active > commissioner joiner add 4831b7fffec02be1 J01NME Done
Wechseln Sie zu Board2 Joiner. Starte die Joiner-Rolle mit den Anmeldedaten, die du gerade für den BR Commissioner eingerichtet hast:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
Innerhalb etwa einer Minute erhalten Sie eine Bestätigung über eine erfolgreiche Authentifizierung:
## Board2 Joiner ## ---------------------- > Join success
Danach kannst du das Thread-Netzwerk des BR Commissioner 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 als Rolle „Router“ fest.
> 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 erhalten Sie ein Thread-Netzwerk mit der folgenden Topologie:
7. IPv6-Adresse zwischen Thread-Knoten pingen
Sie können den Befehl „ping“ verwenden, um zwischen zwei Boards zu kommunizieren. Geben Sie den Befehl ipaddr
ein, um die IPv6-Adressen 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 Board2 MLE-ID von BR Commissioner anpingen möchten, können Sie diesen Befehl für 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 zwischen Thread-Knoten mit UDP weiterleiten
In dieser Sitzung lernst du, wie du Nachrichten zwischen zwei Thread-Geräten senden kannst. Öffnen Sie beispielsweise udp, binden Sie es an Port 20617
und warten Sie auf alle Adressen in 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 BR-MLE-ID-Adresse und den Port 20617
:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
Du kannst die in BR empfangene Nachricht sehen:
## BR Commissioner ## ---------------------- 3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP
9. Glückwunsch!
Sie haben mithilfe von ESP-Boards ein physisches Thread-Netzwerk erstellt.
Jetzt wissen Sie:
- Erstellen und Flashen von OpenThread-CLI-Binärdateien auf ESP-Boards
- Blinkender Border-Router zur ESP-Thread-Border-Router-Platine
- Thread-Knoten manuell mit ESP Monitor und OpenThread CLI verwalten.
- Thread-Netzwerk auf dem Thread-Border-Router erstellen
- Inbetriebnahme von Geräten in einem Thread-Netzwerk sichern
- IPv6-Adresse zwischen Thread-Knoten wird mit Ping gepingt.
- Nachrichten zwischen Thread-Knoten mit UDP weiterleiten.
Weitere Informationen
Unter openthread.io und GitHub finden Sie eine Vielzahl von OpenThread-Ressourcen, darunter:
- Unterstützte Plattformen – Finden Sie alle Plattformen, die OpenThread unterstützen.
- OpenThread erstellen – weitere Details zum Erstellen und Konfigurieren von OpenThread
- Thread Primer – behandelt alle Thread-Konzepte in diesem Codelab
Referenz: