Hands-on Matter - Die Matter-Lampe (Teil 2)

In Teil 1 dieser Blogserie haben wir einen theoretischen Überblick gegeben, indem wir Alices Weg vom Auspacken eines neuen Matter-Schalters bis zur Inbetriebnahme des Geräts innerhalb der Fabric sowie dessen Verbindung mit einer Matter-Lampe verfolgt haben. In den folgenden Teilen werden wir nachstellen wie Alice ihr System aufgesetzt hat. In diesem Teil beginnen wir mit einer Matter-Lampe. Wir werden anhand dieses Beispiels demonstrieren wie ein Matter-Gerät funktioniert. Dafür werden wir einen ESP32 mit einer einfachen LED und einem Widerstand verwenden, um unsere eigene Matter-Lampe als Proof of Concept zu erstellen.

Tim Conrad — Senior Security Consultant

4. Oktober 2022


Hinweis

Dieser Blogbeitrag richtet sich an Entwickler und andere Personen mit technischem Hintergrund und Interesse an einem auf Sicherheit ausgerichteten Überblick über Matter.

Achtung:

Bitte beachten Sie, dass der Matter-Code Open Source ist, so dass sich viele Beispiele und Tools im Laufe des Prozesses ändern können. Wir werden alles auf Ubuntu 20.04 machen. Für andere Systeme werden wir den Link zum Originaldokument im Matter-Repository zur Verfügung stellen.

Hardware-Setup und Komponenten

ESP32 und LED-Schaltpläne:

Um unsere Lampe zu bauen, benötigen wir die folgenden Komponenten:

  • ESP32-WROOM DevKitC
  • 330 Ohm Widerstand
  • LED
  • Drähte
  • Breadboard
  • Micro-USB-Kabel
  • Computer mit BLE und WiFi

Für unsere Matter-Lampe sollten die Kosten für die Hardware unter 10€ liegen. Platzieren Sie den ESP32 auf dem Breadboard und verbinden Sie die LED und den Widerstand mit den Drähten wie auf dem Bild gezeigt. In unserem Fall wird der GPIO 2 (beschriftet mit “G2” oder “2”) verwendet. Nachdem wir unsere Grundschaltung aufgebaut haben, verbinden wir den ESP32 über das USB-Kabel mit unserem Computer.

(Matter) Chip GitHub Repository

Das Matter-GitHub-Repository ist hier zu finden: https://github.com/project-chip/connectedhomeip Zuerst werden wir das Repository wie hier beschrieben bootstrappen und dann einen Blick auf die Verzeichnisstruktur werfen, wie in BUILDING.md beschrieben.

sudo apt-get install git gcc g++ python pkg-config libssl-dev libdbus-1-dev \
     libglib2.0-dev libavahi-client-dev ninja-build python3-venv python3-dev \
     python3-pip unzip libgirepository1.0-dev libcairo2-dev
     
git clone --recurse-submodules git@github.com:project-chip/connectedhomeip.git

cd connectedhomeip/

source scripts/bootstrap.sh

source scripts/activate.sh

Bei der Betrachtung unserer Repository-Struktur gibt es einige Bereiche, die für uns von besonderem Interesse sind:

  • docs/guides - hier sind plattformspezifische Anleitungen und Benutzerhandbücher, die bei der Einrichtung bestimmter Tools helfen, z. B. das chip-tool, das CLI-Tool zur Interaktion mit Matter-Geräten.
  • examples/ - hier sind alle Beispielprojekte für verschiedene Plattformen nach Anwendungen sortiert, z. B. enthält die all-cluster-app alle verfügbaren Funktionen von Matter in einer Anwendung und ist die beste Anwendung, um die ersten Schritte damit zu wagen.

Für unser Setup müssen wir zwei Anwendungen erstellen, erstens das chip-tool und zweitens die all-cluster-app for the ESP32.

Bau des Chip-Tools

Aus dem Root-Verzeichnis des Repositorys können Sie das Chip-Tool direkt mit dem folgenden Befehl erstellen.

scripts/examples/ gn_build_example.sh 
examples/chip-tool out/chip-tool

Code-Änderungen:

Während die Arbeit mit dem master-Branch des Matter-Repositorys Ihnen Zugang zu den neuesten Funktionen verschafft, kann es aufgrund der schnellen Code-Änderungen von Zeit zu Zeit zu Problemen kommen. In den meisten Fällen löst ein erneuter Pull und ein Wiederholen des Bootstrapen das Problem. Falls das Bootstrapen fehlschlägt, löschen Sie den Ordner .environment/ und starten Sie erneut.


Nachdem Sie das Chip-Tool erfolgreich erstellt haben, können Sie es mit dem folgenden Befehl starten.

