--- title: Device Management Federation API parent: API weight: 83 --- 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 All messages have to be sent to the exchange **dmf.exchange**. ### Message to register a thing | Message Header | Description | Type | Mandatory | | -------------- | -------------------------------- | ----------------------------- | --------- | | type | Type of the message | Fixed string "THING_CREATED " | true | | thingId | The ID of the registered thing | String | true | | tenant | The tenant this thing belongs to | String | true | | Message Properties | Description | Type | Mandatory | | ------------------ | --------------------- | ------ | --------- | | reply_to | Exchange to reply to. | String | true | **Example Header** | Headers | MessageProperties | | ------------------------------------------------------------- | -------------------------- | | type=THING_CREATED
tenant=tenant123
thingId=abc | reply_to=dmfclient.replyTo | ### Message to update target attributes | Message Header | Description | Type | Mandatory | | -------------- | -------------------------------- | -------------------------------- | --------- | | type | Type of the message | Fixed string "EVENT" | true | | topic | Topic to handle events different | Fixed string "UPDATE_ATTRIBUTES" | true | | thingId | The ID of the registered thing | String | true | | tenant | The tenant this thing belongs to | String | true | | Message Properties | Description | Type | Mandatory | | ------------------ | ------------------------------- | ------ | --------- | | content_type | The content type of the payload | String | true | **Example Header and Payload** | Headers | MessageProperties | | ------------------------------------------------------------------------------------ | ----------------------------- | | type=EVENT
tenant=tenant123
thingId=abc
topic=UPDATE_ATTRIBUTES | content_type=application/json | Payload Template ```json { "attributes": { "exampleKey1": "exampleValue1", "exampleKey2": "exampleValue2" } } ``` ### Message to send an action status event to hawkBit The Java representation is ActionUpdateStatus: | Header | Description | Type | Mandatory | | ------ | -------------------------------- | ----------------------------------- | --------- | | type | Type of the message | Fixed string "EVENT" | true | | topic | Topic to handle events different | Fixed string "UPDATE_ACTION_STATUS" | true | | tenant | The tenant this thing belongs to | String | true | | Message Properties | Description | Type | Mandatory | | ------------------ | ------------------------------- | ------ | --------- | | content_type | The content type of the payload | String | true | Payload Template ```json { "actionId": long, "softwareModuleId": long, "actionStatus": "String", "message": ["String"] } ``` Possible actionStatus | Header | Description | | --------------- | ------------------------------------------------- | | DOWNLOAD | Device is downloading | | RETRIEVED | Device management service has retrieved something | | 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** | Headers | MessageProperties | | -------------------------------------------------------------------- | ----------------------------- | | type=EVENT
tenant=tenant123
topic=UPDATE_ACTION_STATUS | content_type=application/json | ```json { "actionId": 137, "softwareModuleId": 17, "actionStatus": "DOWNLOAD", "message": ["The download has started"] } ``` ### 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 thing | String | true | | topic | Topic to handle events different | Fixed string "CANCEL_DOWNLOAD" | true | | tenant | The tenant this thing belongs to | String | true | | Message Properties | Description | Type | Mandatory | | ------------------ | ------------------------------- | ------ | --------- | | content_type | The content type of the payload | String | true | Payload Template ```json { "actionId": long } ``` **Example Header and payload** | Headers | MessageProperties | | ---------------------------------------------------------------------------------- | ----------------------------- | | type=EVENT
tenant=tenant123
thingId=abc
topic=CANCEL_DOWNLOAD | content_type=application/json | ```json { "actionId": 137 } ``` After this message has been sent, an action status event with either actionStatus=CANCELED or actionStatus=CANCEL_REJECTED has to be returned. **Example Header and Payload when cancellation is successful** | Headers | MessageProperties | | -------------------------------------------------------------------- | ----------------------------- | | type=EVENT
tenant=tenant123
topic=UPDATE_ACTION_STATUS | content_type=application/json | ```json { "actionId": 137, "softwareModuleId": 17, "actionStatus": "CANCELED", "message": ["The update was canceled."] } ``` **Example Header and Payload when cancellation was rejected** | Headers | MessageProperties | | -------------------------------------------------------------------- | ----------------------------- | | type=EVENT
tenant=tenant123
topic=UPDATE_ACTION_STATUS | content_type=application/json | ```json { "actionId": 137, "softwareModuleId": 17, "actionStatus": "CANCEL_REJECTED", "message": [ "The cancellation was not possible since the target sent an unexpected response." ] } ``` ## Messages sent by hawkBit All messages from hawkBit will be sent to the specified exchange in the `reply_to` property. ### Message sent by hawkBit to initialize an update task | Header | Description | Type | Mandatory | | ------- | -------------------------------- | ----------------------------------- | --------- | | type | Type of the message | Fixed string "EVENT" | true | | thingId | The ID of the registered thing | String | true | | topic | Topic to handle events different | Fixed string "DOWNLOAD_AND_INSTALL" | true | | tenant | The tenant this thing belongs to | String | true | | Message Properties | Description | Type | Mandatory | | ------------------ | ------------------------------- | ------ | --------- | | content_type | The content type of the payload | String | true | The Java representation is DownloadAndUpdateRequest: Payload Template ```json { "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** | Headers | MessageProperties | | --------------------------------------------------------------------------------------- | ----------------------------- | | type=EVENT
tenant=tenant123
thingId=abc
topic=DOWNLOAD_AND_INSTALL | content_type=application/json | ```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#" } ] } ] } ```