Device Management Federation API

The DMF API provides Java classes which allows that the message body can be deserialized at runtime into a Java object. Also Java classes can be used to serialize Java objects into JSON bodies to send a message to hawkBit. Currently, bodies of messages are based on JSON.

Basics

There are three basic concepts of AMQP:

  • Exchanges - what you publish to.
  • Queues - what you consume from.
  • Bindings - configuration that maps an exchange to a queue.

Queues are just a place for receiving messages.
Bindings determine how messages get put in this place Queues can also be bound to multiple exchanges.

Exchanges are just publish messages. The user decides who can produce on an exchange and who can create bindings on that exchange for delivery to a specific queue.

hawkBit will create all necessary queues, exchanges and bindings for the user, making it easy to get started. The exchange name for outgoing messages is dmf.exchange.

The user has to set a reply_to header (see chapter below), to change the default sender exchange.

The following chapter describes the message body, header and properties.

Note: the DMF protocol was intended to be compatible to other use cases by design. As a result, DMF uses the term thing and not target but they are actually synonyms in this case.

Messages sent to hawkBit (Client -> hawkBit)

THING_CREATED

Message to register and update a provisioning target.

Header Description Type Mandatory
type Type of the message Fixed string “THING_CREATED” true
thingId The ID of the registered provisioning target String true
sender Name of the message sender String false
tenant The tenant this provisioning target belongs to String false
Message Properties Description Type Mandatory
content_type The content type of the payload String true
reply_to Exchange to reply to. The default is sp.direct.exchange which is bound to the sp_direct_queue String false

Example headers and payload:

Header MessageProperties
type=THING_CREATED
tenant=tenant123
thingId=abc
sender=Lwm2m
content_type=application/json
reply_to (optional) =sp.connector.replyTo

Payload Template (optional):

{
    "name": "String"
}

The “name” property specifies the name of the thing, which by default is the thing ID. This property is optional.

THING_REMOVED

Message to request the deletion of a provisioning target.

Header Description Type Mandatory
type Type of the message Fixed string “THING_REMOVED” true
thingId The ID of the registered provisioning target String true
tenant The tenant this provisioning target belongs to String false
Message Properties Description Type Mandatory
content_type The content type of the payload String true

Example headers

Header MessageProperties
type=THING_REMOVED
tenant=tenant123
thingId=abc
content_type=application/json

UPDATE_ATTRIBUTES

Message to update target attributes. This message can be send in response to a _REQUEST_ATTRIBUTESUPDATE event, sent by hawkBit.

Header Description Type Mandatory
type Type of the message Fixed string “EVENT” true
topic Topic name identifying the event Fixed string “UPDATE_ATTRIBUTES” true
thingId The ID of the registered thing String true
tenant The tenant this thing belongs to String false
Message Properties Description Type Mandatory
content_type The content type of the payload String true

Example header and payload:

Header MessageProperties
type=EVENT
tenant=tenant123
thingId=abc
topic=UPDATE_ATTRIBUTES
content_type=application/json

Payload Template:

{
    "attributes": {
        "exampleKey1" : "exampleValue1",
        "exampleKey2" : "exampleValue2"
    },
    "mode": "String"
}

The “mode” property specifies the update mode that should be applied. This property is optional. Possible mode values:

Value Description
MERGE The target attributes specified in the payload are merged into the existing attributes. This is the default mode that is applied if no “mode” property is specified in the payload.
REPLACE The existing attributes are replaced with the target attributes specified in the payload.
REMOVE The target attributes specified in the payload are removed from the existing attributes.

UPDATE_ACTION_STATUS

Message to send an action status event to hawkBit.

Header Description Type Mandatory
type Type of the message Fixed string “EVENT” true
topic Topic name identifying the event Fixed string “UPDATE_ACTION_STATUS” true
tenant The tenant this thing belongs to String false
Message Properties Description Type Mandatory
content_type The content type of the payload String true

Payload Template (the Java representation is ActionUpdateStatus):

{
  "actionId": long,
  "softwareModuleId": long,
  "actionStatus":"String",
  "message":["String"]
}

Possible actionStatus values:

Value Description
DOWNLOAD Device is downloading
DOWNLOADED Device completed download
RETRIEVED Device has retrieved the artifact
RUNNING Update is running
FINISHED Update process finished successful
ERROR Error during update process
WARNING Warning during update process
CANCELED Cancel update process successful
CANCEL_REJECTED Cancel update process has been rejected

Example header and payload:

Header MessageProperties
type=EVENT
tenant=tenant123
topic=UPDATE_ACTION_STATUS
content_type=application/json
{
  "actionId":137,
  "softwareModuleId":17,
  "actionStatus":"DOWNLOAD",
  "message":["The download has started"]
}