out/chip-tool/chip-tool

Die Ergebnis sieht in etwa so aus.

[1649943820.702390][30597:30597] CHIP:TOO: Missing cluster name
Usage:
  out/chip-tool/chip-tool cluster_name command_name [param1 param2 ...]

  +-------------------------------------------------------------------------------------+
  | Clusters:                                                                           |
  +-------------------------------------------------------------------------------------+
  | * accesscontrol                                                                     |
  | * accountlogin                                                                      |
  | * administratorcommissioning                                                        |
  | * alarms                                                                            |
  | * any                                                                               |
  | * appliancecontrol                                                                  |
  | * applianceeventsandalert                                                           |
  | * applianceidentification                                                           |
  | * appliancestatistics                                                               |
  | * applicationbasic                                                                  |
  | * applicationlauncher                                                               |
  | * audiooutput                                                                       |
  | * ballastconfiguration                                                              |
  | * barriercontrol                                                                    |
  | * basic                                                                             |
  | * binaryinputbasic                                                                  |
  | * binding                                                                           |
  | * booleanstate                                                                      |
  | * bridgedactions                                                                    |
  | * bridgeddevicebasic                                                                |
  | * bromateconcentrationmeasurement                                                   |
  | * bromodichloromethaneconcentrationmeasurement                                      |
  | * bromoformconcentrationmeasurement                                                 |
  | * carbondioxideconcentrationmeasurement                                             |
  | * carbonmonoxideconcentrationmeasurement                                            |
  | * channel                                                                           |
  | * chloraminesconcentrationmeasurement                                               |
  | * chlorineconcentrationmeasurement                                                  |
  | * chlorodibromomethaneconcentrationmeasurement                                      |
  | * chloroformconcentrationmeasurement                                                |
  | * colorcontrol                                                                      |
  | * contentlauncher                                                                   |
  | * copperconcentrationmeasurement                                                    |
  | * dehumidificationcontrol                                                           |
  | * descriptor                                                                        |
  | * devicetemperatureconfiguration                                                    |
  | * diagnosticlogs                                                                    |
  | * discover                                                                          |
  | * dissolvedoxygenconcentrationmeasurement                                           |
  | * doorlock                                                                          |
  | * electricalmeasurement                                                             |
  | * ethernetnetworkdiagnostics                                                        |
  | * ethyleneconcentrationmeasurement                                                  |
  | * ethyleneoxideconcentrationmeasurement                                             |
  | * fancontrol                                                                        |
  | * fecalcoliformandecoliconcentrationmeasurement                                     |
  | * fixedlabel                                                                        |
  | * flowmeasurement                                                                   |
  | * fluorideconcentrationmeasurement                                                  |
  | * generalcommissioning                                                              |
  | * generaldiagnostics                                                                |
  | * groupkeymanagement                                                                |
  | * groupsettings                                                                     |
  | * groups                                                                            |
  | * haloaceticacidsconcentrationmeasurement                                           |
  | * hydrogenconcentrationmeasurement                                                  |
  | * hydrogensulphideconcentrationmeasurement                                          |
  | * iasace                                                                            |
  | * iaswd                                                                             |
  | * iaszone                                                                           |
  | * identify                                                                          |
  | * illuminancemeasurement                                                            |
  | * keypadinput                                                                       |
  | * leadconcentrationmeasurement                                                      |
  | * levelcontrol                                                                      |
  | * localizationconfiguration                                                         |
  | * lowpower                                                                          |
  | * manganeseconcentrationmeasurement                                                 |
  | * mediainput                                                                        |
  | * mediaplayback                                                                     |
  | * messaging                                                                         |
  | * meteridentification                                                               |
  | * modeselect                                                                        |
  | * networkcommissioning                                                              |
  | * nitricoxideconcentrationmeasurement                                               |
  | * nitrogendioxideconcentrationmeasurement                                           |
  | * occupancysensing                                                                  |
  | * onoff                                                                             |
  | * onoffswitchconfiguration                                                          |
  | * operationalcredentials                                                            |
  | * otasoftwareupdateprovider                                                         |
  | * otasoftwareupdaterequestor                                                        |
  | * oxygenconcentrationmeasurement                                                    |
  | * ozoneconcentrationmeasurement                                                     |
  | * pairing                                                                           |
  | * payload                                                                           |
  | * pollcontrol                                                                       |
  | * powerconfiguration                                                                |
  | * powerprofile                                                                      |
  | * powersource                                                                       |
  | * powersourceconfiguration                                                          |
  | * pressuremeasurement                                                               |
  | * proxyconfiguration                                                                |
  | * proxydiscovery                                                                    |
  | * proxyvalid                                                                        |
  | * pulsewidthmodulation                                                              |
  | * pumpconfigurationandcontrol                                                       |
  | * relativehumiditymeasurement                                                       |
  | * scenes                                                                            |
  | * shadeconfiguration                                                                |
  | * sodiumconcentrationmeasurement                                                    |
  | * softwarediagnostics                                                               |
  | * subscriptions                                                                     |
  | * sulfateconcentrationmeasurement                                                   |
  | * sulfurdioxideconcentrationmeasurement                                             |
  | * switch                                                                            |
  | * targetnavigator                                                                   |
  | * temperaturemeasurement                                                            |
  | * testcluster                                                                       |
  | * tests                                                                             |
  | * thermostat                                                                        |
  | * thermostatuserinterfaceconfiguration                                              |
  | * threadnetworkdiagnostics                                                          |
  | * time                                                                              |
  | * timeformatlocalization                                                            |
  | * timesynchronization                                                               |
  | * totalcoliformbacteriaconcentrationmeasurement                                     |
  | * totaltrihalomethanesconcentrationmeasurement                                      |
  | * turbidityconcentrationmeasurement                                                 |
  | * unitlocalization                                                                  |
  | * userlabel                                                                         |
  | * wakeonlan                                                                         |
  | * wifinetworkdiagnostics                                                            |
  | * windowcovering                                                                    |
  | * interactive                                                                       |
  +-------------------------------------------------------------------------------------+
[1649943820.702695][30597:30597] CHIP:TOO: Run command failure: 
../../examples/chip-tool/commands/common/Commands.cpp:71: Error 0x0000002F

Unsere Ergebnis wird die folgende Fehlermeldung enthalten [1649943820.702390][30597:30597] CHIP:TOO: Missing cluster name, die wir jetzt ignorieren werden. Nachdem wir die Firmware für den ESP32 erstellt und geflasht haben, werden wir auf das Thema Cluster zurückkommen und dieses Konzept ausführlicher diskutieren.

Erstellen der all-cluster-app

Als erstes müssen Sie Espressifs ESP-IDF installieren, um die Beispiele zu bauen und zu flashen (alle Anweisungen finden Sie auch im Beispiel, wenn etwas nicht wie beschrieben funktioniert, schauen Sie hier).

mkdir ${HOME}/tools
cd ${HOME}/tools
git clone https://github.com/espressif/esp-idf.git
cd esp-idf
git checkout v4.4
git submodule update --init
./install.sh
. ./export.sh

Gehen Sie nun zurück zum Matter-Repository und aktivieren Sie die Umgebung.

cd /path/to/connectedhomeip
source scripts/activate.sh

cd examples/all-clusters-app/esp32
idf.py set-target esp32
idf.py build

Nachdem die Firmware erfolgreich erstellt wurde, können Sie nun den ESP32 flashen und die Ergebnisse überwachen. Hier ist /dev/ttyUSB0 der ESP32, dies kann auf Ihrem System anders sein oder wenn Sie mehr als ein Entwicklungsboard angeschlossen haben.

idf.py -p /dev/ttyUSB0 flash monitor

Löschen Sie den Flash des ESP3:

Der ESP32 behält Änderungen, wie z.B. Netzwerk-Zugangsdaten, ACLs oder NOCs, auf dem Flash bei, daher müssen Sie das Flash löschen, bevor Sie mit einem leeren Gerät beginnen.

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

Im Folgenden wird das Blinken des ESP und das Monitoring des Geräts gezeigt.

Jetzt haben Sie das Chip-Tool und den ESP erfolgreich mit allem ausgestattet, was Sie für Ihr erstes Matter-Gerät brauchen. Jetzt brauchen wir noch ein bisschen mehr Theorie darüber, wie das Interaktionsmodell funktioniert. Danach werden wir unser neues Gerät in unser eigenes WiFi-Netzwerk einbinden. Wenn Sie kein WiFi haben, das Sie benutzen können, können Sie mit Ubuntu einen eigenen Wifi-Zugangspunkt erstellen, wie hier beschrieben.

Endpoints, Clusters, Commands und Attributes

Das Interaktionsmodell ist recht einfach zu verstehen. Wir werden es anhand unseres Lampen-Beispiels weiter erläutern. Zur Veranschaulichung betrachten wir das Licht als dimmbar, ohne Farbwechsel oder andere ausgefallene Funktionen. Die typischen Funktionen einer herkömmlichen dimmbaren Lampe sind also:

  • Einschalten des Lichts
  • Ausschalten des Lichts
  • Einstellen der Helligkeit auf eine bestimmte Stufe

In Matter gruppieren wir diese Funktionen in Clustern und legen diese Endpoints und den Nodes/das Gerät offen. Die folgende Abbildung gibt einen vereinfachten Überblick über das Interaktionsmodell.

