thin-edge / thin-edge.io

The open edge framework for lightweight IoT devices
https://thin-edge.io
Apache License 2.0
211 stars 55 forks source link

Publish registration and capabilities on te topics when connecting to the MQTT broker #2868

Open reubenmiller opened 1 month ago

reubenmiller commented 1 month ago

Is your feature improvement request related to a problem? Please describe.

If the local MQTT broker (e.g. mosquitto) is not configured with persistence, all retain messages are lost when the service is restarted. As a result all devices registration message, supported commands will not be sent to the platform

  1. Start the tedge-agent service (before connection to the cloud)
  2. Configure thin-edge.io to connect to Cumulocity IoT (this will al)

    tedge cert create --device-id example001
    tedge config set c8y.url example.c8y.com
    tedge connect c8y

    The tedge connect c8y will also restart the mosquitto broker which will remove all of the previously published retained message by tedge-agent before the tedge-mapper-c8y has seen the messages. This results in the device in the cloud having only partial information about the device.

Describe the solution you'd like

Since registration and device capabilities are fairly critical for other components to understand what the device is and what it can do (e.g. does it accept get/set configuration, software_update, firmware_update command etc.), it might make sense to publish these message every time the component connects to the MQTT broker (and not assume these message are persisted when the MQTT broker is restarted).

Describe alternatives you've considered

Additional context

Below shows an example of the reduced number MQTT message after the MQTT broker is restarted (when it is not configured with persistence).

Before the MQTT broker is restarted, the tedge-agent has previously registered itself and its capabilities:

% tedge mqtt sub '#'
INFO: Connected
[te/device/main/service/mosquitto-c8y-bridge] {"@id":"rmi-macos:device:main:service:mosquitto-c8y-bridge","@parent":"device/main//","@type":"service","name":"mosquitto-c8y-bridge","type":"service"}
[te/device/main/service/mosquitto-c8y-bridge/status/health] 1
[te/device/main/service/tedge-agent] {"@parent":"device/main//","@type":"service","type":"service"}
[te/device/main/service/tedge-agent/status/health] {"pid":66677,"status":"up","time":1715267898.9250402}
[te/device/main/service/tedge-mapper-c8y] {"@id":"rmi-macos:device:main:service:tedge-mapper-c8y","@parent":"device/main//","@type":"service","name":"tedge-mapper-c8y","type":"service"}
[te/device/main/service/tedge-mapper-c8y/status/health] {"pid":61406,"status":"up","time":1715267770.182519}
[te/device/main///twin/c8y_Agent] {"name":"thin-edge.io","url":"https://thin-edge.io","version":"1.0.1"}
[te/device/main///cmd/config_snapshot] {"types":["tedge-configuration-plugin","tedge-log-plugin","tedge.toml"]}
[te/device/main///cmd/config_update] {"types":["tedge-configuration-plugin","tedge-log-plugin","tedge.toml"]}
[te/device/main///cmd/log_upload] {"types":["software-management"]}
[te/device/main///cmd/restart] {}
[te/device/main///cmd/software_list] {"types":["brew"]}
[te/device/main///cmd/software_update] {"types":["brew"]}

After restarting the MQTT broker using systemctl restart mosquitto, the majority of the message are no longer present.

% tedge mqtt sub '#'
INFO: Connected
[te/device/main/service/mosquitto-c8y-bridge/status/health] 1
[te/device/main/service/tedge-agent/status/health] {"pid":66677,"status":"up","time":1715268183.9397252}
[te/device/main/service/tedge-mapper-c8y/status/health] {"pid":61406,"status":"up","time":1715268183.941719}