blob: 73129b84e50966515041a31d0e7964a0600b98e2 [file] [log] [blame] [view]
# Matter Open IoT SDK Example Device Firmware Upgrade
Matter Open IoT SDK examples can support over-the-air (`OTA`) Device Firmware
Upgrade (`DFU`) based on Matter-compliant OTA update protocol that uses the
Matter operational network for querying and downloading a new firmware image.
## Device Firmware Upgrade over Matter OTA cluster
The `DFU` over Matter OTA clusters requires two kinds of nodes:
- `OTA Provider` is an application that implements the OTA provider cluster
service. It can respond to the OTA Requestors' queries about available
software updates and share the update image with them.
- `OTA Requestor` is an application that implements the OTA requestor cluster
service. It can communicate with the OTA Provider to fetch applicable
software updates and apply them.
The last required element is a Matter controller. This application controls both
nodes and manages the entire software update process.
In the procedure described below, the `OTA Provider` will be a
[Linux application](../../examples/ota-provider-app/linux/README.md) and the
Open IoT SDK example with
[DFU support](./openiotsdk_examples.md#device-firmware-update) will work as the
OTA Requestor. The [chip-tool](../../examples/chip-tool/README.md) application
used as the Matter controller. Each application should be launched in a separate
terminal.
List of `OIS` examples that currently support the `DFU` over Matter:
- ota-requestor-app
### Device Firmware Upgrade over Matter procedure
1. Navigate to the CHIP root directory.
2. Build the `OTA Provider` application:
```
scripts/examples/gn_build_example.sh examples/ota-provider-app/linux out/ota-provider chip_config_network_layer_ble=false
```
More details about the `OTA provider` application can be found
[here](../../examples/ota-provider-app/linux/README.md).
3. Build `chip-tool`:
```
scripts/examples/gn_build_example.sh examples/chip-tool out/chip-tool
```
More details about the `chip-tool` application can be found
[here](../../examples/chip-tool/README.md).
4. Build `OIS` example application
```
scripts/examples/openiotsdk_example.sh -v 1 -V 0.0.1 <example_name>
```
This is first version of the application that can be updated.
5. Build `OIS` update image
```
scripts/examples/openiotsdk_example.sh -p out/update -v 2 -V 0.0.2 <example_name>
```
Pass the build path (`-p out/update`) in this step to not override the
example application. In that directory you should find the update image file
with `.ota` extension (`chip-openiotsdk-<example_name>-example.ota`).
6. Setup `OIS` network environment
```
sudo ./scripts/setup/openiotsdk/network_setup.sh -n OISupdate up
```
More details about `OIS` network environment can be found
[here](./openiotsdk_examples.md#networking-setup).
7. In `terminal 1`: run the `OTA Provider` application in the network
environment and provide a path to the update image:
```
scripts/run_in_ns.sh OISupdate out/ota-provider/chip-ota-provider-app --KVS /tmp/chip-ota-provider --discriminator 3841 --secured-device-port 5580 --filepath out/update/chip-openiotsdk-<example_name>-example.ota
```
The node details should be printed:
```
...
CHIP:DL: Device Configuration:
CHIP:DL: Serial Number: TEST_SN
CHIP:DL: Vendor Id: 65521 (0xFFF1)
CHIP:DL: Product Id: 32769 (0x8001)
CHIP:DL: Hardware Version: 0
CHIP:DL: Setup Pin Code (0 for UNKNOWN/ERROR): 20202021
CHIP:DL: Setup Discriminator (0xFFFF for UNKNOWN/ERROR): 3841 (0xF01)
CHIP:DL: Manufacturing Date: (not set)
CHIP:DL: Device Type: 65535 (0xFFFF)
CHIP:SVR: SetupQRCode: [MT:-24J0IRV01KA0648G00]
CHIP:SVR: Copy/paste the below URL in a browser to see the QR Code:
CHIP:SVR: https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%3A-24J0IRV01KA0648G00
CHIP:SVR: Manual pairing code: [34970112332]
CHIP:SWU: Using OTA file: out/update/chip-openiotsdk-ota-requestor-app-example.ota
...
```
> 💡 **Notes**:
>
> Set the custom Key Value Store path for `OTA provider`.
>
> The `OTA provider` discriminator must be different from the value used by
> the example application. `OIS` examples use the default discriminator
> value `3840`.
>
> The `OTA provider` UDP port must be different from the value used by the
> example application. `OIS` examples use the default discriminator value
> `5540`.
8. In `terminal 2`: run the `OIS` example application in the network
environment:
```
scripts/run_in_ns.sh OISupdate scripts/examples/openiotsdk_example.sh -C run -n OISupdatetap <example_name>
```
The node details should be printed to terminal:
```
...
[INF] [DL] Device Configuration:
[INF] [DL] Serial Number: TEST_SN
[INF] [DL] Vendor Id: 65521 (0xFFF1)
[INF] [DL] Product Id: 32769 (0x8001)
[INF] [DL] Hardware Version: 0
[INF] [DL] Setup Pin Code (0 for UNKNOWN/ERROR): 20202021
[INF] [DL] Setup Discriminator (0xFFFF for UNKNOWN/ERROR): 3840 (0xF00)
[INF] [DL] Manufacturing Date: (not set)
[INF] [DL] Device Type: 65535 (0xFFFF)
[INF] [SVR] SetupQRCode: [MT:-24J0AFN00KA0648G00]
[INF] [SVR] Copy/paste the below URL in a browser to see the QR Code:
[INF] [SVR] https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%3A-24J0AFN00KA0648G00
[INF] [SVR] Manual pairing code: [34970112332]
[INF] [-] Current software version: [1] 0.0.1
[INF] [SWU] Stopping the watchdog timer
[INF] [SWU] Starting the periodic query timer, timeout: 86400 seconds
[INF] [-] Open IoT SDK ota-requestor-app example application run
...
```
9. In `terminal 3`: commission the `OTA Provider` application into the Matter
network:
```
scripts/run_in_ns.sh OISupdate ./out/chip-tool/chip-tool pairing onnetwork-long 123 20202021 3841
```
Set node ID to `123`.
The confirmation of commissioning success will be printed on the terminal:
```
CHIP:SVR: Commissioning completed successfully
```
10. In `terminal 3`: commission the `OIS` example application into the Matter
network:
```
scripts/run_in_ns.sh OISupdate ./out/chip-tool/chip-tool pairing onnetwork-long 321 20202021 3840
```
Set node ID to `321`.
The confirmation of commissioning success will be printed on the terminal:
```
[INF] [SVR] Commissioning completed successfully
```
11. In `terminal 3`: configure the `OTA Provider` with the access control list
(ACL) that grants _Operate_ privileges to all nodes in the fabric. This is
necessary to allow the nodes to send cluster commands to the `OTA Provider`:
```
scripts/run_in_ns.sh OISupdate ./out/chip-tool/chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [321], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": null, "targets": null}]' 123 0
```
12. Initiate the `DFU` procedure:
In `terminal 3`: send the `Announce OTA Provider` command to the example
application. The numeric arguments are: provider node ID, provider vendor
ID, announcement reason, provider endpoint ID, requestor node ID and
requestor Endpoint Id, respectively.
```
scripts/run_in_ns.sh OISupdate ./out/chip-tool/chip-tool otasoftwareupdaterequestor announce-otaprovider 123 0 2 0 321 0
```
The example application is notified of the `OTA Provider` node and it
automatically queries for a new firmware image. If a new version of firmware
is available, the downloading step starts.
13. When the firmware image download is complete, the device is automatically
rebooted to apply the update.
The new version of firmware will be printed in the log `terminal 2`:
```
...
[INF] [-] Current software version: [2] 0.0.2
...
```
14. Now, you can manually close the nodes applications and terminals sessions:
- `OTA Provider` - `terminal 1`
- `OIS` example - `terminal 2`. More details about terminating `OIS`
example can be found [here](./openiotsdk_examples.md#running).
15. Cleanup after update (disable network environment, remove `KVS` storage
files):
```
sudo ./scripts/setup/openiotsdk/network_setup.sh -n OISupdate down
sudo rm /tmp/chip-ota-provider
```