Lassen Sie uns diese Abbildung Schritt für Schritt besprechen:

  • Node - Das physische Gerät im Netzwerk, dargestellt durch eine Node ID in unserer Fabric.
  • Endpoint - Beziehen sich auf eine Geräteeigenschaft. z.B. würde ein Beleuchtungsgerät mit zwei Lampen zwei identische Endpoints haben, um jede Lampe separat zu steuern. Endpoint 0 ist für Matter-spezifische Funktionen reserviert, wie z. B. die Kopplung des Geräts mit dem Netzwerk.
  • Cluster - Eine Reihe von Funktionen, die über einen bestimmten Endpunkt gesteuert werden. So wird z. B. die Funktion zum Ein- und Ausschalten des Geräts als OnOff-Cluster bezeichnet.
    • Server - Eine Lampe würde einen Cluster-Server implementieren, der auf Befehle zum Ein- und Ausschalten des Lichts wartet.
    • Clients - Ein Lichtschalter würde einen Cluster-Client implementieren, der der Lampe Ein/Aus-Befehle sendet.
  • Commands - Löst eine bestimmte Aktion auf dem Cluster aus. Z.B. Licht einschalten.
  • Attribute - Speichert Informationen über einen bestimmten Cluster-Zustand. Ist z. B. das Licht ein- oder ausgeschaltet?

Mit diesem Hintergrundwissen können wir nun das Chip-Tool verwenden, um unser ESP32 Matter-Gerät in Betrieb zu nehmen.

Inbetriebnahme des ESP32

Um die Inbetriebnahme zu starten, benötigen wir die folgenden Dinge:

  • WiFi Network Credentials (wir verwenden die SSID “IoT Testing” und das Passwort “NotTheRealPassword”)
  • Gerätediskriminator (in diesem Beispiel ist es “3840”)
  • Gerätepasswort (in diesem Beispiel ist es “20202021”)
Discriminator:

Ein Discriminator hilft bei der weiteren Identifizierung potenzieller Geräte während des Einrichtungsprozesses und trägt dazu bei, die Geschwindigkeit und Stabilität der Einrichtung für den Benutzer zu verbessern. Der Discriminator sollte für jedes einzelne Gerät unterschiedlich sein.

Als erstes wollen wir unseren Laptop mit dem Chip-Tool (der Commissioner) mit unserem ESP32 (der Commissionee) koppeln und die WiFi-Anmeldedaten bereitstellen, der folgende Befehl wird dies für uns tun. Die Node ID (hier “12344321”) kann frei gewählt werden.

# ./chip-tool pairing ble-wifi node-id ssid password setup-pin-code discriminator 
./chip-tool pairing ble-wifi 12344321 "IoT Testing" NotTheRealPassword 20202021 3840

Dies führt das komplette Commissioning durch, die in Teil 1 beschrieben wurde. Im GIF unten sehen Sie sowohl das Monitoring des Geräts (unten) als auch das Commissioning mit dem Chip-Tool (oben).

Werfen wir einen Blick auf die Logs des chip-tool für das Commissioning und vergleichen wir die Ausgabe mit dem, was wir in Teil 1 gelernt haben.

Der Ort, an dem die Fabric-Anmeldedaten gespeichert sind. Sie müssen diese Dateien sichern, wenn Sie den Zugang zu Ihren Materie-Geräten behalten wollen, da sie nach einem Neustart entfernt werden, wenn der Ordner /tmp geleert wird.

[...]
[1658309310.347076][132461:132461] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /tmp/chip_kvs
[1658309310.347179][132461:132461] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /tmp/chip_factory.ini
[1658309310.347204][132461:132461] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /tmp/chip_config.ini
[1658309310.347218][132461:132461] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /tmp/chip_counters.ini
[...]

Die Protokollausgabe mit Kommentaren (englisch) zur Erläuterung der einzelnen Abschnitte und einer Zusammenfassung am Ende der Auflistung.

[...]

# Finding the BLE device and matching with the discriminator
[1658309311.070510][132461:132464] CHIP:BLE: New device scanned: C8:C9:A3:C5:65:BA
[1658309311.070546][132461:132464] CHIP:BLE: Device discriminator match. Attempting to connect.
[...]
[1658309312.208721][132461:132464] CHIP:DL: ConnectDevice complete
[...]

