Thread-Netzwerk mit dem ESP32H2- und ESP-Thread-Border-Router-Board erstellen

1. Einführung

26b7f4f6b3ea0700.png

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.

Espressif_hardware_setup.jpg

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:

  • 2 ESP-Platinen mit IEEE 802.15.4-Modulen
  • 1 ESP-Thread-Border-Router-Board.

Software:

2. Erste Schritte

  1. ESP-IDF-Installation.

Folgen Sie der Anleitung im ESP-IDF-Programmierhandbuch, um die Softwareentwicklungsumgebung zu installieren.

  1. 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
> 

esp_ot_tp_LR.jpg

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:

esp_ot_tp_LRR.jpg

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.

esp_ot_final_topology.jpg

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:

Referenz: