DFU over Bluetooth Mesh

The DFU specification is implemented in the Zephyr Bluetooth Mesh DFU subsystem as three separate models:

For more information about the Zephyr Bluetooth Mesh DFU subsystem, see Device Firmware Update (DFU).

The Bluetooth Mesh subsystem in nRF Connect SDK provides a set of samples that can be used for evaluation of the Bluetooth Mesh DFU specification and subsystem:

To configure and control DFU on the Firmware Distribution Server, use either the Firmware Distribution Client model or the shell commands.

You can use either the nRF Mesh app or the shell commands to configure and control the DFU process.

Note

The Mesh DFU feature in the nRF Mesh app is currently supported only on iOS.

The nRF Mesh app for iOS provides a built-in Firmware Distribution Client model to configure and control the DFU process on the distributor node.

To connect to the distributor node:

  • Launch the nRF Mesh app for iOS and navigate to the Proxy screen.

  • If the Proxy section does not show Mesh DFU Distributor, disable Automatic Connection, tap the Proxy name, and choose the distributor node from the list.

nRF Mesh app Proxy screen with Mesh DFU Distributor

Proxy screen with distributor node connection and proxy filter

Provisioning and configuring the devices

After programming the samples onto the boards, they need to be provisioned into the same Bluetooth Mesh network with an external provisioner device. See the documentation for provisioning the mesh DFU target device and provisioning the mesh DFU distributor device for how this is done.

After the provisioning is completed, a Configuration Client needs to add a common application key to all devices. The added application key must be bound:

  • On the Distributor: to the Firmware Distribution Server, Firmware Update Client, BLOB Transfer Server and BLOB Transfer Client models instantiated on the primary element, and to the Firmware Update Server and BLOB Transfer Server models instantiated on the secondary element of the device (see Configuring models on the Distributor node).

  • On Target nodes: to the Firmware Update Server and BLOB Transfer Server models instantiated on the primary element of the device (see Configuring models on the Target node).

The bound application key will be used in the firmware distribution procedure.

Uploading the firmware

Note

When using the nRF Mesh mobile app for iOS for DFU, bind the application key to the Firmware Distribution Server model on the distributor node. The app binds the application key to the Firmware Update Server models on the Target nodes automatically.

  1. Navigate to the Network screen and tap the Update button in the top right corner.

    nRF Mesh app Network screen with Update button

    Network screen with mesh nodes and Update button

  2. On the Firmware Distribution screen, review the distributor node information, the current state of the Firmware Distribution Server model, and the Capabilities section.

    Firmware Distributor screen with model details

    Firmware Distributor screen showing details of the Firmware Distributor Server model

    Firmware Distributor with firmware image slot empty and available

    Firmware Distributor with firmware image slot empty and available

  3. Tap Next in the top right corner of the Firmware Distribution screen to open the Target Nodes screen.

  4. Tap Select File and select the zip archive intended for distribution. Verify the firmware details shown by the app.

Populating the Distributor’s receivers list

To add Target nodes to the receivers list: 1. Scroll down to the AVAILABLE TARGET NODES section. #. Select the nodes to update, or tap Select All to select all nodes. #. Tap Next in the top right corner of the screen to open the Firmware Distribution screen.

Target Nodes screen with firmware selection and node list

Target Nodes screen with firmware details and available target nodes to select

Initiating the distribution

  1. Set the transfer TTL, Timeout, Transfer Mode, and Update Policy (you may leave default values as is).

  2. To transfer the firmware to several Target nodes simultaneously, select the desired group address under the Multicast Distribution section.

    Firmware Distribution parameters (TTL, timeout, transfer mode, policy, multicast)

    Firmware Distribution screen with transfer parameters and multicast options

Firmware distribution

To start the distribution:

  1. After setting the Firmware Distribution parameters and multicast options, tap Next in the top right corner of the screen. The app binds the necessary keys and subscribes the target nodes to the group address.

  2. When configuration is complete, tap Next again. The app uploads the firmware image to the distributor node over SMP (Firmware Upload; typically a couple of minutes), then instructs the distributor to start the Firmware Distribution process.

    App configures distributor and target nodes

    Firmware Update screen while uploading image to the distributor

    Once the distribution process starts, the screen continues to show the distribution progress and remaining time.

    Firmware Update screen during distribution to targets

    Firmware Update screen during distribution to target nodes

To exit the Firmware Update screen without canceling the distribution, tap the Close button in the top right corner of the screen (the distribution process continues in the background). The mobile device may be disconnected; the distributor node continues the Firmware Distribution process in the background. To get back to the ongoing distribution process, navigate to the Network screen and tap the Update button in the top right corner. To cancel the distribution process, tap the X button in the top left corner.