# Start of PASE and successfull session establishment to communicate securly via BLE
[1658309313.022392][132461:132467] CHIP:SC: Sent spake2p msg1
[...]
[1658309315.540046][132461:132467] CHIP:SC: Received spake2p msg2
[...]
[1658309315.540344][132461:132467] CHIP:SC: Sent spake2p msg3
[...]
[1658309315.672418][132461:132467] CHIP:SC: SecureSession[0x7fdfa0001a30]: Moving from state 'kEstablishing' --> 'kActive'
[1658309315.672421][132461:132467] CHIP:IN: SecureSession[0x7fdfa0001a30]: Activated - Type:1 LSID:45062
[1658309315.672425][132461:132467] CHIP:IN: New secure session activated for device <FFFFFFFB00000000, 0>, LSID:45062 PSID:44671!
[1658309315.672431][132461:132467] CHIP:CTL: Remote device completed SPAKE2+ handshake
[1658309315.672434][132461:132467] CHIP:TOO: Pairing Success
[1658309315.672437][132461:132467] CHIP:TOO: PASE establishment successful
[1658309315.672440][132461:132467] CHIP:CTL: Commissioning stage next step: 'SecurePairing' -> 'ReadCommissioningInfo'
[...]

# ReadCommissioningInfo -> ArmFailSafe -> ConfigRegulatory:
# Basic configuration for the commissioning
[1658309315.856534][132461:132467] CHIP:CTL: Successfully finished commissioning step 'ReadCommissioningInfo'
[1658309315.856550][132461:132467] CHIP:CTL: Commissioning stage next step: 'ReadCommissioningInfo' -> 'ArmFailSafe'
[...]
[1658309316.035322][132461:132467] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_0030 Command=0x0000_0001
[1658309316.035345][132461:132467] CHIP:CTL: Received ArmFailSafe response errorCode=0
[1658309316.035362][132461:132467] CHIP:CTL: Successfully finished commissioning step 'ArmFailSafe'
[1658309316.035372][132461:132467] CHIP:CTL: Commissioning stage next step: 'ArmFailSafe' -> 'ConfigRegulatory'
[...]
[1658309316.213618][132461:132467] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_0030 Command=0x0000_0003
[1658309316.213637][132461:132467] CHIP:CTL: Received SetRegulatoryConfig response errorCode=0
[1658309316.213647][132461:132467] CHIP:CTL: Successfully finished commissioning step 'ConfigRegulatory'
[1658309316.213652][132461:132467] CHIP:CTL: Commissioning stage next step: 'ConfigRegulatory' -> 'SendPAICertificateRequest'
[...]

# SendPAICertificateRequest -> SendDACCertificateRequest -> SendAttestationRequest -> AttestationVerification:
# Perform the Device Attestation process to validate the authenticity of the device.
[1658309316.405915][132461:132467] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_003E Command=0x0000_0003
[1658309316.405925][132461:132467] CHIP:CTL: Received certificate chain from the device
[1658309316.405934][132461:132467] CHIP:CTL: Successfully finished commissioning step 'SendPAICertificateRequest'
[1658309316.405941][132461:132467] CHIP:CTL: Commissioning stage next step: 'SendPAICertificateRequest' -> 'SendDACCertificateRequest'
[...]
[1658309316.582616][132461:132467] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_003E Command=0x0000_0003
[1658309316.582638][132461:132467] CHIP:CTL: Received certificate chain from the device
[1658309316.582659][132461:132467] CHIP:CTL: Successfully finished commissioning step 'SendDACCertificateRequest'
[1658309316.582675][132461:132467] CHIP:CTL: Commissioning stage next step: 'SendDACCertificateRequest' -> 'SendAttestationRequest'
[...]
[1658309317.296396][132461:132467] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_003E Command=0x0000_0001
[1658309317.296407][132461:132467] CHIP:CTL: Received Attestation Information from the device
[1658309317.296416][132461:132467] CHIP:CTL: Successfully finished commissioning step 'SendAttestationRequest'
[1658309317.296434][132461:132467] CHIP:CTL: Commissioning stage next step: 'SendAttestationRequest' -> 'AttestationVerification'
[...]
[1658309317.296446][132461:132467] CHIP:CTL: Verifying attestation
[1658309317.298651][132461:132467] CHIP:CTL: Successfully validated 'Attestation Information' command received from the device.
[1658309317.298687][132461:132467] CHIP:CTL: Successfully finished commissioning step 'AttestationVerification'
[1658309317.298693][132461:132467] CHIP:CTL: Commissioning stage next step: 'AttestationVerification' -> 'SendOpCertSigningRequest'
[...]

