OTA auf Espressif ESP32 testen

In den folgenden Anleitungen wird das Beispiel für die Beleuchtungs-App aus dem Matter SDK zusammen mit einem M5Stack ESP32 Entwicklungsboard verwendet.

Build-Umgebung einrichten

Klonen Sie zuerst das Matter SDK.

In diesem Beispiel prüfen wir den minimal unterstützten Commit für Google Home's Matter Release 5:

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 Version, die im ESP32 GitHub-Workflow verwendet wird, 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 zu mounten und Zugriff auf das ESP32-Gerät zu ermöglichen.

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

Jedes Mal, wenn Sie einen docker run-Befehl ausführen, erstellen Sie einen neuen Container mit dem angegebenen Image. Dabei gehen Ihre alten Daten verloren, die in einer vorherigen Containerinstanz gespeichert wurden. Manchmal ist das gewünscht, da Sie so mit einer Neuinstallation beginnen können. In diesem Beispiel möchten Sie Ihre Arbeit und die Umgebungskonfiguration jedoch wahrscheinlich zwischen den Sitzungen speichern.

user@host> docker stop container_name

Wenn Sie wieder bereit sind, 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 folgendem Befehl öffnen:

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

Oder starten Sie eine Root-Sitzung mit folgendem Befehl:

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

SDK initialisieren

Im Container initialisieren wir das Matter SDK und 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 Entwicklerkit flashen, um das Matter OTA-Firmwareupdate zu erhalten.

Dazu müssen Sie ein Image erstellen.

Konfigurieren Sie zuerst den Build mit dem menuconfig-Tool 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 Vendor ID auf die von Connectivity Standards Alliance (Alliance) zugewiesene VID fest.

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

Aktivieren Sie das Flag „OTA Requestor“:

  1. Component config -->

  2. CHIP Core -->

  3. System options --->

  4. Aktivieren Sie das Flag „OTA Requestor“ [*] Enable OTA Requestor.

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

Aktivieren Sie das Matter Flag 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. Wählen Sie [*] Get the project version from Kconfig aus.

  3. Legen Sie Project version (NEW) auf 1.0 fest.

  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 jetzt 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 noch einmal die Build-Einstellungen, um ein OTA-Image zu erstellen. Verwenden Sie dasselbe Image, aber mit einer erhöhten Versionsnummer.

Führen Sie menuconfig aus.

idf.py menuconfig

Aktualisieren Sie im interaktiven Menü Folgendes:

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

Erstellen Sie das Image und rufen Sie es ab. Das Beispiel zeigt sowohl den Speicherort des Images für OTA als auch die Ausgabe beim Parsen mit ota_image_tool.py.

cd build && /workspace/src/app/ota_image_tool.py show ./chip-lighting-app-ota.bin

Die Ausgabe sieht so aus:

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 vom Containerhost gemountet wird, ist das OTA-Image auf Ihrem Containerhost verfügbar.

Folgen Sie der Anleitung zum Hochladen von OTA-Images, um das OTA-Image in die Developer Console hochzuladen.

In Google Home einbinden und OTA beobachten

Achten Sie darauf, dass Ihr Gerät über USB mit dem Linux-Hostcomputer verbunden ist. Im folgenden Beispiel wird GNU screen verwendet, um die Gerätelogs zu lesen:

screen -L /dev/ttyUSB0 115200

Dadurch wird die Ausgabe vom Gerät in Ihrem Terminal angezeigt und gleichzeitig in die Standard-Screen-Logdatei screenlog.0 geschrieben.

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

Drücken Sie die rote Reset-Taste an der Seite des Geräts, um die Logs vom Startvorgang zu sehen.

In der Geräteausgabe sollten die VID und PID angezeigt werden, die Sie zuvor festgelegt haben, sowie eine URL zum QR-Code-Image, mit dem Sie das Gerät einbinden.

[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 in Ihrem Zuhause online ist.

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

Lassen Sie das Gerät nach der Einbindung einige Minuten lang ununterbrochen laufen. Sie sollten Logausgaben zu OTA Requestor, OTA-Image-Download und OTAImageProcessor sehen.

Nachdem das Image installiert wurde, prüfen Sie, ob die Kompilierungszeit des Images mit der des in die Console hochgeladenen Images übereinstimmt und später als die Kompilierungszeit ist, die beim ersten Start gemeldet wurde. Wenn Sie grep mit dem folgenden Muster im Modus für reguläre Ausdrücke auf screenlog.0 ausführen, können Sie den OTA-Prozess veranschaulichen:

grep -E "(Compile time|OTA)" screenlog.0

Die Ausgabe sieht so aus:

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

Führen Sie menuconfig aus und legen Sie in den interaktiven Menüoptionen Folgendes fest:

  1. Component config -->

  2. CHIP Device Layer --->

  3. Device Identification Options

  4. Legen Sie Version String auf v1.0 fest.

  5. Legen Sie Device Software Version Number auf 1 fest.

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

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

Erstellen Sie das Image, falls es noch nicht erstellt wurde:

idf.py build

Flashen Sie es:

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

Wiederholen Sie die Schritte unter In Google Home einbinden und OTA beobachten nach Bedarf.

OTA-Softwareupdate validieren

Die Version der Gerätesoftware kann über die Google Home App (GHA) geprüft werden. Sobald ein Gerät eingebunden ist, gehen Sie so vor:

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

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