Suspending the distribution

To suspend the distribution:

  1. Navigate to the Network screen.

  2. Tap the Mesh DFU Distributor node.

  3. Navigate to the element list and tap Element 1, then Firmware Distribution Server.

  4. On the Firmware Distribution Server screen, scroll to the Control section and tap Get to obtain the current state.

  5. Tap the Suspend button.

    Firmware Distribution Server screen with Control (Get, Suspend, Cancel, Apply)

    Firmware Distribution Server screen with status, phase, and control actions

Applying the firmware image

Depending on the update policy set at the start of the DFU transfer, the Firmware Distribution Server will do the following:

  • If policy_apply is set to true or omitted when the DFU transfer starts, the Firmware Distribution Server will immediately apply the new firmware on the Target nodes upon the DFU transfer completion.

  • If policy_apply is set to false, the image needs to be applied manually.

When the update policy was set to Verify Only, the target nodes wait for an apply message after the distribution completes. To apply the firmware:

  1. Navigate to the Network screen.

  2. Tap the Mesh DFU Distributor node.

  3. Navigate to the element list and tap Element 1, then Firmware Distribution Server.

  4. On the Firmware Distribution Server screen, scroll to the Control section and tap Get to obtain the current state.

  5. Tap the Apply button.

    Firmware Distribution Server screen with Control (Get, Suspend, Cancel, Apply)

    Firmware Distribution Server screen with status, phase, and control actions

When the Firmware Distribution Server starts applying the transferred image, the distribution phase is set to BT_MESH_DFD_PHASE_APPLYING_UPDATE.

After applying the new firmware, the Firmware Distribution Server will immediately request firmware ID of the currently running firmware on the Target nodes to confirm that the new firmware has been applied successfully. Depending on the bt_mesh_dfu_effect value received from the Target nodes after the DFU transfer is started, the following cases are possible:

  • If the image effect for a particular Target node is BT_MESH_DFU_EFFECT_UNPROV, the Firmware Distribution Server does not expect any reply from that Target node. If the Distributor does not receive any reply, it will repeat the request several times. If the Distributor eventually receives a reply, the DFU for this particular Target node is considered unsuccessful. Otherwise, the DFU is considered successful.

  • In all other cases, the Distributor expects a reply from the Target node with the firmware ID equal to the firmware ID of the transferred image. If the Target node responds with a different firmware ID or does not respond at all after several requests, the DFU for this particular Target node is considered unsuccessful. Otherwise, the DFU is considered successful.

The DFU ends after the Distributor stops polling the Target nodes. If the DFU completes successfully for at least one Target node, the firmware distribution is considered as successful. In this case, the distribution phase is set to BT_MESH_DFD_PHASE_COMPLETED. If the DFU does not complete successfully, the distribution phase is set to BT_MESH_DFD_PHASE_FAILED.

Cancelling the distribution

To cancel the distribution:

  1. Navigate to the Network screen.

  2. Tap the Mesh DFU Distributor node.

  3. Navigate to the element list and tap Element 1, then Firmware Distribution Server.

  4. On the Firmware Distribution Server screen, scroll to the Control section and tap Get to obtain the current state.

  5. Tap the Cancel button.

Alternatively, tap the Update button on the Network screen to open the Firmware Distribution flow, then tap the X button in the top left corner of the Firmware Update screen.

Recovering from failed distribution

To recover from a failed distribution, clear the distribution phase and optionally clear the firmware slots so that a new distribution can be started.

To clear the distribution phase and reset the Firmware Distribution Server state, follow the steps in Cancelling the distribution.

To clear the list of firmware slots (for example, to remove slot data from the failed distribution before retrying):

  1. Navigate to the Network screen.

  2. Tap the Mesh DFU Distributor node.

  3. Navigate to the element list, tap Element 1, tap Firmware Distribution Server, and scroll to the Firmware Distribution Slots section.

  4. Tap Get to obtain the current list of firmware slots.

  5. To remove a slot: swipe left on the slot and tap Delete or to remove all slots: tap Delete All.

Then start the distribution process again from the beginning.

Generating the firmware metadata

Note

When using the nRF Mesh app for DFU, the app obtains all required information from the firmware archive generated as part of the build process.

There are two ways to generate the required DFU metadata:

  • Automated generation using the DFU metadata extraction script integrated in the nRF Connect SDK build system.

  • Manual generation by using shell commands.

Using the DFU metadata extraction script is the most efficient way of generating the required DFU metadata.

Automated metadata generation