# SendOpCertSigningRequest -> ValidateCSR -> GenerateNOCChain -> SendTrustedRootCert -> SendNOC:
# Configure cetifcicates to allow access to the device based on the added credentials
1658309318.959302][132461:132467] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_003E Command=0x0000_0005
[1658309318.959313][132461:132467] CHIP:CTL: Received certificate signing request from the device
[1658309318.959321][132461:132467] CHIP:CTL: Successfully finished commissioning step 'SendOpCertSigningRequest'
[1658309318.959326][132461:132467] CHIP:CTL: Commissioning stage next step: 'SendOpCertSigningRequest' -> 'ValidateCSR'
[...]
[1658309318.959622][132461:132467] CHIP:CTL: Successfully finished commissioning step 'ValidateCSR'
[1658309318.959629][132461:132467] CHIP:CTL: Commissioning stage next step: 'ValidateCSR' -> 'GenerateNOCChain'
[1658309318.959633][132461:132467] CHIP:CTL: Performing next commissioning step 'GenerateNOCChain'
[1658309318.959638][132461:132467] CHIP:CTL: Getting certificate chain for the device from the issuer
[1658309318.959706][132461:132467] CHIP:CTL: Verifying Certificate Signing Request
[1658309318.959917][132461:132467] CHIP:CTL: Generating NOC
[1658309318.959996][132461:132467] CHIP:CTL: Providing certificate chain to the commissioner
[1658309318.960003][132461:132467] CHIP:CTL: Received callback from the CA for NOC Chain generation. Status ../../examples/chip-tool/third_party/connectedhomeip/src/controller/ExampleOperationalCredentialsIssuer.cpp:261: Success
[1658309318.960009][132461:132467] CHIP:CTL: Successfully finished commissioning step 'GenerateNOCChain'
[1658309318.960057][132461:132467] CHIP:CTL: Performing next commissioning step 'SendTrustedRootCert'
[1658309318.960062][132461:132467] CHIP:CTL: Sending root certificate to the device
[...]
[1658309319.183569][132461:132467] CHIP:DMG: Received Command Response Status for Endpoint=0 Cluster=0x0000_003E Command=0x0000_000B Status=0x0
[1658309319.183577][132461:132467] CHIP:CTL: Device confirmed that it has received the root certificate
[1658309319.183584][132461:132467] CHIP:CTL: Successfully finished commissioning step 'SendTrustedRootCert'
[1658309319.183589][132461:132467] CHIP:CTL: Commissioning stage next step: 'SendTrustedRootCert' -> 'SendNOC'
[...]
[1658309321.568391][132461:132467] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_003E Command=0x0000_0008
[1658309321.568399][132461:132467] CHIP:CTL: Device returned status 0 on receiving the NOC
[1658309321.568402][132461:132467] CHIP:CTL: Operational credentials provisioned on device 0x7fdfa0000b60
[1658309321.568406][132461:132467] CHIP:TOO: Secure Pairing Success
[1658309321.568409][132461:132467] CHIP:TOO: CASE establishment successful
[1658309321.568415][132461:132467] CHIP:CTL: Successfully finished commissioning step 'SendNOC'
[1658309321.568418][132461:132467] CHIP:CTL: Commissioning stage next step: 'SendNOC' -> 'WiFiNetworkSetup'
[...]

# WiFiNetworkSetup -> WiFiNetworkEnable: 
# Setup the network access for the wifi
[1658309321.703555][132461:132467] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_0031 Command=0x0000_0005
[1658309321.703577][132461:132467] CHIP:CTL: Received NetworkConfig response, networkingStatus=0
[1658309321.703584][132461:132467] CHIP:CTL: Successfully finished commissioning step 'WiFiNetworkSetup'
[1658309321.703587][132461:132467] CHIP:CTL: Commissioning stage next step: 'WiFiNetworkSetup' -> 'WiFiNetworkEnable'
[...]
[1658309322.873512][132461:132467] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_0031 Command=0x0000_0007
[1658309322.873524][132461:132467] CHIP:CTL: Received ConnectNetwork response, networkingStatus=0
[1658309322.873533][132461:132467] CHIP:CTL: Successfully finished commissioning step 'WiFiNetworkEnable'
[1658309322.873538][132461:132467] CHIP:CTL: Commissioning stage next step: 'WiFiNetworkEnable' -> 'FindOperational'
[...]

# FindOperational:
# Test access and configuration of the setup by connecting to the device via wifi instead of BLE (using CASE)
[1658309322.873544][132461:132467] CHIP:CTL: Performing next commissioning step 'FindOperational'
[...]
# CASE is used to secure the access
[1658309324.113041][132461:132467] CHIP:SC: Sent Sigma1 msg
[1658309325.728491][132461:132467] CHIP:SC: Received Sigma2 msg
[1658309325.729381][132461:132467] CHIP:SC: Sending Sigma3
[1658309325.729581][132461:132467] CHIP:SC: Sent Sigma3 msg
[...]
[1658309324.112694][132461:132467] CHIP:IN: SecureSession[0x7fdfa0012d60]: Allocated Type:2 LSID:45063
[1658309324.112703][132461:132467] CHIP:SC: Initiating session on local FabricIndex 1 from 0x000000000001B669 -> 0x0000000000BC5C01
[...]
[1658309328.881997][132461:132467] CHIP:CTL: Successfully finished commissioning step 'FindOperational'
[1658309328.882001][132461:132467] CHIP:CTL: Commissioning stage next step: 'FindOperational' -> 'SendComplete'
[1658309328.882005][132461:132467] CHIP:CTL: Performing next commissioning step 'SendComplete'
[...]

