OTA auf Espressif ESP32 testen

In der folgenden Anleitung wird das Beispiel einer Lighting-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 das mindestens unterstützte 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 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 die 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, 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 so, was Sie möchten, weil Sie so mit einer neuen Installation beginnen können. In diesem Beispiel möchten Sie Ihre Arbeits- und Umgebungskonfiguration jedoch höchstwahrscheinlich zwischen Sitzungen speichern.

user@host> docker stop container_name

Wenn Sie zur erneuten Ausführung 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

Mit den folgenden Methoden können Sie 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

Initialisieren Sie im Container 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

Build und Flash

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

Dazu müssen Sie ein Image erstellen.

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

  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. Flag [*] Enable OTA Requestor für OTA-Anfragesteller aktivieren

  5. Drücken Sie zweimal die ESC, um zur obersten Menüebene zurückzukehren.

Aktivieren Sie das Flag Matter zur 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

Führen Sie die Schritte unter Matter-Testzertifikate erstellen aus, um CD-, DAC- und PAI-Zertifikate zu erstellen.

Dein Gerät zusammenstellen

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 erneut, um ein OTA-Image zu erstellen. Verwenden Sie dasselbe Image, jedoch mit erhöhter 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, und zweimal die Eingabetaste. Drücken Sie dann q, um menuconfig zu beenden.

Erstellen Sie das Image und rufen Sie es ab. Das folgende 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
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.

Lade das OTA-Image auf Developer Console hoch. Folge dazu der Anleitung zum OTA-Upload.

Inbetriebnahme für Google Home und Beobachtung von Onlinereisebüros

Das Gerät muss über USB mit dem Linux-Hostcomputer verbunden sein. Das folgende Beispiel zeigt die Verwendung von GNU screen zum Lesen der Geräteprotokolle:

screen -L /dev/ttyUSB0 115200

Dadurch wird die Ausgabe des Geräts auf Ihrem Terminal angezeigt und dieselbe Ausgabe in die Standardbildschirm-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 Taste zum Zurücksetzen an der Seite des Geräts, um die Protokolle vom Start anzuzeigen.

In der Geräteausgabe sollten die zuvor festgelegte VID und PID sowie eine URL zu dem 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

Vergewissere dich, dass dein Hub in deinem Zuhause online ist.

Nehmen Sie das Gerät mit der Google Home app (GHA) in Betrieb. Verwenden Sie dazu den QR-Code aus dem Link in der Logdatei.

Lassen Sie das Gerät nach der Inbetriebnahme einige Minuten lang ohne Unterbrechung laufen. Sie sollten die Logausgabe im Zusammenhang mit dem OTA-Requestor, dem OTA-Image-Download und OTAImageProcessor beobachten.

Beachten Sie nach der Installation des Images, dass die Kompilierungszeit des Images mit der des Images übereinstimmt, das in die Konsole hochgeladen wurde, und nach der Kompilierungszeit liegt, die beim ersten Start gemeldet wurde. Die Ausführung von grep mit dem folgenden Muster im Regex-Modus in 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 diesmal auf 1 zurück.

Führen Sie menuconfig aus und führen 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 aus deinem Zuhause in „GHA“.

Erstellen Sie das Image, falls noch nicht geschehen:

idf.py build

Flashen:

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

Wiederholen Sie bei Bedarf die Schritte unter Inbetriebnahme für Google Home und beobachten Sie das Over-the-Air-Update (OTA).

OTA-Softwareupdate validieren

Die Gerätesoftwareversion kann über die Google Home App (GHA) geprüft werden. Nach der Inbetriebnahme eines Geräts gehen Sie so vor:

  1. Halte die Gerätekachel auf dem Hauptbildschirm von GHA lange gedrückt
  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, auf dem das Feld für die Softwareversion angezeigt wird