OTA auf Espressif ESP32 testen

In der folgenden Anleitung wird das Beispiel der 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 sehen wir uns den minimal unterstützten Commit für Release 5 von Matter 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 festzustellen, welches Docker-Image am besten zu unserem Build passt:

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 wurden. Manchmal ist das genau das, was Sie wollen, weil Sie so mit einer Neuinstallation beginnen können. In diesem Beispiel möchten Sie Ihre Arbeit und Umgebungskonfiguration jedoch wahrscheinlich zwischen den Sitzungen speichern.

user@host> docker stop container_name

Wenn Sie bereit sind, den Container wieder auszuführen, starten Sie ihn 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 öffnen:

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

Oder starten Sie 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 ESP IDF:

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

Build erstellen und flashen

Die nächste Aufgabe besteht darin, das Image zu erstellen und das Development Kit zu flashen, um das OTA-Firmware-Update Matter zu erhalten.

Dazu müssen Sie ein Image erstellen.

Konfigurieren Sie zuerst den Build mit dem Dienstprogramm menuconfig aus dem 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. Lege für Vendor ID die von Connectivity Standards Alliance (Alliance) zugewiesene VID fest.

  5. Legen Sie für Product ID 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 ESC, 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, drücken Sie zweimal die Eingabetaste und dann q, um menuconfig zu beenden.

Testzertifikate einrichten

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

Gerät erstellen

Führe jetzt den Build aus und flashe das Gerät:

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

OTA-Image erstellen und hochladen

Ändere jetzt die Build-Einstellungen noch einmal, um ein OTA-Image zu erstellen. Verwenden Sie dasselbe Image, aber mit einer höheren 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, drücken Sie zweimal die Eingabetaste und drücken Sie 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 dem 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 von Ihrem Containerhost bereitgestellt wird, ist das OTA-Image auf Ihrem Containerhost verfügbar.

Lade das OTA-Image gemäß der Anleitung zum Hochladen von OTA-Images in das Developer Console hoch.

Inbetriebnahme in Google Home und OTA beobachten

Achte darauf, dass dein Gerät über USB mit dem Linux-Hostcomputer verbunden ist. Im folgenden Beispiel wird die Verwendung von GNU screen zum Lesen der Geräteprotokolle gezeigt:

screen -L /dev/ttyUSB0 115200

Dadurch wird die Ausgabe des Geräts in Ihrem Terminal angezeigt und dieselbe Ausgabe in die Standard-Bildschirmprotokolldatei mit dem Namen screenlog.0 geschrieben.

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

Drücke die rote Reset-Taste an der Seite des Geräts, um die Logs vom Bootvorgang aufzurufen.

In der Geräteausgabe sollten die zuvor festgelegten VID und PID sowie eine URL zum QR-Code-Bild angezeigt werden, das du für die Inbetriebnahme des Geräts verwendest.

[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

Dein Hub muss in deinem Zuhause online sein.

Nimm das Gerät mit dem Google Home app (GHA) in Betrieb. Verwende dazu den QR-Code aus dem Link, der in der Protokolldatei angezeigt wird.

Lass das Gerät nach der Inbetriebnahme einige Minuten lang ununterbrochen laufen. Sie sollten Logausgaben im Zusammenhang mit dem OTA-Anforderer, dem 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 nach der Kompilierungszeit liegt, 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 kannst du 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 beenden.

Entferne das Gerät in der GHA aus deinem Zuhause.

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

idf.py build

Flashen:

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

Wiederhole die Schritte unter In Google Home in Betrieb nehmen und OTA beobachten nach Bedarf.

OTA-Softwareupdate validieren

Die Softwareversion des Geräts kann in der Google Home App (GHA) geprüft werden. Nachdem ein Gerät in Betrieb genommen wurde, gehe so vor:

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

Bildschirm der Google Home App mit dem Feld „Softwareversion“