OTA auf Espressif ESP32 testen

In der folgenden Anleitung wird das Beispiel Lampensteuerung aus dem Matter SDK zusammen mit einem M5Stack ESP32-Entwicklungsboard verwendet.

Build-Umgebung einrichten

Klonen Sie zuerst das Matter SDK.

In diesem Beispiel sehen wir uns den Mindestwert für den unterstützten Commit für Matter Release 5 von Google Home an:

$ mkdir otaprep
$ cd otaprep
git clone https://github.com/project-chip/connectedhomeip.git
cd connectedhomeip
git fetch origin v1.0-branch
git checkout FETCH_HEAD
git submodule update --init --recursive
source ./scripts/activate.sh

Als Nächstes prüfen wir die im ESP32-GitHub-Workflow verwendete Version, um zu ermitteln, welches Docker-Image am besten für unseren Build geeignet ist:

$ cat .github/workflows/examples-esp32.yaml | grep chip-build | head -n 1
            image: connectedhomeip/chip-build-esp32:0.5.99

Wir führen einen Container aus dem Docker-Image aus und übergeben Flags, um das Matter SDK im Container bereitzustellen und Zugriff auf das ESP32-Gerät zu gewähren.

$ docker run --name container_name -it --user $(id -u):$(id -g) --mount source=$(pwd),target=/workspace,type=bind --device=/dev/ttyUSB0 connectedhomeip/chip-build-esp32:0.5.99 /bin/bash

Matter-Docker-Container beenden und starten

Wenn Sie einen docker run-Befehl ausführen, wird ein neuer Container mit dem angegebenen Image erstellt. Dabei gehen Ihre alten Daten verloren, die in einer vorherigen Containerinstanz gespeichert waren. Manchmal ist das auch erwünscht, da Sie dann mit einer Neuinstallation beginnen können. In diesem Beispiel sollten Sie Ihre Arbeit und die Umgebungskonfiguration jedoch zwischen den Sitzungen speichern.

user@host> docker stop container_name

Wenn Sie die Ausführung wieder starten möchten, starten Sie den Container und öffnen Sie ein Terminalfenster:

user@host> docker start container_name
user@host> docker exec -it container_name /bin/bash

Sie können zusätzliche Terminalsitzungen für Ihren Container mit folgenden Befehlen öffnen:

user@host> docker exec -it container_name /bin/bash

Oder Sie starten eine Root-Sitzung mit:

user@host> docker exec -u 0 -it container_name /bin/bash

SDK initialisieren

Im Container initialisieren wir das Matter SDK und die ESP-IDF:

cd /workspace
git submodule update --init --recursive
source ./scripts/activate.sh
source /opt/espressif/esp-idf/export.sh

Erstellen und flashen

Als Nächstes müssen Sie das Image erstellen und das Entwicklungskit flashen, um das Matter-OTA-Firmwareupdate zu erhalten.

Dazu müssen Sie ein Image erstellen.

Konfigurieren Sie zuerst den Build mit dem menuconfig-Dienstprogramm aus der ESP-IDF.

cd examples/lighting-app/esp32
idf.py menuconfig

Konfigurieren Sie im interaktiven Menü die folgenden Einstellungen:

  1. Component config --->

  2. CHIP Device Layer --->

  3. Device Identification Options --->

  4. Legen Sie für Vendor ID die Connectivity Standards Alliance (Alliance) zugewiesene VID fest.

  5. Legen Sie Product ID auf die PID fest, die Sie in der Google Home Developer Console für die Matter-Integration festgelegt haben.

Aktiviere das Flag „OTA-Anfrage“:

  1. Component config -->

  2. CHIP Core -->

  3. System options --->

  4. Flag „OTA-Anfrage“ aktivieren [*] Enable OTA Requestor

  5. Drücken Sie zweimal die ESC-Taste, um zum Menü der obersten Ebene zurückzukehren.

Aktivieren Sie das Flag Matter für die Erstellung von OTA-Images:

  1. Component config -->

  2. CHIP Device Layer --->

  3. Matter OTA Image --->

  4. [*] Generate OTA IMAGE

Legen Sie die Versionsnummer fest:

  1. Application manager --->

  2. [*] Get the project version from Kconfig auswählen

  3. Setzen Sie Project version (NEW) auf 1.0.

  4. Drücken Sie S, um die Konfiguration zu speichern, zweimal die Eingabetaste und dann Q, um menuconfig zu beenden.

Testzertifikate einrichten

Folgen Sie der Anleitung unter Matter-Gerätetestzertifikate erstellen, um CD-, DAC- und PAI-Zertifikate zu erstellen.

Gerät erstellen

Führen Sie nun den Build aus und flashen Sie das Gerät:

idf.py build
idf.py -p /dev/ttyUSB0 erase_flash
idf.py -p /dev/ttyUSB0 flash

OTA-Image erstellen und hochladen

Ändern Sie nun die Build-Einstellungen noch einmal, um ein OTA-Image zu erstellen. Verwenden Sie dasselbe Bild, aber mit einer inkrementellen Versionsnummer.

Führen Sie menuconfig aus.

idf.py menuconfig

Aktualisieren Sie im interaktiven Menü Folgendes:

  1. Application manager --->
  2. [*] Get the project version from Kconfig auswählen
  3. Setzen Sie Project version (NEW) auf 2.0.
  4. Drücken Sie s, um die Konfiguration zu speichern, zweimal die Eingabetaste und dann q, um menuconfig zu beenden.

Erstellen und abrufen Sie das Image. Das folgende Beispiel zeigt sowohl den Speicherort des Bildes für OTA als auch die Ausgabe beim Parsen mit der ota_image_tool.py.

