| <!DOCTYPE html> |
| |
| |
| |
| |
| <html class="no-js"> |
| |
| <head lang="en-us"> |
| <meta charset="utf-8"> |
| <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1"> |
| <meta http-equiv="X-UA-Compatible" content="IE=10" /> |
| <title>Device Management Federation API - Eclipse hawkBit</title> |
| <meta name="generator" content="Hugo 0.77.0" /> |
| |
| |
| <meta name="description" content="IoT. Update. Device."> |
| |
| <link rel="canonical" href="https://www.eclipse.org/hawkbit/apis/dmf_api/"> |
| |
| <meta name="author" content="The Eclipse hawkBit Project"> |
| |
| |
| <meta property="og:url" content="https://www.eclipse.org/hawkbit/apis/dmf_api/"> |
| <meta property="og:title" content="Eclipse hawkBit"> |
| <meta property="og:image" content="https://www.eclipse.org/hawkbit/images/hawkbit_icon.png"> |
| <meta name="apple-mobile-web-app-title" content="Eclipse hawkBit"> |
| <meta name="apple-mobile-web-app-capable" content="yes"> |
| <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> |
| |
| |
| |
| <link rel="shortcut icon" type="image/x-icon" href="https://www.eclipse.org/hawkbit/images/favicon.ico"> |
| <link rel="icon" type="image/x-icon" href="https://www.eclipse.org/hawkbit/images/favicon.ico"> |
| |
| <style> |
| @font-face { |
| font-family: 'Icon'; |
| src: url('https://www.eclipse.org/hawkbit/fonts/icon.eot'); |
| src: url('https://www.eclipse.org/hawkbit/fonts/icon.eot') |
| format('embedded-opentype'), |
| url('https://www.eclipse.org/hawkbit/fonts/icon.woff') |
| format('woff'), |
| url('https://www.eclipse.org/hawkbit/fonts/icon.ttf') |
| format('truetype'), |
| url('https://www.eclipse.org/hawkbit/fonts/icon.svg') |
| format('svg'); |
| font-weight: normal; |
| font-style: normal; |
| } |
| </style> |
| |
| <link rel="stylesheet" href="https://www.eclipse.org/hawkbit/stylesheets/application.css"> |
| <link rel="stylesheet" href="https://www.eclipse.org/hawkbit/stylesheets/temporary.css"> |
| <link rel="stylesheet" href="https://www.eclipse.org/hawkbit/stylesheets/palettes.css"> |
| <link rel="stylesheet" href="https://www.eclipse.org/hawkbit/stylesheets/highlight/highlight.css"> |
| |
| |
| |
| |
| <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Ubuntu:400,700|Ubuntu+Mono"> |
| <style> |
| body, input { |
| font-family: 'Ubuntu', Helvetica, Arial, sans-serif; |
| } |
| pre, code { |
| font-family: 'Ubuntu Mono', 'Courier New', 'Courier', monospace; |
| } |
| </style> |
| |
| |
| <link rel="stylesheet" href="https://www.eclipse.org/hawkbit/css/hawkbit.css"> |
| |
| <link rel="stylesheet" href="//www.eclipse.org/eclipse.org-common/themes/solstice/public/stylesheets/vendor/cookieconsent/cookieconsent.min.css"> |
| |
| <script src="https://www.eclipse.org/hawkbit/javascripts/modernizr.js"></script> |
| <script src="//www.eclipse.org/eclipse.org-common/themes/solstice/public/javascript/vendor/cookieconsent/default.min.js"></script> |
| |
| |
| |
| <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous"> |
| </head> |
| <body class="palette-primary-deep-purple palette-accent-light-green"> |
| |
| |
| |
| |
| |
| |
| |
| <div class="backdrop"> |
| <div class="backdrop-paper"></div> |
| </div> |
| |
| <input class="toggle" type="checkbox" id="toggle-drawer"> |
| <input class="toggle" type="checkbox" id="toggle-search"> |
| <label class="toggle-button overlay" for="toggle-drawer"></label> |
| |
| <header class="header"> |
| <nav aria-label="Header"> |
| <div class="bar default"> |
| <div class="button button-menu" role="button" aria-label="Menu"> |
| <label class="toggle-button icon icon-menu" for="toggle-drawer"> |
| <span></span> |
| </label> |
| </div> |
| <div class="stretch"> |
| <div class="title"> |
| Device Management Federation API |
| </div> |
| </div> |
| |
| |
| |
| |
| <div class="button button-github" role="button" aria-label="GitHub"> |
| <a href="https://github.com/eclipse/hawkbit" title="@eclipse/hawkbit on GitHub" target="_blank" class="toggle-button icon icon-github"></a> |
| </div> |
| |
| |
| |
| <div class="button button-github" role="button" aria-label="Gitter"> |
| <a href="https://gitter.im/eclipse/hawkbit" title="@eclipse/hawkbit on Gitter" target="_blank" class="toggle-button icon fab fa-gitter"></a> |
| </div> |
| |
| |
| |
| <div class="button button-github" role="button" aria-label="Docker"> |
| <a href="https://hub.docker.com/u/hawkbit" title="hawkbit on Docker Hub" target="_blank" class="toggle-button icon fab fa-docker"></a> |
| </div> |
| |
| |
| |
| </div> |
| <div class="bar search"> |
| <div class="button button-close" role="button" aria-label="Close"> |
| <label class="toggle-button icon icon-back" for="toggle-search"></label> |
| </div> |
| <div class="stretch"> |
| <div class="field"> |
| <input class="query" type="text" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck> |
| </div> |
| </div> |
| <div class="button button-reset" role="button" aria-label="Search"> |
| <button class="toggle-button icon icon-close" id="reset-search"></button> |
| </div> |
| </div> |
| </nav> |
| </header> |
| |
| <main class="main"> |
| <div class="drawer"> |
| <nav aria-label="Navigation"> |
| <a href="https://www.eclipse.org/hawkbit/" class="project"> |
| <div class="banner"> |
| |
| <div class="logo"> |
| <img src="https://www.eclipse.org/hawkbit/images/hawkbit_icon.png"> |
| </div> |
| |
| <div class="name"> |
| <strong>Eclipse hawkBit™ </strong> |
| |
| <br> |
| eclipse/hawkbit |
| |
| </div> |
| </div> |
| </a> |
| |
| <div class="scrollable"> |
| <div class="wrapper"> |
| |
| <ul class="repo"> |
| <li class="repo-download"> |
| <a href="https://hawkbit.eclipse.org" target="_blank" title="hawkBit Sandbox" data-action="sandbox"> |
| <i class="fas fa-desktop"></i> Sandbox |
| </a> |
| </li> |
| <li class="repo-stars"> |
| <a href="https://github.com/eclipse/hawkbit/stargazers" target="_blank" title="Stargazers" data-action="star"> |
| <i class="icon icon-star"></i> Stars |
| <span class="count">–</span> |
| </a> |
| </li> |
| </ul> |
| <hr> |
| |
| |
| <div class="toc"> |
| |
| <ul> |
| |
| |
| |
| |
| |
| <li> |
| |
| |
| |
| |
| |
| <a title="What is hawkBit" href="/hawkbit/whatishawkbit/"> |
| |
| What is hawkBit |
| </a> |
| |
| |
| |
| </li> |
| |
| |
| |
| <li> |
| |
| |
| |
| |
| |
| <a title="Getting started" href="/hawkbit/gettingstarted/"> |
| |
| Getting started |
| </a> |
| |
| |
| |
| </li> |
| |
| |
| |
| <li> |
| |
| |
| |
| |
| |
| <a title="Guides" href="/hawkbit/guides/"> |
| |
| Guides |
| </a> |
| |
| |
| |
| </li> |
| |
| |
| |
| <li> |
| |
| |
| |
| |
| |
| <a title="Features" href="/hawkbit/features/"> |
| |
| Features |
| </a> |
| |
| |
| |
| </li> |
| |
| |
| |
| <li> |
| |
| |
| |
| |
| |
| <a title="Concepts" href="/hawkbit/concepts/"> |
| |
| Concepts |
| </a> |
| |
| |
| |
| </li> |
| |
| |
| |
| <li> |
| |
| |
| |
| |
| |
| <a title="Architecture" href="/hawkbit/architecture/"> |
| |
| Architecture |
| </a> |
| |
| |
| |
| </li> |
| |
| |
| |
| <li> |
| |
| |
| |
| |
| |
| <a title="Management UI" href="/hawkbit/ui/"> |
| |
| Management UI |
| </a> |
| |
| |
| |
| </li> |
| |
| |
| |
| <li> |
| |
| |
| |
| |
| |
| <a title="APIs" href="/hawkbit/apis/"> |
| |
| APIs |
| </a> |
| |
| |
| |
| </li> |
| |
| |
| |
| <li> |
| |
| |
| |
| |
| |
| <a title="Community" href="/hawkbit/community/"> |
| |
| Community |
| </a> |
| |
| |
| |
| </li> |
| |
| |
| |
| <li> |
| |
| |
| |
| |
| |
| <a title="Release notes" href="/hawkbit/release-notes/"> |
| |
| Release notes |
| </a> |
| |
| |
| |
| </li> |
| |
| |
| </ul> |
| |
| |
| |
| <hr> |
| |
| <ul> |
| <li> |
| <a href="https://gitter.im/eclipse/hawkbit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge" title="Chat on Gitter" target="_blank"> |
| <img src="https://badges.gitter.im/eclipse/hawkbit.svg" /> |
| </a> |
| </li> |
| <li> |
| <a href="https://circleci.com/gh/eclipse/hawkbit" title="Circle CI Status" target="_blank"> |
| <img src="https://circleci.com/gh/eclipse/hawkbit.svg?style=shield" /> |
| </a> |
| </li> |
| <li> |
| <a href="https://sonar.ops.bosch-iot-rollouts.com" title="SonarQube Status" target="_blank"> |
| <img src="https://sonar.ops.bosch-iot-rollouts.com/api/badges/gate?key=org.eclipse.hawkbit:hawkbit-parent" /> |
| </a> |
| </li> |
| <li> |
| <a href="https://maven-badges.herokuapp.com/maven-central/org.eclipse.hawkbit/hawkbit-parent" title="Maven Central Status" target="_blank"> |
| <img src="https://maven-badges.herokuapp.com/maven-central/org.eclipse.hawkbit/hawkbit-parent/badge.svg" /> |
| </a> |
| </li> |
| </ul> |
| |
| </div> |
| </div> |
| </div> |
| </nav> |
| |
| </div> |
| |
| <article class="article"> |
| <div class="wrapper"> |
| <h1>Device Management Federation API </h1> |
| |
| <p>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.</p> |
| |
| <h2 id="basics">Basics</h2> |
| |
| <p>There are three basic concepts of AMQP:</p> |
| |
| <ul> |
| <li>Exchanges - what you publish to.</li> |
| <li>Queues - what you consume from.</li> |
| <li>Bindings - configuration that maps an exchange to a queue.</li> |
| </ul> |
| |
| <p><strong>Queues</strong> are just a place for receiving messages.<br /> |
| Bindings determine how messages get put in this place |
| Queues can also be bound to multiple exchanges.</p> |
| |
| <p><strong>Exchanges</strong> 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.</p> |
| |
| <p>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 <strong>dmf.exchange</strong>.</p> |
| |
| <p>The user has to set a <code>reply_to</code> header (see chapter below), in order to specify the exchange to which hawkBit should reply to.</p> |
| |
| <p>The following chapter describes the message body, header and properties.</p> |
| |
| <p>Note: the DMF protocol was intended to be compatible to other use cases by design. As a result, DMF uses the term <strong>thing</strong> and not <strong>target</strong> but they are actually synonyms in this case.</p> |
| |
| <h2 id="messages-sent-to-hawkbit-client-hawkbit">Messages sent to hawkBit (Client -> hawkBit)</h2> |
| |
| <h3 id="thing-created">THING_CREATED</h3> |
| |
| <p>Message to register and update a provisioning target.</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “THING_CREATED”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>thingId</td> |
| <td>The ID of the registered provisioning target</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant this provisioning target belongs to</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>sender</td> |
| <td>Name of the message sender</td> |
| <td>String</td> |
| <td>false</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Message Properties</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>content_type</td> |
| <td>The content type of the payload</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>reply_to</td> |
| <td>Exchange to reply to</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Example headers and payload:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=THING_CREATED <br /> tenant=default <br /> thingId=abc <br /> sender=myClient</td> |
| <td>content_type=application/json <br /> reply_to=myExchangeToReplyTo</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Payload Template (optional):</p> |
| |
| <pre><code class="language-json">{ |
| "name": "String" |
| } |
| </code></pre> |
| |
| <p>The “name” property specifies the name of the thing, which by default is the thing ID. This property is optional.</p> |
| |
| <h3 id="thing-removed">THING_REMOVED</h3> |
| |
| <p>Message to request the deletion of a provisioning target.</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “THING_REMOVED”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>thingId</td> |
| <td>The ID of the registered provisioning target</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant this provisioning target belongs to</td> |
| <td>String</td> |
| <td>false</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Message Properties</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>content_type</td> |
| <td>The content type of the payload</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Example headers</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=THING_REMOVED <br /> tenant=default <br /> thingId=abc</td> |
| <td>content_type=application/json</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <h3 id="update-attributes">UPDATE_ATTRIBUTES</h3> |
| |
| <p>Message to update target attributes. This message can be send in response to a _REQUEST_ATTRIBUTES<em>UPDATE</em> event, sent by hawkBit.</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “EVENT”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>topic</td> |
| <td>Topic name identifying the event</td> |
| <td>Fixed string “UPDATE_ATTRIBUTES”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>thingId</td> |
| <td>The ID of the registered thing</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant this thing belongs to</td> |
| <td>String</td> |
| <td>false</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Message Properties</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>content_type</td> |
| <td>The content type of the payload</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Example header and payload:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=EVENT <br /> tenant=default <br /> thingId=abc <br /> topic=UPDATE_ATTRIBUTES</td> |
| <td>content_type=application/json <br /></td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Payload Template:</p> |
| |
| <pre><code class="language-json">{ |
| "attributes": { |
| "exampleKey1" : "exampleValue1", |
| "exampleKey2" : "exampleValue2" |
| }, |
| "mode": "String" |
| } |
| </code></pre> |
| |
| <p>The “mode” property specifies the update mode that should be applied. This property is optional. Possible <a href="https://github.com/eclipse/hawkbit/tree/master/hawkbit-dmf/hawkbit-dmf-api/src/main/java/org/eclipse/hawkbit/dmf/json/model/DmfUpdateMode.java">mode</a> values:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Value</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>MERGE</td> |
| <td>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.</td> |
| </tr> |
| |
| <tr> |
| <td>REPLACE</td> |
| <td>The existing attributes are replaced with the target attributes specified in the payload.</td> |
| </tr> |
| |
| <tr> |
| <td>REMOVE</td> |
| <td>The target attributes specified in the payload are removed from the existing attributes.</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <h3 id="update-action-status">UPDATE_ACTION_STATUS</h3> |
| |
| <p>Message to send an action status event to hawkBit.</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “EVENT”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>topic</td> |
| <td>Topic name identifying the event</td> |
| <td>Fixed string “UPDATE_ACTION_STATUS”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant this thing belongs to</td> |
| <td>String</td> |
| <td>false</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Message Properties</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>content_type</td> |
| <td>The content type of the payload</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Payload Template (the Java representation is <a href="https://github.com/eclipse/hawkbit/tree/master/hawkbit-dmf/hawkbit-dmf-api/src/main/java/org/eclipse/hawkbit/dmf/json/model/DmfActionUpdateStatus.java">ActionUpdateStatus</a>):</p> |
| |
| <pre><code class="language-json">{ |
| "actionId": long, |
| "softwareModuleId": long, |
| "actionStatus":"String", |
| "message":["String"] |
| } |
| </code></pre> |
| |
| <p>Possible <a href="https://github.com/eclipse/hawkbit/tree/master/hawkbit-dmf/hawkbit-dmf-api/src/main/java/org/eclipse/hawkbit/dmf/json/model/DmfActionStatus.java">actionStatus</a> values:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Value</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>DOWNLOAD</td> |
| <td>Device is downloading</td> |
| </tr> |
| |
| <tr> |
| <td>DOWNLOADED</td> |
| <td>Device completed download</td> |
| </tr> |
| |
| <tr> |
| <td>RETRIEVED</td> |
| <td>Device has retrieved the artifact</td> |
| </tr> |
| |
| <tr> |
| <td>RUNNING</td> |
| <td>Update is running</td> |
| </tr> |
| |
| <tr> |
| <td>FINISHED</td> |
| <td>Update process finished successful</td> |
| </tr> |
| |
| <tr> |
| <td>ERROR</td> |
| <td>Error during update process</td> |
| </tr> |
| |
| <tr> |
| <td>WARNING</td> |
| <td>Warning during update process</td> |
| </tr> |
| |
| <tr> |
| <td>CANCELED</td> |
| <td>Cancel update process successful</td> |
| </tr> |
| |
| <tr> |
| <td>CANCEL_REJECTED</td> |
| <td>Cancel update process has been rejected</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Example header and payload:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=EVENT <br /> tenant=default <br /> topic=UPDATE_ACTION_STATUS</td> |
| <td>content_type=application/json</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <pre><code class="language-json">{ |
| "actionId":137, |
| "softwareModuleId":17, |
| "actionStatus":"DOWNLOAD", |
| "message":["The download has started"] |
| } |
| </code></pre> |
| |
| <h3 id="ping">PING</h3> |
| |
| <p>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:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “PING”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant the PING belongs to</td> |
| <td>String</td> |
| <td>false</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Message Properties</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>correlationId</td> |
| <td>CorrelationId that allows the client to map a PING request to PING_RESPONSE</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <h2 id="messages-sent-by-hawkbit-hawkbit-client">Messages sent by hawkBit (hawkBit -> Client)</h2> |
| |
| <h3 id="cancel-download">CANCEL_DOWNLOAD</h3> |
| |
| <p>Message to cancel an update task.</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “Event”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>thingId</td> |
| <td>The ID of the registered provisioning target</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>topic</td> |
| <td>Topic name identifying the event</td> |
| <td>Fixed string “CANCEL_DOWNLOAD”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant this provisioning target belongs to</td> |
| <td>String</td> |
| <td>false</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Message Properties</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>content_type</td> |
| <td>The content type of the payload</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Payload template:</p> |
| |
| <pre><code class="language-json">{ |
| "actionId": long |
| } |
| </code></pre> |
| |
| <p>Example Headers and Payload:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=EVENT <br /> tenant=default <br /> thingId=abc <br /> topic=CANCEL_DOWNLOAD</td> |
| <td>content_type=application/json</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <pre><code class="language-json">{ |
| "actionId":137 |
| } |
| </code></pre> |
| |
| <p>After sending this message, an action status event with either actionStatus=CANCELED or actionStatus=CANCEL_REJECTED has to be returned.</p> |
| |
| <p>Example header and payload when cancellation is successful:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=EVENT <br /> tenant=default <br /> topic=UPDATE_ACTION_STATUS</td> |
| <td>content_type=application/json</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <pre><code class="language-json">{ |
| "actionId":137, |
| "softwareModuleId":17, |
| "actionStatus":"CANCELED", |
| "message":["The update was canceled."] |
| } |
| </code></pre> |
| |
| <p>Example header and payload when cancellation is rejected:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=EVENT <br /> tenant=default <br /> topic=UPDATE_ACTION_STATUS</td> |
| <td>content_type=application/json</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <pre><code class="language-json">{ |
| "actionId":137, |
| "softwareModuleId":17, |
| "actionStatus":"CANCEL_REJECTED", |
| "message":["The cancellation was not possible since the target sent an unexpected response."] |
| } |
| </code></pre> |
| |
| <h3 id="download-and-install-or-download">DOWNLOAD_AND_INSTALL or DOWNLOAD</h3> |
| |
| <p>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 <em>DOWNLOAD</em> instead of _DOWNLOAD_AND<em>INSTALL</em>.</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “EVENT”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>thingId</td> |
| <td>The ID of the registered provisioning target</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>topic</td> |
| <td>Topic name identifying the event</td> |
| <td>Fixed string “DOWNLOAD_AND_INSTALL” or “DOWNLOAD”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant this provisioning target belongs to</td> |
| <td>String</td> |
| <td>false</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Message Properties</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>content_type</td> |
| <td>The content type of the payload</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Payload Template (the Java representation is <a href="https://github.com/eclipse/hawkbit/tree/master/hawkbit-dmf/hawkbit-dmf-api/src/main/java/org/eclipse/hawkbit/dmf/json/model/DmfDownloadAndUpdateRequest.java">DmfDownloadAndUpdateRequest</a>):</p> |
| |
| <pre><code class="language-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" |
| } |
| ] |
| }] |
| } |
| </code></pre> |
| |
| <p>Example header and payload:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=EVENT <br /> tenant=default <br /> thingId=abc <br /> topic=DOWNLOAD_AND_INSTALL</td> |
| <td>content_type=application/json</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <pre><code class="language-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#" |
| } |
| ] |
| }] |
| } |
| </code></pre> |
| |
| <h3 id="multi-action">MULTI_ACTION</h3> |
| |
| <p>If <code>multi.assignments.enabled</code> 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).</p> |
| |
| <p>With weight, one can set the priority to the action. The higher the weight, the higher is the priority of an action.</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “EVENT”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>thingId</td> |
| <td>The ID of the registered provisioning target</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>topic</td> |
| <td>Topic name identifying the event</td> |
| <td>Fixed string “MULTI_ACTION”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant this provisioning target belongs to</td> |
| <td>String</td> |
| <td>false</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Message Properties</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>content_type</td> |
| <td>The content type of the payload</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Payload Template (the Java representation is <a href="https://github.com/eclipse/hawkbit/tree/master/hawkbit-dmf/hawkbit-dmf-api/src/main/java/org/eclipse/hawkbit/dmf/json/model/DmfMultiActionRequest.java">DmfMultiActionRequest</a>):</p> |
| |
| <pre><code class="language-json">[{ |
| "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" |
| } |
| ] |
| }] |
| } |
| }] |
| </code></pre> |
| |
| <p>Example header and payload:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=EVENT <br /> tenant=default <br /> thingId=abc <br /> topic=MULTI_ACTION</td> |
| <td>content_type=application/json</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <pre><code class="language-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#" |
| } |
| ] |
| }] |
| } |
| }] |
| </code></pre> |
| |
| <h3 id="thing-deleted">THING_DELETED</h3> |
| |
| <p>Message sent by hawkBit when a target has been deleted.</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “THING_DELETED”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>thingId</td> |
| <td>The ID of the registered provisioning target</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant this provisioning target belongs to</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Example header:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=THING_DELETED <br /> tenant=default <br /> thingId=abc</td> |
| <td></td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <h3 id="request-attributes-update">REQUEST_ATTRIBUTES_UPDATE</h3> |
| |
| <p>Message sent by Eclipse hawkBit when a re-transmission of target attributes is requested.</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “EVENT”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>thingId</td> |
| <td>The ID of the registered provisioning target</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>topic</td> |
| <td>Topic name identifying the event</td> |
| <td>Fixed string “REQUEST_ATTRIBUTES_UPDATE”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant this provisioning target belongs to</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>Example headers:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=EVENT <br /> tenant=default <br /> thingId=abc <br /> topic=REQUEST_ATTRIBUTES_UPDATE</td> |
| <td></td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <h3 id="ping-response">PING_RESPONSE</h3> |
| |
| <p><em>hawkBit</em> will respond to the PING message with a PING_RESPONSE type message that has the same correlationId as the original PING message:</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type</td> |
| <td>Type of the message</td> |
| <td>Fixed string “PING_RESPONSE”</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>tenant</td> |
| <td>The tenant the PING belongs to</td> |
| <td>String</td> |
| <td>false</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Message Properties</th> |
| <th>Description</th> |
| <th>Type</th> |
| <th>Mandatory</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>correlationId</td> |
| <td>CorrelationId of the original PING request</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| |
| <tr> |
| <td>content_type</td> |
| <td>The content type of the payload</td> |
| <td>String</td> |
| <td>true</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p>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.</p> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Header</th> |
| <th>MessageProperties</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td>type=PING_RESPONSE <br /> tenant=default</td> |
| <td>content_type=text/plain</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <pre><code class="language-text">1505215891247 |
| </code></pre> |
| |
| <aside class="copyright" role="note"> |
| <div class="logo"> |
| <a href="https://www.eclipse.org" target="_blank"> |
| <img src="/hawkbit/images/eclipse_foundation_logo.png" /> |
| </a> |
| </div> |
| <p class="notice"> |
| |
| © 2021 The Eclipse hawkBit Project – |
| |
| Documentation built with |
| <a href="https://www.gohugo.io" target="_blank">Hugo</a> |
| using the |
| <a href="http://github.com/digitalcraftsman/hugo-material-docs" target="_blank">Material</a> theme. |
| </p> |
| <p class="quickLinks"> |
| <a href="http://www.eclipse.org/legal/privacy.php" target="_blank"> |
| > Privacy Policy |
| </a> |
| <a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank"> |
| > Terms of Use |
| </a> |
| <a href="http://www.eclipse.org/legal/copyright.php" target="_blank"> |
| > Copyright Agent |
| </a> |
| <a href="http://www.eclipse.org/legal" target="_blank"> |
| > Legal |
| </a> |
| <a href="https://www.eclipse.org/org/documents/epl-v10.php" target="_blank"> |
| > License |
| </a> |
| </p> |
| </aside> |
| |
| |
| <footer class="footer"> |
| |
| |
| <nav class="pagination" aria-label="Footer"> |
| <div class="previous"> |
| |
| <a href="https://www.eclipse.org/hawkbit/community/" title="Community"> |
| <span class="direction"> |
| Previous |
| </span> |
| <div class="page"> |
| <div class="button button-previous" role="button" aria-label="Previous"> |
| <i class="icon icon-back"></i> |
| </div> |
| <div class="stretch"> |
| <div class="title"> |
| Community |
| </div> |
| </div> |
| </div> |
| </a> |
| |
| </div> |
| |
| <div class="next"> |
| |
| <a href="https://www.eclipse.org/hawkbit/apis/ddi_api/" title="Direct Device Integration API"> |
| <span class="direction"> |
| Next |
| </span> |
| <div class="page"> |
| <div class="stretch"> |
| <div class="title"> |
| Direct Device Integration API |
| </div> |
| </div> |
| <div class="button button-next" role="button" aria-label="Next"> |
| <i class="icon icon-forward"></i> |
| </div> |
| </div> |
| </a> |
| |
| </div> |
| </nav> |
| |
| |
| |
| |
| |
| </footer> |
| </div> |
| </article> |
| |
| <div class="results" role="status" aria-live="polite"> |
| <div class="scrollable"> |
| <div class="wrapper"> |
| <div class="meta"></div> |
| <div class="list"></div> |
| </div> |
| </div> |
| </div> |
| </main> |
| |
| <script> |
| |
| var base_url = 'https:\/\/www.eclipse.org\/hawkbit\/'; |
| var repo_id = 'eclipse\/hawkbit'; |
| |
| </script> |
| |
| <script src="https://www.eclipse.org/hawkbit/javascripts/application.js"></script> |
| |
| |
| <script> |
| /* Add headers to scrollspy */ |
| var headers = document.getElementsByTagName("h2"); |
| var scrollspy = document.getElementById('scrollspy'); |
| |
| if(scrollspy) { |
| if(headers.length > 0) { |
| for(var i = 0; i < headers.length; i++) { |
| var li = document.createElement("li"); |
| li.setAttribute("class", "anchor"); |
| |
| var a = document.createElement("a"); |
| if(!headers[i].id) |
| a.setAttribute("href", headers[i].parentNode.href); |
| else |
| a.setAttribute("href", "#" + headers[i].id); |
| a.setAttribute("title", headers[i].innerHTML); |
| a.innerHTML = headers[i].innerHTML; |
| |
| li.appendChild(a); |
| scrollspy.appendChild(li); |
| } |
| } else { |
| scrollspy.parentElement.removeChild(scrollspy) |
| } |
| |
| |
| /* Add permanent link next to the headers */ |
| var headers = document.querySelectorAll("h1, h2, h3, h4, h5, h6"); |
| |
| for(var i = 0; i < headers.length; i++) { |
| var a = document.createElement("a"); |
| a.setAttribute("class", "headerlink"); |
| a.setAttribute("href", "#" + headers[i].id); |
| a.setAttribute("title", "Permanent link"); |
| a.innerHTML = "#"; |
| headers[i].appendChild(a); |
| } |
| } |
| </script> |
| |
| <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.8.0/highlight.min.js"></script> |
| <script>hljs.initHighlightingOnLoad();</script> |
| </body> |
| </html> |
| |