PING

hawkBit allows DMF clients to check the availability of the DMF service. For this scenario DMF specifies a PING message that can be sent by the client:

Header Description Type Mandatory
type Type of the message Fixed string “PING” true
tenant The tenant the PING belongs to String false
Message Properties Description Type Mandatory
correlationId CorrelationId that allows the client to map a PING request to PING_RESPONSE String true

Messages sent by hawkBit (hawkBit -> Client)

CANCEL_DOWNLOAD

Message to cancel an update task.

Header Description Type Mandatory
type Type of the message Fixed string “Event” true
thingId The ID of the registered provisioning target String true
topic Topic name identifying the event Fixed string “CANCEL_DOWNLOAD” true
tenant The tenant this provisioning target belongs to String false
Message Properties Description Type Mandatory
content_type The content type of the payload String true

Payload template:

{
    "actionId": long
}

Example Headers and Payload:

Header MessageProperties
type=EVENT
tenant=tenant123
thingId=abc
topic=CANCEL_DOWNLOAD
content_type=application/json
{
"actionId":137
}

After sending this message, an action status event with either actionStatus=CANCELED or actionStatus=CANCEL_REJECTED has to be returned.

Example header and payload when cancellation is successful:

Header MessageProperties
type=EVENT
tenant=tenant123
topic=UPDATE_ACTION_STATUS
content_type=application/json
{
  "actionId":137,
  "softwareModuleId":17,
  "actionStatus":"CANCELED",
  "message":["The update was canceled."]
}

Example header and payload when cancellation is rejected:

Header MessageProperties
type=EVENT
tenant=tenant123
topic=UPDATE_ACTION_STATUS
content_type=application/json
{
  "actionId":137,
  "softwareModuleId":17,
  "actionStatus":"CANCEL_REJECTED",
  "message":["The cancellation was not possible since the target sent an unexpected response."]
}

DOWNLOAD_AND_INSTALL or DOWNLOAD

Message sent by hawkBit to initialize an update or download task. Note: in case of a maintenance window configured but not yet active the message will have the topic DOWNLOAD instead of _DOWNLOAD_ANDINSTALL.

Header Description Type Mandatory
type Type of the message Fixed string “EVENT” true
thingId The ID of the registered provisioning target String true
topic Topic name identifying the event Fixed string “DOWNLOAD_AND_INSTALL” or “DOWNLOAD” true
tenant The tenant this provisioning target belongs to String false
Message Properties Description Type Mandatory
content_type The content type of the payload String true

Payload Template (the Java representation is DmfDownloadAndUpdateRequest):

{
"actionId": long,
"targetSecurityToken": "String",
"softwareModules":[
    {
    "moduleId": long,
    "moduleType":"String",
    "moduleVersion":"String",
    "artifacts":[
        {
        "filename":"String",
        "urls":{
            "HTTP":"String",
            "HTTPS":"String"
            },
        "hashes":{
            "md5":"String",
            "sha1":"String"
            },
        "size":long
        }],
    "metadata":[
        {
            "key":"String",
            "value":"String"
        }
    ]
    }]
}

Example header and payload:

Header MessageProperties
type=EVENT
tenant=tenant123
thingId=abc
topic=DOWNLOAD_AND_INSTALL
content_type=application/json
{
"actionId":137,
"targetSecurityToken":"bH7XXAprK1ChnLfKSdtlsp7NOlPnZAYY",
"softwareModules":[
    {
    "moduleId":7,
    "moduleType":"firmware",
    "moduleVersion":"7.7.7",
    "artifacts":[
        {
        "filename":"artifact.zip",
        "urls":{
            "HTTP":"http://download-from-url.com",
            "HTTPS":"https://download-from-url.com"
            },
        "hashes":{
            "md5":"md5hash",
            "sha1":"sha1hash"
            },
        "size":512
        }],
    "metadata":[
        {
            "key":"installationType",
            "value":"5784K#"
        }
    ]
    }]
}

MULTI_ACTION

If multi.assignments.enabled is enabled, this message is sent instead of DOWNLOAD_AND_INSTALL, DOWNLOAD, or CANCEL_DOWNLOAD by hawkBit to initialize update, download, or cancel task(s).

With weight, one can set the priority to the action. The higher the weight, the higher is the priority of an action.

Header Description Type Mandatory
type Type of the message Fixed string “EVENT” true
thingId The ID of the registered provisioning target String true
topic Topic name identifying the event Fixed string “MULTI_ACTION” true
tenant The tenant this provisioning target belongs to String false
Message Properties Description Type Mandatory
content_type The content type of the payload String true