# SendComplete -> Cleanup: 
# Close sessions and shutdown BLE, all future access will no be via wifi.
[1658309329.130822][132461:132467] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_0030 Command=0x0000_0005
[1658309329.130830][132461:132467] CHIP:CTL: Received CommissioningComplete response, errorCode=0
[1658309329.130837][132461:132467] CHIP:CTL: Successfully finished commissioning step 'SendComplete'
[1658309329.130841][132461:132467] CHIP:CTL: Commissioning stage next step: 'SendComplete' -> 'Cleanup'
[...]
[1658309329.131667][132461:132461] CHIP:DL: Inet Layer shutdown
[1658309329.131671][132461:132461] CHIP:DL: BLE shutdown
[1658309329.131938][132461:132461] CHIP:DL: System Layer shutdown
[1658309329.131953][132461:132461] CHIP:IN: SecureSession[0x7fdfa0001a30]: Released - Type:1 LSID:45062

# End of pairing

Zusammengefasst leistet das Chip-Tool folgendes:

1.) Erkennen des Geräts über BLE mit Hilfe des Discriminators

2.) Sichere Kommunikation aufbauen (PASE)

3.) Übermittlung grundlegender Informationen

4.) Device-Attestation durchführen

5.) Konfigurieren der Operational Credentials des Geräts

6.) Aktivieren des WiFi-Zugangs auf dem Gerät

7.) Test der Verbindung zum Gerät (CASE)

8.) Schließen und bereinigen aller Sitzungsdaten.

Jetzt können Sie das Licht ganz einfach ein- und ausschalten, indem Sie den folgenden Befehl senden.

# ./chip-tool onoff toggle destination-id endpoint-id
./chip-tool onoff toggle 12344321 1

Das folgende GIF zeigt, wie man das Licht umschaltet.

Ein kurzer Blick auf die Chip-Tool-Ausgabe, um zu erklären, was passiert.

[...]
# Setup credentials for Fabric 1
[1658316828.616743][241737:241737] CHIP:CTL: System State Initialized...
[1658316828.616757][241737:241737] CHIP:CTL: Stopping commissioning discovery over DNS-SD
[1658316828.616764][241737:241737] CHIP:CTL: Setting attestation nonce to random value
[1658316828.616774][241737:241737] CHIP:CTL: Setting CSR nonce to random value
[...]
[1658316828.616819][241737:241737] CHIP:CTL: Stopping commissioning discovery over DNS-SD
[1658316828.616822][241737:241737] CHIP:CTL: Setting attestation nonce to random value
[1658316828.616827][241737:241737] CHIP:CTL: Setting CSR nonce to random value
[1658316828.617696][241737:241737] CHIP:CTL: Generating NOC
[1658316828.618026][241737:241737] CHIP:FP: Validating NOC chain
[1658316828.618437][241737:241737] CHIP:FP: NOC chain validation successful
[1658316828.618481][241737:241737] CHIP:FP: Updated fabric at index: 0x1, Node ID: 0x000000000001B669
[...]
[1658316828.620696][241737:241737] CHIP:CTL: Joined the fabric at index 1. Compressed fabric ID is: 0x0000000000000000
[...]

# Identify the node and establish a session (CASE) (0xbc5c01 = 12344321)
[1658316828.657279][241737:241742] CHIP:TOO: Sending command to node 0xbc5c01
[1658316828.657288][241737:241742] CHIP:CSM: FindOrEstablishSession: PeerId = 5981134D36BF4317:0000000000BC5C01
[1658316828.657292][241737:241742] CHIP:CSM: FindOrEstablishSession: No existing OperationalDeviceProxy instance found
[...]
[1658316828.857614][241737:241742] CHIP:CTL: Updating device address to UDP:[fe80::cac9:a3ff:fec5:65b8%wlp0s20f3]:5540 while in state 2
[1658316828.857631][241737:241742] CHIP:CTL: OperationalDeviceProxy[5981134D36BF4317:0000000000BC5C01]: State change 2 --> 3
[1658316828.857730][241737:241742] CHIP:IN: SecureSession[0x7f40e00018a0]: Allocated Type:2 LSID:22504
[1658316828.857756][241737:241742] CHIP:SC: Initiating session on local FabricIndex 1 from 0x000000000001B669 -> 0x0000000000BC5C01
[...]