cd build
/workspace/src/app/ota_image_tool.py show ./chip-lighting-app-ota.bin
Magic: 1beef11e
Total Size: 1243360
Header Size: 64
Header TLV:
  [0] Vendor Id: XXXXX (0x000)
  [1] Product Id: XXXXX (0x000)
  [2] Version: 2 (0x2)
  [3] Version String: v2.0
  [4] Payload Size: 1243280 (0x12f890)
  [8] Digest Type: 1 (0x1)
  [9] Digest: e367f4d71e2ccd554b9a399c864abbf2c039382ef1def1b986fb2f59a99923a8

Da das Matter SDK über Ihren Containerhost bereitgestellt wird, ist das OTA-Image auf Ihrem Containerhost verfügbar.

Laden Sie das OTA-Image auf die Developer Console hoch. Folgen Sie dazu der Anleitung zum OTA-Upload.

Google Home in Auftrag geben und OTA beobachten

Achten Sie darauf, dass Ihr Gerät über USB mit dem Linux-Hostcomputer verbunden ist. Im folgenden Beispiel wird gezeigt, wie die Geräteprotokolle mit GNU screen gelesen werden:

screen -L /dev/ttyUSB0 115200

Dadurch wird die Ausgabe des Geräts im Terminal angezeigt und in die Standard-Bildschirmprotokolldatei screenlog.0 geschrieben.

Sie können die screenlog.0-Datei in einem anderen Texteditor öffnen oder mit cat, tail, more oder grep in einer anderen Shell anzeigen.

Drücken Sie die rote Taste zum Zurücksetzen an der Seite des Geräts, um Protokolle vom Start zu sehen.

In der Geräteausgabe sollten die zuvor festgelegte VID und PID sowie eine URL zum QR-Code-Bild angezeigt werden, mit dem Sie das Gerät in Betrieb nehmen.

[0;32mI (2388) chip[DIS]: Advertise commission parameter vendorID=XXXXX productID=XXXX discriminator=3840/15 cm=1[0m

[0;32mI (1928) chip[SVR]: SetupQRCode: [MT:E59-000000000000000][0m

https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%3AE59-000000000000000

Achten Sie darauf, dass Ihr Hub zu Hause online ist.

Stellen Sie das Gerät mit der Google Home app (GHA) über den QR-Code aus dem Link in der Protokolldatei in Betrieb.

Lassen Sie das Gerät nach der Inbetriebnahme einige Minuten lang laufen. Sie sollten die Protokollausgabe im Zusammenhang mit OTA-Anfrage, OTA-Image-Download und OTAImageProcessor beobachten.

Prüfen Sie nach der Installation des Images, ob die Kompilierungszeit des Images mit der Zeit des in die Konsole hochgeladenen Images übereinstimmt und später als die beim ersten Start gemeldete Kompilierungszeit ist. Die Ausführung von grep mit dem folgenden Muster im Regex-Modus auf screenlog.0 kann den OTA-Prozess veranschaulichen:

$ grep -E "(Compile time|OTA)" screenlog.0
I (76) boot:  1 otadata          OTA data         01 00 0000f000 00002000
I (91) boot:  3 ota_0            OTA app          00 10 00020000 00177000
I (99) boot:  4 ota_1            OTA app          00 11 001a0000 00177000
I (645) cpu_start: Compile time:     Oct 15 2022 06:21:59
I (135558) chip[SWU]: OTA Requestor received AnnounceOTAProvider
I (540658) chip[SWU]: OTA image downloaded to offset 0x1a0000
I (541348) OTAImageProcessor: Applying, Boot partition set offset:0x1a0000
I (76) boot:  1 otadata          OTA data         01 00 0000f000 00002000
I (91) boot:  3 ota_0            OTA app          00 10 00020000 00177000
I (99) boot:  4 ota_1            OTA app          00 11 001a0000 00177000
I (645) cpu_start: Compile time:     Oct 15 2022 07:35:31
I (76) boot:  1 otadata          OTA data         01 00 0000f000 00002000
I (91) boot:  3 ota_0            OTA app          00 10 00020000 00177000
I (99) boot:  4 ota_1            OTA app          00 11 001a0000 00177000
I (645) cpu_start: Compile time:     Oct 15 2022 07:35:31

Nach der ersten Ausführung können Sie die Schritte im Abschnitt OTA-Image erstellen und hochladen wiederholen, ohne ein neues Image hochzuladen. Setzen Sie die Versionen dieses Mal auf 1 zurück.

Führen Sie menuconfig aus und wählen Sie in den interaktiven Menüoptionen Folgendes aus:

  1. Component config -->

  2. CHIP Device Layer --->

  3. Device Identification Options

  4. Setzen Sie Version String auf v1.0.

  5. Setzen Sie Device Software Version Number auf 1.

  6. Drücken Sie s, um die Konfiguration zu speichern, und dann q, um menuconfig zu schließen.

Entfernen Sie das Gerät in der GHA aus Ihrem Zuhause.

Erstellen Sie das Image, falls noch nicht geschehen:

idf.py build

So flashen Sie das Gerät:

idf.py -p /dev/ttyUSB0 erase_flash
idf.py -p /dev/ttyUSB0 flash

Wiederhole bei Bedarf die Schritte unter Für Google Home in Betrieb nehmen und OTA beobachten.

OTA-Softwareupdate validieren

Die Gerätesoftwareversion kann über die Google Home App (GHA) geprüft werden. Sobald ein Gerät in Betrieb genommen wurde, gehen Sie so vor:

  1. Drücken Sie auf dem Hauptbildschirm von GHA lange auf die Gerätekachel.
  2. Tippe oben rechts auf das Symbol .
  3. Tippen Sie auf Technische Daten.
  4. Prüfen Sie das Feld Softwareversion.

Bildschirm der Google Home App mit dem Feld für die Softwareversion