Payload Template (the Java representation is DmfMultiActionRequest):

[{
"topic": "String",
"weight": long,
"action": {
  "actionId": long,
  "targetSecurityToken": "String",
  "softwareModules":[
      {
      "moduleId": long,
      "moduleType":"String",
      "moduleVersion":"String",
      "artifacts":[
          {
          "filename":"String",
          "urls":{
              "HTTP":"String",
              "HTTPS":"String"
              },
          "hashes":{
              "md5":"String",
              "sha1":"String"
              },
          "size":long
          }],
      "metadata":[
          {
              "key":"String",
              "value":"String"
          }
      ]
      }]
  }
},
{
"topic": "String",
"weight": long,
"action": {
  "actionId": long,
  "targetSecurityToken": "String",
  "softwareModules":[
      {
      "moduleId": long,
      "moduleType":"String",
      "moduleVersion":"String",
      "artifacts":[
          {
          "filename":"String",
          "urls":{
              "HTTP":"String",
              "HTTPS":"String"
              },
          "hashes":{
              "md5":"String",
              "sha1":"String"
              },
          "size":long
          }],
      "metadata":[
          {
              "key":"String",
              "value":"String"
          }
      ]
      }]
  }
}]

Example header and payload:

Header MessageProperties
type=EVENT
tenant=tenant123
thingId=abc
topic=MULTI_ACTION
content_type=application/json
[{
"topic": "DOWNLOAD_AND_INSTALL",
"weight": 600,
"action": {
  "actionId":137,
  "targetSecurityToken":"bH7XXAprK1ChnLfKSdtlsp7NOlPnZAYY",
  "softwareModules":[
      {
      "moduleId":7,
      "moduleType":"firmware",
      "moduleVersion":"7.7.7",
      "artifacts":[
          {
          "filename":"artifact.zip",
          "urls":{
              "HTTP":"http://download-from-url.com",
              "HTTPS":"https://download-from-url.com"
              },
          "hashes":{
              "md5":"md5hash",
              "sha1":"sha1hash"
              },
          "size":512
          }],
      "metadata":[
          {
              "key":"installationType",
              "value":"5784K#"
          }
      ]
      }]
  }
},
{
"topic": "DOWNLOAD",
"weight": 500,
"action": {
  "actionId":138,
  "targetSecurityToken":"bH7XXAprK1ChnLfKSdtlsp7NOlPnZAYY",
  "softwareModules":[
      {
      "moduleId":4,
      "moduleType":"firmware",
      "moduleVersion":"7.7.9",
      "artifacts":[
          {
          "filename":"artifact.zip",
          "urls":{
              "HTTP":"http://download-from-url.com",
              "HTTPS":"https://download-from-url.com"
              },
          "hashes":{
              "md5":"md5hash",
              "sha1":"sha1hash"
              },
          "size":512
          }],
      "metadata":[
          {
              "key":"installationType",
              "value":"5784K#"
          }
      ]
      }]
  }
}]

THING_DELETED

Message sent by hawkBit when a target has been deleted.

Header Description Type Mandatory
type Type of the message Fixed string “THING_DELETED” true
thingId The ID of the registered provisioning target String true
tenant The tenant this provisioning target belongs to String true

Example header:

Header MessageProperties
type=THING_DELETED
tenant=tenant123
thingId=abc

REQUEST_ATTRIBUTES_UPDATE

Message sent by Eclipse hawkBit when a re-transmission of target attributes is requested.

Header Description Type Mandatory
type Type of the message Fixed string “EVENT” true
thingId The ID of the registered provisioning target String true
topic Topic name identifying the event Fixed string “REQUEST_ATTRIBUTES_UPDATE” true
tenant The tenant this provisioning target belongs to String true

Example headers:

Header MessageProperties
type=EVENT
tenant=tenant123
thingId=abc
topic=REQUEST_ATTRIBUTES_UPDATE

PING_RESPONSE

hawkBit will respond to the PING message with a PING_RESPONSE type message that has the same correlationId as the original PING message:

Header Description Type Mandatory
type Type of the message Fixed string “PING_RESPONSE” true
tenant The tenant the PING belongs to String false
Message Properties Description Type Mandatory
correlationId CorrelationId of the original PING request String true
content_type The content type of the payload String true

The PING_RESPONSE also contains a timestamp (i.e. the difference, measured in milliseconds, between the current time and midnight, January 1, 1970 UTC) as plain text. It is not guaranteed that this timestamp is completely accurate.

Header MessageProperties
type=PING_RESPONSE
tenant=tenant123
content_type=text/plain
1505215891247