# CASE
[1658316828.858806][241737:241742] CHIP:SC: Sent Sigma1 msg
[...]
[1658316829.938517][241737:241742] CHIP:SC: Received Sigma2 msg
[...]
[1658316829.939354][241737:241742] CHIP:SC: Sending Sigma3
[...]
[1658316829.939545][241737:241742] CHIP:SC: Sent Sigma3 msg
[...]
[1658316832.001580][241737:241742] CHIP:IN: New secure session activated for device <0000000000BC5C01, 1>, LSID:22504 PSID:44672!
[...]

# Send the command toggle (0x2) to onoff cluster (0x6) to endpoint 1
# See also: https://github.com/project-chip/connectedhomeip/blob/master/src/app/zap-templates/zcl/data-model/chip/onoff-cluster.xml
[1658316832.001604][241737:241742] CHIP:TOO: Sending cluster (0x00000006) command (0x00000002) on endpoint 1
[...]

# Receiving the response from the device (all successful)
[1658316832.204861][241737:241742] CHIP:DMG: InvokeResponseMessage =
[1658316832.204865][241737:241742] CHIP:DMG: {
[1658316832.204869][241737:241742] CHIP:DMG: 	suppressResponse = false, 
[1658316832.204873][241737:241742] CHIP:DMG: 	InvokeResponseIBs =
[1658316832.204880][241737:241742] CHIP:DMG: 	[
[1658316832.204884][241737:241742] CHIP:DMG: 		InvokeResponseIB =
[1658316832.204890][241737:241742] CHIP:DMG: 		{
[1658316832.204895][241737:241742] CHIP:DMG: 			CommandStatusIB =
[1658316832.204899][241737:241742] CHIP:DMG: 			{
[1658316832.204903][241737:241742] CHIP:DMG: 				CommandPathIB =
[1658316832.204908][241737:241742] CHIP:DMG: 				{
[1658316832.204913][241737:241742] CHIP:DMG: 					EndpointId = 0x1,
[1658316832.204918][241737:241742] CHIP:DMG: 					ClusterId = 0x6,
[1658316832.204922][241737:241742] CHIP:DMG: 					CommandId = 0x2,
[1658316832.204926][241737:241742] CHIP:DMG: 				},
[1658316832.204933][241737:241742] CHIP:DMG: 				
[1658316832.204937][241737:241742] CHIP:DMG: 				StatusIB =
[1658316832.204942][241737:241742] CHIP:DMG: 				{
[1658316832.204947][241737:241742] CHIP:DMG: 					status = 0x00 (SUCCESS),
[1658316832.204951][241737:241742] CHIP:DMG: 				},
[1658316832.204956][241737:241742] CHIP:DMG: 				
[1658316832.204960][241737:241742] CHIP:DMG: 			},
[1658316832.204966][241737:241742] CHIP:DMG: 			
[1658316832.204970][241737:241742] CHIP:DMG: 		},
[1658316832.204975][241737:241742] CHIP:DMG: 		
[1658316832.204979][241737:241742] CHIP:DMG: 	],
[1658316832.204985][241737:241742] CHIP:DMG: 	
[1658316832.204989][241737:241742] CHIP:DMG: 	InteractionModelRevision = 1
[1658316832.204992][241737:241742] CHIP:DMG: },
[1658316832.205009][241737:241742] CHIP:DMG: Received Command Response Status for Endpoint=1 Cluster=0x0000_0006 Command=0x0000_0002 Status=0x0

Zusammengefasst leistet das Chip-Tool folgendes:

1.) Einrichten der Anmeldeinformationen für Fabric 1

2.) Finden des Nodes 12344321 (0xbc5c01) und Aufbau einer Sitzung mit CASE

3.) Senden Sie den Toggle-Befehl (0x2) an den OnOff-Cluster (0x6) und Endpoint 1. (OnOff-Cluster-Definitionen hier)

4.) Empfang einer Antwort vom Node, wenn der Befehl erfolgreich war.

Jetzt können wir ein helles Licht sehen und unser erstes selbst gebautes Matter-Gerät steuern. Wir haben viele der Konzepte verwendet, die in Teil 1 erklärt wurden, und in Teil 3 dieser Serie werden wir uns ansehen, wie man einen Lichtschalter an die Lampe bindet, um ein vollständigeres Setup zu haben und das Chip-Tool zur Steuerung des Lichts loszuwerden.

Weitere Lektüre:

Haben Sie Fragen oder wollen Sie ein Matter Projekt realisieren?

Patrick Sernetz — Head of Solution Architecture

Hi, ich bin Patrick. Haben Sie Fragen zu Matter? Kontaktieren Sie mich gerne per E-Mail.