By enabling the SB_CONFIG_DFU_ZIP_BLUETOOTH_MESH_METADATA option in sysbuild, the metadata will be automatically parsed from the .elf and .config files. The parsed data is stored in the ble_mesh_metadata.json file. The file is placed in the dfu_application.zip archive in the build folder of the application. Additionally, the metadata string and, optionally, the firmware ID required by the mesh models dfu slot add command are printed in the command-line window when the application is built:

Bluetooth Mesh Composition metadata generated:
  Encoded metadata: 020000000000000094cf24017c26f3710100
  Firmware ID: 59000200000000000000
  Full metadata written to: APPLICATION_FOLDER\build\zephyr\dfu_application.zip

You can generate the Firmware ID using one of the following options:

Note

The Firmware ID (FWID) specified in the JSON file must match the fwid used when initializing the Firmware Update Server. This ensures that after the firmware update is applied, the node will respond with the correct Current Firmware ID in the Firmware Update Information Status message.

Note

It is required that the Composition Data is declared with the const qualifier. If the application contains more than one Composition Data structure (for example, when the structure to be used is picked at runtime), the script will not print any encoded metadata. In this case, use the JSON file to find the encoded metadata matching the Composition Data to be used by the device after the update. Additionally, the script is hardcoded to produce a metadata string where the firmware is targeted for the application core.

A separate west command can be utilized to print the metadata to the console, given that it is already generated by the build system. This gives the user easy access to this information, without having to enter the .json file in the build folder or to rebuild the application:

west build -t ble_mesh_dfu_metadata

For this particular example, the following output is generated:

{
  "sign_version": {
    "major": 2,
    "minor": 0,
    "revision": 0,
    "build_number": 0
  },
  "binary_size": 241236,
  "composition_data": {
    "cid": 89,
    "pid": 0,
    "vid": 0,
    "crpl": 10,
    "features": 7,
    "elements": [
      {
        "location": 1,
        "sig_models": [
          0,
          2,
          48962,
          48964
        ],
        "vendor_models": []
      }
    ]
  },
  "composition_hash": 1911760508,
  "encoded_metadata": "020000000000000094cf24017c26f3710100",
  "firmware_id": "59000200000000000000"
}

Manual metadata generation

The Bluetooth Mesh DFU subsystem provides a set of shell commands that can be used to compose a firmware metadata. The format of metadata is defined in the bt_mesh_dfu_metadata structure. For the complete list of commands, see DFU metadata.

To start composing metadata, use the mesh models dfu metadata comp-add shell command that encodes a Composition Data header. For example, for a Target node with product ID 0x0059, zero company and version IDs, 10 entries in the replay list, and with Relay, Proxy and Friend features enabled, the command will be the following:

mesh models dfu metadata comp-add 0x59 0 0 10 7

Now you need to encode elements that are present on a new image. For each element to encode, use the mesh models dfu metadata comp-elem-add shell command specifying the location of the element, number of Bluetooth SIG and vendor models and their IDs. For example, for Bluetooth Mesh: Device Firmware Update (DFU) target sample, which has only one element containing Configuration and Health Server models as well as DFU and BLOB Transfer Server models, the command will be the following:

mesh models dfu metadata comp-elem-add 1 4 0 0x0000 0x0002 0xBF42 0xBF44

Note

In case of any mistakes during the encoding of the Composition Data, use the mesh models dfu metadata comp-clear command to clear the cached value, then start composing the metadata from the beginning.

When all elements are added, generate a hash of the Composition Data using the mesh models dfu metadata comp-hash-get shell command. For example, using the inputs from the commands above, the output of this command should be the following:

Composition data to be hashed:
        CID: 0x0059
        PID: 0x0000
        VID: 0x0000
        CPRL: 10
        Features: 0x7
        Elem: 1
                NumS: 4
                NumV: 0
                SIG Model ID: 0x0000
                SIG Model ID: 0x0002
                SIG Model ID: 0xbf42
                SIG Model ID: 0xbf44
Composition data hash: 0x71f3267c

The generated hash will then be encoded into the metadata. Use the mesh models dfu metadata encode shell command to encode the metadata. For example, using the Composition Data hash generated above, the command to encode the metadata for firmware version 2.0.0+0, with a size of 241236 bytes and targeted to application core, will be the following:

mesh models dfu metadata encode 2 0 0 0 241236 1 0x71f3267c 1

The output of the command will be the following:

Metadata to be encoded:
        Version: 2.0.0+0
        Size: 241236
        Core Type: 0x1
        Composition data hash: 0x71f3267c
        Elements: 1
        User data length: 0
Encoded metadata: 020000000000000094cf24017c26f3710100