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 Smart Homes beschleunigt werden soll. Die Thread-Spezifikation definiert ein IPv6-basiertes zuverlässiges, sicheres und energiesparendes drahtloses Kommunikationsprotokoll zwischen Geräten und Anwendungen für private und kommerzielle Anwendungen.

Espressif hat den OpenThread-Stack basierend auf FreeRTOS und LwIP portiert, sodass Entwickler schnell Thread-Netzwerke aufbauen können. Den zugehörigen Quellcode erhalten Sie von GitHub. Gleichzeitig hat Espressif auch einen Thread-Border-Router implementiert, der auf RTOS basiert.

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-Befehlszeilen-Binärprogrammen auf ESP-Boards.
  • Border-Router wird erstellt und auf dem ESP Thread-Border-Router-Board aufgebaut.
  • Manuelle Verwaltung von Thread-Knoten mit ESP Monitor und der OpenThread-Befehlszeile
  • Bilden Sie ein Thread-Netzwerk auf dem Thread-Border-Router.
  • Die Inbetriebnahme von Geräten in einem Thread-Netzwerk sichern
  • Pingen der IPv6-Adresse zwischen Thread-Knoten.
  • Nachrichten zwischen Thread-Knoten mit UDP weiterleiten.

Voraussetzungen

Hardware:

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

Software:

2. Erste Schritte

  1. ESP-IDF-Installation.

Folgen Sie dem 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. Er unterstützt alle grundlegenden Netzwerkfunktionen zum Erstellen eines Thread-Border-Routers und bietet umfassende 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

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

Komponentenkonfiguration > OpenThread > Joiner aktivieren, 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 Thread-Border-Router-Board des ESP übertragen werden. Sie ist in der Binärdatei des Border Router enthalten und wird beim ersten Start (oder beim ersten Start der RCP-Firmware) auf den ESP32-H2-Chip geladen. 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 Funktion „Provisioner“ über „menuconfig“:

$ idf.py menuconfig

Komponentenkonfiguration > OpenThread > Provisioner aktivieren, dann Build und Flash.

$ idf.py -p <your-local-port> build flash monitor

4. Thread-Netzwerk auf 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 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

Führen Sie den Commit für dieses Dataset als aktives Dataset aus:

> dataset commit active
Done

Öffnen Sie die IPv6-Schnittstelle:

> 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 kurz den Gerätestatus. Es sollte der Anführer sein.

> state
leader
Done
> 

5. Mit dem Netzwerkschlüssel dem Thread-Netzwerk beitreten

In diesem Codelab werden zwei ESP-Boards mit IEEE 802.15.4-Modulen für den Beitritt zum BR-förmigen Netzwerk vorbereitet. In dieser Sitzung werden wir Board1 dem Netzwerk hinzufügen.

Rufen Sie den networkkey aus 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

Führen Sie den Commit für dieses Dataset als aktives Dataset aus:

> dataset commit active
Done

Öffnen Sie die IPv6-Schnittstelle:

> 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 kurz den Gerätestatus. Es sollte das Kind sein.

> state
child
Done

Legen Sie die Rolle auf „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 werden wir Board2 über die Sicherheitsinbetriebnahme zum Netzwerk hinzufügen:

PSKc und Panid vom BR Commissioner abrufen:

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

Führen Sie den Commit für dieses Dataset als aktives Dataset aus:

## Board2 Joiner ##
----------------------
> dataset commit active 
Done

Öffnen Sie die IPv6-Schnittstelle:

## Board2 Joiner ##
----------------------
> ifconfig up
Done
I (29146) OT_STATE: netif up

Rufen Sie den eui64 von Board2 ab:

## Board2 Joiner ##
----------------------
> eui64
4831b7fffec02be1
Done

Starten Sie den Provisioner auf dem BR Commissioner und geben Sie die eui64 des Geräts an, das teilnehmen kann, sowie die Joiner-Anmeldedaten, z. B. J01NME. Joiner Credential ist ein gerätespezifischer String aus allen alphanumerischen Zeichen in Großbuchstaben (0–9 und A–Y, ausgenommen I, O, Q und Z zur besseren Lesbarkeit) und hat eine Länge zwischen 6 und 32 Zeichen.

## BR Commissioner ##
----------------------
> commissioner start
Commissioner: petitioning
Done
Commissioner: active
> commissioner joiner add 4831b7fffec02be1 J01NME
Done

Wechseln Sie zu Board2 Joiner. Beginnen Sie die Joiner-Rolle mit den Anmeldedaten, die Sie gerade im BR Commissioner eingerichtet haben:

## Board2 Joiner ##
----------------------
> ifconfig up
Done
> joiner start J01NME
Done

Nach etwa einer Minute erhalten Sie eine Bestätigung, dass die Authentifizierung erfolgreich war:

## Board2 Joiner ##
----------------------
>
Join success

Danach können Sie das vom BR Commissioner gegründete Thread-Netzwerk starten und 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 „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 Ping-Befehl für die Kommunikation zwischen zwei beliebigen Boards verwenden. Verwenden Sie den Befehl ipaddr, um die IPv6-Adressen aller 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

Um beispielsweise die MLE-ID von BR Commissioner an Board2 MLE-ID zu senden, können Sie den folgenden Befehl im 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 erfährst du, wie du eine Nachricht zwischen zwei Thread-Geräten sendest. Öffnen Sie beispielsweise udp, binden Sie ihn 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

Sie können die empfangene Nachricht in BR 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

Sie wissen jetzt:

  • Erstellen und Flashen von OpenThread-Befehlszeilen-Binärprogrammen auf ESP-Boards.
  • Ein blinkender Border-Router wird auf dem ESP Thread-Border-Router-Board erstellt.
  • Manuelle Verwaltung von Thread-Knoten mit ESP Monitor und der OpenThread-Befehlszeile
  • Bilden Sie ein Thread-Netzwerk auf dem Thread-Border-Router.
  • Die Inbetriebnahme von Geräten in einem Thread-Netzwerk sichern
  • Pingen der IPv6-Adresse zwischen Thread-Knoten.
  • Nachrichten zwischen Thread-Knoten mit UDP weiterleiten.

Weitere Informationen

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

Referenz: