latest web site changes
diff --git a/404.html b/404.html
index 4ab7791..643083d 100644
--- a/404.html
+++ b/404.html
@@ -277,15 +277,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/categories/index.html b/categories/index.html
index 8a5aa6e..74e0049 100644
--- a/categories/index.html
+++ b/categories/index.html
@@ -316,15 +316,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/community/contributing/index.html b/community/contributing/index.html
index caf5ee6..906e93f 100644
--- a/community/contributing/index.html
+++ b/community/contributing/index.html
@@ -387,15 +387,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/community/get-in-touch/index.html b/community/get-in-touch/index.html
index f013048..2e69719 100644
--- a/community/get-in-touch/index.html
+++ b/community/get-in-touch/index.html
@@ -314,15 +314,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/community/index.html b/community/index.html
index a9cefc7..0d02801 100644
--- a/community/index.html
+++ b/community/index.html
@@ -316,15 +316,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/community/presentations/index.html b/community/presentations/index.html
index ac9d54c..26ecbf4 100644
--- a/community/presentations/index.html
+++ b/community/presentations/index.html
@@ -333,15 +333,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/community/road-map/index.html b/community/road-map/index.html
index 2439df2..08e1046 100644
--- a/community/road-map/index.html
+++ b/community/road-map/index.html
@@ -287,15 +287,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/css/custom.css b/css/custom.css
index ca84764..b4828c2 100644
--- a/css/custom.css
+++ b/css/custom.css
@@ -1,11 +1,11 @@
-#footer div.incubation {
- float: right;
- width: 99px;
+#footer div.eclipse-logos {
+ height: 120px;
}
-#footer div.eclipse-logo {
- width: 250px;
+#footer div.eclipse-logos #logo-eclipse-foundation {
+ margin: -20px;
+ height: 120px;
}
.alert {
diff --git a/docs/404.html b/docs/404.html
index 5a743c2..303cabd 100644
--- a/docs/404.html
+++ b/docs/404.html
@@ -18,16 +18,16 @@
<title>404 Page not found</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/horsey.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/horsey.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
<style type="text/css">
:root #header + #content > #left > #rlblock_left {
diff --git a/docs/admin-guide/amqp-adapter-config/index.html b/docs/admin-guide/amqp-adapter-config/index.html
index 2db7128..d75a8be 100644
--- a/docs/admin-guide/amqp-adapter-config/index.html
+++ b/docs/admin-guide/amqp-adapter-config/index.html
@@ -21,19 +21,19 @@
<title>AMQP Adapter Configuration :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/amqp-adapter-config/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/amqp-adapter-config/" selected>stable (1.0)</option>
@@ -1423,7 +1423,7 @@
<tr>
<td align="left"><code>HONO_AMQP_INSECURE_PORT</code><br><code>--hono.amqp.insecurePort</code></td>
<td align="center">no</td>
-<td align="left"><code>4040</code></td>
+<td align="left"><code>5672</code></td>
<td align="left">The port number that the protocol adapter should listen on for insecure connections.<br>See <a href="#port-configuration">Port Configuration</a> below for details.</td>
</tr>
@@ -1493,7 +1493,7 @@
<tr>
<td align="left"><code>HONO_AMQP_PORT</code><br><code>--hono.amqp.port</code></td>
<td align="center">no</td>
-<td align="left"><code>4041</code></td>
+<td align="left"><code>5671</code></td>
<td align="left">The secure port that the protocol adapter should listen on.<br>See <a href="#port-configuration">Port Configuration</a> below for details.</td>
</tr>
@@ -1505,6 +1505,13 @@
</tr>
<tr>
+<td align="left"><code>HONO_AMQP_TENANT_IDLE_TIMEOUT</code><br><code>--hono.amqp.tenantIdleTimeout</code></td>
+<td align="center">no</td>
+<td align="left"><code>0ms</code></td>
+<td align="left">The duration after which the protocol adapter removes local state of the tenant (e.g. open AMQP links) with an amount and a unit, e.g. <code>2h</code> for 2 hours. See the <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-conversion-duration">Spring Boot documentation</a> for an explanation of the format. The value <code>0ms</code> disables the timeout.</td>
+</tr>
+
+<tr>
<td align="left"><code>HONO_APP_MAX_INSTANCES</code><br><code>--hono.app.maxInstances</code></td>
<td align="center">no</td>
<td align="left"><em>#CPU cores</em></td>
@@ -1538,7 +1545,7 @@
<li>setting the <code>HONO_AMQP_KEY_PATH</code> and <code>HONO_AMQP_CERT_PATH</code> variables in order to load the key and certificate from two separate PEM files in PKCS8 format.</li>
</ol>
-<p>When starting up, the protocol adapter will bind a TLS secured socket to the default secure port 4041. The port number can also be set explicitly using the <code>HONO_AMQP_PORT</code> variable.</p>
+<p>When starting up, the protocol adapter will bind a TLS secured socket to the default secure port 5671. The port number can also be set explicitly using the <code>HONO_AMQP_PORT</code> variable.</p>
<p>The <code>HONO_AMQP_BIND_ADDRESS</code> variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the <em>loopback device</em> only, i.e. the port will only be accessible from the local host. Setting this variable to <code>0.0.0.0</code> will let the port being bound to <strong>all</strong> network interfaces (be careful not to expose the port unintentionally to the outside world).</p>
@@ -1548,10 +1555,10 @@
<ul>
<li>explicitly setting <code>HONO_AMQP_INSECURE_PORT</code> to a valid port number, or by</li>
-<li>implicitly configuring the default adapter port (4040) by simply setting <code>HONO_AMQP_INSECURE_PORT_ENABLED</code> to <code>true</code>.</li>
+<li>implicitly configuring the default adapter port (5672) by simply setting <code>HONO_AMQP_INSECURE_PORT_ENABLED</code> to <code>true</code>.</li>
</ul>
-<p>The protocol adapter issues a warning on the console if <code>HONO_AMQP_INSECURE_PORT</code> is set to the default secure port (4041) used by the adapter for secure connections.</p>
+<p>The protocol adapter issues a warning on the console if <code>HONO_AMQP_INSECURE_PORT</code> is set to the default secure port (5671) used by the adapter for secure connections.</p>
<p>The <code>HONO_AMQP_INSECURE_PORT_BIND_ADDRESS</code> variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the <em>loopback device</em> only, i.e. the port will only be accessible from the local host. This variable might be used to e.g. expose the non-TLS secured port on a local interface only, thus providing easy access from within the local network, while still requiring encrypted communication when accessed from the outside over public network infrastructure.</p>
@@ -1629,35 +1636,35 @@
<tbody>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_HOST</code><br><code>--hono.plan.prometheusBased.host</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_HOST</code><br><code>--hono.resourceLimits.prometheusBased.host</code></td>
<td align="center">no</td>
<td align="left">none</td>
<td align="left">The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_PORT</code><br><code>--hono.plan.prometheusBased.port</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_PORT</code><br><code>--hono.resourceLimits.prometheusBased.port</code></td>
<td align="center">no</td>
<td align="left"><code>9090</code></td>
<td align="left">The port of the Prometheus server to retrieve metrics data from.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_MIN_SIZE</code><br><code>--hono.plan.prometheusBased.cacheMinSize</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MIN_SIZE</code><br><code>--hono.resourceLimits.prometheusBased.cacheMinSize</code></td>
<td align="center">no</td>
<td align="left"><code>20</code></td>
<td align="left">The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_MAX_SIZE</code><br><code>--hono.plan.prometheusBased.cacheMaxSize</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MAX_SIZE</code><br><code>--hono.resourceLimits.prometheusBased.cacheMaxSize</code></td>
<td align="center">no</td>
<td align="left"><code>1000</code></td>
<td align="left">The maximum size of the cache to store the metrics data retrieved from the Prometheus server.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_TIMEOUT</code><br><code>--hono.plan.prometheusBased.cacheTimeout</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_TIMEOUT</code><br><code>--hono.resourceLimits.prometheusBased.cacheTimeout</code></td>
<td align="center">no</td>
<td align="left"><code>600</code></td>
<td align="left">The number of seconds after which the cached metrics data should be considered invalid.</td>
@@ -2542,20 +2549,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/amqp-network-config/index.html b/docs/admin-guide/amqp-network-config/index.html
index 78c1194..61d5d7f 100644
--- a/docs/admin-guide/amqp-network-config/index.html
+++ b/docs/admin-guide/amqp-network-config/index.html
@@ -21,19 +21,19 @@
<title>AMQP 1.0 Messaging Network Configuration :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/amqp-network-config/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/amqp-network-config/" selected>stable (1.0)</option>
@@ -2240,20 +2240,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/auth-server-config/index.html b/docs/admin-guide/auth-server-config/index.html
index 5842913..1f5f3d9 100644
--- a/docs/admin-guide/auth-server-config/index.html
+++ b/docs/admin-guide/auth-server-config/index.html
@@ -21,19 +21,19 @@
<title>Auth Server Configuration :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/auth-server-config/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/auth-server-config/" selected>stable (1.0)</option>
@@ -2446,20 +2446,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/common-config/index.html b/docs/admin-guide/common-config/index.html
index 9e3b260..ae3f25e 100644
--- a/docs/admin-guide/common-config/index.html
+++ b/docs/admin-guide/common-config/index.html
@@ -21,19 +21,19 @@
<title>Common Configuration :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/common-config/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/common-config/" selected>stable (1.0)</option>
@@ -2311,20 +2311,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/device-connection-config/index.html b/docs/admin-guide/device-connection-config/index.html
index d348866..c65f0a6 100644
--- a/docs/admin-guide/device-connection-config/index.html
+++ b/docs/admin-guide/device-connection-config/index.html
@@ -21,19 +21,19 @@
<title>Configuring the Device Connection Service :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/device-connection-config/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/device-connection-config/" selected>stable (1.0)</option>
@@ -2498,20 +2498,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/device-registry-config/index.html b/docs/admin-guide/device-registry-config/index.html
index 44c0659..b82ad34 100644
--- a/docs/admin-guide/device-registry-config/index.html
+++ b/docs/admin-guide/device-registry-config/index.html
@@ -21,19 +21,19 @@
<title>Device Registry Configuration :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/device-registry-config/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/device-registry-config/" selected>stable (1.0)</option>
@@ -2697,20 +2697,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/hono-client-configuration/index.html b/docs/admin-guide/hono-client-configuration/index.html
index a71e67e..822b28a 100644
--- a/docs/admin-guide/hono-client-configuration/index.html
+++ b/docs/admin-guide/hono-client-configuration/index.html
@@ -21,19 +21,19 @@
<title>Hono Client Configuration :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/hono-client-configuration/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/hono-client-configuration/" selected>stable (1.0)</option>
@@ -1413,7 +1413,7 @@
<td align="left"><code>${PREFIX}_HOST</code><br><code>--${prefix}.host</code></td>
<td align="center">no</td>
<td align="left"><code>localhost</code></td>
-<td align="left">The IP address or name of the host to connect to. NB: This needs to be set to an address that can be resolved within the network the adapter runs on. When running as a Docker container, use Docker’s <code>--network</code> command line option to attach the local container to the Docker network that the service is running on.</td>
+<td align="left">The IP address or name of the host to connect to. <strong>NB</strong> This needs to be set to an address that can be resolved within the network the adapter runs on. When running as a Docker container, use Docker’s <code>--network</code> command line option to attach the local container to the Docker network that the service is running on.</td>
</tr>
<tr>
@@ -1431,13 +1431,6 @@
</tr>
<tr>
-<td align="left"><code>${PREFIX}_INACTIVE_LINK_TIMEOUT</code><br><code>--${prefix}.inactiveLinkTimeout</code></td>
-<td align="center">no</td>
-<td align="left"><code>0ms</code></td>
-<td align="left">Sets duration after which an AMQP sender link will be closed when no message has been sent on it with an amount and an unit, e.g. <code>2h</code> for 2 hours. See the <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-conversion-duration">Spring Boot documentation</a> for an explanation of the format. Links will not be closed automatically if the value is <code>0ms</code>.</td>
-</tr>
-
-<tr>
<td align="left"><code>${PREFIX}_INITIAL_CREDITS</code><br><code>--${prefix}.initialCredits</code></td>
<td align="center">no</td>
<td align="left"><code>200</code></td>
@@ -2508,20 +2501,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/http-adapter-config/index.html b/docs/admin-guide/http-adapter-config/index.html
index 43fbce7..badfeb2 100644
--- a/docs/admin-guide/http-adapter-config/index.html
+++ b/docs/admin-guide/http-adapter-config/index.html
@@ -21,19 +21,19 @@
<title>HTTP Adapter Configuration :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/http-adapter-config/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/http-adapter-config/" selected>stable (1.0)</option>
@@ -1496,6 +1496,13 @@
<td align="left"><code>TLSv1.2</code></td>
<td align="left">A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the <a href="https://vertx.io/docs/vertx-core/java/#ssl">vert.x documentation</a> for a list of supported protocol names.</td>
</tr>
+
+<tr>
+<td align="left"><code>HONO_HTTP_TENANT_IDLE_TIMEOUT</code><br><code>--hono.http.tenantIdleTimeout</code></td>
+<td align="center">no</td>
+<td align="left"><code>0ms</code></td>
+<td align="left">The duration after which the protocol adapter removes local state of the tenant (e.g. open AMQP links) with an amount and a unit, e.g. <code>2h</code> for 2 hours. See the <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-conversion-duration">Spring Boot documentation</a> for an explanation of the format. The value <code>0ms</code> disables the timeout.</td>
+</tr>
</tbody>
</table>
@@ -1615,35 +1622,35 @@
<tbody>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_HOST</code><br><code>--hono.plan.prometheusBased.host</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_HOST</code><br><code>--hono.resourceLimits.prometheusBased.host</code></td>
<td align="center">no</td>
<td align="left">none</td>
<td align="left">The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_PORT</code><br><code>--hono.plan.prometheusBased.port</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_PORT</code><br><code>--hono.resourceLimits.prometheusBased.port</code></td>
<td align="center">no</td>
<td align="left"><code>9090</code></td>
<td align="left">The port of the Prometheus server to retrieve metrics data from.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_MIN_SIZE</code><br><code>--hono.plan.prometheusBased.cacheMinSize</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MIN_SIZE</code><br><code>--hono.resourceLimits.prometheusBased.cacheMinSize</code></td>
<td align="center">no</td>
<td align="left"><code>20</code></td>
<td align="left">The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_MAX_SIZE</code><br><code>--hono.plan.prometheusBased.cacheMaxSize</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MAX_SIZE</code><br><code>--hono.resourceLimits.prometheusBased.cacheMaxSize</code></td>
<td align="center">no</td>
<td align="left"><code>1000</code></td>
<td align="left">The maximum size of the cache to store the metrics data retrieved from the Prometheus server.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_TIMEOUT</code><br><code>--hono.plan.prometheusBased.cacheTimeout</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_TIMEOUT</code><br><code>--hono.resourceLimits.prometheusBased.cacheTimeout</code></td>
<td align="center">no</td>
<td align="left"><code>600</code></td>
<td align="left">The number of seconds after which the cached metrics data should be considered invalid.</td>
@@ -2528,20 +2535,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/index.html b/docs/admin-guide/index.html
index 296ed24..97224cb 100644
--- a/docs/admin-guide/index.html
+++ b/docs/admin-guide/index.html
@@ -21,19 +21,19 @@
<title>Admin Guide :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/" selected>stable (1.0)</option>
@@ -1332,7 +1332,7 @@
<h1 id="admin-guide">Admin Guide</h1>
-<p>Learn how to operate Hono™ and look-up the configuration options of it’s components.</p>
+<p>Learn how to operate Eclipse Hono™ and look up the configuration options of its components.</p>
<footer class=" footline" >
@@ -2205,20 +2205,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/kura-adapter-config/index.html b/docs/admin-guide/kura-adapter-config/index.html
index f64c0c1..d37dc4f 100644
--- a/docs/admin-guide/kura-adapter-config/index.html
+++ b/docs/admin-guide/kura-adapter-config/index.html
@@ -21,19 +21,19 @@
<title>Kura Adapter Configuration :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/kura-adapter-config/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/kura-adapter-config/" selected>stable (1.0)</option>
@@ -1510,6 +1510,13 @@
<td align="left"><code>TLSv1.2</code></td>
<td align="left">A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the <a href="https://vertx.io/docs/vertx-core/java/#ssl">vert.x documentation</a> for a list of supported protocol names.</td>
</tr>
+
+<tr>
+<td align="left"><code>HONO_KURA_TENANT_IDLE_TIMEOUT</code><br><code>--hono.kura.tenantIdleTimeout</code></td>
+<td align="center">no</td>
+<td align="left"><code>0ms</code></td>
+<td align="left">The duration after which the protocol adapter removes local state of the tenant (e.g. open AMQP links) with an amount and a unit, e.g. <code>2h</code> for 2 hours. See the <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-conversion-duration">Spring Boot documentation</a> for an explanation of the format. The value <code>0ms</code> disables the timeout.</td>
+</tr>
</tbody>
</table>
@@ -1629,35 +1636,35 @@
<tbody>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_HOST</code><br><code>--hono.plan.prometheusBased.host</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_HOST</code><br><code>--hono.resourceLimits.prometheusBased.host</code></td>
<td align="center">no</td>
<td align="left">none</td>
<td align="left">The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_PORT</code><br><code>--hono.plan.prometheusBased.port</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_PORT</code><br><code>--hono.resourceLimits.prometheusBased.port</code></td>
<td align="center">no</td>
<td align="left"><code>9090</code></td>
<td align="left">The port of the Prometheus server to retrieve metrics data from.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_MIN_SIZE</code><br><code>--hono.plan.prometheusBased.cacheMinSize</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MIN_SIZE</code><br><code>--hono.resourceLimits.prometheusBased.cacheMinSize</code></td>
<td align="center">no</td>
<td align="left"><code>20</code></td>
<td align="left">The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_MAX_SIZE</code><br><code>--hono.plan.prometheusBased.cacheMaxSize</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MAX_SIZE</code><br><code>--hono.resourceLimits.prometheusBased.cacheMaxSize</code></td>
<td align="center">no</td>
<td align="left"><code>1000</code></td>
<td align="left">The maximum size of the cache to store the metrics data retrieved from the Prometheus server.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_TIMEOUT</code><br><code>--hono.plan.prometheusBased.cacheTimeout</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_TIMEOUT</code><br><code>--hono.resourceLimits.prometheusBased.cacheTimeout</code></td>
<td align="center">no</td>
<td align="left"><code>600</code></td>
<td align="left">The number of seconds after which the cached metrics data should be considered invalid.</td>
@@ -2542,20 +2549,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/monitoring-tracing-config/index.html b/docs/admin-guide/monitoring-tracing-config/index.html
index 512f062..f21bf95 100644
--- a/docs/admin-guide/monitoring-tracing-config/index.html
+++ b/docs/admin-guide/monitoring-tracing-config/index.html
@@ -21,19 +21,19 @@
<title>Monitoring & Tracing :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/monitoring-tracing-config/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/monitoring-tracing-config/" selected>stable (1.0)</option>
@@ -1333,7 +1333,6 @@
<ul>
<li><a href="#configuring-a-metrics-back-end">Configuring a Metrics Back End</a></li>
<li><a href="#using-prometheus">Using Prometheus</a></li>
-<li><a href="#legacy-metrics-support">Legacy Metrics Support</a></li>
</ul></li>
<li><a href="#health-check-server-configuration">Health Check Server Configuration</a></li>
<li><a href="#tracing">Tracing</a>
@@ -1407,53 +1406,14 @@
(or <em>scrapes</em>) all components periodically for new metrics data.
For this to work, the Prometheus server needs to be configured with the IP
addresses of the components to monitor. In the example deployment that comes
-with Hono, the Kubernetes <em>pods</em> that the Hono components are running in are
-marked by means of a label. The Prometheus server then periodically queries
-the Kubernetes API to determine a list of pods (and their IP addresses) that
-have the corresponding label.
+with Hono, the Prometheus server is configured with the names of the Kubernetes
+services corresponding to the Hono components that it should scrape.
The components themselves need to expose a corresponding HTTP endpoint that
the Prometheus server can connect to for scraping the meter data. All
Hono components that report metrics can be configured to expose such an
endpoint via their <a href="#health-check-server-configuration"><em>Health Check</em> server</a>
which already exposes endpoints for determining the component’s readiness and liveness status.</p>
-<h3 id="legacy-metrics-support">Legacy Metrics Support</h3>
-
-<p>In addition to using standard Micrometer back ends, Hono also provides out of
-the box support for the pre-0.8 Graphite based format. This will configure the
-Graphite adapter to output metrics in the legacy format
-used by Hono versions before 0.8. Further configuration of the Graphite adapter
-can be made using the standard Spring Boot configuration of Micrometer.
-The legacy support can be enabled using the following configuration switch:</p>
-
-<table>
-<thead>
-<tr>
-<th align="left">Environment Variable<br>Command Line Option</th>
-<th align="center">Mandatory</th>
-<th align="left">Default</th>
-<th align="left">Description</th>
-</tr>
-</thead>
-
-<tbody>
-<tr>
-<td align="left"><code>HONO_METRICS_LEGACY</code><br><nobr><code>--hono.metrics.legacy</code></nobr></td>
-<td align="center">no</td>
-<td align="left"><code>false</code></td>
-<td align="left">Enable legacy metrics using graphite.</td>
-</tr>
-</tbody>
-</table>
-
-<p>It is also necessary to enable the build profile for Graphite (<code>metrics-graphite</code>),
-as the legacy back end is based on the Graphite wire format. The profile will
-add the necessary dependencies to the build. If the dependencies are missing,
-the startup of the Hono components will fail.</p>
-
-<p>The names and semantics of the individual metrics being reported by the components
-are described in the <a href="/hono/docs/api/metrics/#legacy-metrics">Legacy Metrics specification</a>.</p>
-
<h2 id="health-check-server-configuration">Health Check Server Configuration</h2>
<p>All of Hono’s service components and protocol adapters contain a <em>Health Check</em> server which can be configured to
@@ -1579,7 +1539,7 @@
<p><strong>Hint</strong>: to resolve all dependencies for <code>jaeger-tracerresolver</code> in order to provide them to <code>/opt/hono/extensions</code>, you may want to rely on Maven’s dependency plugin. To obtain all jar files you can invoke the following command in a simple Maven project that contains only the dependency to <code>jaeger-tracerresolver</code>:</p>
-<pre><code>mvn dependency:copy-dependencies
+<pre><code class="language-sh">mvn dependency:copy-dependencies
</code></pre>
<p>All jar files can then be found in the directory <code>target/dependency</code>.</p>
@@ -1591,7 +1551,7 @@
<p>For example, building the HTTP adapter image with the Jaeger client included:</p>
-<pre><code># in directory: hono/adapters/http-vertx/
+<pre><code class="language-sh"># in directory: hono/adapters/http-vertx/
mvn clean install -Pbuild-docker-image,jaeger
</code></pre>
@@ -2474,20 +2434,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/mqtt-adapter-config/index.html b/docs/admin-guide/mqtt-adapter-config/index.html
index 9ac8027..3fac377 100644
--- a/docs/admin-guide/mqtt-adapter-config/index.html
+++ b/docs/admin-guide/mqtt-adapter-config/index.html
@@ -21,19 +21,19 @@
<title>MQTT Adapter Configuration :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/mqtt-adapter-config/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/mqtt-adapter-config/" selected>stable (1.0)</option>
@@ -1503,6 +1503,13 @@
<td align="left"><code>TLSv1.2</code></td>
<td align="left">A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the <a href="https://vertx.io/docs/vertx-core/java/#ssl">vert.x documentation</a> for a list of supported protocol names.</td>
</tr>
+
+<tr>
+<td align="left"><code>HONO_MQTT_TENANT_IDLE_TIMEOUT</code><br><code>--hono.mqtt.tenantIdleTimeout</code></td>
+<td align="center">no</td>
+<td align="left"><code>0ms</code></td>
+<td align="left">The duration after which the protocol adapter removes local state of the tenant (e.g. open AMQP links) with an amount and a unit, e.g. <code>2h</code> for 2 hours. See the <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-conversion-duration">Spring Boot documentation</a> for an explanation of the format. The value <code>0ms</code> disables the timeout.</td>
+</tr>
</tbody>
</table>
@@ -1622,35 +1629,35 @@
<tbody>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_HOST</code><br><code>--hono.plan.prometheusBased.host</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_HOST</code><br><code>--hono.resourceLimits.prometheusBased.host</code></td>
<td align="center">no</td>
<td align="left">none</td>
<td align="left">The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_PORT</code><br><code>--hono.plan.prometheusBased.port</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_PORT</code><br><code>--hono.resourceLimits.prometheusBased.port</code></td>
<td align="center">no</td>
<td align="left"><code>9090</code></td>
<td align="left">The port of the Prometheus server to retrieve metrics data from.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_MIN_SIZE</code><br><code>--hono.plan.prometheusBased.cacheMinSize</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MIN_SIZE</code><br><code>--hono.resourceLimits.prometheusBased.cacheMinSize</code></td>
<td align="center">no</td>
<td align="left"><code>20</code></td>
<td align="left">The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_MAX_SIZE</code><br><code>--hono.plan.prometheusBased.cacheMaxSize</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MAX_SIZE</code><br><code>--hono.resourceLimits.prometheusBased.cacheMaxSize</code></td>
<td align="center">no</td>
<td align="left"><code>1000</code></td>
<td align="left">The maximum size of the cache to store the metrics data retrieved from the Prometheus server.</td>
</tr>
<tr>
-<td align="left"><code>HONO_PLAN_PROMETHEUS_BASED_CACHE_TIMEOUT</code><br><code>--hono.plan.prometheusBased.cacheTimeout</code></td>
+<td align="left"><code>HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_TIMEOUT</code><br><code>--hono.resourceLimits.prometheusBased.cacheTimeout</code></td>
<td align="center">no</td>
<td align="left"><code>600</code></td>
<td align="left">The number of seconds after which the cached metrics data should be considered invalid.</td>
@@ -2535,20 +2542,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/admin-guide/secure_communication/index.html b/docs/admin-guide/secure_communication/index.html
index 5583447..17d5a0b 100644
--- a/docs/admin-guide/secure_communication/index.html
+++ b/docs/admin-guide/secure_communication/index.html
@@ -21,19 +21,19 @@
<title>Secure Communication :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/secure_communication/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/secure_communication/" selected>stable (1.0)</option>
@@ -2507,20 +2507,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/authentication/index.html b/docs/api/authentication/index.html
index 4174f4d..cec8e03 100644
--- a/docs/api/authentication/index.html
+++ b/docs/api/authentication/index.html
@@ -21,19 +21,19 @@
<title>Authentication API Specification :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/authentication/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/authentication/" selected>stable (1.0)</option>
@@ -2388,20 +2388,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/command-and-control/index.html b/docs/api/command-and-control/index.html
index ad4682b..9b0ad9d 100644
--- a/docs/api/command-and-control/index.html
+++ b/docs/api/command-and-control/index.html
@@ -21,19 +21,19 @@
<title>Command & Control API Specification :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/command-and-control/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/command-and-control/" selected>stable (1.0)</option>
@@ -2640,20 +2640,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/credentials/index.html b/docs/api/credentials/index.html
index 2a6b700..b95b3a0 100644
--- a/docs/api/credentials/index.html
+++ b/docs/api/credentials/index.html
@@ -21,19 +21,19 @@
<title>Credentials API Specification :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/credentials/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/credentials/" selected>stable (1.0)</option>
@@ -1365,7 +1365,7 @@
-<p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports the look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p>
+<p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports to look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p>
<p>Credentials are of a certain <em>type</em> which indicates which authentication mechanism the credentials can be used with. Each set of credentials also contains an <em>authentication identity</em> which is the identity claimed by the device during authentication. This authentication identity is usually different from the <em>device-id</em> the device has been registered under. A device may have multiple sets of credentials, using arbitrary <em>authentication identities</em>.</p>
@@ -1396,7 +1396,7 @@
<p><strong>Message Flow</strong></p>
<figure>
- <img src="../getCredentials_Success.svg"
+ <img src="get-credentials-success.svg"
alt="A client sends a request message for looking up device credentials and receives a response containing the credentials"/> <figcaption>
<h4>Client looking up credentials for a device</h4>
</figcaption>
@@ -1440,7 +1440,7 @@
<td align="center">yes</td>
<td align="left"><em>properties</em></td>
<td align="left"><em>string</em></td>
-<td align="left">MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions">Preconditions</a>).</td>
+<td align="left">MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions-for-invoking-the-credentials-api">Preconditions</a>).</td>
</tr>
<tr>
@@ -2857,20 +2857,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/device-connection/index.html b/docs/api/device-connection/index.html
index 7b7bcaf..224beb0 100644
--- a/docs/api/device-connection/index.html
+++ b/docs/api/device-connection/index.html
@@ -21,19 +21,19 @@
<title>Device Connection API Specification :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/device-connection/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/device-connection/" selected>stable (1.0)</option>
@@ -1643,7 +1643,7 @@
<td align="center">yes</td>
<td align="left"><em>properties</em></td>
<td align="left"><em>string</em></td>
-<td align="left">MUST contain the source address that the client wants to received response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions">Preconditions</a>).</td>
+<td align="left">MUST contain the source address that the client wants to received response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions-for-invoking-the-device-connection-api">Preconditions</a>).</td>
</tr>
<tr>
@@ -2596,20 +2596,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/device-registration/index.html b/docs/api/device-registration/index.html
index 1068c57..580722b 100644
--- a/docs/api/device-registration/index.html
+++ b/docs/api/device-registration/index.html
@@ -21,19 +21,19 @@
<title>Device Registration API Specification :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/device-registration/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/device-registration/" selected>stable (1.0)</option>
@@ -1443,7 +1443,7 @@
<td align="center">yes</td>
<td align="left"><em>properties</em></td>
<td align="left"><em>string</em></td>
-<td align="left">MUST contain the source address that the client wants to received response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions">Preconditions</a>).</td>
+<td align="left">MUST contain the source address that the client wants to received response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions-for-invoking-the-device-registration-api">Preconditions</a>).</td>
</tr>
<tr>
@@ -1547,7 +1547,7 @@
<p>Below is an example for a payload of a response to an <em>assert</em> request for device <code>4711</code> which also includes a default <em>content-type</em>:</p>
<pre><code class="language-json">{
- "device-id" : "4711",
+ "device-id": "4711",
"via": ["4712"],
"defaults": {
"content-type": "application/vnd.acme+json"
@@ -2488,20 +2488,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/event/index.html b/docs/api/event/index.html
index fb34584..7ca52fd 100644
--- a/docs/api/event/index.html
+++ b/docs/api/event/index.html
@@ -21,19 +21,19 @@
<title>Event API Specification :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/event/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/event/" selected>stable (1.0)</option>
@@ -1402,7 +1402,7 @@
<ol>
<li><em>MQTT Adapter</em> transfers data to <em>AMQP 1.0 Messaging Network</em>.</li>
<li><em>AMQP 1.0 Messaging Network</em> acknowledges reception of the message.</li>
-<li><em>MQTT Adapter</em> acknowledges the message published by the device.</li>
+<li><em>MQTT Adapter</em> acknowledges the reception of the message to the <em>Device</em>.</li>
</ol></li>
</ol>
@@ -1410,13 +1410,13 @@
<p><strong>Message Format</strong></p>
-<p>See <a href="/hono/docs/api/telemetry/#upload-telemetry-data">Telemetry API</a> for definition of message format.</p>
+<p>See <a href="/hono/docs/api/telemetry/#forward-telemetry-data">Telemetry API</a> for definition of message format.</p>
<h2 id="northbound-operations">Northbound Operations</h2>
<h3 id="receive-events">Receive Events</h3>
-<p>Hono delivers messages containing events reported by a particular device in the same order that they have been received in (using the <em>Forward Event</em> operation defined above).</p>
+<p>Hono delivers messages containing events reported by a particular device in the same order that they have been received in (using the <a href="#forward-event">Forward Event</a> operation).</p>
<p>Hono supports multiple non-competing <em>Business Application</em> consumers of event messages for a given tenant. Hono allows each <em>Business Application</em> to have multiple competing consumers for event messages for a given tenant to share the load of processing the messages.</p>
@@ -1431,7 +1431,7 @@
<p><strong>Message Flow</strong></p>
-<p>The following sequence diagram illustrates the flow of messages involved in a <em>Business Application</em> receiving an event data message from Hono.</p>
+<p>The following sequence diagram illustrates the flow of messages involved in a <em>Business Application</em> receiving an event message from Hono.</p>
<figure>
<img src="consume.svg"/> <figcaption>
@@ -1450,7 +1450,7 @@
<p><strong>Message Format</strong></p>
-<p>See <a href="/hono/docs/api/telemetry/"><em>Telemetry API</em></a> for definition of message format.</p>
+<p>See <a href="/hono/docs/api/telemetry/#forward-telemetry-data">Telemetry API</a> for definition of message format.</p>
<h2 id="well-known-event-message-types">Well-known Event Message Types</h2>
@@ -1494,7 +1494,7 @@
</tbody>
</table>
-<p>NB: An empty notification can be used to indicate to a <em>Business Application</em> that a device is currently ready to receive an upstream message by setting the <em>ttd</em> property. <em>Backend Applications</em> may use this information to determine the time window during which the device will be able to receive a command.</p>
+<p><strong>NB</strong> An empty notification can be used to indicate to a <em>Business Application</em> that a device is currently ready to receive an upstream message by setting the <em>ttd</em> property. <em>Backend Applications</em> may use this information to determine the time window during which the device will be able to receive a command.</p>
<h3 id="connection-event">Connection Event</h3>
@@ -2463,20 +2463,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/index.html b/docs/api/index.html
index 0e224a4..be168be 100644
--- a/docs/api/index.html
+++ b/docs/api/index.html
@@ -21,19 +21,19 @@
<title>API :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/" selected>stable (1.0)</option>
@@ -1332,7 +1332,9 @@
<h1 id="api">API</h1>
-<p>Documentation of the APIs defined by Hono™.</p>
+<p>Documentation of the APIs defined by Eclipse Hono™.</p>
+
+<p>For an overview of the available APIs, see the <a href="/hono/docs/architecture/component-view/">architecture documentation</a>.</p>
<footer class=" footline" >
@@ -2205,20 +2207,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/index.xml b/docs/api/index.xml
index 487268b..029a296 100644
--- a/docs/api/index.xml
+++ b/docs/api/index.xml
@@ -76,7 +76,7 @@
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.eclipse.org/hono/docs/api/credentials/</guid>
- <description><p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports the look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p></description>
+ <description><p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports to look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p></description>
</item>
<item>
diff --git a/docs/api/management/device-registry-v1.yaml b/docs/api/management/device-registry-v1.yaml
index 57e720d..6840cfd 100644
--- a/docs/api/management/device-registry-v1.yaml
+++ b/docs/api/management/device-registry-v1.yaml
@@ -55,18 +55,15 @@
url: https://www.eclipse.org/hono/docs/concepts/device-identity/
- name: credentials
description: Device credentials
-
externalDocs:
description: Hono device identity
url: https://www.eclipse.org/hono/docs/concepts/device-identity/
servers:
- - url: '{corsProxy}{server}/v1'
+ - url: '{server}/v1'
variables:
server:
default: http://hono.eclipse.org:28080
- corsProxy:
- default: https://cors-anywhere.herokuapp.com/
security:
- BearerAuth: []
@@ -99,6 +96,17 @@
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/NotAllowed'
+ 409:
+ description: |
+ Indicates that an existing tenant uses a certificate authority with the same Subject DN.
+ If the client has no read access to the conflicting tenant then `403` should be returned instead.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ example:
+ error: "Root Certificate Authority is already used by other tenant"
+ subject-dn: "CN=devices,OU=iot,O=ACME"
/tenants/{tenantId}:
@@ -127,7 +135,16 @@
403:
$ref: '#/components/responses/NotAllowed'
409:
- $ref: '#/components/responses/AlreadyExists'
+ description: |
+ Indicates that tenant with the given identifier already exists or that an existing tenant uses
+ a certificate authority with the same Subject DN.
+ If the client has no read access to the conflicting tenant then `403` should be returned instead.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ example:
+ error: "tenant with given identifier already exists"
get:
tags:
@@ -178,6 +195,17 @@
$ref: '#/components/responses/NotAllowed'
404:
$ref: '#/components/responses/NotFound'
+ 409:
+ description: |
+ Indicates that an existing tenant uses a certificate authority with the same Subject DN.
+ If the client has no read access to the conflicting tenant then `403` should be returned instead.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ example:
+ error: "Root Certificate Authority is already used by other tenant"
+ subject-dn: "CN=devices,OU=iot,O=ACME"
412:
$ref: '#/components/responses/ResourceVersionMismatch'
@@ -448,7 +476,12 @@
$ref: '#/components/schemas/Extensions'
"adapters":
type: array
- description: Only a single entry per type is allowed. If multiple entries for the same type are present it is handled as an error.
+ description: |
+ A list of configuration options for certain types of protocol adapters.
+ If set then the array must not be empty.
+ Multiple entries for the same type are considered an error.
+ If not set, then all adapters are enabled using their respective
+ default configuration.
items:
$ref: '#/components/schemas/Adapter'
"defaults":
@@ -456,50 +489,104 @@
"minimum-message-size":
type: integer
default: 0
- description: The minimum message size in bytes. If it is set
- then the payload size of the telemetry, event and
- command messages are calculated in accordance with
- the configured value and then reported to the metrics.
+ description: |
+ The minimum message size in bytes. If set, then reported size of
+ telemetry, event and command messages is calculated as the minimum multiple
+ of the configured value that is greater than or equal to the messages
+ payload size.
"resource-limits":
$ref: '#/components/schemas/ResourceLimit'
"tracing":
$ref: '#/components/schemas/TracingConfig'
"trusted-ca":
- $ref: '#/components/schemas/TrustedCA'
+ type: array
+ description: |
+ The set of root certificate authorities which are used for verifying the signature of
+ client certificates that devices use for authentication.
+ items:
+ $ref: '#/components/schemas/TrustedCA'
TrustedCA:
type: object
additionalProperties: false
- required:
- - "subject-dn"
properties:
"subject-dn":
type: string
- description: The subject DN of the trusted root certificate in
- the format defined by RFC 2253.
+ description: |
+ The subject DN of the trusted root certificate in
+ the format defined by RFC 2253.
+ CAs of the *same* tenant may share the same subject DN, e.g.
+ allowing for the definition of overlapping validity periods.
+ However, CAs of *different* tenants must not share the same
+ subject DN in order to allow for the unique look up of a tenant by
+ the subject DN of one of its trusted CAs.
+ If the `cert` property is used to provide an X.509 certificate
+ then the subject DN is determined from the certificate and this
+ property is ignored.
+ Otherwise, i.e. if the `public-key` property is
+ used, this property is mandatory.
"public-key":
type: string
format: byte
- description: The Base64 encoded binary DER encoding of the
- trusted root certificate’s public key.
- Either this property or `cert` must be set.
+ description: |
+ The Base64 encoded binary DER encoding of the
+ trusted root certificate’s public key.
+ If the `cert` property is used to provide an
+ X.509 certificate then the public key is extracted
+ from the certificate and this property is ignored.
+ Either this property or `cert` must be set.
+ "algorithm":
+ type: string
+ description: |
+ The algorithm used for the public key of the CA.
+ If the `cert` property is used to provide an
+ X.509 certificate then the algorithm is determined
+ from the certificate and this property is ignored.
+ Otherwise, i.e. if the `public-key` property is
+ used, this property must be set to the algorithm
+ used, if other than the default.
+ default: RSA
+ example: EC
+ "not-before":
+ type: string
+ format: date-time
+ description: |
+ The point in time from which on the certificate authority
+ may be used for authenticating devices.
+ If the `cert` property is used to provide an
+ X.509 certificate then the point in time is
+ determined from the certificate and this property is ignored.
+ Otherwise, i.e. if the `public-key` property is
+ used, this property is mandatory.
+ "not-after":
+ type: string
+ format: date-time
+ description: |
+ The point in time until which the certificate authority
+ may be used for authenticating devices.
+ If the `cert` property is used to provide an
+ X.509 certificate then the point in time is
+ determined from the certificate and this property is ignored.
+ Otherwise, i.e. if the `public-key` property is
+ used, this property is mandatory.
"cert":
type: string
format: byte
- description: The Base64 encoded binary DER encoding of the
- trusted root certificate. Either this property
- or `public-key` must be set.
- "algorithm":
- type: string
- description: The algorithm used for the public key of the CA.
- If the `cert` property is used to provide an
- X.509 certificate then the algorithm is determined
- from the certificate and this property is ignored.
- Otherwise, i.e. if the `public-key` property is
- used, this property must be set to the algorithm
- used, if other than the default.
- default: RSA
- example: EC
+ description: |
+ The Base64 encoded binary DER encoding of the trusted X.509 root certificate.
+ This property can be used as a convenient alternative to
+ specifying the `public-key`, `not-before`, `not-after` and
+ `algorithm` properties explicitly. Implementors of this
+ API may choose to support this property only for uploading
+ a certificate but then extract all relevant data and store
+ it in the properties described above.
+ Either this property or `public-key` must be set.
+ example:
+ subject-dn: "CN=devices,OU=iot,O=ACME"
+ public-key: "Tk9UIEEgUFVCTElDIEtFWQ=="
+ algorithm: "EC"
+ not-before: "2019-10-03T13:45:16+02:00"
+ not-after: "2021-10-03T00:00:00Z"
Adapter:
type: object
@@ -525,9 +612,26 @@
"max-connections":
type: integer
default: -1
- description: The maximum number of concurrent connections allowed
- from devices of this tenant. The default value -1
- indicates that no limit is set.
+ description: |
+ The maximum number of concurrent connections allowed from devices of this tenant.
+ A value of `-1` (the default) indicates that no limit is set.
+ "max-ttl":
+ type: integer
+ default: -1
+ description: |
+ The maximum time-to-live (in seconds) to use for events published by
+ devices of this tenant. Any default TTL value specified
+ at either the tenant or device level will be limited to
+ the max value specified here.
+ If this property is set to a value greater than -1 and no
+ default TTL is specified for a device, the max value will
+ be used for events published by the device.
+ A value of `-1` (the default) indicates that no limit is set.
+ Note that this property contains the TTL in seconds whereas
+ the AMQP 1.0 specification defines a message's ttl header
+ to use milliseconds.
+ "data-volume":
+ $ref: '#/components/schemas/DataVolume'
"ext":
$ref: '#/components/schemas/Extensions'
@@ -537,15 +641,17 @@
properties:
"sampling-mode":
type: string
- description: Defines in how far OpenTracing spans created when
- processing messages for this tenant shall be recorded
- (sampled) by the tracing system. The value `default`
- lets the default sampling mechanism be used.
- The value `all` marks the spans related to this tenant
- so that they should all be sampled.
- The value `none` marks the spans as not to be sampled.
- The mode defined here may be overridden for a particular
- auth-id by means of the `sampling-mode-per-auth-id`
+ description: |
+ Defines if and how often OpenTracing spans are being
+ sampled when processing messages for this tenant.
+ The value `default` indicates that the underyling tracing
+ system's default sampling mode should be used.
+ The value `all` indicates that every span created for
+ messages of the tenant will be sampled.
+ The value `none` indicates that no spans should be sampled
+ at all for the tenant.
+ The mode defined here may be overridden for specific
+ devices by means of the `sampling-mode-per-auth-id`
property.
default: default
enum:
@@ -554,27 +660,67 @@
- none
"sampling-mode-per-auth-id":
type: object
- description: Defines in how far OpenTracing spans created when
- processing messages for this tenant and a particular
- auth-id shall be recorded (sampled) by the tracing
- system. The child properties have the auth-id as name.
- A child property value of `default` lets the default
- sampling mechanism be used. The child property value
- `all` marks the spans related to this tenant and the
- auth-id so that they should all be sampled.
- The child property value `none` marks the spans as not
- to be sampled.
- The mode defined for a particular auth-id has precedence
+ description: |
+ Defines if and how often OpenTracing spans are being
+ sampled when processing messages for specific devices
+ of this tenant.
+ This object contains a property for each device for which
+ specific behavior should be defined, using the device's
+ authentication identifier as the property name and
+ the device specific sampling mode as its value.
+ The value `default` indicates that the underyling tracing
+ system's default sampling mode should be used.
+ The value `all` indicates that every span created for
+ messages of the tenant will be sampled.
+ The value `none` indicates that no spans should be sampled
+ at all for the tenant.
+ The mode defined for a particular device has precedence
over the value defined by the `sampling-mode` property.
additionalProperties:
type: string
- description: The property name is the auth-id as used for authenticating requests from a device.
+ description: |
+ The property name is the device's 'authentication identifier.
default: default
enum:
- default
- all
- none
+ DataVolume:
+ type: object
+ additionalProperties: false
+ required:
+ - effective-since
+ properties:
+ "effective-since":
+ type: string
+ format: date-time
+ description: The date-time on which the data volume limit came into effect.
+ "max-bytes":
+ type: integer
+ default: -1
+ description: The maximum number of bytes to be allowed for a tenant for the
+ defined period.
+ A value of -1 (the default) indicates that no limit is set.
+ "period":
+ $ref: '#/components/schemas/Period'
+
+ Period:
+ type: object
+ additionalProperties: false
+ required:
+ - mode
+ properties:
+ "mode":
+ type: string
+ description: The mode of the data usage caluclation. The supported modes by
+ the default resource limit checks implementation are "days"
+ and "monthly".
+ "no-of-days":
+ type: integer
+ description: The number of days for which the data usage is to be calculated
+ if mode is set to "days". Otherwise, this property is ignored.
+
# Devices schema
Device:
@@ -695,6 +841,10 @@
- $ref: '#/components/schemas/CommonSecret'
PasswordSecret:
+ description: |
+ Password based secret definition <br>
+ __NOTE__: Defining password secrets with user provided password hash, function and salt is deprecated and will be removed
+ in the upcoming versions. You should use `pwd-plain` property only going forward.
additionalProperties: false
allOf:
- $ref: '#/components/schemas/CommonSecret'
@@ -703,25 +853,28 @@
properties:
"hash-function":
type: string
- example: sha-512
- description: The name of the hash function used to create the password hash (defined in `pwd-hash` property).
+ example: bcrypt
+ description: __DEPRECATED!__ The name of the hash function used to create the password hash (defined in `pwd-hash` property).
If the password is defined using a `pwd-plain` property, this value will be ignored by the device registry.
This property should be empty when returning passwords from the device registry using only secret metadata.
In this case the id field must be set instead.
+ deprecated: true
"pwd-hash":
type: string
format: byte
- description: The password hash created using the `hash-function` and optional `salt` values.
+ description: __DEPRECATED!__ The password hash created using the `hash-function` and optional `salt` values.
If the password is defined using a `pwd-plain` property, this value will be ignored by the device registry.
This property should be empty when returning passwords from the device registry using only secret metadata.
In this case the id field must be set instead.
+ deprecated: true
"salt":
type: string
format: byte
- description: The Base64 encoding of the salt used in the password hash (defined in the `pwd-hash` property).
+ description: __DEPRECATED!__ The Base64 encoding of the salt used in the password hash (defined in the `pwd-hash` property).
If the password is defined using a `pwd-plain` property, this value will be ignored by the device registry.
This property should be empty when returning passwords from the device registry using only secret metadata.
In this case the id field must be set instead.
+ deprecated: true
"pwd-plain":
type: string
format: byte
@@ -890,32 +1043,39 @@
examples:
HashedPasswordExample:
value:
- auth-id: sensor1
- type: hashed-password
- secrets: [{
- "not-after": "2027-12-24T19:00:00Z",
- "pwd-hash": "AQIDBAUGBwg=",
- "salt": "Mq7wFw==",
- "hash-function": "sha-512"
- }]
+ [{
+ auth-id: sensor1,
+ type: hashed-password,
+ secrets: [{
+ "not-after": "2027-12-24T19:00:00Z",
+ "pwd-hash": "AQIDBAUGBwg=",
+ "salt": "Mq7wFw==",
+ "hash-function": "sha-512"
+ }]
+ }]
+
PlainPasswordExample:
value:
- auth-id: sensor1
- type: hashed-password
- secrets: [{
- "id": "349556ea-4902-47c7-beb0-1009ab693fb4",
- "not-after": "2027-12-24T19:00:00Z",
- "pwd-plain": "hono-secret"
+ [{
+ auth-id: sensor1,
+ type: hashed-password,
+ secrets: [{
+ "id": "349556ea-4902-47c7-beb0-1009ab693fb4",
+ "not-after": "2027-12-24T19:00:00Z",
+ "pwd-plain": "hono-secret"
+ }]
}]
MetaPasswordExample:
value:
- auth-id: sensor1
- type: hashed-password
- secrets: [{
- "id": "349556ea-4902-47c7-beb0-1009ab693fb4",
- "not-after": "2027-12-24T19:00:00Z",
- "pwd-plain": "",
- "pwd-hash": "",
- "salt": "",
- "hash-function": ""
+ [{
+ auth-id: sensor1,
+ type: hashed-password,
+ secrets: [{
+ "id": "349556ea-4902-47c7-beb0-1009ab693fb4",
+ "not-after": "2027-12-24T19:00:00Z",
+ "pwd-plain": "",
+ "pwd-hash": "",
+ "salt": "",
+ "hash-function": ""
+ }]
}]
diff --git a/docs/api/management/index.html b/docs/api/management/index.html
index 4ecc016..2834b49 100644
--- a/docs/api/management/index.html
+++ b/docs/api/management/index.html
@@ -21,19 +21,19 @@
<title>Device Registry Management API Specification :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -86,14 +86,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1204,7 +1204,7 @@
- <option id="stable" value="/hono/docs/api/management/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/management/" selected>stable (1.0)</option>
@@ -2249,20 +2249,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/metrics/index.html b/docs/api/metrics/index.html
index 35cdc24..d982974 100644
--- a/docs/api/metrics/index.html
+++ b/docs/api/metrics/index.html
@@ -21,19 +21,19 @@
<title>Metrics :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/metrics/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/metrics/" selected>stable (1.0)</option>
@@ -1338,13 +1338,6 @@
</ul></li>
<li><a href="#service-metrics">Service Metrics</a></li>
</ul></li>
-<li><a href="#legacy-metrics">Legacy Metrics</a>
-<ul>
-<li><a href="#tags">Tags</a></li>
-<li><a href="#common-metrics-1">Common Metrics</a></li>
-<li><a href="#http-metrics">HTTP Metrics</a></li>
-<li><a href="#mqtt-metrics">MQTT Metrics</a></li>
-</ul></li>
</ul></li>
</ul>
</nav>
@@ -1375,7 +1368,7 @@
<p>Hono uses <a href="https://micrometer.io/">Micrometer</a> in combination with Spring Boot
to internally collect metrics. Those metrics can be exported to different
-back ends. Please refer to <a href="/hono/docs/admin-guide/monitoring-tracing-config/#configuring-metrics">Configuring Metrics</a>
+back ends. Please refer to <a href="/hono/docs/admin-guide/monitoring-tracing-config/#configuring-a-metrics-back-end">Configuring Metrics</a>
for details.</p>
<p>The example deployment by default uses <a href="https://prometheus.io/">Prometheus</a> as the metrics back end.</p>
@@ -1596,295 +1589,6 @@
<p>Hono’s service components do not report any metrics at the moment.</p>
-<h2 id="legacy-metrics">Legacy Metrics</h2>
-
-<div class="alert alert-notice">
- <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Deprecated</h4>
- <div><p>This metrics configuration is still supported in Hono, but is considered
-deprecated and will be removed in a future version of Hono.</p>
-
-<p>The legacy metrics support needs to be enabled explicitly.
-See <a href="/hono/docs/admin-guide/monitoring-tracing-config/#legacy-metrics-support">Legacy support</a>
-for more information.</p>
-</div>
-</div>
-
-
-<p>Enabling the legacy support sets up internal support for exporting the metrics
-in the pre-0.8 format, using the Graphite Micrometer backend, but with a
-custom (legacy) naming scheme. It still is possible to use the InfluxDB Micrometer
-backend as well, however this will export metrics in the new format, and not
-on the legacy format.</p>
-
-<p>Some users have started to build custom dash boards on top of the names of the metrics and
-associated tags that end up in the example InfluxDB. Hono will try to support such users
-by allowing future versions of Hono to be configured to report metrics to InfluxDB resulting
-in the same database structure as created by InfluxDB’s Graphite Input.</p>
-
-<p><strong>NB</strong> This does not necessarily mean that future versions of Hono will always support
-metrics being reported using the Graphite wire format. It only means that there will be
-a way to transmit metrics to InfluxDB resulting in the same database structure.</p>
-
-<h3 id="tags">Tags</h3>
-
-<p>The InfluxDB configuration file used for the example deployment contains templates for
-extracting the following <em>tags</em> from metric names transmitted via the Graphite reporter.</p>
-
-<table>
-<thead>
-<tr>
-<th>Tag</th>
-<th>Description</th>
-</tr>
-</thead>
-
-<tbody>
-<tr>
-<td><em>host</em></td>
-<td>The name of the host that the component reporting the metric is running on.</td>
-</tr>
-
-<tr>
-<td><em>type</em></td>
-<td>The type of message that the metric is being reported for (either <code>telemetry</code> or <code>event</code>)</td>
-</tr>
-
-<tr>
-<td><em>tenant</em></td>
-<td>The name of the tenant that the metric is being reported for.</td>
-</tr>
-
-<tr>
-<td><em>protocol</em></td>
-<td>The transport protocol that has been used to send the message for which the metric is being reported (<code>http</code> or <code>mqtt</code>).</td>
-</tr>
-</tbody>
-</table>
-
-<p>The following sections describe which of these tags are extracted for which metrics specifically.</p>
-
-<h3 id="common-metrics-1">Common Metrics</h3>
-
-<p>The following table contains metrics that are collected for all protocol adapters (if applicable to the underlying transport protocol).</p>
-
-<table>
-<thead>
-<tr>
-<th>Metric</th>
-<th>Tags</th>
-<th>Description</th>
-</tr>
-</thead>
-
-<tbody>
-<tr>
-<td><em>counter.hono.connections.authenticated.count</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Current number of connections with authenticated devices. <strong>NB</strong> This metric is only supported by protocol adapters that maintain <em>connection state</em> with authenticated devices. In particular, the HTTP adapter does not support this metric.</td>
-</tr>
-
-<tr>
-<td><em>counter.hono.connections.unauthenticated.count</em></td>
-<td><em>host</em>, <em>protocol</em></td>
-<td>Current number of connections with unauthenticated devices. <strong>NB</strong> This metric is only supported by protocol adapters that maintain <em>connection state</em> with unauthenticated devices. In particular, the HTTP adapter does not support this metric.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.device.delivered.count</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Commands delivered to devices. Total count since application start.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.device.delivered.m1_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Commands delivered to devices. One minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.device.delivered.m5_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Commands delivered to devices. Five minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.device.delivered.m15_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Commands delivered to devices. Fifteen minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.device.delivered.mean_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Commands delivered to devices. Mean rate of messages since application start.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.response.delivered.count</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Command responses delivered to applications. Total count since application startup.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.response.delivered.m1_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Command responses delivered to applications. One minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.response.delivered.m5_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Command responses delivered to applications. Five minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.response.delivered.m15_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Command responses delivered to applications. Fifteen minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.response.delivered.mean_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Command responses delivered to applications. Mean rate of messages since the application start.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.ttd.expired.count</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Messages containing a TTD that expired with no pending command(s). Total count since application startup.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.ttd.expired.m1_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Messages containing a TTD that expired with no pending command(s). One minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.ttd.expired.m5_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Messages containing a TTD that expired with no pending command(s). Five minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.ttd.expired.m15_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Messages containing a TTD that expired with no pending command(s). Fifteen minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.commands.ttd.expired.mean_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>protocol</em></td>
-<td>Messages containing a TTD that expired with no pending command(s). Mean rate of messages since the application start.</td>
-</tr>
-</tbody>
-</table>
-
-<h3 id="http-metrics">HTTP Metrics</h3>
-
-<p>The following table contains metrics that are collected specifically for the HTTP protocol adapter.</p>
-
-<table>
-<thead>
-<tr>
-<th>Metric</th>
-<th>Tags</th>
-<th>Description</th>
-</tr>
-</thead>
-
-<tbody>
-<tr>
-<td><em>counter.hono.http.messages.undeliverable.count</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages which could not be processed by the HTTP protocol adapter. Total count since application startup.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.http.messages.processed.count</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages processed by the HTTP protocol adapter. Total count since application startup.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.http.messages.processed.m1_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages processed by the HTTP protocol adapter. One minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.http.messages.processed.m5_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages processed by the HTTP protocol adapter. Five minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.http.messages.processed.m15_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages processed by the HTTP protocol adapter. Fifteen minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.http.messages.processed.mean_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages processed by the HTTP protocol adapter. Mean rate of messages since the application start.</td>
-</tr>
-</tbody>
-</table>
-
-<h3 id="mqtt-metrics">MQTT Metrics</h3>
-
-<p>The following table contains metrics that are collected specifically for the MQTT protocol adapter.</p>
-
-<table>
-<thead>
-<tr>
-<th>Metric</th>
-<th>Tags</th>
-<th>Description</th>
-</tr>
-</thead>
-
-<tbody>
-<tr>
-<td><em>counter.hono.mqtt.messages.undeliverable.count</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages which could not be processed by the MQTT protocol adapter- Total count since application startup.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.mqtt.messages.processed.count</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages processed by the MQTT protocol adapter. Total count since application startup.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.mqtt.messages.processed.m1_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages processed by the MQTT protocol adapter. One minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.mqtt.messages.processed.m5_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages processed by the MQTT protocol adapter. Five minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.mqtt.messages.processed.m15_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages processed by the MQTT protocol adapter. Fifteen minute, exponentially weighted, moving average.</td>
-</tr>
-
-<tr>
-<td><em>meter.hono.mqtt.messages.processed.mean_rate</em></td>
-<td><em>host</em>, <em>tenant</em>, <em>type</em></td>
-<td>Messages processed by the MQTT protocol adapter. Mean rate of messages since the application start.</td>
-</tr>
-</tbody>
-</table>
-
<footer class=" footline" >
</footer>
@@ -2758,20 +2462,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/telemetry/index.html b/docs/api/telemetry/index.html
index f9ca563..00d9c3b 100644
--- a/docs/api/telemetry/index.html
+++ b/docs/api/telemetry/index.html
@@ -21,19 +21,19 @@
<title>Telemetry API Specification :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/telemetry/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/telemetry/" selected>stable (1.0)</option>
@@ -1408,7 +1408,8 @@
<p>As indicated above, it is up to the discretion of the protocol adapter whether it wants to use <em>AT LEAST ONCE</em> or <em>AT MOST ONCE</em> delivery semantics.</p>
-<p>Hono’s HTTP adapter allows devices to indicate, which delivery semantics they want to use when uploading telemetry data.</p>
+<p>Hono’s HTTP adapter allows devices to indicate, which delivery semantics they want to use when uploading telemetry data.
+The HTTP adapter always forwards messages unsettled and either ignores the outcome of the message transfer (<em>AT MOST ONCE</em>) or waits for the downstream peer to accept the message (<em>AT LEAST ONCE</em>) before acknowledging the reception of the message to the device.</p>
<p>The following sequence diagram illustrates the flow of messages involved in the <em>HTTP Adapter</em> forwarding an <em>unsettled</em> telemetry data message to the downstream AMQP Messaging Network implementing <em>AT MOST ONCE</em> delivery semantics.</p>
@@ -1515,7 +1516,7 @@
<h3 id="receive-telemetry-data">Receive Telemetry Data</h3>
-<p>Hono delivers messages containing telemetry data reported by a particular device in the same order that they have been received in (using the <em>Upload Telemetry Data</em> operation defined above). Hono MAY drop telemetry messages that it cannot deliver to any consumers. Reasons for this include that there are no consumers connected to Hono or the existing consumers are not able to process the messages from Hono fast enough.</p>
+<p>Hono delivers messages containing telemetry data reported by a particular device in the same order that they have been received in (using the <a href="#forward-telemetry-data">Forward Telemetry Data</a> operation). Hono MAY drop telemetry messages that it cannot deliver to any consumers. Reasons for this include that there are no consumers connected to Hono or the existing consumers are not able to process the messages from Hono fast enough.</p>
<p>Hono supports multiple non-competing <em>Business Application</em> consumers of telemetry data for a given tenant. Hono allows each <em>Business Application</em> to have multiple competing consumers for telemetry data for a given tenant to share the load of processing the messages.</p>
@@ -1559,7 +1560,7 @@
<p><strong>Message Format</strong></p>
-<p>The format of the messages containing the telemetry data is the same as for the <a href="#upload-telemetry-data">Upload Telemetry Data operation</a>.</p>
+<p>The format of the messages containing the telemetry data is the same as for the <a href="#forward-telemetry-data">Forward Telemetry Data operation</a>.</p>
<footer class=" footline" >
@@ -2431,20 +2432,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/api/tenant/index.html b/docs/api/tenant/index.html
index 1805464..517cd75 100644
--- a/docs/api/tenant/index.html
+++ b/docs/api/tenant/index.html
@@ -21,19 +21,19 @@
<title>Tenant API Specification :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/tenant/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/tenant/" selected>stable (1.0)</option>
@@ -1338,6 +1338,7 @@
<li><a href="#adapter-configuration-format">Adapter Configuration Format</a></li>
<li><a href="#resource-limits-configuration-format">Resource Limits Configuration Format</a></li>
<li><a href="#data-volume-configuration-format">Data Volume Configuration Format</a></li>
+<li><a href="#data-volume-period-configuration-format">Data Volume Period Configuration Format</a></li>
</ul></li>
<li><a href="#delivery-states-used-by-the-tenant-api">Delivery States used by the Tenant API</a></li>
</ul></li>
@@ -1440,7 +1441,7 @@
<td align="center">yes</td>
<td align="left"><em>properties</em></td>
<td align="left"><em>string</em></td>
-<td align="left">MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions">Preconditions</a>).</td>
+<td align="left">MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions-for-invoking-the-tenant-api">Preconditions</a>).</td>
</tr>
<tr>
@@ -1657,8 +1658,8 @@
<tr>
<td align="left"><em>trusted-ca</em></td>
<td align="center"><em>no</em></td>
-<td align="left"><em>object</em></td>
-<td align="left">The trusted certificate authority to use for validating certificates presented by devices of the tenant for authentication purposes. See <a href="#trusted-ca-format">Trusted Certificate Authority Format</a> for a definition of the content model of the object.</td>
+<td align="left"><em>array</em></td>
+<td align="left">The list of trusted certificate authorities to use for validating certificates presented by devices of the tenant for authentication purposes. See <a href="#trusted-ca-format">Trusted Certificate Authority Format</a> for a definition of the content model of the objects contained in the array. <strong>NB</strong> If the element is provided then the list MUST NOT be empty.</td>
</tr>
</tbody>
</table>
@@ -1671,29 +1672,32 @@
<p>The JSON structure below contains example information for tenant <code>TEST_TENANT</code>. Note that the structure contains some custom properties at both the root level (<em>customer</em>) as well as the adapter configuration level (<em>deployment</em>) and also defines a default TTL for downstream messages.</p>
<pre><code class="language-json">{
- "tenant-id" : "TEST_TENANT",
+ "tenant-id": "TEST_TENANT",
"defaults": {
"ttl": 30
},
- "enabled" : true,
+ "enabled": true,
"customer": "ACME Inc.",
"resource-limits": {
"max-connections": 100000,
"data-volume": {
"max-bytes": 2147483648,
- "period-in-days": 30,
- "effective-since": "2019-04-27"
+ "period": {
+ "mode": "days",
+ "no-of-days": 30
+ },
+ "effective-since": "2019-07-27T14:30:00Z"
}
},
- "adapters" : [
+ "adapters": [
{
- "type" : "hono-mqtt",
- "enabled" : true,
- "device-authentication-required" : true
+ "type": "hono-mqtt",
+ "enabled": true,
+ "device-authentication-required": true
}, {
- "type" : "hono-http",
- "enabled" : true,
- "device-authentication-required" : true,
+ "type": "hono-http",
+ "enabled": true,
+ "device-authentication-required": true,
"deployment": {
"maxInstances": 4
}
@@ -1738,7 +1742,7 @@
<h3 id="trusted-ca-format">Trusted CA Format</h3>
-<p>The table below provides an overview of the members defined for the <em>trusted-ca</em> JSON object:</p>
+<p>The table below provides an overview of the members of a JSON object representing a trusted CA:</p>
<table>
<thead>
@@ -1756,23 +1760,15 @@
<td align="left"><em>subject-dn</em></td>
<td align="center"><em>yes</em></td>
<td align="left"><em>string</em></td>
-<td align="left"></td>
+<td align="left"><code>-</code></td>
<td align="left">The subject DN of the trusted root certificate in the format defined by <a href="https://www.ietf.org/rfc/rfc2253.txt">RFC 2253</a>.</td>
</tr>
<tr>
-<td align="left"><em>cert</em></td>
-<td align="center"><em>no</em></td>
-<td align="left"><em>string</em></td>
-<td align="left"></td>
-<td align="left">The Base64 encoded binary DER encoding of the trusted root X.509 certificate.</td>
-</tr>
-
-<tr>
<td align="left"><em>public-key</em></td>
-<td align="center"><em>no</em></td>
+<td align="center"><em>yes</em></td>
<td align="left"><em>string</em></td>
-<td align="left"></td>
+<td align="left"><code>-</code></td>
<td align="left">The Base64 encoded binary DER encoding of the trusted root certificate’s public key.</td>
</tr>
@@ -1781,15 +1777,34 @@
<td align="center"><em>no</em></td>
<td align="left"><em>string</em></td>
<td align="left"><code>RSA</code></td>
-<td align="left">The name of the public key algorithm. Supported values are <code>RSA</code> and <code>EC</code>. This property is ignored if the <em>cert</em> property is used to store a certificate.</td>
+<td align="left">The name of the public key algorithm. Supported values are <code>RSA</code> and <code>EC</code>.</td>
</tr>
</tbody>
</table>
-<ul>
-<li>The <em>subject-dn</em> MUST be unique among all registered tenants.</li>
-<li>Either the <em>cert</em> or the <em>public-key</em> MUST be set.</li>
-</ul>
+<p><strong>NB</strong> CAs of the <em>same</em> tenant MAY share the same subject DN, e.g. allowing for the definition of overlapping validity periods.
+However, CAs of <em>different</em> tenants MUST NOT share the same subject DN in order to allow for the unique look up of a tenant by
+the subject DN of one of its trusted CAs.</p>
+
+<p><strong>Examples</strong></p>
+
+<p>Below is an example payload for a response to a <em>get</em> request for tenant <code>TEST_TENANT</code>.
+The tenant is configured with two trusted certificate authorities, each using a different public key algorithm.</p>
+
+<pre><code class="language-json">{
+ "tenant-id" : "TEST_TENANT",
+ "enabled" : true,
+ "trusted-ca": [{
+ "subject-dn": "CN=ca,OU=Hono,O=Eclipse",
+ "public-key": "PublicKey==",
+ "algorithm": "RSA"
+ }, {
+ "subject-dn": "CN=ca,OU=Hono,O=ACME Inc.",
+ "public-key": "ECKey==",
+ "algorithm": "EC"
+ }]
+}
+</code></pre>
<h3 id="adapter-configuration-format">Adapter Configuration Format</h3>
@@ -1863,6 +1878,14 @@
</tr>
<tr>
+<td align="left"><em>max-ttl</em></td>
+<td align="center"><em>no</em></td>
+<td align="left"><em>number</em></td>
+<td align="left"><code>-1</code></td>
+<td align="left">The maximum time-to-live (in seconds) to use for events published by devices of this tenant. Any default TTL value specified at either the tenant or device level will be limited to the max value specified here. If this property is set to a value greater than <code>-1</code> and no default TTL is specified for a device, the max value will be used for events published by the device. A value of <code>-1</code> (the default) indicates that no limit is set. <strong>Note</strong> that this property contains the TTL in <em>seconds</em> whereas the AMQP 1.0 specification defines a message’s <em>ttl</em> header to use milliseconds.</td>
+</tr>
+
+<tr>
<td align="left"><em>data-volume</em></td>
<td align="center"><em>no</em></td>
<td align="left"><em>object</em></td>
@@ -1874,6 +1897,22 @@
<p>Protocol adapters SHOULD use the <em>max-connections</em> property to determine if a device’s connection request should be accepted or rejected.</p>
+<p>Protocol adapters SHOULD use the <em>max-ttl</em> property to determine the <em>effective time-to-live</em> for events published by devices as follows:</p>
+
+<ol>
+<li>If a non-default <em>max-ttl</em> is set for the tenant, use that value as the <em>effective ttl</em>, otherwise set <em>effective ttl</em> to <code>-1</code>.</li>
+<li>If the event published by the device
+
+<ol>
+<li>contains a <em>ttl</em> header and <em>effective ttl</em> is not <code>-1</code> and the <em>ttl</em> value (in seconds) provided by the device is smaller than the
+<em>effective ttl</em>, use the device provided <em>ttl</em> value as the new <em>effective ttl</em>.</li>
+<li>does not contain a <em>ttl</em> header but a default <em>ttl</em> value is configured for the device (with the device level taking precedence
+over the tenant level) and <em>effective ttl</em> is not <code>-1</code> and the default value is smaller than the <em>effective ttl</em>,
+use the default <em>ttl</em> value as the new <em>effective ttl</em>.</li>
+</ol></li>
+<li>If <em>effective ttl</em> is not <code>-1</code>, set the downstream event message’s <em>ttl</em> header to its value (in milliseconds).</li>
+</ol>
+
<p>The JSON object MAY contain an arbitrary number of additional members with arbitrary names of either scalar or complex type.
This allows for future <em>well-known</em> additions and also allows to add further information which might be relevant to a <em>custom</em> adapter only.</p>
@@ -1894,6 +1933,14 @@
<tbody>
<tr>
+<td align="left"><em>effective-since</em></td>
+<td align="center"><em>yes</em></td>
+<td align="left"><em>string</em></td>
+<td align="left"><code>-</code></td>
+<td align="left">The point in time at which the current settings became effective, i.e. the start of the first accounting period based on these settings. The value MUST be an <a href="https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations">ISO 8601 compliant <em>combined date and time representation in extended format</em></a>.</td>
+</tr>
+
+<tr>
<td align="left"><em>max-bytes</em></td>
<td align="center"><em>no</em></td>
<td align="left"><em>number</em></td>
@@ -1902,25 +1949,51 @@
</tr>
<tr>
-<td align="left"><em>period-in-days</em></td>
+<td align="left"><em>period</em></td>
<td align="center"><em>no</em></td>
-<td align="left"><em>number</em></td>
-<td align="left"><code>30</code></td>
-<td align="left">The length of an accounting period, i.e. the number of days over which the data usage is to be limited. MUST be a positive integer.</td>
-</tr>
-
-<tr>
-<td align="left"><em>effective-since</em></td>
-<td align="center"><em>yes</em></td>
-<td align="left"><em>string</em></td>
+<td align="left"><em>object</em></td>
<td align="left"><code>-</code></td>
-<td align="left">The point in time at which the current settings became effective, i.e. the start of the first accounting period based on these settings. The value MUST be an <a href="https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations">ISO 8601 compliant <em>combined date and time representation in extended format</em></a>.</td>
+<td align="left">The mode and length of an accounting period, i.e. the data usage can limited based on the defined number of days or on a monthly basis.</td>
</tr>
</tbody>
</table>
<p>Protocol adapters SHOULD use this information to determine if a message originating from or destined to a device should be accepted for processing.</p>
+<h3 id="data-volume-period-configuration-format">Data Volume Period Configuration Format</h3>
+
+<p>The table below contains the properties which are used to configure a tenant’s data volume period:</p>
+
+<table>
+<thead>
+<tr>
+<th align="left">Name</th>
+<th align="center">Mandatory</th>
+<th align="left">JSON Type</th>
+<th align="left">Default Value</th>
+<th align="left">Description</th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td align="left"><em>mode</em></td>
+<td align="center"><em>yes</em></td>
+<td align="left"><em>string</em></td>
+<td align="left"><code>-</code></td>
+<td align="left">The mode of the data usage calculation. The default implementation supports two modes namely <code>days</code> and <code>monthly</code>.</td>
+</tr>
+
+<tr>
+<td align="left"><em>no-of-days</em></td>
+<td align="center"><em>no</em></td>
+<td align="left"><em>number</em></td>
+<td align="left"><code>-</code></td>
+<td align="left">When the mode is set as <code>days</code>, then this value represents the length of an accounting period , i.e. the number of days over which the data usage is to be limited. MUST be a positive integer.</td>
+</tr>
+</tbody>
+</table>
+
<h2 id="delivery-states-used-by-the-tenant-api">Delivery States used by the Tenant API</h2>
<p>A Tenant service implementation uses the following AMQP message delivery states when receiving request messages from clients:</p>
@@ -2819,20 +2892,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/architecture/auth/index.html b/docs/architecture/auth/index.html
index 51f6c75..54bcadc 100644
--- a/docs/architecture/auth/index.html
+++ b/docs/architecture/auth/index.html
@@ -21,19 +21,19 @@
<title>Authentication/Authorization :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/architecture/auth/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/architecture/auth/" selected>stable (1.0)</option>
@@ -2283,20 +2283,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/architecture/component-view/device-registry.png b/docs/architecture/component-view/device-registry.png
index af90506..5b0550b 100644
--- a/docs/architecture/component-view/device-registry.png
+++ b/docs/architecture/component-view/device-registry.png
Binary files differ
diff --git a/docs/architecture/component-view/device-registry.xml b/docs/architecture/component-view/device-registry.xml
index acbcff0..9ca9ae1 100644
--- a/docs/architecture/component-view/device-registry.xml
+++ b/docs/architecture/component-view/device-registry.xml
@@ -1 +1 @@
-<mxfile userAgent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36" version="9.0.5" editor="www.draw.io" type="device"><diagram id="335c56a3-2b2a-8ff2-00d6-b683b72057d3" name="Page-1">7Vtbc6M2FP41fuwOIK6PsTe77Uw7k2k60+2jAgpWFyNW4MTpr68EkkFItkkMduK1XwxHIKTzfeeig5iBxWrzlcJi+QdJUDZzrGQzA59njmMDx2d/XPIiJJ4dNZKU4kTIWsE9/g8JoSWka5ygUrmwIiSrcKEKY5LnKK4UGaSUPKuXPZJMfWoBU6QJ7mOY6dK/cVIthdT2o7bhV4TTpXh06ARNwwOMv6eUrHPxvJkDHutf07yCsi8x0XIJE/LcEYHbGVhQQqrmaLVZoIwrV6qtue/LjtbtuCnKqyE3OM0NTzBbIznielzVi9RFPRvEr7dnYP68xBW6L2DMW58Z/Ey2rFaZaC4QxStUIcovwXnKxICJy4qS72hBMkLrToFV/1hLmsGSg8WPIY0FFTx2pk9FzO4J0QptOiIxta+IsEfTF3aJaAWST5KHUu3PLahBIGTLDp5uJIRQECnd9t0qkx0IfZp1CzTdfkZPmCnOsf5EKS5ld11ls4lVqkZV1eUkZ1fOH3GW9UQww2nOTmOmLsTkc64mzCh9IxpWOEn4Y4wQtiBzIB5JXgkkHGscKHzHVaEArgaF7To6FM4ISHi2pmiUMIMXp4RWS5KSHGa3rbSnkg4iaIOrb53jf/glnzhlmXroyzdxR33StpUVpFWH3ihPbrinahFkki+Yz0HcLv2izS3oX1RVL0IA1xVhonbYvxNSKHSRTstWwbTdfWCWZE1joR4BDhtzisRVQLg4rrm9iFOUwQo/qa70GPjc1zgp67CT6vqc3Z5pBNI7kep/WOca6V2D+7HBGKQ/rLUOBwm7rkdzlY6C9JZCeqfPbNvRqatTsqHVnR4r9urdwM+DXOwo2jMoWsoGU1Y84Y5gNrgWZ7+HMwBqF83QxV3dcNzvyD3QkdBcv6OaC9tpD6KHfyw9jITwNOIY/F6XHB8R7R5IfmiNhLbvTYV2MAnagQ73BcAbWJ9A5+cpGLmWsfVo6KNwKujtV+X47yl8gkBVkhfq4TPaQ4RjoueQpIMv9Irh89wuV+GD7MHaP/9e+uADff4mQwi8EeZvH56/nsLuTB9GzhG27qgJOMIh2UbavTf38laP0fdDU/kLCfRe5LMMF+WuxWSHBbAsmvrMI95w/zJXqwlvdSVb6xzsS3qVAFe3JGDAfIw83FAHmMr/Cis8Sl/S13qDXM0Yq3OgK2hBUcIGj2FWarp6HyWSLgiDV9ivoGsv9AFD5cq0chwFD1e39+OrJbqrPltFZCc+3aRUslIpgYCBoWT0EgjQV/N/oRwKZ381D4O7msw89JWzrOv6GVf9A1UQ8X+seTW/VsMvZa2HG3aB7RabWhmynR2l/F/Uhhl/SD5Sl1eSKOn0CUjielP40EuuOMvysuJvo3P5WzeYJgYG3SC4ozx2HpD2MentAIZnAzA8AYD2xVug9I9nyHhMJcsmGvLZDYqH4Y54eI9XRcbfwxpeyFr3iLIYI5/Fhtk8bkcknaBy1o267f4BFdRwnBDpOr0QCfQ8yjbFSH+EGCnXk1PHyA9mhaHBCs+37gg1K9yVnzYGcpsnRVOE6rdcmOn4rq+YjmN4t7vdbzK26chnX01HMZ3IYDrO2Uwn0kxHLtmt1kou2iaM4WQym4hOYxOXk/DJwK7Yi322jN3S7KUtA18DTfvqIjhloNFfAzL68ox5DkumUsfqYlTnznVCfVEIhL3tPadFwDmEwDaq/BzaP21Q0d9N9bSvpsM/CQYnTXY93QJu1tWSO534rVXya4lc9WRyh4nBs01VIvde9V58wLcHe60mCaIHq21Rcqe+HSE/jnv6jrb6Nmzr0SDYre/D3yNsdyp09T3G5wjegB1N5RIW/JCiH2tM+Rc484T9x7WVcYJTPsyu0t+yn2MABAZXFtVPq6AYix1a42DSc222wQRMW0NGMYEBe7QlJBnhe274EkCBhOXz54VkAgRcPcCbELDHQEB/mXtHyRNO6th+c/fbB4sL3jiIRF4PEUO4l+Qd3Sj0wv+C5OV6dYXkgJsaCxJ22n6B2OwgbL/zBLf/Aw==</diagram></mxfile>
\ No newline at end of file
+<mxfile host="www.draw.io" modified="2019-10-16T11:12:33.889Z" agent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0" version="12.1.1" etag="SCVMVU0YPNX_xoPjp2d9" type="device" pages="1"><diagram id="335c56a3-2b2a-8ff2-00d6-b683b72057d3" name="Page-1">7Vxbc5s4FP41fkyHO+YxdpK2M9uZTLMz2z7tYKPY2mJEBE7s/vqVQDISkm1iCztJnRfDEQh0vu9cdCQycMeL1Wcc5/NvKAHpwLGS1cC9GTiOHXgB+aGSNZNYXlhLZhgmTNYIHuBvwC9k0iVMQCFdWCKUljCXhVOUZWBaSrIYY/QiX/aIUvmpeTwDiuBhGqeq9B+YlHMmtYOoafgC4GzOHj102Pgm8fTXDKNlxp43cNzH6q9uXsS8LzbQYh4n6EUQubcDd4wRKuujxWoMUqpcrrb6vrstrZv3xiAru9zg1Dc8x+kS8Deu3qtcc11UowH0envgjl7msAQPeTylrS8EfiKbl4uUNecAwwUoAaaXwGxGxC4RFyVGv8AYpQhXnbpW9UdaZmlcULDocYynjAo+OVOHwkb3DHAJVoKIDe0zQOTReE0uYa0u5xPnIVf7SwNqGDLZXMDTHzJhzIg02/TdKJMcMH3qdesqur0Bz5AozrG+gxkseHeissnASlmjsuoylJErR48wTVuiOIWzjJxOiboAkY+omiCh9DVrWMAkoY/RQtiATIF4RFnJkHAsM1AEjidD4XoKFLbnqFA4BpDwbUXRICEGz04RLudohrI4vW2kLZUIiIAVLH8Ixz/pJZ8oZYl68PoHu6M6adqKMsalQG+QJdfUUzUIEskdpGNgt3O/aFML+g+U5ZoJ4mWJiKh57b8QyiW6cKdly2Da3i4wC7TEU6YeBg555xlgV7nMxVHN7UQcgzQu4bPsSo+Bz3uNk7L2OynR52z3TAZI70Sy/yGdK6T3NO7Hdk2Qfr/WBA4icl2L5jIdGektifROm9m2o1JXpWRNq3s1VuzU+17iCVr1dU6dyTrzkz3hHkHyJttBtZ1PvtxJbUnsPjH6trvy2l25ckdMUe2OKug3A+/EhuBYNmjx9xWeaNycyIV3B65nCtp2R+agDXuBNlSxfe9YhqExQw2HfaFpvyolf0vRzg1lJQVDNdpFGrg9A8GuS45A52V593FuZpfxhPdg7R5/i2+hZraho3voGxi/vX/8asa5NdobDukbD1MHDOZjbC3tOJJvxYkc6jF8iQttjpvzFxzoncinKcyLbXM/gQVxkdfllEe4ov5lJE/+D3UlG+vs7EtaE3dPtSRXg7mJtFkzbe/L/zIrPEpfTEG+38nVmJhMu6qCxhgk5OVhnBaKrt5GRUMEofOE+BV0bYW+rhM9I3h4qr0fX9xQXfXZChhb8RELFpyVUsXC7RhKjFcsXHXy/TfIYubsL+bhqu6qN/NQZ768DBukVPUTLCESPC1p8b1Sw1VR6eGaXGB7+apSBm8nRzP6y0q5hD8oM9TlhSTSdOIEJOGT80uBuLO/DTX+NjqXv+XLi6ZjYCgGwS3lrfOAtItJhwM4PBuAwxMAaH94C+T+8QwZj64KWUdDOrpO8XC4JR4+wEWe0mVTzfqp9QAwiTH8WeQ168dtiaQ9VM7EqNss98ugDs2ESM9phUhe+5UWUXsqMfH5ZN8x8p1Z4VBjheebdwwVK9yWn9YGcpsleV2Eard8MNPZ7Ela86xRzS4320NE0wlMpJfBxXQ0phNpTMc5m+lEiunwKbvVWMmHtgndtLw/m4hOYxMfJ+HjgV2yl65LruYzdkuxl6YMfAk0zdJFcMpAoy4DEvrSjHkUF0SljiViVOXOVUL9oRAYBq3FI83iiBaB0AQCzj4ENlHlz9C+6262R+21AAOzFE9dnWrpX06I/xAU7OiENuCrNnC9LOfU7UwPrZNfiuQ1vVtF8lATXfoqkvuvWhnv8LHATqtJwmhiNS1S9tS2IxBMpy19R4b0vf8Dgs1eBVHfkQl9d9jTVMzjnB5i8LSEmH4yM0rI77SyMkpwTF9TVPohOzo6QKBxZVH1tDJm72IPTX1K0MJEs06k2xxixAQ6bKrmkKSI7rqhkwAJEpLRnxeSHhDw1OCiQ8A2gYC6nHuP0TNMqth+ff/1ncUFQ186RX4LEc2kg5PXuFGopf8xyorl4gLJHjfVGyS33pfvi7vkJwrs5eRpMvn6L7y60uCkINPjRvFWiUKj3bPt8Wxt3PXMfdHh9fdFhx5jdQHg4N0uSso9rvdDVwn8u7LoJvnW7PLuQMMtO1Q8+3TJtxbt4PjvGrUFS01hs9unQOTsZiU03awHQuFV2FfI67CbJfnmtuqM3zdHGP4mSMbCPvWdJdquvkYureptSbM+US9zn6C8qsfbPQveOyrou7A7M1R6DTrnxI+/pu6TcNG5vuEFp6McaLs27utyor6qUjv4ICHyjaixqRbq8XmzRcOj4GkXDX0/7Fq6jV5fuiWnzf+5qPOf5r+JuLf/Aw==</diagram></mxfile>
\ No newline at end of file
diff --git a/docs/architecture/component-view/index.html b/docs/architecture/component-view/index.html
index aefa6ef..982e695 100644
--- a/docs/architecture/component-view/index.html
+++ b/docs/architecture/component-view/index.html
@@ -21,19 +21,19 @@
<title>Component View :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/architecture/component-view/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/architecture/component-view/" selected>stable (1.0)</option>
@@ -2282,20 +2282,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/architecture/component-view/top-level.png b/docs/architecture/component-view/top-level.png
index b85d267..b333695 100644
--- a/docs/architecture/component-view/top-level.png
+++ b/docs/architecture/component-view/top-level.png
Binary files differ
diff --git a/docs/architecture/component-view/top-level.xml b/docs/architecture/component-view/top-level.xml
index a99e90b..7a29236 100644
--- a/docs/architecture/component-view/top-level.xml
+++ b/docs/architecture/component-view/top-level.xml
@@ -1 +1 @@
-<mxfile userAgent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36" version="9.0.6-1" editor="www.draw.io" type="device"><diagram id="335c56a3-2b2a-8ff2-00d6-b683b72057d3" name="Page-1">7Z1Zc6M4EIB/jR83BRLnY445tmqyldmkamcfidE47GDkxTjH/vqVsIRBkh2wBSRBfkhAgID+pO5W62AGL5fPX/Jo9XCNY5TOgBU/z+DVDAAbAo/8oykvLMX1rW3KIk9ilrZLuE3+QyyRn7ZJYrRunFhgnBbJqpk4x1mG5kUjLcpz/NQ87SdOm3ddRQskJdzOo1RO/SuJiweW6rnO7sBXlCwe+K1tL9weuY/mvxY53mTshjMAf5a/7eFlxDNjb7p+iGL8VEuCn2bwMse42G4tny9RSqXL5ba97vOeo9WD5ygrWl0A4faSxyjdsLe/2KyTDK3XM3otQQkJFnhxvlqlyTwqEpyxRy9euLzIW6zo5hwvVzgrb30RpckiI2kp+kl316tonmSLb+XeFfRIUikmRB/EJnuLNFpTbPRe6yLHv9AlTnFe3gAG4B569JqfSZrW0mMXBbFD03FWsHIEXLIvy4GJ5hHlBXquJTG5fEF4iYr8hZzCjwLIILFi7PDi+bQrE8BjaQ+14lAlRqwcLqrMdyjIBqOxj4wjkdkr+Bz9u0lyWmUuYvJ/XlKCVxnO6YNePBTLlIm5g9Ct8icLnRVoWejbHHiNofmvUJ6QN0f57RY/S9ZBhyiVJh3HluiECjgw0MHGM2w6sHHBkGx8w6YDG0+h1fpjE7Znk+I0TVZ4JbBZ440ONrLM29LSAcEKhQpi+WeuhEFlWzxXAwbHMhiUGEJvUAy2hOH8+vsNSbHP6q7XNXHGogVVA8D6AxVPOP9VOzoNbyywBWfMArIzFvh9OWMOkFB9vbu7mV2C2XnDS46jFVHbo+LpbH90VCXeAOJNPoVVsVUVyQZa8LjvX6HluIjYs1g96TcHDGpmXJnKFXpM5kiqNn+iRbIus59YvYGwWW8GVmu+7Aick2pA3qdq6ldAblH+OEXNJtgdT27KAKsvxQYsT5Iyihfolu3Sdgpe4CxKP+1SaxK1mgoNPSfFj9r23/SUM9YGifLinMbOZrT9kyGe9jmhT8d4kH0mXjukeWSxcAlJqV1A9vjpkOz+g4rihSVEmwKTpN0LfMNUJZePptChbblS4RykmqOUFOzHZqBPhYhdeoMTcouqNLhBszgEjnUWwN1PUJtEYAtUsDzqYTghWwjCM9vb/Xyny12I6crnSLpLWbiqV29X3my3//Lmu2XRIA/1o9x3nYAnbE8IHcgTbnhDuF4ETTF9rZi+Up5CcEx5ku5iW67dJd89teGIcmr7cnD0+vvdnfHH9/jjARjUH+fBog/ij/8WavLIA6FLoXL/BnHHLYnBCbrdaOJWmpjoyCbyyufu7CPAVzLS5wZU2qN3N8CUotb2HFi1n9soCoC3GrtacDewD2e0p3AS8UcvtdNW9IT1IbdZfZ9dEd3meHSBdeRubGNwqMEJRjQ4Toce7ClBsS0wJpWP23fdDyxR2QZyiK63DlPn43Zm96LuvDFZdWj0GFYgsMdk1WIgguxmNpo/rzmL3Ou1zvgej255bF8Mbu0V6tadE4rZqz5nTY6uQo487UTXNIACRtiuWSJn5B3XUDrGXXTBe8L/RkiHQlcIcEMdUUQx2165t2gmGO6vhTA0gT86NHIU+Q5e75TaItBrtsyHjUh28G6nBMUB7ohQTOxeCcV1x6wpHQbOmrYFcCVXRW5bVMMv67AcSwMsXgoMrHYmKIACLHmMWhVL1N4S5PbPwGoHyw7Hg1UNtDrBNmmC9bZsk+jFee5wtglYHWrQlKA4AI4IpUWEY4pQRC9uWCgdein32BpNrvW7sDWu0E3mczB1WwN68uKAdfr82ynBgiFoAQv25Rh0mABiYEljiQaGdXrY50PapgCOaZtOD/t8TCh+eOaOiOX0GdMfEottgREri316hGdK5iYUOnoCSzY3VTNSuyNnnx7hmRKswAoEhafG1Zd3YHdouRpcO9dtHFhyt2o5L75cOiqlc2fuc7K1oFts7u8+lptlej4vqLAv6Nsn8yj9Ft2j9AavEya0e1wUeElOSOmBi2qtLRUknsc5m8pTlHbxPS9X4Qi95YopPY7C4NmWFiX6AVZuqVc/O9DliHBBcCxQOcdeUQG1eCJgGn1N2nB5zRURbEXHoMpr1KIsgeyIlJMWgRctaWXJ7ter8i2N5uxVc1az8AbRnLxCGs35iuYMnGE15+nB+ClrzsAbUnPKwamt5hR4kVcpZooBm1y6bEBnXeAsic/4nhMBobom5VpwmcRxOc3x6SEpEJU3vedTHq0a1C2Beo1hOXdRR72xBBKOTEKlzrQsSAJlf0NaMUawXtOkBPym0XEV65P2R0n2NLbNMsNGVYNs5bpY/dGRPYLLHMW0DkXp2kBihoOHvvl4SyAHePtDJHf+3qEsouPQDZ1S8r4/Ip29C8tJdNjKcsY01T05wfEelp0cMTTKTzHMsonIt50BEcn980b5NZVfMCIduS1klF8X5eeOyE6Ool/i5TLKYhUeFhbc/iVXXRJp5Dg1JBk5YVGZQc2YYgn1T4/IqMiqy1+YFj4sHLn5e4dSxDIygLZt4MAZkZCiCWwUoSZFOKhJU6y8ZRThAUU4LBxVGMMowsOKcFhCcijDKMKjUdpCT68DrCEDu4ql1YwuPMTH5QPTBqGjCmsYZfgKIb4E1yCEWsxBaHawqwRWI3Sw/z32w/u24yKQN5/3JHEgrq4jCxwqR6fo+AIIaLMQ2jCjII4anVJSqA130Dc4BQpLSPgKLH3VA1cOLuyF8gaHDGmrGiIDR7blKga2FgZyC3Uvgw/1pTUbCGsGqwYaqxZm1DJZQ7FC202OHxMqMGCd3/w+UbvsSLMyHJlK9cUt/RpJ0WuHs/VmabAIWBR2okcsskv76ZkILYvoaYc+2T0NPDDwBFUWSHSUX+/SQ6eFO0uHYa9O82GANcdZRix/dM9ztQ6KRfqmWSBHfqtPKmpfysyfxIJLaoS7ItF+EYxmV7MtN5hVnwfUsjSW38EFeoNuaLuvanZBon9YOtnNMS5qx74QPflwjWNEz/gf</diagram></mxfile>
\ No newline at end of file
+<mxfile host="www.draw.io" modified="2019-10-16T10:33:43.722Z" agent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0" version="12.1.1" etag="gHkZKoHFO34990e9U8qM" type="device" pages="1"><diagram id="335c56a3-2b2a-8ff2-00d6-b683b72057d3" name="Page-1">7Z1bd6M4EoB/jR8nB0lcH51L9+w5yZ70JmdnZt+IUdtMY+TFOHH2168EEgZJxGADTmz8kBiZa31SqaokFRN0s9x+T/zV4oEEOJpAI9hO0O0EQmCbNv3HSt55iWE6eck8CQNetit4Cv+HxY68dBMGeF3ZMSUkSsNVtXBG4hjP0kqZnyTkrbrbTxJVr7ry51gpeJr5kVr6RxikC/Fglrn74Xcczhfi0sD28l9e/NmveUI2Mb/gBKKf2Sf/eemLk/EnXS/8gLyVitDdBN0khKT5t+X2BkdMukJu+XHfan4tbjzBcdroAITyQ179aMOf/nqzDmO8Xk/YsRQl2k4n6Hq6WkXhzE9DEvNbT9+FvOhTrNjXGVmuSJxd+tqPwnlMyyL8k22uV/4sjOf32dYtsmlRJibMbgTQrXnkrxk2g+2cJuQXviERSbILIBe+IJsd8zOMolJ5YGE3MFk5iVNej6BFt1U5cNG84iTF21IRl8t3TJY4Td7pLuJXiDgkXo1NUT3fdnUC2rxsUaoORaHP6+G8OPkOBf3CadSRMRUytYJP8H83YcKazHVA/88ySug2Jgm70etFuoy4mFsI3cg+qtB5hVaFnp9BtBh2/hVOQvrkOHnK8fPiLugAy6nSMYFCx9PAQW4XbOyRTQs2FhySjTOyacHG1mi1/th4zdlEJIrCFVlJbNZk0wUbVeZNaXUBwfCkBmI4V5aCQde32FYHGExjxKDF4NmDYgAKhunDj0daAq7KptcDNcb8OVMD0PgnTt9I8qv062VYYy6QjDEDqsaY6/RljJlQQfX78/Pj5AZOphUrOfBXVG2fFE/r/qeLpiQcIOHyaXoVoGtIAHaCx/r6Ci0hqc/vxehJv5lw0G7GUqnc4tdwhpVm8y88D9fZ6S+s3SBUbTcDqzVHNQSmtBnQ5ylc/QLIE05eL1GzSf2Orboy0OhLsUHDVqSMgzl+4pvMTyFzEvvR3a60JFGjqtDwNkz/LH3/i+1yxX0QP0mnLHY2Yf5PjEXZt5DdHedBt7l4gcfOEQfSIbSkdADdErsjuvk3TtN3XuBvUkKLdg9wT5hKzm5No0ObcmXC+ZBqgiNasV+rgT4dIn7oIwnpJYraYEvVwTWlU1ARzXHKjyoH3qQTIehdAXv3cUzpvMaVi3YfSR3TziqZYeUqFIb/XtptxXZY1z+NZeqfpu6m9+xPv+R3sKvbheSbVXdg9V/dHSurmfSm/sy2LdMVBfkOnolEwaPww8stYGwl+1rJnsrtwUMqt3IVYFigzXlrmuYB9RQ4amz24cfz8+gO1LgDLhzUHRCxqjNxB37zOnIIXGlEo7A+B/EGDIXBEbp91MSNNDHVkVXkhcnf2mBBe05Uo7YPUa9Ce/RuBnytWlQ2WgCUjBbq6vOC221xI2zrvbwlGzRNKyY08noi2rLXm90AjdLHqlQ5KJzjtpaC5YKPT1TTCNra07bhaK/TlX0MTHW0fuzYWMfmnrBjM1sM1F8SFGDAU1I53yH6fmDJytZVI5G9jQub5ztm34u6s0/JqoVzNbKCLjglqwbzLVRztuJm7TVKuXVNbdKKfe2ZNt9ubHPm5pxUzfZ6SCU5Who5irIjTVMXSRhRM/dHPZF9mEN2iLlowa+E/5OQ9qQQP7S8LqKV8ml75d7ATRi57wuVdAT+4BDMQeRbWL2X5Isg85SRzxbW7UVBkcaFhoUyjhFooViOe0IoLeYHj74FtJAUbxQGX3mYTcxQKMMyjQ5giVowwmo41QtKsNSpeEUssXNPUExbGmE1ggU993SwivlkR/RNHcH6XH0T7Yuuqm64bQ3XO0GjRRu6KCwOOimWBlGOS8RCLTkZi2AwCJYWY5U1PU5HBvaX6HEs05FoOZqpxgD2ZM1B4/jlxpeEC5lQwaWZ4wZRXyZCixUvIy56u7IuHBjX8SGgs+yjXFSdmTOs4XB8COg8oTinNbOPXyR+lliAAU/YWMDx0Z5L6nA8adDHNdTupnAoOzfmwPHRnkuC5SrWgR5XX9YBaOHBjrh2pttpYKlDrFkqgCxbVsTW67wk9NucfePLnetYbpbRdJYyYV+zpw9nfnTvv+DokaxDLrQXkqZkSXeI2A/XRXoxHSRxjilfPpRm/eJXztAhjdoCzTIiU9PhAaMTJXoGyWrKzQ+4XRkiQhACC9KmFdA0wE4sEXgZ406d4bKrg4RAM0iosxo7UZZQNUSyhZLQ9pesscQv61X2lKPm7FVzFiv/BtGcokGOmnOP5nTNYTXn8SH5S9acrj2k5lSDU7nmlHjRR0knmsmbQrp8cmdZ4LxIrDKfUQHhsiYVWnAZBkG2tPJtEaaYyZtd8y3xVxXqhkS9xDBbL9lFu5EW1rmmSkKnzjrJwYJUe0NJkiP1XpdJCTrVTsfSpGTtj5JqaeRu2chG14KANhVYf3RUi+AmwQFrQ360HiFxMbnyoCKywKCY1EHgZxz7bF76SCiTvJxBw4KD8qnNqKfwuclz4+vStR9Piiem+bycbCBHdKE3pMmgxghHdddA3dmeMWhzUkflR3VXUXfQOjEh1QuqU3g8h+hwFnmSP+snxmfB6gIbRyyqHQSdGj6/IculHwc6OjwemP+lR9Hui+KIxobIyUkZbBBUh/57I6lJF3/3ikctWYz1S2vDh4Wj+r3POML8RCOg3Pl1zRMS0vi+oyLsSBE6wByQpBo/HxXhB4pwWDi62MWoCD9WhMMSUqMXoyI8GCWQhnhNOKhnpsmvNurCj/hYYkbaIHR0kY1RGe4hJPJwDUKoweKD6si6TmAlQh8OvAeO99J0QgS2Z7OeJA7lFDuqwJF2WkoXbzuBTbKhDTP94aBpKRmF0jyH7malICk3laPB0lc7sNTgQi2UTzhXqLOmITMw1b5cxwB0wkD1UGsZnNVb5QCUEgfrZhjrsjN2skpDk6btMSGvIRMYNKaP/7jQftlUlmOYKpXi7WLdayTN4B2J15vliEVeQzsoFtWkvdtSocU+2+2j15NfBh7k2pIqUwd7tG8q64ZOA3OWzb9eHWfDQGOWz2vwX8RZjQ/Fory/zVUjv8XrIzvPZ+ZcRNYlPcJdlWg+XllNugRUh1n3KsRO8mM5LUygT2iGNnuDaBskA8xH//v+2+rHHwvnP3fb+wfr0f/3DKDfiqudCYnyqkeNOlOUXn3jMKUxLI1R1Nfq7xpSx6eM+QLarTuAIgBY5JRT9Vtv2RprCKo2VbPpNZ1bWINMpjkOnzSZBg4YLayhd775SzrVlEOmPashdXzk8Yst8D8OIKhqykEzoekJat6UfbYzr49iZ0MlMVp/sw7pZkJIWvrtO33kxQMJMNvj/w==</diagram></mxfile>
\ No newline at end of file
diff --git a/docs/architecture/index.html b/docs/architecture/index.html
index 214394e..cb3139d 100644
--- a/docs/architecture/index.html
+++ b/docs/architecture/index.html
@@ -21,19 +21,19 @@
<title>Architecture :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/architecture/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/architecture/" selected>stable (1.0)</option>
@@ -1332,7 +1332,7 @@
<h1 id="architecture">Architecture</h1>
-<p>Get an overview over Hono’s architecture.</p>
+<p>Get an overview of the architecture of Eclipse Hono™.</p>
<footer class=" footline" >
@@ -2205,20 +2205,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/categories/index.html b/docs/categories/index.html
index 637bdc0..f3d3d00 100644
--- a/docs/categories/index.html
+++ b/docs/categories/index.html
@@ -21,19 +21,19 @@
<title>Categories :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/categories/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/categories/" selected>stable (1.0)</option>
@@ -2186,20 +2186,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/concepts/command-and-control/index.html b/docs/concepts/command-and-control/index.html
index 1aa8488..dcf6294 100644
--- a/docs/concepts/command-and-control/index.html
+++ b/docs/concepts/command-and-control/index.html
@@ -21,19 +21,19 @@
<title>Command & Control :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/command-and-control/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/command-and-control/" selected>stable (1.0)</option>
@@ -1358,22 +1358,21 @@
<h2 id="command-control-over-http-adapter">Command & Control over HTTP Adapter</h2>
-<p>The following sequence diagrams give an overview of a device connecting via HTTP, which gets a command from the business application in the response to a downstream message - being an arbitrary event in this example. The application and the adapter connect to the AMQP Network, which forwards the transfer - for clarity this is not shown in the diagram.</p>
+<p>The following sequence diagrams give an overview of a device connecting via HTTP, which gets a command from the business application in the response to a downstream message - being an arbitrary event in this example.
+<a href="/hono/docs/concepts/device-notifications/">Device Notifications</a> are used to indicate to the application the period in which the device is ready to receive a command.</p>
-<p><strong>(Request/Response) command over HTTP:</strong></p>
+<p>The application and the adapter connect to the AMQP Network, which forwards the transfer - for clarity this is not shown in the diagrams.</p>
<figure>
- <img src="../command_control_concept_http.svg"/> <figcaption>
- <h4>Command & Control over HTTP Adapter</h4>
+ <img src="../command_control_concept_one_way_http.svg"/> <figcaption>
+ <h4>One-way Command over HTTP Adapter</h4>
</figcaption>
</figure>
-<p><strong>One-way command over HTTP:</strong></p>
-
<figure>
- <img src="../command_control_concept_one_way_http.svg"/> <figcaption>
- <h4>One-way Command & Control over HTTP Adapter</h4>
+ <img src="../command_control_concept_http.svg"/> <figcaption>
+ <h4>Request/Response Command over HTTP Adapter</h4>
</figcaption>
</figure>
@@ -1413,7 +1412,7 @@
<p>The <em>hono-cmd-req-id</em> response header is needed for the command response to correlate it. It has to be sent back from the device to the adapter in a following operation (5).</p>
<p>The device needs to respond to the command (5), to inform the business application about the outcome of executing the command. For this purpose
-specific URIs are defined in <a href="/hono/docs/user-guide/http-adapter/#sending-a-response-to-a-previously-received-command">HTTP Adapter</a>.</p>
+specific URIs are defined in <a href="/hono/docs/user-guide/http-adapter/#sending-a-response-to-a-command-authenticated-device">HTTP Adapter</a>.</p>
<p>The URI contains the <em>hono-cmd-req-id</em> and a status code indicating the outcome of executing the command.</p>
@@ -1423,47 +1422,20 @@
<h2 id="command-control-over-mqtt-adapter">Command & Control over MQTT Adapter</h2>
-<p>When the device is connected to the MQTT Adapter it receives <em>Request/Response</em> commands on the topic:</p>
+<p>When the device is connected to the MQTT adapter, it can subscribe to the topic filters described in the <a href="/hono/docs/user-guide/mqtt-adapter/#command-control">User Guide</a>.
+The topic on which commands are published has the structure <code>command/[${tenant-id}]/[${device-id}]/req/[${req-id}]/${command}</code>.</p>
-<ul>
-<li><code>command/[${tenant}]/[${device-id}]/req/${req-id}/${command}</code></li>
-</ul>
+<p>For authenticated devices, the tenant-id and device-id topic levels are empty, and for <em>one-way</em> commands, the <code>${req-id}</code> level is.
+For example, authenticated devices typically subscribe to <code>command///req/#</code>.</p>
-<p>and <em>one-way</em> commands on the topic:</p>
+<p>Gateways (which always need to authenticate) subscribe to commands for all devices they act on behalf of using topic filter
+<code>command//+/req/#</code>
+and will receive commands on a topic that contains the target device id.</p>
-<ul>
-<li><code>command/[${tenant}]/[${device-id}]/req//${command}</code></li>
-</ul>
-
-<p>Authenticated devices typically subscribe to</p>
-
-<ul>
-<li><code>command/+/+/req/#</code></li>
-</ul>
-
-<p>while unauthenticated devices have to fully specify their <code>${tenant}</code> and <code>${device-id}</code> during the subscription.</p>
-
-<p>The response of the command will be sent by the device to</p>
-
-<ul>
-<li><code>command/[${tenant}]/[${device-id}]/res/${req-id}/${status}</code></li>
-</ul>
-
-<p>If the device is authenticated, the <code>${tenant}</code> and <code>${device-id}</code> are left empty (resulting in 3 subsequent <code>/</code>s).</p>
+<p>In the case of request/response commands, the device must publish the response on the topic <code>command///res/${req-id}/${status}</code>, inserting the <code>${req-id}</code> from the command.</p>
<p>The following diagrams show the message flow for commands over the MQTT adapter:</p>
-<p><strong>Request/Response commands</strong> :</p>
-
-<figure>
- <img src="../command_control_concept_mqtt.svg"/> <figcaption>
- <h4>Request/Response Command over MQTT Adapter</h4>
- </figcaption>
-</figure>
-
-
-<p><strong>one-way commands</strong> :</p>
-
<figure>
<img src="../command_control_concept_one_way_mqtt.svg"/> <figcaption>
<h4>One-way Command over MQTT Adapter</h4>
@@ -1471,6 +1443,13 @@
</figure>
+<figure>
+ <img src="../command_control_concept_mqtt.svg"/> <figcaption>
+ <h4>Request/Response Command over MQTT Adapter</h4>
+ </figcaption>
+</figure>
+
+
<h2 id="command-control-over-amqp-adapter">Command & Control over AMQP Adapter</h2>
<p>When a device connected to the AMQP adapter wants to receive commands from the adapter, it opens a receiver link specifying the following source address:</p>
@@ -1482,91 +1461,9 @@
<p>Once the receiver link is opened, the AMQP adapter sends command messages to devices through the link. The <em>subject</em> property of the request message contains the actual command to be executed on the device.</p>
-<p>If the command request is a <em>one-way command</em>, then the device need not publish a command response message. However, if the application expects a response, then devices should publish a response back to the application. If an anonymous sender link is already opened by the device (e.g for publishing telemetry or events), then the device can reuse that link to publish the command response message. Otherwise, the device should publish the response by opening an anonymous sender link. The device should set the message address, status and correlation-id properties of the response accordingly. Consult the table below for a list of properties that a device must set on a command response message.</p>
+<p>If the command request is a <em>one-way command</em>, then the device need not publish a command response message. However, if the application expects a response, then devices should publish a response back to the application. If an anonymous sender link is already opened by the device (e.g for publishing telemetry or events), then the device can reuse that link to publish the command response message. Otherwise, the device should publish the response by opening an anonymous sender link. The device should set the message address, status and correlation-id properties of the response accordingly.</p>
-<p><strong>Command Request Message Properties</strong></p>
-
-<p>The following properties are set by the AMQP adapter on a command message sent to devices.</p>
-
-<table>
-<thead>
-<tr>
-<th align="left">Name</th>
-<th align="center">Mandatory</th>
-<th align="left">Location</th>
-<th align="left">Type</th>
-<th align="left">Description</th>
-</tr>
-</thead>
-
-<tbody>
-<tr>
-<td align="left"><em>subject</em></td>
-<td align="center">yes</td>
-<td align="left"><em>properties</em></td>
-<td align="left"><em>string</em></td>
-<td align="left">Contains the name of the command to be executed on a device.</td>
-</tr>
-
-<tr>
-<td align="left"><em>reply-to</em></td>
-<td align="center">yes</td>
-<td align="left"><em>properties</em></td>
-<td align="left"><em>string</em></td>
-<td align="left">Contains the address to which the command response should be published to. This value is empty for one-way commands.</td>
-</tr>
-
-<tr>
-<td align="left"><em>correlation-id</em></td>
-<td align="center">yes</td>
-<td align="left"><em>properties</em></td>
-<td align="left"><em>string</em></td>
-<td align="left">Contains the identifier used to correlate the response with the command request. If the command sent by the application contains a correlation-id, then that value is used as the correlation-id of the command request sent to the device. Otherwise, the value of the message-id property is used instead.</td>
-</tr>
-</tbody>
-</table>
-
-<p><strong>Command Response Message Properties</strong></p>
-
-<p>If the application expects a response (i.e the <em>reply-to</em> property is set), then the device should set the following properties on a command response message.</p>
-
-<table>
-<thead>
-<tr>
-<th align="left">Name</th>
-<th align="center">Mandatory</th>
-<th align="left">Location</th>
-<th align="left">Type</th>
-<th align="left">Description</th>
-</tr>
-</thead>
-
-<tbody>
-<tr>
-<td align="left"><em>to</em></td>
-<td align="center">yes</td>
-<td align="left"><em>properties</em></td>
-<td align="left"><em>string</em></td>
-<td align="left">MUST contain the address to which the command response should be published to, which is the value of the reply-to property of the command request message.</td>
-</tr>
-
-<tr>
-<td align="left"><em>correlation-id</em></td>
-<td align="center">yes</td>
-<td align="left"><em>properties</em></td>
-<td align="left"><em>string</em></td>
-<td align="left">MUST contain the identifier used to correlate the response with the original request, which is the value of the correlation-id of the original request.</td>
-</tr>
-
-<tr>
-<td align="left"><em>status</em></td>
-<td align="center">yes</td>
-<td align="left"><em>application-properties</em></td>
-<td align="left"><em>string</em></td>
-<td align="left">The status code indicating the outcome of processing the command by the device. MUST be set by the device after executing the command.</td>
-</tr>
-</tbody>
-</table>
+<p>Consult the <a href="/hono/docs/user-guide/amqp-adapter/#command-control">User Guide</a> for a list of properties in request and response messages.</p>
<figure>
<img src="../command_control_concept_amqp.svg"/> <figcaption>
@@ -2444,20 +2341,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275523"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275523"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275523"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275523"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275523"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361813"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361813"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361813"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361813"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361813"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275523"></script>
- <script src="/hono/docs/js/learn.js?1571275523"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275523"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361813"></script>
+ <script src="/hono/docs/js/learn.js?1571361813"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361813"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275523" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275523"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361813" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361813"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/concepts/command_control_concept_mqtt.svg b/docs/concepts/command_control_concept_mqtt.svg
index 59c36e1..f8540e6 100644
--- a/docs/concepts/command_control_concept_mqtt.svg
+++ b/docs/concepts/command_control_concept_mqtt.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="427.2px" preserveAspectRatio="none" style="width:1316px;height:427px;" version="1.1" viewBox="0 0 1316 427" width="1316.4px" zoomAndPan="magnify"><defs><filter height="300%" id="f1o44wqsfudvsx" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.4"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.8" dy="4.8" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FFFFFF" filter="url(#f1o44wqsfudvsx)" height="209.7563" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="538.2" y="148.4344"/><rect fill="#FFFFFF" filter="url(#f1o44wqsfudvsx)" height="174.7969" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="1246.2" y="183.3937"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="148.8" x2="148.8" y1="45.9563" y2="379.7906"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="543.6" x2="543.6" y1="45.9563" y2="379.7906"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="1251.6" x2="1251.6" y1="45.9563" y2="379.7906"/><rect fill="#FEFECE" filter="url(#f1o44wqsfudvsx)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="73.2" x="110.4" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="56.4" x="118.8" y="27.5941">Device</text><rect fill="#FEFECE" filter="url(#f1o44wqsfudvsx)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="73.2" x="110.4" y="378.5906"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="56.4" x="118.8" y="402.5848">Device</text><rect fill="#FEFECE" filter="url(#f1o44wqsfudvsx)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="135.6" x="474" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="118.8" x="482.4" y="27.5941">MQTT Adapter</text><rect fill="#FEFECE" filter="url(#f1o44wqsfudvsx)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="135.6" x="474" y="378.5906"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="118.8" x="482.4" y="402.5848">MQTT Adapter</text><rect fill="#FEFECE" filter="url(#f1o44wqsfudvsx)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="106.8" x="1196.4" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="90" x="1204.8" y="27.5941">Application</text><rect fill="#FEFECE" filter="url(#f1o44wqsfudvsx)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="106.8" x="1196.4" y="378.5906"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="90" x="1204.8" y="402.5848">Application</text><rect fill="#FFFFFF" filter="url(#f1o44wqsfudvsx)" height="209.7563" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="538.2" y="148.4344"/><rect fill="#FFFFFF" filter="url(#f1o44wqsfudvsx)" height="174.7969" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="1246.2" y="183.3937"/><path d="M9.6,63.9563 L9.6,111.9563 L285.6,111.9563 L285.6,75.9563 L273.6,63.9563 L9.6,63.9563 " fill="#FBFB77" filter="url(#f1o44wqsfudvsx)" style="stroke: #A80036; stroke-width: 1.2;"/><path d="M273.6,63.9563 L273.6,75.9563 L285.6,75.9563 L273.6,63.9563 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.2;"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="217.2" x="16.8" y="84.4365">The device is connected and</text><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="250.8" x="16.8" y="102.5959">authenticated with TENANT/4711</text><polygon fill="#A80036" points="523.8,143.6344,535.8,148.4344,523.8,153.2344,528.6,148.4344" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="149.4" x2="531" y1="148.4344" y2="148.4344"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="354" x="157.8" y="142.3553">1. device subscribes to "command/+/+/req/#"</text><polygon fill="#A80036" points="1231.8,178.5938,1243.8,183.3937,1231.8,188.1938,1236.6,183.3937" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="550.2" x2="1239" y1="183.3937" y2="183.3937"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="334.8" x="558.6" y="177.3146">2. transfer("event/TENANT","4711","ttd=-1")</text><polygon fill="#A80036" points="563.4,213.5531,551.4,218.3531,563.4,223.1531,558.6,218.3531" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="556.2" x2="1245" y1="218.3531" y2="218.3531"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="380.4" x="570.6" y="212.274">3. transfer("command/TENANT/4711","light","ON")</text><polygon fill="#A80036" points="162.6,248.5125,150.6,253.3125,162.6,258.1125,157.8,253.3125" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="155.4" x2="537" y1="253.3125" y2="253.3125"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="298.8" x="169.8" y="247.2334">4. "command///req/${reqId}/light":"ON"</text><polygon fill="#A80036" points="1231.8,283.4719,1243.8,288.2719,1231.8,293.0719,1236.6,288.2719" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="550.2" x2="1239" y1="288.2719" y2="288.2719"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="176.4" x="558.6" y="282.1928">disposition("accepted")</text><polygon fill="#A80036" points="523.8,318.4313,535.8,323.2313,523.8,328.0313,528.6,323.2313" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="149.4" x2="531" y1="323.2313" y2="323.2313"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="360" x="157.8" y="317.1521">5. "command///res/${reqId}/200":"lumen=100"</text><polygon fill="#A80036" points="1237.8,353.3906,1249.8,358.1906,1237.8,362.9906,1242.6,358.1906" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="544.2" x2="1245" y1="358.1906" y2="358.1906"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="667.2" x="552.6" y="352.1115">6. transfer("command_response/TENANT/4711/${replyId}","status=200","lumen=100")</text><!--
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="427.2px" preserveAspectRatio="none" style="width:1400px;height:427px;" version="1.1" viewBox="0 0 1400 427" width="1400.4px" zoomAndPan="magnify"><defs><filter height="300%" id="fv63cmfv2nt78" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.4"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.8" dy="4.8" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FFFFFF" filter="url(#fv63cmfv2nt78)" height="209.7563" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="622.2" y="148.4344"/><rect fill="#FFFFFF" filter="url(#fv63cmfv2nt78)" height="174.7969" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="1330.2" y="183.3937"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="148.8" x2="148.8" y1="45.9563" y2="379.7906"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="627.6" x2="627.6" y1="45.9563" y2="379.7906"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="1335.6" x2="1335.6" y1="45.9563" y2="379.7906"/><rect fill="#FEFECE" filter="url(#fv63cmfv2nt78)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="73.2" x="110.4" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="56.4" x="118.8" y="27.5941">Device</text><rect fill="#FEFECE" filter="url(#fv63cmfv2nt78)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="73.2" x="110.4" y="378.5906"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="56.4" x="118.8" y="402.5848">Device</text><rect fill="#FEFECE" filter="url(#fv63cmfv2nt78)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="135.6" x="558" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="118.8" x="566.4" y="27.5941">MQTT Adapter</text><rect fill="#FEFECE" filter="url(#fv63cmfv2nt78)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="135.6" x="558" y="378.5906"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="118.8" x="566.4" y="402.5848">MQTT Adapter</text><rect fill="#FEFECE" filter="url(#fv63cmfv2nt78)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="106.8" x="1280.4" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="90" x="1288.8" y="27.5941">Application</text><rect fill="#FEFECE" filter="url(#fv63cmfv2nt78)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="106.8" x="1280.4" y="378.5906"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="90" x="1288.8" y="402.5848">Application</text><rect fill="#FFFFFF" filter="url(#fv63cmfv2nt78)" height="209.7563" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="622.2" y="148.4344"/><rect fill="#FFFFFF" filter="url(#fv63cmfv2nt78)" height="174.7969" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="1330.2" y="183.3937"/><path d="M9.6,63.9563 L9.6,111.9563 L285.6,111.9563 L285.6,75.9563 L273.6,63.9563 L9.6,63.9563 " fill="#FBFB77" filter="url(#fv63cmfv2nt78)" style="stroke: #A80036; stroke-width: 1.2;"/><path d="M273.6,63.9563 L273.6,75.9563 L285.6,75.9563 L273.6,63.9563 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.2;"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="217.2" x="16.8" y="84.4365">The device is connected and</text><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="250.8" x="16.8" y="102.5959">authenticated with TENANT/4711</text><polygon fill="#A80036" points="607.8,143.6344,619.8,148.4344,607.8,153.2344,612.6,148.4344" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="149.4" x2="615" y1="148.4344" y2="148.4344"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="267.6" x="157.8" y="142.3553">1. SUBSCRIBE("command///req/#")</text><polygon fill="#A80036" points="1315.8,178.5938,1327.8,183.3937,1315.8,188.1938,1320.6,183.3937" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="634.2" x2="1323" y1="183.3937" y2="183.3937"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="334.8" x="642.6" y="177.3146">2. transfer("event/TENANT","4711","ttd=-1")</text><polygon fill="#A80036" points="647.4,213.5531,635.4,218.3531,647.4,223.1531,642.6,218.3531" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="640.2" x2="1329" y1="218.3531" y2="218.3531"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="380.4" x="654.6" y="212.274">3. transfer("command/TENANT/4711","light","ON")</text><polygon fill="#A80036" points="162.6,248.5125,150.6,253.3125,162.6,258.1125,157.8,253.3125" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="155.4" x2="621" y1="253.3125" y2="253.3125"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="382.8" x="169.8" y="247.2334">4. PUBLISH("command///req/${reqId}/light", "ON")</text><polygon fill="#A80036" points="1315.8,283.4719,1327.8,288.2719,1315.8,293.0719,1320.6,288.2719" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="634.2" x2="1323" y1="288.2719" y2="288.2719"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="176.4" x="642.6" y="282.1928">disposition("accepted")</text><polygon fill="#A80036" points="607.8,318.4313,619.8,323.2313,607.8,328.0313,612.6,323.2313" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="149.4" x2="615" y1="323.2313" y2="323.2313"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="444" x="157.8" y="317.1521">5. PUBLISH("command///res/${reqId}/200", "lumen=100")</text><polygon fill="#A80036" points="1321.8,353.3906,1333.8,358.1906,1321.8,362.9906,1326.6,358.1906" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="628.2" x2="1329" y1="358.1906" y2="358.1906"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="667.2" x="636.6" y="352.1115">6. transfer("command_response/TENANT/4711/${replyId}","status=200","lumen=100")</text><!--MD5=[130e2d2ad51dc80d7f83df15b0506eb0]
@startuml
scale 1.2
@@ -10,20 +10,20 @@
The device is connected and
authenticated with TENANT/4711
end note
-Device -> "MQTT Adapter": 1. device subscribes to "command/+/+/req/#"
+Device -> "MQTT Adapter": 1. SUBSCRIBE("command///req/#")
activate "MQTT Adapter"
"MQTT Adapter" -> Application: 2. transfer("event/TENANT","4711","ttd=-1")
activate Application
Application -> "MQTT Adapter": 3. transfer("command/TENANT/4711","light","ON")
-"MQTT Adapter" -> Device: 4. "command///req/${reqId}/light":"ON"
+"MQTT Adapter" -> Device: 4. PUBLISH("command///req/${reqId}/light", "ON")
"MQTT Adapter" -> Application: disposition("accepted")
-Device -> "MQTT Adapter": 5. "command///res/${reqId}/200":"lumen=100"
+Device -> "MQTT Adapter": 5. PUBLISH("command///res/${reqId}/200", "lumen=100")
"MQTT Adapter" -> Application: 6. transfer("command_response/TENANT/4711/${replyId}","status=200","lumen=100")
deactivate "MQTT Adapter"
deactivate Application
@enduml
-PlantUML version 1.2019.07beta1(Unknown compile time)
+PlantUML version 1.2019.11(Sun Sep 22 10:02:15 UTC 2019)
(GPL source distribution)
Java Runtime: Java(TM) SE Runtime Environment
JVM: Java HotSpot(TM) 64-Bit Server VM
@@ -32,4 +32,4 @@
Default Encoding: UTF-8
Language: en
Country: US
---></g></svg>
\ No newline at end of file
+--></g></svg>
diff --git a/docs/concepts/command_control_concept_one_way_mqtt.svg b/docs/concepts/command_control_concept_one_way_mqtt.svg
index 53cd10c..a53ea56 100644
--- a/docs/concepts/command_control_concept_one_way_mqtt.svg
+++ b/docs/concepts/command_control_concept_one_way_mqtt.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="357.6px" preserveAspectRatio="none" style="width:1017px;height:357px;" version="1.1" viewBox="0 0 1017 357" width="1017.6px" zoomAndPan="magnify"><defs><filter height="300%" id="fo2b0w3wx1stz" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.4"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.8" dy="4.8" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FFFFFF" filter="url(#fo2b0w3wx1stz)" height="139.8375" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="526.2" y="148.4344"/><rect fill="#FFFFFF" filter="url(#fo2b0w3wx1stz)" height="104.8781" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="947.4" y="183.3937"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="148.8" x2="148.8" y1="45.9563" y2="309.8719"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="531.6" x2="531.6" y1="45.9563" y2="309.8719"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="952.8" x2="952.8" y1="45.9563" y2="309.8719"/><rect fill="#FEFECE" filter="url(#fo2b0w3wx1stz)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="73.2" x="110.4" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="56.4" x="118.8" y="27.5941">Device</text><rect fill="#FEFECE" filter="url(#fo2b0w3wx1stz)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="73.2" x="110.4" y="308.6719"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="56.4" x="118.8" y="332.666">Device</text><rect fill="#FEFECE" filter="url(#fo2b0w3wx1stz)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="135.6" x="462" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="118.8" x="470.4" y="27.5941">MQTT Adapter</text><rect fill="#FEFECE" filter="url(#fo2b0w3wx1stz)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="135.6" x="462" y="308.6719"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="118.8" x="470.4" y="332.666">MQTT Adapter</text><rect fill="#FEFECE" filter="url(#fo2b0w3wx1stz)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="106.8" x="897.6" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="90" x="906" y="27.5941">Application</text><rect fill="#FEFECE" filter="url(#fo2b0w3wx1stz)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="106.8" x="897.6" y="308.6719"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="90" x="906" y="332.666">Application</text><rect fill="#FFFFFF" filter="url(#fo2b0w3wx1stz)" height="139.8375" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="526.2" y="148.4344"/><rect fill="#FFFFFF" filter="url(#fo2b0w3wx1stz)" height="104.8781" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="947.4" y="183.3937"/><path d="M9.6,63.9563 L9.6,111.9563 L285.6,111.9563 L285.6,75.9563 L273.6,63.9563 L9.6,63.9563 " fill="#FBFB77" filter="url(#fo2b0w3wx1stz)" style="stroke: #A80036; stroke-width: 1.2;"/><path d="M273.6,63.9563 L273.6,75.9563 L285.6,75.9563 L273.6,63.9563 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.2;"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="217.2" x="16.8" y="84.4365">The device is connected and</text><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="250.8" x="16.8" y="102.5959">authenticated with TENANT/4711</text><polygon fill="#A80036" points="511.8,143.6344,523.8,148.4344,511.8,153.2344,516.6,148.4344" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="149.4" x2="519" y1="148.4344" y2="148.4344"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="354" x="157.8" y="142.3553">1. device subscribes to "command/+/+/req/#"</text><polygon fill="#A80036" points="933,178.5938,945,183.3937,933,188.1938,937.8,183.3937" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="538.2" x2="940.2" y1="183.3937" y2="183.3937"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="334.8" x="546.6" y="177.3146">2. transfer("event/TENANT","4711","ttd=-1")</text><polygon fill="#A80036" points="551.4,213.5531,539.4,218.3531,551.4,223.1531,546.6,218.3531" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="544.2" x2="946.2" y1="218.3531" y2="218.3531"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="380.4" x="558.6" y="212.274">3. transfer("command/TENANT/4711","light","ON")</text><polygon fill="#A80036" points="162.6,248.5125,150.6,253.3125,162.6,258.1125,157.8,253.3125" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="155.4" x2="525" y1="253.3125" y2="253.3125"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="103.2" x="169.8" y="247.2334">4. "command</text><text fill="#000000" font-family="sans-serif" font-size="15.6" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="30" x="273" y="247.2334">/req</text><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="79.2" x="303" y="247.2334">light":"ON"</text><polygon fill="#A80036" points="939,283.4719,951,288.2719,939,293.0719,943.8,288.2719" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="532.2" x2="946.2" y1="288.2719" y2="288.2719"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="176.4" x="540.6" y="282.1928">disposition("accepted")</text><!--
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="357.6px" preserveAspectRatio="none" style="width:966px;height:357px;" version="1.1" viewBox="0 0 966 357" width="966px" zoomAndPan="magnify"><defs><filter height="300%" id="f19t5uq8ddfn8" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.4"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.8" dy="4.8" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FFFFFF" filter="url(#f19t5uq8ddfn8)" height="139.8375" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="474.6" y="148.4344"/><rect fill="#FFFFFF" filter="url(#f19t5uq8ddfn8)" height="104.8781" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="895.8" y="183.3937"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="148.8" x2="148.8" y1="45.9563" y2="309.8719"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="480" x2="480" y1="45.9563" y2="309.8719"/><line style="stroke: #A80036; stroke-width: 1.2; stroke-dasharray: 5.0,5.0;" x1="901.2" x2="901.2" y1="45.9563" y2="309.8719"/><rect fill="#FEFECE" filter="url(#f19t5uq8ddfn8)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="73.2" x="110.4" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="56.4" x="118.8" y="27.5941">Device</text><rect fill="#FEFECE" filter="url(#f19t5uq8ddfn8)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="73.2" x="110.4" y="308.6719"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="56.4" x="118.8" y="332.666">Device</text><rect fill="#FEFECE" filter="url(#f19t5uq8ddfn8)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="135.6" x="410.4" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="118.8" x="418.8" y="27.5941">MQTT Adapter</text><rect fill="#FEFECE" filter="url(#f19t5uq8ddfn8)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="135.6" x="410.4" y="308.6719"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="118.8" x="418.8" y="332.666">MQTT Adapter</text><rect fill="#FEFECE" filter="url(#f19t5uq8ddfn8)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="106.8" x="846" y="3.6"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="90" x="854.4" y="27.5941">Application</text><rect fill="#FEFECE" filter="url(#f19t5uq8ddfn8)" height="36.3562" style="stroke: #A80036; stroke-width: 1.7999999999999998;" width="106.8" x="846" y="308.6719"/><text fill="#000000" font-family="sans-serif" font-size="16.8" lengthAdjust="spacingAndGlyphs" textLength="90" x="854.4" y="332.666">Application</text><rect fill="#FFFFFF" filter="url(#f19t5uq8ddfn8)" height="139.8375" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="474.6" y="148.4344"/><rect fill="#FFFFFF" filter="url(#f19t5uq8ddfn8)" height="104.8781" style="stroke: #A80036; stroke-width: 1.2;" width="12" x="895.8" y="183.3937"/><path d="M9.6,63.9563 L9.6,111.9563 L285.6,111.9563 L285.6,75.9563 L273.6,63.9563 L9.6,63.9563 " fill="#FBFB77" filter="url(#f19t5uq8ddfn8)" style="stroke: #A80036; stroke-width: 1.2;"/><path d="M273.6,63.9563 L273.6,75.9563 L285.6,75.9563 L273.6,63.9563 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.2;"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="217.2" x="16.8" y="84.4365">The device is connected and</text><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="250.8" x="16.8" y="102.5959">authenticated with TENANT/4711</text><polygon fill="#A80036" points="460.2,143.6344,472.2,148.4344,460.2,153.2344,465,148.4344" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="149.4" x2="467.4" y1="148.4344" y2="148.4344"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="267.6" x="157.8" y="142.3553">1. SUBSCRIBE("command///req/#")</text><polygon fill="#A80036" points="881.4,178.5938,893.4,183.3937,881.4,188.1938,886.2,183.3937" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="486.6" x2="888.6" y1="183.3937" y2="183.3937"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="334.8" x="495" y="177.3146">2. transfer("event/TENANT","4711","ttd=-1")</text><polygon fill="#A80036" points="499.8,213.5531,487.8,218.3531,499.8,223.1531,495,218.3531" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="492.6" x2="894.6" y1="218.3531" y2="218.3531"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="380.4" x="507" y="212.274">3. transfer("command/TENANT/4711","light","ON")</text><polygon fill="#A80036" points="162.6,248.5125,150.6,253.3125,162.6,258.1125,157.8,253.3125" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="155.4" x2="473.4" y1="253.3125" y2="253.3125"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="176.4" x="169.8" y="247.2334">4. PUBLISH("command</text><text fill="#000000" font-family="sans-serif" font-size="15.6" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="30" x="346.2" y="247.2334">/req</text><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="90" x="376.2" y="247.2334">light", "ON")</text><polygon fill="#A80036" points="887.4,283.4719,899.4,288.2719,887.4,293.0719,892.2,288.2719" style="stroke: #A80036; stroke-width: 1.2;"/><line style="stroke: #A80036; stroke-width: 1.2;" x1="480.6" x2="894.6" y1="288.2719" y2="288.2719"/><text fill="#000000" font-family="sans-serif" font-size="15.6" lengthAdjust="spacingAndGlyphs" textLength="176.4" x="489" y="282.1928">disposition("accepted")</text><!--MD5=[7651b2573c32d1b0c97f09ff206baf24]
@startuml
scale 1.2
@@ -10,18 +10,18 @@
The device is connected and
authenticated with TENANT/4711
end note
-Device -> "MQTT Adapter": 1. device subscribes to "command/+/+/req/#"
+Device -> "MQTT Adapter": 1. SUBSCRIBE("command///req/#")
activate "MQTT Adapter"
"MQTT Adapter" -> Application: 2. transfer("event/TENANT","4711","ttd=-1")
activate Application
Application -> "MQTT Adapter": 3. transfer("command/TENANT/4711","light","ON")
-"MQTT Adapter" -> Device: 4. "command///req//light":"ON"
+"MQTT Adapter" -> Device: 4. PUBLISH("command///req//light", "ON")
"MQTT Adapter" -> Application: disposition("accepted")
deactivate "MQTT Adapter"
deactivate Application
@enduml
-PlantUML version 1.2019.07beta1(Unknown compile time)
+PlantUML version 1.2019.11(Sun Sep 22 10:02:15 UTC 2019)
(GPL source distribution)
Java Runtime: Java(TM) SE Runtime Environment
JVM: Java HotSpot(TM) 64-Bit Server VM
@@ -30,4 +30,4 @@
Default Encoding: UTF-8
Language: en
Country: US
---></g></svg>
\ No newline at end of file
+--></g></svg>
diff --git a/docs/concepts/connection-events/index.html b/docs/concepts/connection-events/index.html
index d2835b7..0eb256f 100644
--- a/docs/concepts/connection-events/index.html
+++ b/docs/concepts/connection-events/index.html
@@ -21,19 +21,19 @@
<title>Connection Events :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/connection-events/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/connection-events/" selected>stable (1.0)</option>
@@ -2242,20 +2242,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275523"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275523"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275523"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275523"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275523"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361813"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361813"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361813"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361813"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361813"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275523"></script>
- <script src="/hono/docs/js/learn.js?1571275523"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275523"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361813"></script>
+ <script src="/hono/docs/js/learn.js?1571361813"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361813"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275523" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275523"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361813" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361813"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/concepts/device-identity/index.html b/docs/concepts/device-identity/index.html
index f88d24e..dca4967 100644
--- a/docs/concepts/device-identity/index.html
+++ b/docs/concepts/device-identity/index.html
@@ -21,19 +21,19 @@
<title>Device Identity :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/device-identity/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/device-identity/" selected>stable (1.0)</option>
@@ -1360,21 +1360,22 @@
<h2 id="tenant">Tenant</h2>
-<p>Hono supports the logical partitioning of devices into groups called <em>tenants</em>. Each tenant has a unique identifier, a string called the <em>tenant-id</em>, and can be used to provide a logical grouping of devices belonging e.g. to the same application scope or organizational unit. Each device can thus be uniquely identified by the tuple (<em>tenant-id</em>, <em>device-id</em>). This tuple is broadly used throughout Hono’s APIs when addressing a particular device.</p>
+<p>Hono supports the logical partitioning of devices into groups called <a href="/hono/docs/concepts/tenancy/"><em>tenants</em></a>. Each tenant has a unique identifier, a string called the <em>tenant-id</em>, and can be used to provide a logical grouping of devices belonging e.g. to the same application scope or organizational unit. Each device can thus be uniquely identified by the tuple (<em>tenant-id</em>, <em>device-id</em>). This tuple is broadly used throughout Hono’s APIs when addressing a particular device.</p>
<h2 id="device-registration">Device Registration</h2>
-<p>Hono components use the <a href="/hono/docs/api/device-registration/">Device Registration API</a> to access device registration information. The API defines the mandatory to implement <em>assert Registration</em> operation for verifying a device’s registration status. In addition to that, it defines optional CRUD operations to register, update and remove device registration information. These operations are optional because Hono components do not require them during runtime. From a Hono perspective, it is not important how devices have been registered or how they are managed.</p>
+<p>Hono components use the <a href="/hono/docs/api/device-registration/">Device Registration API</a> to access device registration information. The API defines the <em>assert Registration</em> operation for verifying a device’s registration status.
+In many real world scenarios there will already be a component in place which keeps track of devices and which supports the particular <em>provisioning process</em> being used to bring devices into life. In such cases it makes sense to simply implement the Device Registration API as a <em>facade</em> on top of the existing component.</p>
-<p>In many real world scenarios there will already be a component in place which keeps track of devices and which supports the particular <em>provisioning process</em> being used to bring devices into life. In such cases it makes sense to simply implement the mandatory operation of Hono’s Device Registration API as a <em>facade</em> on top of the existing component.</p>
+<p>In addition to that, Hono defines a <a href="/hono/docs/api/management/">Device Registry Management API</a>, which can be implemented to take advantage of standardized operations for managing devices and credentials. This API is optional because Hono components do not require it during runtime.</p>
-<p>For demonstration purposes, Hono comes with a <a href="/hono/docs/admin-guide/device-registry-config/">simple default implementation</a> of the Device Registration API which keeps all data in memory only. This component implements all mandatory and optional operations but is not supposed to be used in production scenarios.</p>
+<p>For demonstration purposes, Hono comes with a <a href="/hono/docs/admin-guide/device-registry-config/">simple default implementation</a> of both APIs which keeps all data in memory only. Therefore it is not supposed to be used in production scenarios. For the future, it is planned that a production-ready Device Registry will be released as part of Hono that implements both APIs.</p>
<h2 id="device-authentication">Device Authentication</h2>
<p>Devices connect to protocol adapters in order to publish telemetry data or events. Downstream applications consuming this data often take particular actions based on the content of the messages. Such actions may include simply updating some statistics, e.g. tracking the average room temperature, but may also trigger more serious activities like shutting down a power plant. It is therefore important that applications can rely on the fact that the messages they process have in fact been produced by the device indicated by a message’s source address.</p>
-<p>Hono relies on protocol adapters to establish a device’s identity before it is allowed to publish telemetry data or send events. Conceptually, Hono distinguishes between two identities</p>
+<p>Hono relies on protocol adapters to establish a device’s identity before it is allowed to publish downstream data or receive commands. Conceptually, Hono distinguishes between two identities</p>
<ol>
<li>an identity associated with the authentication credentials (termed the <em>authentication identity</em> or <em>auth-id</em>), and</li>
@@ -2256,20 +2257,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275523"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275523"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275523"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275523"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275523"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361813"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361813"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361813"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361813"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361813"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275523"></script>
- <script src="/hono/docs/js/learn.js?1571275523"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275523"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361813"></script>
+ <script src="/hono/docs/js/learn.js?1571361813"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361813"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275523" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275523"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361813" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361813"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/concepts/device-notifications/index.html b/docs/concepts/device-notifications/index.html
index fde1247..480e046 100644
--- a/docs/concepts/device-notifications/index.html
+++ b/docs/concepts/device-notifications/index.html
@@ -21,19 +21,19 @@
<title>Device Notifications :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/device-notifications/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/device-notifications/" selected>stable (1.0)</option>
@@ -1361,17 +1361,15 @@
<h2 id="time-until-disconnect-notification">Time until Disconnect Notification</h2>
-<p><em>Devices</em> and <em>Protocol Adapters</em> can notify an application about the fact that a device is connected and ready to receive one or more commands by means of including a <em>time ‘til disconnect</em> (<em>ttd</em>) property in downstream AMQP 1.0 messages containing data originating from a connected device.</p>
+<p><em>Devices</em> and <em>Protocol Adapters</em> can notify an application about the fact that a device is connected and ready to receive one or more commands by means of including a <em>time ‘til disconnect</em> (<em>ttd</em>) property in telemetry or event messages.</p>
<p>The <em>ttd</em> property value indicates the time that the device will stay connected to the protocol adapter.
-Using this value together with the <em>creation-time</em> of the message, an application can determine whether an attempt to send a command to the device has a reasonable chance of succeeding.</p>
-
-<p>The <em>ttd</em> property can be included in any regular telemetry or event message. However, if a device does not have any telemetry data or event to upload to the adapter, it can also use an <a href="/hono/docs/api/event/#empty-notification">empty notification</a> instead.</p>
+Using this value together with the <em>creation-time</em> of the message, an application can determine whether an attempt to send a command to the device has a reasonable chance of succeeding.
+The <em>ttd</em> property can be included in any regular telemetry or event message. However, if a device does not have any telemetry data or event to upload to the adapter, it can also use an <a href="/hono/docs/api/event/#empty-notification">empty notification</a> instead.</p>
<p>Hono includes utility classes that application developers can use to register a callback to be notified when a device sends a <em>ttd</em> notification.
-See Hono’s example module for details where such a notification callback is used.</p>
-
-<p>Please refer to the <a href="/hono/docs/api/telemetry/">Telemetry API</a> and the <a href="/hono/docs/api/event/">Event API</a> for further details.</p>
+See Hono’s example module for details where such a notification callback is used.
+Please refer to the <a href="/hono/docs/api/telemetry/">Telemetry API</a> and the <a href="/hono/docs/api/event/">Event API</a> for further details.</p>
<p>The following table defines the possible values of the <em>ttd</em> property and their semantics:</p>
@@ -1416,15 +1414,12 @@
<h3 id="source-of-the-ttd-value">Source of the <em>ttd</em> Value</h3>
<p>While it seems to be natural that a device itself indicates when it is ready to receive a command, it may not always be
-possible or desirable to do so.</p>
-
-<p>A device could e.g. be not capable to specify the value for <em>ttd</em> in it’s message, or all devices of a particular setup
-would always use the same value for <em>ttd</em>, so it would not make much sense to provide this value always again.</p>
-
-<p>Additionally different protocols may or may not let a sender set specific values for a message, so a device using a
-specific protocol may not be able to provide a value for the <em>ttd</em> property at all.</p>
-
-<p>For these reasons there are (resp. may be) additional ways of setting the value of <em>ttd</em>:</p>
+possible or desirable to do so.
+A device could e.g. be not capable to specify the value for <em>ttd</em> in it’s message, or all devices of a particular setup
+would always use the same value for <em>ttd</em>, so it would not make much sense to provide this value always again.
+Additionally different protocols may or may not let a sender set specific values for a message, so a device using a
+specific protocol may not be able to provide a value for the <em>ttd</em> property at all.
+For these reasons there are (resp. may be) additional ways of setting the value of <em>ttd</em>:</p>
<ul>
<li>Hono’s Tenant and Device Registration APIs support the inclusion of default values for application-properties in the
@@ -1437,9 +1432,8 @@
<h3 id="hono-s-http-protocol-adapter">Hono’s HTTP protocol adapter</h3>
<p>Hono’s HTTP protocol adapter supports the setting of the <em>ttd</em> value in requests explicitly - please refer to the
-<a href="/hono/docs/user-guide/http-adapter/">HTTP Adapter</a> for details.</p>
-
-<p>Alternatively the default property values for devices from the Device Registry can be used (described above).</p>
+<a href="/hono/docs/user-guide/http-adapter/">HTTP Adapter</a> for details.
+Alternatively the default property values for devices from the Device Registry can be used (described above).</p>
<h3 id="hono-s-mqtt-protocol-adapter">Hono’s MQTT protocol adapter</h3>
@@ -2339,20 +2333,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275523"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275523"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275523"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275523"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275523"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361813"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361813"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361813"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361813"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361813"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275523"></script>
- <script src="/hono/docs/js/learn.js?1571275523"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275523"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361813"></script>
+ <script src="/hono/docs/js/learn.js?1571361813"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361813"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275523" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275523"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361813" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361813"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/concepts/index.html b/docs/concepts/index.html
index b50f787..ae18624 100644
--- a/docs/concepts/index.html
+++ b/docs/concepts/index.html
@@ -21,19 +21,19 @@
<title>Concepts :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/" selected>stable (1.0)</option>
@@ -1332,7 +1332,7 @@
<h1 id="concepts">Concepts</h1>
-<p>Understand the concepts behind Hono™.</p>
+<p>Understand the concepts behind Eclipse Hono™.</p>
<footer class=" footline" >
@@ -2202,20 +2202,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275523"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275523"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275523"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275523"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275523"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361813"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361813"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361813"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361813"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361813"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275523"></script>
- <script src="/hono/docs/js/learn.js?1571275523"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275523"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361813"></script>
+ <script src="/hono/docs/js/learn.js?1571361813"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361813"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275523" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275523"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361813" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361813"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/concepts/resource-limits/index.html b/docs/concepts/resource-limits/index.html
index 563ef9f..160de02 100644
--- a/docs/concepts/resource-limits/index.html
+++ b/docs/concepts/resource-limits/index.html
@@ -21,19 +21,19 @@
<title>Resource limits :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/resource-limits/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/resource-limits/" selected>stable (1.0)</option>
@@ -1355,7 +1355,7 @@
<p>Resource limits such as the maximum number of device connections allowed per tenant or the allowed data volume of the messages over a period of time per tenant can be set in Hono.</p>
-<p>Hono specifies an API <code>ResourceLimitChecks</code> that is used by the protocol adapters for the verification of the configured resource limits. A default implementation of this API is shipped with Hono. This default implementation uses the live metrics data retrieved from a Prometheus server to verify the resource-limits, if configured. To enable and use this default implementation, please refer to the protocol adapter admin guides. Based on the requirements, a custom version of the above API can be implemented and used. The resource-limits for a tenant can be set using the tenant configuration. Please refer to the <a href="/hono/docs/api/tenant/#request-payload">Tenant API</a> for more details.</p>
+<p>Hono specifies an API <code>ResourceLimitChecks</code> that is used by the protocol adapters for the verification of the configured resource limits. A default implementation of this API is shipped with Hono. This default implementation uses the live metrics data retrieved from a Prometheus server to verify the resource-limits, if configured. To enable and use this default implementation, please refer to the protocol adapter admin guides. Based on the requirements, a custom version of the above API can be implemented and used. The resource-limits for a tenant can be set using the tenant configuration. Please refer to the <a href="/hono/docs/api/tenant/#tenant-information-format">Tenant API</a> for more details.</p>
<h2 id="connections-limit">Connections Limit</h2>
@@ -1367,7 +1367,36 @@
<p>Hono supports limiting the number of messages that devices and north bound applications of a tenant can publish to Hono during a given time interval. Before accepting any telemetry or event or command messages from devices or north bound applications, it is checked by the protocol adapters that if the message limit is exceeded or not. The incoming message is discarded if the limit is exceeded.</p>
-<p>The default prometheus based implementation uses data volume as the factor to limit the messages. The data volume already consumed by a tenant over the given time interval is compared with the configured message limit before accepting any messages.</p>
+<p>The default Prometheus based implementation uses data volume as the factor to limit the messages. The data volume already consumed by a tenant over the given time interval is compared with the configured message limit before accepting any messages. The default implementation supports two modes of message limits calculation namely <code>days</code> and <code>monthly</code>. For more details on how to set the mode refer to the <a href="/hono/docs/api/tenant/#data-volume-period-configuration-format">Tenant API</a>.</p>
+
+<p>In the <code>monthly</code> mode, the message limit check ensures that the data usage from the beginning till the end of a (Gregorian) calendar month does not exceed the <em>max-bytes</em> value. But for the first month on which the message limit became effective, the <em>effective max-bytes</em> are calculated based on the <em>max-bytes</em> with respect to the remaining days in that month from the <em>effective-since</em> date.</p>
+
+<p>Below is a sample resource limit configuration for a tenant and it has been defined that the message limit became effective on 10.Jul.2019 and the maximum bytes allowed for a month is 2 GB. It means that from August 2019, the message limit check ensures that the data usage in a month does not exceed 2 GB. But in case of July 2019, the month on which the message limit became effective, the <em>effective max-bytes</em> is calculated by finding the average limit for a day from the <em>max-bytes</em> and multiplying it with the number of days from the <em>effective-since</em> date till the end of that month. In this case it is calculated as <em>(2 GB / 31 days) x 22 days</em> which is 1.4 GB. It means that for the month of July 2019, the data usage should not exceed 1.4GB.</p>
+
+<pre><code class="language-json">"resource-limits": {
+ "data-volume": {
+ "effective-since": "2019-07-10T14:30:00Z",
+ "max-bytes": 2147483648,
+ "period": {
+ "mode": "monthly"
+ }
+ }
+}
+</code></pre>
+
+<p>In the <code>days</code> mode, the message limit check ensures that the data usage for the defined <em>no-of-days</em> does not exceed the <em>max-bytes</em> value. In the below sample configuration, the mode is configured as <code>days</code> and the accounting duration as 30 days. In this case the message limit check ensures that the data usage for every 30 days from 10.Jul.2019 (<code>effective-since</code>) does not exceed the 2GB limit.</p>
+
+<pre><code class="language-json">"resource-limits": {
+ "data-volume": {
+ "effective-since": "2019-07-10T14:30:00Z",
+ "max-bytes": 2147483648,
+ "period": {
+ "mode": "days",
+ "no-of-days": 30
+ }
+ }
+}
+</code></pre>
<footer class=" footline" >
@@ -2240,20 +2269,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275523"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275523"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275523"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275523"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275523"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361813"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361813"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361813"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361813"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361813"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275523"></script>
- <script src="/hono/docs/js/learn.js?1571275523"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275523"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361813"></script>
+ <script src="/hono/docs/js/learn.js?1571361813"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361813"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275523" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275523"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361813" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361813"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/concepts/tenancy/index.html b/docs/concepts/tenancy/index.html
index 34bf5fa..5050247 100644
--- a/docs/concepts/tenancy/index.html
+++ b/docs/concepts/tenancy/index.html
@@ -21,19 +21,19 @@
<title>Multi-Tenancy :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/tenancy/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/tenancy/" selected>stable (1.0)</option>
@@ -1376,28 +1376,24 @@
<h2 id="the-tenant-api">The Tenant API</h2>
-<p>By means of the <a href="/hono/docs/api/tenant/">Tenant API</a> Hono handles tenants as own <em>entities</em>.</p>
-
-<p>The API defines how to <em>retrieve</em> the details of a specific tenant. This offers the possibility to handle arbitrary
-properties on the level of a tenant (see e.g. <a href="#protocol-adapter-configuration">Protocol adapter configuration</a>).</p>
-
-<p>For convenience, there are CRUD operations for the handling of tenants, which can be found in the
+<p>By means of the <a href="/hono/docs/api/tenant/">Tenant API</a> Hono handles tenants as own <em>entities</em>.
+The API defines how to <em>retrieve</em> the details of a specific tenant. This offers the possibility to handle arbitrary
+properties on the level of a tenant (see e.g. <a href="#protocol-adapter-configuration">Protocol adapter configuration</a>).
+For convenience, there are CRUD operations for the handling of tenants, which can be found in the
<a href="/hono/docs/user-guide/device-registry/#managing-tenants">Device Registry</a>.</p>
<h2 id="protocol-adapters-respect-the-tenant-api">Protocol Adapters respect the Tenant API</h2>
<p>When a device connects to one of Hono’s protocol adapters, the adapter determines the tenant this device belongs to.
-How this is done is described in the User Guide.</p>
-
-<p>After the tenant is determined, the adapter retrieves the details of the determined tenant by means of the Tenant API.
+How this is done is described in the User Guide.
+After the tenant is determined, the adapter retrieves the details of the determined tenant by means of the Tenant API.
Only if the tenant exists and is enabled the adapter further processes the data of the device that is connecting. Otherwise
the connection will be closed.</p>
<h2 id="protocol-adapter-configuration">Protocol Adapter Configuration</h2>
-<p>Protocol adapters retrieve parts of their configuration on a tenant level by using the details of the determined tenant.</p>
-
-<p>This includes e.g. if a specific protocol adapter is enabled at all for this tenant, allowing to define tenants with
+<p>Protocol adapters retrieve parts of their configuration on a tenant level by using the details of the determined tenant.
+This includes e.g. if a specific protocol adapter is enabled at all for this tenant, allowing to define tenants with
only a subset of Hono’s functionality. This feature is foreseen to be especially important for production setups.</p>
<p><em>Example</em>: a tenant that</p>
@@ -1407,8 +1403,8 @@
<li>but is not allowed to use the HTTP protocol adapter</li>
</ul>
-<p>Please refer to the <a href="/hono/docs/api/tenant/">Tenant API</a> to find out which protocol adapter properties are
-configurable on a tenant level. The number of such properties may grow during further development of Hono.</p>
+<p>Please refer to the <a href="/hono/docs/api/tenant/">Tenant API</a> to find out which protocol adapter properties
+can be configured at the tenant level.</p>
<h2 id="amqp-1-0-endpoints">AMQP 1.0 Endpoints</h2>
@@ -1430,13 +1426,9 @@
<h2 id="devices-and-tenants">Devices and Tenants</h2>
-<p>All devices of Hono belong to exactly one tenant, so any data is sent in the context of the
-tenant a device belongs to.</p>
-
-<p>It is important here to focus on Hono’s view of a device: it is on a logical level, meaning a device is created in the
-context of a tenant purely by using Hono’s Credentials and Device Registration API.</p>
-
-<p>Usually a physical device will be created in Hono as exactly one logical device, and thus belongs to exactly one tenant.</p>
+<p>A physical device will usually be represented in Hono as an entity in the device registry, having a unique identity
+and belonging to exactly one tenant. All data sent from a device, as well as from the application to the device,
+is therefore treated as belonging to the corresponding tenant.</p>
<p>The following diagram shows the relation between tenants, devices and their credentials:</p>
@@ -1450,18 +1442,17 @@
<h2 id="tenant-based-flow-control">Tenant based Flow Control</h2>
<p>An important detail in Hono’s architecture is that data sent downstream is transported via the tenant
-scoped AMQP 1.0 links from the protocol adapters to the AMQP 1.0 network.</p>
+scoped AMQP 1.0 links from the protocol adapters to the AMQP 1.0 network.
+Each tenant has its own pair of AMQP 1.0 links and is treated
+independently from other tenants regarding the back pressure mechanism that AMQP 1.0 offers.
+This enables a <em>Business application</em> to limit the rate at which it consumes AMQP 1.0 messages per tenant.</p>
-<p>Each tenant has its own pair of AMQP 1.0 links and is treated
-independently from other tenants regarding the back pressure mechanism that AMQP 1.0 offers.</p>
-
-<p>This enables a <em>Business application</em> to limit the rate at which it consumes AMQP 1.0 messages per tenant.</p>
+<p>For the other direction, when commands are sent from the application to the device, the rate is also limited per tenant.</p>
<h2 id="authorization-at-tenant-level">Authorization at Tenant Level</h2>
-<p>Hono’s components authenticate each other by means of the <a href="/hono/docs/api/authentication/">Authentication API</a>.</p>
-
-<p>The returned token for a successful authentication contains authorization information that is addressing the AMQP 1.0
+<p>Hono’s components authenticate each other by means of the <a href="/hono/docs/api/authentication/">Authentication API</a>.
+The returned token for a successful authentication contains authorization information that is addressing the AMQP 1.0
endpoints. Since the endpoints (as outlined above) are scoped to a tenant, this enables to configure tenants that are
authorized to only a subset of Hono’s full functionality.</p>
@@ -1476,22 +1467,21 @@
<h2 id="business-applications-and-tenants">Business Applications and Tenants</h2>
-<p>The northbound <em>Business applications</em> are always connecting to the AMQP 1.0 endpoints of Hono.</p>
-
-<p>By means of the authentication and authorization setup and the fact that the endpoints are scoped to a tenant, the
+<p>The northbound <em>Business applications</em> are always connecting to the AMQP 1.0 endpoints of Hono.
+By means of the authentication and authorization setup and the fact that the endpoints are scoped to a tenant, the
<em>Business application</em> is only acting in the context of one tenant.</p>
<h2 id="separation-of-tenants">Separation of Tenants</h2>
-<p>Tenants are separated from each other in all of Hono’s components.</p>
-
-<p>Here is a summary of how this is implemented:</p>
+<p>Tenants are separated from each other in all of Hono’s components.
+Here is a summary of how this is implemented:</p>
<ul>
<li>the registration of devices are strictly scoped to a tenant</li>
<li>the credentials of devices are strictly scoped to a tenant</li>
<li>protocol adapters can be enabled/disabled for a tenant</li>
<li>the downstream data flow is isolated for every tenant</li>
+<li>the upstream data flow (<a href="/hono/docs/concepts/command-and-control/">Command & Control</a>) is isolated for every tenant</li>
<li><em>Business applications</em> need to authenticate to the AMQP 1.0 network and are by that mechanism scoped to their tenant</li>
</ul>
@@ -2381,20 +2371,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275523"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275523"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275523"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275523"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275523"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361813"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361813"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361813"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361813"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361813"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275523"></script>
- <script src="/hono/docs/js/learn.js?1571275523"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275523"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361813"></script>
+ <script src="/hono/docs/js/learn.js?1571361813"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361813"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275523" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275523"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361813" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361813"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/deployment/create-kubernetes-cluster/index.html b/docs/deployment/create-kubernetes-cluster/index.html
index 8f4d4f7..06c7bbb 100644
--- a/docs/deployment/create-kubernetes-cluster/index.html
+++ b/docs/deployment/create-kubernetes-cluster/index.html
@@ -21,19 +21,19 @@
<title>Setting up a Kubernetes Cluster :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/deployment/create-kubernetes-cluster/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/deployment/create-kubernetes-cluster/" selected>stable (1.0)</option>
@@ -1331,30 +1331,12 @@
<ul>
<li><a href="#setting-up-a-local-development-environment">Setting up a local Development Environment</a></li>
<li><a href="#setting-up-a-production-environment">Setting up a Production Environment</a></li>
-<li><a href="#setting-up-a-cluster-using-azure-kubernetes-service">Setting up a Cluster using Azure Kubernetes Service</a>
+<li><a href="#setting-up-an-environment-on-microsoft-azure">Setting up an Environment on Microsoft Azure</a>
<ul>
-<li><a href="#prepare-environment">Prepare Environment</a>
-<ul>
-<li><a href="#install-azure-cli">Install azure cli</a></li>
-<li><a href="#install-kubectl">Install Kubectl</a></li>
-<li><a href="#log-in-to-azure">Log in to Azure</a></li>
-<li><a href="#create-resource-group-for-hono-deployment">Create Resource Group for Hono Deployment</a></li>
-<li><a href="#create-private-container-registry-on-azure">Create private Container Registry on Azure</a></li>
-<li><a href="#log-in-to-container-registry">Log in to Container Registry</a></li>
-</ul></li>
-<li><a href="#create-azure-kubernetes-service-cluster">Create Azure Kubernetes Service Cluster</a>
-<ul>
-<li><a href="#create-service-principal">Create Service Principal</a></li>
-<li><a href="#create-cluster">Create Cluster</a></li>
-<li><a href="#set-cluster-as-current-context-for-kubectl">Set Cluster as current Context for kubectl</a></li>
-<li><a href="#create-clusterrolebinding-for-kubernetes-dashboard">Create ClusterRoleBinding for Kubernetes dashboard</a></li>
-<li><a href="#deploy-helm-s-tiller-service">Deploy Helm’s Tiller Service</a></li>
-<li><a href="#grant-aks-cluster-access-to-container-registry">Grant AKS Cluster access to Container Registry</a></li>
-<li><a href="#optional-create-retain-storageclass-for-the-device-registry">(Optional) Create retain StorageClass for the Device Registry</a></li>
-</ul></li>
+<li><a href="#prerequisites">Prerequisites</a></li>
+<li><a href="#setup">Setup</a></li>
<li><a href="#monitoring">Monitoring</a></li>
<li><a href="#cleaning-up">Cleaning up</a></li>
-<li><a href="#links">Links</a></li>
</ul></li>
</ul></li>
</ul>
@@ -1376,7 +1358,7 @@
-<p>This guide describes how to set up a Kubernetes cluster which can be used to run Eclipse Hono.</p>
+<p>This guide describes how to set up a Kubernetes cluster which can be used to run Eclipse Hono™.</p>
<p>Hono can be deployed to any Kubernetes cluster running version 1.11 or newer. This includes <a href="https://www.okd.io/">OpenShift (Origin)</a> which is built on top of Kubernetes.</p>
@@ -1386,9 +1368,9 @@
<h2 id="setting-up-a-local-development-environment">Setting up a local Development Environment</h2>
-<p>The easiest option is to set up a single-node cluster running on a local VM using the <a href="https://github.com/kubernetes/minikube">Minikube</a> project.
+<p>The easiest option is to set up a single-node cluster running on a local VM using the <a href="https://minikube.sigs.k8s.io/">Minikube</a> project.
This kind of setup is sufficient for evaluation and development purposes.
-Please refer to Kubernetes’ <a href="https://kubernetes.io/docs/setup/minikube/">Minikube setup guide</a> for instructions on how to set up a cluster locally.</p>
+Please refer to Minikube’s <a href="https://minikube.sigs.k8s.io/docs/start/">getting started guide</a> for instructions on how to set up a cluster locally.</p>
<p>The recommended settings for a Minikube VM used for running Hono’s example setup are as follows:</p>
@@ -1402,12 +1384,15 @@
<pre><code class="language-sh">minikube start --cpus 2 --memory 8192
</code></pre>
-<p>After the Minikube VM has started successfully, the <code>minikube tunnel</code> command should be run in order to support Hono’s services being deployed using the <em>LoadBalancer</em> type. Please refer to the <a href="https://github.com/kubernetes/minikube/blob/master/docs/networking.md#access-to-loadbalancer-services-using-minikube-tunnel">Minikube Networking docs</a> for details.</p>
+<p>After the Minikube VM has started successfully, the <code>minikube tunnel</code> command should be run in order to support Hono’s services being deployed using the <em>LoadBalancer</em> type. Please refer to the <a href="https://minikube.sigs.k8s.io/docs/tasks/loadbalancer/">Minikube Loadbalancer docs</a> for details.</p>
<div class="alert alert-notice">
- <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Supported Kubernetes Versions</h4>
- <div>Minikube will use the most recent Kubernetes version that was available when it has been compiled by default. Hono <em>should</em> run on any version of Kubernetes starting with 1.13.6. However, it has been tested with several specific versions only so if you experience any issues with running Hono on a more recent version, please try to deploy to 1.13.6 before
-raising an issue. You can use Minikube’s <code>--kubernetes-version</code> command line switch to set a particular version.</div>
+ <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Setting Kubernetes Version</h4>
+ <div>Minikube will use the most recent Kubernetes version that was available when it has been compiled by default.
+Hono <em>should</em> run on any version of Kubernetes starting with 1.13.6. However, it has been tested with several
+specific versions only. The most recent version known to work is 1.15.4 so if you experience any issues with
+running Hono on another version, please try to deploy to 1.15.4 before raising an issue.
+You can use Minikube’s <code>--kubernetes-version</code> command line switch to set a particular version.</div>
</div>
@@ -1415,185 +1400,99 @@
<p>Setting up a multi-node Kubernetes cluster is a more advanced topic. Please follow the corresponding links provided in the <a href="https://kubernetes.io/docs/setup/#production-environment">Kubernetes documentation</a>.</p>
-<h2 id="setting-up-a-cluster-using-azure-kubernetes-service">Setting up a Cluster using Azure Kubernetes Service</h2>
+<h2 id="setting-up-an-environment-on-microsoft-azure">Setting up an Environment on Microsoft Azure</h2>
-<p>The following sections provide step-by-step instructions for setting up a Kubernetes cluster on Microsoft Azure that can be used to run Hono.</p>
+<p>This chapter describes how Hono can be deployed on Microsoft Azure. It includes:</p>
-<h3 id="prepare-environment">Prepare Environment</h3>
+<ul>
+<li><a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-overview">Azure Resource Manager (ARM)</a> templates for an automated infrastructure deployment.</li>
+<li>Hono deployment into <a href="https://docs.microsoft.com/en-us/azure/aks/intro-kubernetes">Azure Kubernetes Service (AKS)</a>.</li>
+<li>Push Hono docker images to an <a href="https://azure.microsoft.com/en-us/services/container-registry/">Azure Container Registry (ACR)</a>.</li>
+<li>Optional <a href="https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview">Azure Service Bus</a> as broker for the <a href="https://www.eclipse.org/hono/docs/architecture/component-view/component-view/#amqp-1-0-messaging-network">Hono AMQP 1.0 Messaging Network</a> instead of a self hosted ActiveMQ Artemis.</li>
+<li><a href="https://docs.microsoft.com/en-us/azure/virtual-network/virtual-network-service-endpoints-overview">Virtual Network (VNet) service endpoints</a> ensure protected communication between AKS and Azure Service Bus.</li>
+</ul>
-<p>At this step we expect you have clean Ubuntu VM or PC (tested on Ubuntu 18.04.2 LTS (GNU/Linux 4.18.0-1013-azure x86_64))</p>
+<!--more-->
-<h4 id="install-azure-cli">Install azure cli</h4>
+<div class="alert alert-warning">
+ <h4 class="alert-heading"><i class="fas fa-exclamation-triangle"></i> Use for demos only</h4>
+ <div>This deployment model is not meant for productive use but rather for evaluation as well as demonstration purposes or as a baseline to evolve a production grade <a href="https://docs.microsoft.com/en-us/azure/architecture/guide/">Application architecture</a> out of it which includes Hono.</div>
+</div>
-<pre><code class="language-sh">sudo apt-get update
-sudo apt-get install curl apt-transport-https lsb-release gpg
-curl -sL https://packages.microsoft.com/keys/microsoft.asc | \
- gpg --dearmor | \
- sudo tee /etc/apt/trusted.gpg.d/microsoft.asc.gpg > /dev/null
+<h3 id="prerequisites">Prerequisites</h3>
-AZ_REPO=$(lsb_release -cs)
-echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | \
- sudo tee /etc/apt/sources.list.d/azure-cli.list
+<ul>
+<li>An <a href="https://azure.microsoft.com/en-us/get-started/">Azure subscription</a>.</li>
+<li><a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli">Azure CLI</a> installed to setup the infrastructure.</li>
+<li><a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/">kubectl</a> and <a href="https://helm.sh/docs/using_helm/#installing-helm">helm</a> installed to deploy Hono into <a href="https://docs.microsoft.com/en-us/azure/aks/intro-kubernetes">Azure Kubernetes Service (AKS)</a>.</li>
+</ul>
-sudo apt-get update
-sudo apt-get install azure-cli
+<h3 id="setup">Setup</h3>
+
+<p>As described <a href="https://docs.microsoft.com/en-gb/azure/aks/kubernetes-service-principal">here</a> we will create an explicit service principal. Later we add roles to this principal to access the <a href="https://docs.microsoft.com/en-us/azure/container-registry/container-registry-intro">Azure Container Registry (ACR)</a>.</p>
+
+<pre><code class="language-bash"># Resource group where the ACR is deployed.
+acr_resourcegroupname={YOUR_ACR_RG}
+# Name of your ACR.
+acr_registry_name={YOUR_ACR_NAME}
+# Full name of the ACR.
+acr_login_server=$acr_registry_name.azurecr.io
+
+# Create service principal
+service_principal=`az ad sp create-for-rbac --name http://honoServicePrincipal --skip-assignment --output tsv`
+app_id_principal=`echo $service_principal|cut -f1 -d ' '`
+password_principal=`echo $service_principal|cut -f4 -d ' '`
+object_id_principal=`az ad sp show --id $app_id_principal --query objectId --output tsv`
+acr_id_access_registry=`az acr show --resource-group $acr_resourcegroupname --name $acr_registry_name --query "id" --output tsv`
</code></pre>
-<h4 id="install-kubectl">Install Kubectl</h4>
+<p>Note: it might take a few seconds until the principal is available for the next steps.</p>
-<p>The kubectl tool is used to manage a Kubernetes cluster from the command line.
-Follow the <a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/">installation guide</a> in order to set up <code>kubectl</code> on your local machine.</p>
+<pre><code class="language-bash">az role assignment create --assignee $app_id_principal --scope $acr_id_access_registry --role Reader
-<h4 id="log-in-to-azure">Log in to Azure</h4>
-
-<p>Type</p>
-
-<pre><code class="language-sh">az login
+resourcegroup_name=hono
+az group create --name $resourcegroup_name --location "westeurope"
</code></pre>
-<p>and follow instructions on screen.</p>
+<p>With the next command we will use the provided <a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-overview">Azure Resource Manager (ARM)</a> templates to setup the AKS cluster. This might take a while.</p>
-<p>A result of successful log in will be a JSON output with subscription details. Run the following command, using the subscription <em>id</em> from the JSON structure:</p>
-
-<pre><code class="language-sh">az account set -s "{YOUR SUBSCRIPTION ID}"
+<pre><code class="language-bash">unique_solution_prefix=myprefix
+cd deploy/src/main/deploy/azure/
+az group deployment create --name HonoBasicInfrastructure --resource-group $resourcegroup_name --template-file arm/honoInfrastructureDeployment.json --parameters uniqueSolutionPrefix=$unique_solution_prefix servicePrincipalObjectId=$object_id_principal servicePrincipalClientId=$app_id_principal servicePrincipalClientSecret=$password_principal
</code></pre>
-<p>Before we continue, let’s setup some variables, that will be used to create resources on Azure:</p>
+<p>Note: add the following parameter in case you want to opt for the Azure Service Bus as broker in the <a href="https://www.eclipse.org/hono/docs/architecture/component-view/component-view/#amqp-1-0-messaging-network">Hono AMQP 1.0 Messaging Network</a> instead of deploying a (self-hosted) ActiveMQ Artemis into AKS: <em>serviceBus=true</em></p>
-<pre><code class="language-sh"># Name of your Resource Group, where all services will be deployed
-AKS_RESOURCE_GROUP={YOUR-RG-NAME}
-# Name of your AKS cluster
-AKS_CLUSTER_NAME={YOUR-AKS-NAME}
-# Name of your private container registry (should match ^[a-zA-Z0-9]*$)
-ACR_NAME={YOUR-ACR-NAME}
+<p>After the deployment is complete you can set your cluster in <em>kubectl</em>.</p>
+
+<pre><code class="language-bash">az aks get-credentials --resource-group $resourcegroup_name --name $aks_cluster_name
</code></pre>
-<h4 id="create-resource-group-for-hono-deployment">Create Resource Group for Hono Deployment</h4>
+<p>Next deploy helm on to the AKS cluster as well create retain storage for the device registry. It will take a moment until tiller is booted up.</p>
-<pre><code class="language-sh">az group create --name $AKS_RESOURCE_GROUP --location westeurope
-</code></pre>
-
-<h4 id="create-private-container-registry-on-azure">Create private Container Registry on Azure</h4>
-
-<pre><code class="language-sh">az acr create --resource-group $AKS_RESOURCE_GROUP --name $ACR_NAME --sku Basic
-</code></pre>
-
-<p>The full name of the private container registry will be <code>$ACR_NAME.azurecr.io</code>. This name needs to be used with the <code>docker push</code> command when pushing container images to the registry.</p>
-
-<h4 id="log-in-to-container-registry">Log in to Container Registry</h4>
-
-<pre><code class="language-sh">sudo az acr login --name $ACR_NAME
-</code></pre>
-
-<h3 id="create-azure-kubernetes-service-cluster">Create Azure Kubernetes Service Cluster</h3>
-
-<p>Now it’s time to create the AKS cluster.</p>
-
-<h4 id="create-service-principal">Create Service Principal</h4>
-
-<pre><code class="language-sh">az ad sp create-for-rbac --skip-assignment
-</code></pre>
-
-<p>If successful, <em>appId</em> and <em>password</em> will be displayed.</p>
-
-<h4 id="create-cluster">Create Cluster</h4>
-
-<pre><code class="language-sh"># It is recommended to use kubernetes 1.12.5 or higher
-# To list available versions run:
-# az aks get-versions --location westeurope --output table
-
-az aks create --name $AKS_CLUSTER_NAME --resource-group $AKS_RESOURCE_GROUP --node-count 3 --generate-ssh-keys --service-principal "{appId}" --client-secret "{password}" --enable-addons monitoring --kubernetes-version 1.13.5
-</code></pre>
-
-<h4 id="set-cluster-as-current-context-for-kubectl">Set Cluster as current Context for kubectl</h4>
-
-<pre><code class="language-sh">az aks get-credentials --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME
-</code></pre>
-
-<h4 id="create-clusterrolebinding-for-kubernetes-dashboard">Create ClusterRoleBinding for Kubernetes dashboard</h4>
-
-<pre><code class="language-sh"># By default, AKS is deployed with RBAC enabled. Refer to this doc: https://docs.microsoft.com/en-us/azure/aks/kubernetes-dashboard
-
-kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
-</code></pre>
-
-<h4 id="deploy-helm-s-tiller-service">Deploy Helm’s Tiller Service</h4>
-
-<pre><code class="language-sh">kubectl create serviceaccount --namespace kube-system tiller
-kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
-
+<pre><code class="language-bash">kubectl apply -f helm-rbac.yaml
helm init --service-account tiller
+kubectl apply -f managed-premium-retain.yaml
</code></pre>
-<h4 id="grant-aks-cluster-access-to-container-registry">Grant AKS Cluster access to Container Registry</h4>
-
-<pre><code class="language-sh"># Get the id of the service principal configured for AKS
-CLIENT_ID=$(az aks show --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query "servicePrincipalProfile.clientId" --output tsv)
-
-# Get the ACR registry resource id
-ACR_ID=$(az acr show --name $ACR_NAME --resource-group $AKS_RESOURCE_GROUP --query "id" --output tsv)
-
-# Create role assignment
-az role assignment create --assignee $CLIENT_ID --role acrpull --scope $ACR_ID
-</code></pre>
-
-<h4 id="optional-create-retain-storageclass-for-the-device-registry">(Optional) Create retain StorageClass for the Device Registry</h4>
-
-<p>With the <a href="https://docs.microsoft.com/en-us/azure/aks/concepts-storage">reclaim policy retain</a> AKS ensures that your storage persists even through Hono redeployments.</p>
-
-<p>Create a file <code>managed-premium-retain.yaml</code> with the following content.</p>
-
-<pre><code class="language-yaml">kind: StorageClass
-apiVersion: storage.k8s.io/v1
-metadata:
- name: managed-premium-retain
-provisioner: kubernetes.io/azure-disk
-reclaimPolicy: Retain
-parameters:
- storageaccounttype: Premium_LRS
- kind: Managed
-</code></pre>
-
-<p>Now apply to your AKS cluster:</p>
-
-<pre><code class="language-shell">kubectl apply -f managed-premium-retain.yaml
-</code></pre>
-
-<p>Note: in your helm deployment later you have to set the value <code>deviceRegistry.storageClass=managed-premium-retain</code>.</p>
+<p>Now wait until the Azure deployment is complete and then continue with the <a href="helm-based-deployment/">Helm deployment</a> of Hono itself.</p>
<h3 id="monitoring">Monitoring</h3>
-<p>You can monitor your cluster using Azure Monitor Insights.</p>
+<p>You can monitor your cluster using <a href="https://docs.microsoft.com/en-us/azure/azure-monitor/insights/container-insights-overview">Azure Monitor for containers</a>.</p>
<p>Navigate to <a href="https://portal.azure.com">https://portal.azure.com</a> -> your resource group -> your kubernetes cluster</p>
<p>On an overview tab you fill find an information about your cluster (status, location, version, etc.). Also, here you will find a “Monitor Containers” link. Navigate to “Monitor Containers” and explore metrics and statuses of your Cluster, Nodes, Controllers and Containers.</p>
-<p>Another option is to use the kubernetes dashboard. To do this, run:</p>
-
-<pre><code class="language-sh">az aks browse --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME
-</code></pre>
-
-<p>This will create a port forward for Kubernetes’ dashboard on your local port 8001.
-Open <a href="http://127.0.0.1:8001">http://127.0.0.1:8001</a> in your browser and select <em>Namespace</em> <code>hono</code>, check status of your services, pods, etc.</p>
-
<h3 id="cleaning-up">Cleaning up</h3>
-<p>Use the following command to delete all created resources (incl. the Kubernetes cluster and the private container registry)
-once they are no longer needed:</p>
+<p>Use the following command to delete all created resources once they are no longer needed:</p>
-<pre><code class="language-sh">az group delete --name $AKS_RESOURCE_GROUP --yes --no-wait
+<pre><code class="language-sh">az group delete --name $resourcegroup_name --yes --no-wait
</code></pre>
-<h3 id="links">Links</h3>
-
-<ul>
-<li><a href="https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest">Azure CLI</a></li>
-<li><a href="https://docs.microsoft.com/en-us/azure/aks/">Azure Kubernetes Service</a></li>
-<li><a href="https://docs.microsoft.com/en-us/azure/container-registry/">Azure Container Registry</a></li>
-</ul>
-
<footer class=" footline" >
</footer>
@@ -2467,20 +2366,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/deployment/helm-based-deployment/index.html b/docs/deployment/helm-based-deployment/index.html
index 81d26c2..6156001 100644
--- a/docs/deployment/helm-based-deployment/index.html
+++ b/docs/deployment/helm-based-deployment/index.html
@@ -21,19 +21,19 @@
<title>Helm based Deployment :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/deployment/helm-based-deployment/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/deployment/helm-based-deployment/" selected>stable (1.0)</option>
@@ -1347,14 +1347,20 @@
<li><a href="#verifying-the-installation">Verifying the Installation</a></li>
<li><a href="#accessing-the-grafana-dashboard">Accessing the Grafana Dashboard</a></li>
<li><a href="#undeploying-hono">Undeploying Hono</a></li>
+<li><a href="#using-a-production-grade-amqp-messaging-network-and-device-registry">Using a production grade AMQP Messaging Network and Device Registry</a>
+<ul>
+<li><a href="#integrating-with-an-existing-amqp-messaging-network">Integrating with an existing AMQP Messaging Network</a></li>
+<li><a href="#integrating-with-a-custom-device-registry">Integrating with a custom Device Registry</a></li>
+</ul></li>
+<li><a href="#using-the-device-connection-service">Using the Device Connection Service</a></li>
+<li><a href="#deploying-optional-adapters">Deploying optional Adapters</a></li>
<li><a href="#deploying-custom-container-images">Deploying custom Container Images</a>
<ul>
<li><a href="#deploying-via-a-private-registry">Deploying via a private Registry</a></li>
<li><a href="#deploying-to-minikube">Deploying to Minikube</a></li>
-</ul></li>
-<li><a href="#using-the-device-connection-service">Using the Device Connection Service</a></li>
+<li><a href="#deploying-to-azure-kubernetes-service-aks">Deploying to Azure Kubernetes Service (AKS)</a></li>
<li><a href="#using-jaeger-tracing">Using Jaeger Tracing</a></li>
-<li><a href="#deploying-optional-adapters">Deploying optional Adapters</a></li>
+</ul></li>
</ul></li>
</ul>
</nav>
@@ -1391,6 +1397,14 @@
<p>The most basic requirement is, of course, a Kubernetes cluster to deploy to.
The <a href="/hono/docs/deployment/create-kubernetes-cluster/">Kubernetes setup guide</a> describes options available for setting up a cluster.</p>
+<div class="alert alert-notice">
+ <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Supported Kubernetes Versions</h4>
+ <div>Hono <em>should</em> run on any version of Kubernetes starting with 1.13.6. However, it has been tested with several
+specific versions only. The most recent version known to work is 1.15.4 so if you experience any issues with
+running Hono on another version, please try to deploy to 1.15.4 before raising an issue.</div>
+</div>
+
+
<h4 id="helm">Helm</h4>
<p>Helm is a tool for managing (complex) Kubernetes applications. In this guide it is used to deploy Hono to the cluster.
@@ -1405,7 +1419,7 @@
<p>The Helm chart is contained in the Hono archive that is available from <a href="https://www.eclipse.org/hono/downloads/
">Hono’s download page</a>.
-After the archive has been extracted, the chart can be found in the <code>eclipse-hono-$VERSION/deploy/helm/eclipse-hono</code> folder.</p>
+After the archive has been extracted, the chart can be found in the <code>eclipse-hono-$VERSION/eclipse-hono</code> folder.</p>
<h4 id="hono-command-line-client">Hono Command Line Client</h4>
@@ -1417,7 +1431,7 @@
<p>The recommended way of deploying Hono is by means of using Helm’s <em>Tiller</em> service running on the Kubernetes cluster:</p>
-<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION/deploy/helm
+<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION
helm install --dep-up --name hono --namespace hono eclipse-hono/
</code></pre>
@@ -1430,24 +1444,48 @@
helm get hono
</code></pre>
+<div class="alert alert-notice">
+ <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Kubernetes 1.16</h4>
+ <div>Hono can not be deployed to Kubernetes 1.16 using Helm because current versions (< 2.15) of Helm <a href="https://github.com/helm/helm/issues/6374">don’t support installation of
+the Tiller component to Kubernetes 1.16</a>.
+Until that problem is fixed in Helm, the workaround is to either deploy to an earlier version of Kubernetes or deploy using
+the <em>kubectl</em> command as described in the next section.</div>
+</div>
+
+
<h3 id="deploying-hono-using-kubectl">Deploying Hono using kubectl</h3>
<p>In cases where installation of Helm’s Tiller service into the cluster is not an option, the Kubernetes resource descriptors created by Helm can be deployed manually using the <code>kubectl</code> command line tool.</p>
<p>The following commands generate the resource descriptors:</p>
-<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION/deploy/
-helm dep update helm/
-helm template --name hono --namespace hono --output-dir . helm/
+<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION
+mkdir resources
+helm dep update eclipse-hono/
+helm template --name hono --namespace hono --output-dir resources eclipse-hono/
</code></pre>
-<p>This will create an <code>eclipse-hono</code> folder containing all the resource descriptors which can then be deployed to the cluster using <code>kubectl</code>:</p>
+<div class="alert alert-notice">
+ <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Kubernetes 1.16</h4>
+ <div><p>Hono can currently only be deployed to Kubernetes 1.16 if Prometheus and Grafana are disabled.
+This is due to a <a href="https://github.com/helm/charts/pull/17268">bug</a> in the Prometheus Helm chart which is used to deploy
+Prometheus as part of Hono’ example deployment.
+Until the bug is fixed, the workaround is to disable deployment of Prometheus and Grafana by setting the following
+configuration properties when creating the resource descriptors:</p>
-<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION/deploy/
+<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION
+helm template --name hono --namespace hono --set prometheus.createInstance=false --set grafana.enabled=false --output-dir resources eclipse-hono/
+</code></pre>
+</div>
+</div>
+
+
+<p>This will create a <code>resources/eclipse-hono</code> folder containing all the resource descriptors which can then be deployed to the cluster using <code>kubectl</code>:</p>
+
+<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION
kubectl create namespace hono
kubectl config set-context $(kubectl config current-context) --namespace=hono
-find . -path "./eclipse-hono/*" -name crd*.yaml -exec kubectl apply -f {} \;
-kubectl apply -f ./eclipse-hono -R
+kubectl apply -f ./resources -R
</code></pre>
<h2 id="verifying-the-installation">Verifying the Installation</h2>
@@ -1476,7 +1514,7 @@
hono-service-device-registry-headless ClusterIP None <none> <none>
</code></pre>
-<p>The listing above has been retrieved from a Minikube cluster that emulates a load balancer via the <code>minikube tunnel</code> command (refer to the <a href="https://github.com/kubernetes/minikube/blob/master/docs/networking.md#loadbalancer-emulation-minikube-tunnel">Minikube Networking docs</a> for details).
+<p>The listing above has been retrieved from a Minikube cluster that emulates a load balancer via the <code>minikube tunnel</code> command (refer to the <a href="https://minikube.sigs.k8s.io/docs/tasks/loadbalancer/">Minikube docs</a> for details).
The service endpoints can be accessed at the <em>EXTERNAL-IP</em> addresses and corresponding <em>PORT(S)</em>, e.g. 8080 for the HTTP adapter (<em>hono-adapter-http-vertx</em>) and 28080 for the device registry (<em>hono-service-device-registry</em>).</p>
<p>The following command assigns the IP address of the device registry service to the <code>REGISTRY_IP</code> environment variable so that they can easily be used from the command line:</p>
@@ -1504,7 +1542,7 @@
<pre><code class="language-sh">kubectl port-forward service/hono-grafana 3000 -n hono
</code></pre>
-<p>Then the dashboard can be opened by pointing a browser to <a href="http://localhost:3000">http://localhost:3000</a> using credentials <code>admin:admin</code>.</p>
+<p>Then the dashboard can be opened by pointing your browser to <code>http://localhost:3000</code> using credentials <code>admin:admin</code>.</p>
<h2 id="undeploying-hono">Undeploying Hono</h2>
@@ -1515,8 +1553,191 @@
<p>A Hono instance that has been deployed manually using the resource files can be undeployed by running</p>
-<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION/deploy/
-kubectl delete -f ./eclipse-hono -R
+<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION
+kubectl delete -f ./resources -R
+</code></pre>
+
+<h2 id="using-a-production-grade-amqp-messaging-network-and-device-registry">Using a production grade AMQP Messaging Network and Device Registry</h2>
+
+<p>The Helm chart by default deploys the example Device Registry that comes with Hono. The example registry provides implementations
+of the Tenant, Device Registration, Credentials and Device Connection APIs which can be used for example/demo purposes.</p>
+
+<p>The chart also deploys an example AMQP Messaging Network consisting of a single Apache Qpid Dispatch Router and a single
+Apache ActiveMQ Artemis broker.</p>
+
+<p>The protocol adapters are configured to connect to the example messaging network and registry by default.</p>
+
+<p>In a production environment, though, usage of the example registry and messaging network is strongly discouraged and more
+sophisticated (custom) implementations of the service APIs should be used.</p>
+
+<p>The Helm chart supports configuration of the protocol adapters to connect to other service implementations than the example registry
+and messaging network as described in the following sections.</p>
+
+<h3 id="integrating-with-an-existing-amqp-messaging-network">Integrating with an existing AMQP Messaging Network</h3>
+
+<p>The Helm chart can be configured to use an existing AMQP Messaging Network implementation instead of the example implementation.
+In order to do so, the protocol adapters need to be configured with information about the AMQP Messaging Network’s endpoint address
+and connection parameters.</p>
+
+<p>The easiest way to set these properties is by means of putting them into a YAML file with content like this:</p>
+
+<pre><code class="language-yaml"># do not deploy example AMQP Messaging Network
+amqpMessagingNetworkExample:
+ enabled: false
+
+adapters:
+
+ # mount (existing) Kubernetes secret which contains
+ # credentials for connecting to AMQP network
+ extraSecretMounts:
+ - amqpNetwork:
+ secretName: "my-secret"
+ mountPath: "/etc/custom"
+
+ # provide connection params
+ # assuming that "my-secret" contains an "amqp-credenials.properties" file
+ amqpMessagingNetworkSpec:
+ host: my-custom.amqp-network.org
+ port: 5672
+ credentialsPath: "/etc/custom/amqp-credentials.properties"
+ commandAndControlSpec:
+ host: my-custom.amqp-network.org
+ port: 5672
+ credentialsPath: "/etc/custom/amqp-credentials.properties"
+</code></pre>
+
+<p>Both the <em>amqpMessagingNetworkSpec</em> and the <em>commandAndControlSpec</em> need to contain Hono client configuration properties
+as described in the <a href="/hono/docs/admin-guide/hono-client-configuration/">client admin guide</a>.
+Make sure to adapt/add properties as required by the AMQP Messaging Network.</p>
+
+<p>Note that <em>my-secret</em> is expected to already exist in the namespace that Hono gets deployed to, i.e. the Helm chart will <strong>not</strong>
+create this secret.</p>
+
+<p>Assuming that the file is named <code>customAmqpNetwork.yaml</code>, the values can then be passed in to the <code>helm install</code> command
+as follows:</p>
+
+<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION
+helm install --dep-up --name hono --namespace hono -f customAmqpNetwork.yaml eclipse-hono/
+</code></pre>
+
+<h3 id="integrating-with-a-custom-device-registry">Integrating with a custom Device Registry</h3>
+
+<p>The Helm chart can be configured to use existing implementations of the Tenant, Device Registration, Credentials and Device Connection APIs
+instead of the example device registry.
+In order to do so, the protocol adapters need to be configured with information about the service endpoints and connection parameters.</p>
+
+<p>The easiest way to set these properties is by means of putting them into a YAML file with the following content:</p>
+
+<pre><code class="language-yaml"># do not deploy example Device Registry
+deviceRegistryExample:
+ enabled: false
+
+adapters:
+
+ # mount (existing) Kubernetes secret which contains
+ # credentials for connecting to services
+ extraSecretMounts:
+ - customRegistry:
+ secretName: "my-secret"
+ mountPath: "/etc/custom"
+
+ # provide connection params
+ # assuming that "my-secret" contains credentials files
+ tenantSpec:
+ host: my-custom.registry.org
+ port: 5672
+ credentialsPath: "/etc/custom/tenant-service-credentials.properties"
+ deviceRegistrationSpec:
+ host: my-custom.registry.org
+ port: 5672
+ credentialsPath: "/etc/custom/registration-service-credentials.properties"
+ credentialsSpec:
+ host: my-custom.registry.org
+ port: 5672
+ credentialsPath: "/etc/custom/credentials-service-credentials.properties"
+ deviceConnectionSpec:
+ host: my-custom.registry.org
+ port: 5672
+ credentialsPath: "/etc/custom/device-connection-service-credentials.properties"
+</code></pre>
+
+<p>All of the <em>specs</em> need to contain Hono client configuration properties
+as described in the <a href="/hono/docs/admin-guide/hono-client-configuration/">client admin guide</a>.
+Make sure to adapt/add properties as required by the custom service implementations.
+The information contained in the <em>specs</em> will then be used by all protocol adapters that get deployed.
+As a consequence, it is not possible to use credentials for the services which are specific to the
+individual protocol adapters.</p>
+
+<p>Note that <em>my-secret</em> is expected to already exist in the namespace that Hono gets deployed to, i.e. the Helm chart will <strong>not</strong>
+create this secret.</p>
+
+<p>Assuming that the file is named <code>customRegistry.yaml</code>, the values can then be passed in to the <code>helm install</code> command
+as follows:</p>
+
+<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION
+helm install --dep-up --name hono --namespace hono -f customRegistry.yaml eclipse-hono/
+</code></pre>
+
+<h2 id="using-the-device-connection-service">Using the Device Connection Service</h2>
+
+<p>Hono’s example Device Registry component contains a simple in-memory implementation of the <a href="/hono/docs/api/device-connection/">Device Connection API</a>.
+This example implementation is used by default when the example registry is deployed.</p>
+
+<p>Hono also contains a production ready, data grid based implementation of the Device Connection API which can be deployed and used instead of
+the example implementation. The component can be deployed by means of setting the <em>deviceConnectionService.enabled</em> property to <code>true</code> when
+running Helm:</p>
+
+<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION
+helm install --dep-up --name hono --namespace hono --set deviceConnectionService.enabled=true eclipse-hono/
+</code></pre>
+
+<p>This will deploy the Device Connection service and configure all protocol adapters to use it instead of the example Device Registry implementation.
+However, the service requires a connection to a data grid in order to store the device connection data.
+The Helm chart supports deployment of a simple data grid which can be used for experimenting by means of setting the
+<em>dataGridDeployExample</em> property to <code>true</code> when running Helm:</p>
+
+<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION
+helm install --dep-up --name hono --namespace hono --set deviceConnectionService.enabled=true --set dataGridExample.enabled=true eclipse-hono/
+</code></pre>
+
+<p>This will deploy the data grid and configure the Device Connection service to use it for storing the connection data.</p>
+
+<p>The Device Connection service can also be configured to connect to an already existing data grid. Please refer to the
+<a href="/hono/docs/admin-guide/device-connection-config/">admin guide</a> for details regarding the corresponding configuration properties.</p>
+
+<h2 id="deploying-optional-adapters">Deploying optional Adapters</h2>
+
+<p>The Helm chart supports deployment of additional protocol adapters which are still considered experimental or have been deprecated.
+The following table provides an overview of the corresponding configuration properties that need to be set on deployment.</p>
+
+<table>
+<thead>
+<tr>
+<th align="left">Property</th>
+<th align="left">Default</th>
+<th align="left">Description</th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td align="left"><em>adapters.lora.enabled</em></td>
+<td align="left"><code>false</code></td>
+<td align="left">Indicates if the (experimental) LoRa WAN protocol adapter should be deployed.</td>
+</tr>
+
+<tr>
+<td align="left"><em>adapters.kura.enabled</em></td>
+<td align="left"><code>false</code></td>
+<td align="left">Indicates if the deprecated Kura protocol adapter should be deployed.</td>
+</tr>
+</tbody>
+</table>
+
+<p>The following command will deploy the LoRa adapter along with Hono’s standard adapters:</p>
+
+<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION
+helm install --dep-up --name hono --namespace hono --set adapters.lora.enabled=true eclipse-hono/
</code></pre>
<h2 id="deploying-custom-container-images">Deploying custom Container Images</h2>
@@ -1575,47 +1796,121 @@
helm install --dep-up --name hono --namespace hono target/deploy/helm/eclipse-hono/
</code></pre>
-<h2 id="using-the-device-connection-service">Using the Device Connection Service</h2>
+<h3 id="deploying-to-azure-kubernetes-service-aks">Deploying to Azure Kubernetes Service (AKS)</h3>
-<p>Hono’s example Device Registry component contains a simple in-memory implementation of the <a href="/hono/docs/api/device-connection/">Device Connection API</a>.
-This example implementation is used by default when the example registry is deployed.</p>
+<p>The following chapter describes how to use Azure Kubernetes Service (AKS) as a deployment target that has been set up as described in the <a href="create-kubernetes-cluster">Setting up a Kubernetes Cluster guide</a>.</p>
-<p>Hono also contains a production ready, data grid based implementation of the Device Connection API which can be deployed and used instead of
-the example implementation. The component can be deployed by means of setting the <em>deviceConnectionService.enabled</em> property to <code>true</code> when
-running Helm:</p>
+<p>First we build the docker images and push them into the ACR. Note that if you define a custom image tag you have to provide the helm with the image tags as described in the chapters above.</p>
-<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION/deploy/
-helm install --dep-up --name hono --namespace hono --set deviceConnectionService.enabled=true helm/eclipse-hono/
+<pre><code class="language-bash"># Resource group where the ACR is deployed.
+acr_resourcegroupname={YOUR_ACR_RG}
+# Name of your ACR.
+acr_registry_name={YOUR_ACR_NAME}
+# Full name of the ACR.
+acr_login_server=$acr_registry_name.azurecr.io
+# Authenticate your docker daemon with the ACR.
+az acr login --name $ACR_NAME
+# Build images.
+cd hono
+mvn install -Pbuild-docker-image -Ddocker.registry=$acr_login_server
+# Push images to ACR.
+./push_hono_images.sh 1.0.0-SNAPSHOT $acr_login_server
</code></pre>
-<p>This will deploy the Device Connection service and configure all protocol adapters to use it instead of the example Device Registry implementation.
-However, the service requires a connection to a data grid in order to store the device connection data.
-The Helm chart supports deployment of a simple data grid which can be used for experimenting by means of setting the
-<em>dataGridDeployExample</em> property to <code>true</code> when running Helm:</p>
+<p>Now we can retrieve settings from the deployment for the following steps:</p>
-<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION/deploy/
-helm install --dep-up --name hono --namespace hono --set deviceConnectionService.enabled=true --set dataGridDeployExample=true helm/eclipse-hono/
+<pre><code class="language-bash"># Resource group of the AKS deployment
+resourcegroup_name=hono
+
+aks_cluster_name=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.aksClusterName.value -o tsv`
+http_ip_address=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.httpPublicIPAddress.value -o tsv`
+amqp_ip_address=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.amqpPublicIPAddress.value -o tsv`
+mqtt_ip_address=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.mqttPublicIPAddress.value -o tsv`
+registry_ip_address=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.registryPublicIPAddress.value -o tsv`
+network_ip_address=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.networkPublicIPAddress.value -o tsv`
</code></pre>
-<p>This will deploy the data grid and configure the Device Connection service to use it for storing the connection data.</p>
+<p>Note: add the following lines in case you opted for the Azure Service Bus variant:</p>
-<p>The Device Connection service can also be configured to connect to an already existing data grid. Please refer to the
-<a href="/hono/docs/admin-guide/device-connection-config/">admin guide</a> for details regarding the corresponding configuration properties.</p>
+<pre><code class="language-bash">service_bus_namespace=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.serviceBusNamespaceName.value -o tsv`
+service_bus_key_name=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.serviceBusKeyName.value -o tsv`
+service_bus_key=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.serviceBusKey.value -o tsv`
+</code></pre>
-<h2 id="using-jaeger-tracing">Using Jaeger Tracing</h2>
+<p>Next we prepare the k8s environment:</p>
+
+<pre><code class="language-bash">k8s_namespace=honons
+kubectl create namespace $k8s_namespace
+</code></pre>
+
+<p>Finally install Hono. Leveraging the <em>managed-premium-retain</em> storage in combination with <em>deviceRegistry.resetFiles=false</em> parameter is optional but ensures that Device registry storage will retain future update deployments.</p>
+
+<pre><code class="language-bash"># in Hono working tree directory: hono/deploy
+helm install target/deploy/helm/eclipse-hono/ \
+ --dep-up \
+ --name hono \
+ --namespace $k8s_namespace \
+ --set adapters.mqtt.svc.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"=$resourcegroup_name \
+ --set adapters.http.svc.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"=$resourcegroup_name \
+ --set adapters.amqp.svc.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"=$resourcegroup_name \
+ --set deviceRegistryExample.svc.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"=$resourcegroup_name \
+ --set amqpMessagingNetworkExample.dispatchRouter.svc.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"=$resourcegroup_name \
+ --set deviceRegistryExample.storageClass=managed-premium-retain \
+ --set deviceRegistryExample.resetFiles=false \
+ --set adapters.mqtt.svc.loadBalancerIP=$mqtt_ip_address \
+ --set adapters.http.svc.loadBalancerIP=$http_ip_address \
+ --set adapters.amqp.svc.loadBalancerIP=$amqp_ip_address \
+ --set deviceRegistryExample.svc.loadBalancerIP=$registry_ip_address \
+ --set amqpMessagingNetworkExample.dispatchRouter.svc.loadBalancerIP=$network_ip_address
+</code></pre>
+
+<p>Note: add the following lines in case you opted for the Azure Service Bus variant:</p>
+
+<pre><code class="language-bash"> # Router update required to work together with Azure Service Bus
+ --set amqpMessagingNetworkExample.dispatchRouter.imageName=quay.io/enmasse/qdrouterd-base:1.8.0 \
+ --set amqpMessagingNetworkExample.broker.type=servicebus \
+ --set amqpMessagingNetworkExample.broker.servicebus.saslUsername=$service_bus_key_name \
+ --set amqpMessagingNetworkExample.broker.servicebus.saslPassword=$service_bus_key \
+ --set amqpMessagingNetworkExample.broker.servicebus.host=$service_bus_namespace.servicebus.windows.net \
+</code></pre>
+
+<p>Have fun with Hono on Microsoft Azure!</p>
+
+<p>Next steps:</p>
+
+<p>You can follow the steps as described in the <a href="https://www.eclipse.org/hono/getting-started/">getting started</a> tutorial with the following differences:</p>
+
+<p>Compared to a plain k8s deployment Azure provides us DNS names with static IPs for the Hono endpoints. To retrieve them:</p>
+
+<pre><code class="language-bash">HTTP_ADAPTER_IP=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.httpPublicIPFQDN.value -o tsv`
+AMQP_ADAPTER_IP=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.amqpPublicIPFQDN.value -o tsv`
+MQTT_ADAPTER_IP=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.mqttPublicIPFQDN.value -o tsv`
+REGISTRY_IP=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.registryPublicIPFQDN.value -o tsv`
+AMQP_NETWORK_IP=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.networkPublicIPFQDN.value -o tsv`
+</code></pre>
+
+<p>As Azure Service Bus does not support auto creation of queues you have to create a queue per tenant (ID), e.g. after you have created your tenant run:</p>
+
+<pre><code class="language-bash">az servicebus queue create --resource-group $resourcegroup_name \
+ --namespace-name $service_bus_namespace \
+ --name $MY_TENANT
+</code></pre>
+
+<h3 id="using-jaeger-tracing">Using Jaeger Tracing</h3>
<p>Hono’s components are instrumented using OpenTracing to allow tracking of the distributed processing of messages flowing through the system.
The Hono chart can be configured to report tracing information to the <a href="https://jaegertracing.io">Jaeger tracing system</a>. The <em>Spans</em> reported
by the components can then be viewed in a web browser.</p>
<p>In order for Hono’s components to use the Jaeger client for reporting tracing information, the container images need to be built
-with the <code>jaeger</code> Maven profile. Please refer to <a href="/hono/docs/admin-guide/monitoring-tracing-config/#configuring-usage-of-jaeger-tracing-included-in-docker-images">Monitoring & Tracing</a> for details.</p>
+with the <code>jaeger</code> Maven profile. Please refer to <a href="/hono/docs/admin-guide/monitoring-tracing-config/#configuring-usage-of-jaeger-tracing-included-in-docker-images">Monitoring & Tracing</a> for details.
+The newly built images also need to be made available to the target Kubernetes cluster as described in the two previous sections.</p>
<p>The chart can be configured to deploy and use an example Jaeger back end by means of setting the <em>jaegerBackendDeployExample</em> property
to <code>true</code> when running Helm:</p>
<pre><code class="language-sh"># in Hono working tree directory: hono/deploy
-helm install --dep-up --name hono --namespace hono --set jaegerBackendDeployExample=true target/deploy/helm/eclipse-hono/
+helm install --dep-up --name hono --namespace hono --set jaegerBackendExample.enabled=true target/deploy/helm/eclipse-hono/
</code></pre>
<p>This will create a Jaeger back end instance suitable for testing purposes and will configure all deployed Hono components to use the
@@ -1634,35 +1929,6 @@
helm install --dep-up --name hono --namespace hono --set jaegerAgentConf.REPORTER_TYPE=tchannel --set jaegerAgentConf.REPORTER_TCHANNEL_HOST_PORT=my-jaeger-collector:14267 target/deploy/helm/eclipse-hono/
</code></pre>
-<h2 id="deploying-optional-adapters">Deploying optional Adapters</h2>
-
-<p>The Helm chart supports deployment of additional protocol adapters which are still considered experimental or have been deprecated.
-The following table provides an overview of the corresponding configuration properties that need to be set on deployment.</p>
-
-<table>
-<thead>
-<tr>
-<th align="left">Property</th>
-<th align="left">Default</th>
-<th align="left">Description</th>
-</tr>
-</thead>
-
-<tbody>
-<tr>
-<td align="left"><em>adapters.kura.enabled</em></td>
-<td align="left"><code>false</code></td>
-<td align="left">Indicates if the deprecated Kura protocol adapter should be deployed.</td>
-</tr>
-</tbody>
-</table>
-
-<p>The following command will deploy the Kura adapter along with Hono’s standard adapters:</p>
-
-<pre><code class="language-sh"># in directory: eclipse-hono-$VERSION/deploy/
-helm install --dep-up --name hono --namespace hono --set adapters.kura.enabled=true helm/eclipse-hono/
-</code></pre>
-
<footer class=" footline" >
</footer>
@@ -2533,20 +2799,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/deployment/index.html b/docs/deployment/index.html
index 9b94655..9e27c4d 100644
--- a/docs/deployment/index.html
+++ b/docs/deployment/index.html
@@ -21,19 +21,19 @@
<title>Deployment :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/deployment/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/deployment/" selected>stable (1.0)</option>
@@ -1332,7 +1332,7 @@
<h1 id="deployment">Deployment</h1>
-<p>Learn how to deploy Hono™ to different container orchestration platforms.</p>
+<p>Learn how to deploy Eclipse Hono™ to various container orchestration platforms.</p>
<footer class=" footline" >
@@ -2205,20 +2205,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/deployment/index.xml b/docs/deployment/index.xml
index ba51b8f..ffce754 100644
--- a/docs/deployment/index.xml
+++ b/docs/deployment/index.xml
@@ -26,11 +26,8 @@
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.eclipse.org/hono/docs/deployment/openshift/</guid>
- <description><p>This guide describes how Eclipse Hono™ can be deployed on OpenShift with
-EnMasse, using the source-to-image (S2I) way. Using this approach, it is possible
-to customize and refresh the base images where Hono runs in. It also uses
-a more complex, multi-project setup and separates EnMasse and Grafana from
-the core Hono project.</p></description>
+ <description>In Hono version 1.0 we dropped the OpenShift specific deployment using the source-to-image (S2I) model, in favor of the Helm charts and the Eclipse IoT Packages project.
+You can still deploy to OpenShift and OKD, using the Helm charts. And you can also use routes to expose services. Deploying using S2I is also still possible, however the Hono project simply no longer provides out-of-the box scripts for doing so.</description>
</item>
<item>
@@ -39,7 +36,7 @@
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.eclipse.org/hono/docs/deployment/create-kubernetes-cluster/</guid>
- <description><p>This guide describes how to set up a Kubernetes cluster which can be used to run Eclipse Hono.</p></description>
+ <description><p>This guide describes how to set up a Kubernetes cluster which can be used to run Eclipse Hono&trade;.</p></description>
</item>
<item>
diff --git a/docs/deployment/openshift/index.html b/docs/deployment/openshift/index.html
index e16d5f3..f7b1452 100644
--- a/docs/deployment/openshift/index.html
+++ b/docs/deployment/openshift/index.html
@@ -21,19 +21,19 @@
<title>OpenShift / OKD :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/deployment/openshift/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/deployment/openshift/" selected>stable (1.0)</option>
@@ -1325,54 +1325,7 @@
<div class="progress">
<div class="wrapper">
-<nav id="TableOfContents">
-<ul>
-<li>
-<ul>
-<li><a href="#prerequisites">Prerequisites</a>
-<ul>
-<li><a href="#assumptions">Assumptions</a></li>
-<li><a href="#linux-like-environment">Linux like environment</a></li>
-<li><a href="#openshift-origin-client-tools">OpenShift Origin client tools</a></li>
-<li><a href="#minishift">Minishift</a></li>
-<li><a href="#operator-lifecycle-manager">Operator Lifecycle Manager</a></li>
-<li><a href="#persistent-volumes">Persistent volumes</a>
-<ul>
-<li><a href="#minishift-1">Minishift</a></li>
-<li><a href="#local">Local</a></li>
-<li><a href="#nfs">NFS</a></li>
-</ul></li>
-<li><a href="#ability-to-create-new-projects">Ability to create new projects</a></li>
-<li><a href="#certificates">Certificates</a></li>
-</ul></li>
-<li><a href="#clone-the-hono-repository">Clone the Hono repository</a></li>
-<li><a href="#setting-up-enmasse">Setting up EnMasse</a></li>
-<li><a href="#setting-up-hono">Setting up Hono</a></li>
-<li><a href="#enabling-metrics">Enabling metrics</a>
-<ul>
-<li><a href="#adding-prometheus-support">Adding Prometheus support</a></li>
-<li><a href="#setting-up-grafana">Setting up Grafana</a></li>
-</ul></li>
-<li><a href="#configuring-the-installation">Configuring the installation</a>
-<ul>
-<li><a href="#configure-maximum-number-of-devices-per-tenant">Configure maximum number of devices per tenant</a></li>
-<li><a href="#adding-jaeger-support">Adding Jaeger support</a>
-<ul>
-<li><a href="#enable-the-build-profile">Enable the build profile</a></li>
-<li><a href="#add-the-jaeger-agent-sidecar">Add the Jaeger agent sidecar</a></li>
-<li><a href="#deploy-jaeger">Deploy Jaeger</a></li>
-</ul></li>
-</ul></li>
-<li><a href="#using-the-installation">Using the installation</a>
-<ul>
-<li><a href="#extract-certificates">Extract certificates</a></li>
-<li><a href="#running-consumer">Running consumer</a></li>
-<li><a href="#register-device">Register device</a></li>
-<li><a href="#uploading-telemetry-with-http">Uploading Telemetry with HTTP</a></li>
-</ul></li>
-</ul></li>
-</ul>
-</nav>
+
</div>
</div>
@@ -1390,822 +1343,15 @@
-<p>This guide describes how Eclipse Hono™ can be deployed on OpenShift with
-EnMasse, using the source-to-image (S2I) way. Using this approach, it is possible
-to customize and refresh the base images where Hono runs in. It also uses
-a more complex, multi-project setup and separates EnMasse and Grafana from
-the core Hono project.</p>
+<p>In Hono version 1.0 we dropped the OpenShift specific deployment using the
+source-to-image (S2I) model, in favor of the Helm charts and the
+Eclipse IoT Packages project.</p>
-<div class="alert alert-warning">
- <h4 class="alert-heading"><i class="fas fa-exclamation-triangle"></i> Use for demos only</h4>
- <div><p>While this deployment model is closer to a production-ready deployment
-it still is missing some important aspects, so please do use this only as a
-base for your setup or as a demo setup. The following topics are currently
-not covered by this example deployment:</p>
-
-<ul>
-<li>Integration between EnMasse and Hono authentication</li>
-<li>Use your own versions of the device registry and authorization service</li>
-</ul>
-
-<p>These are all subjects to current and future developments in this area. This
-document will be updated accordingly with the progress.</p>
-</div>
-</div>
-
-
-<h2 id="prerequisites">Prerequisites</h2>
-
-<p>In order to work through this example deployment you will need the OpenShift
-client tools installed. Please align the version of the client tools with
-the version of your OpenShift cluster. This guide was tested with
-OpenShift 3.11.0. It might work with older or newer versions as well, but that
-is untested.</p>
-
-<h3 id="assumptions">Assumptions</h3>
-
-<p>This tutorial makes the following assumptions about your environment, if those
-assumptions are not true in your specific environment you will need to adapt
-the following instructions:</p>
-
-<ul>
-<li>The admin URL of your OpenShift cluster is: <code>https://my-cluster:8443</code></li>
-<li>The name of your OpenShift user is <code>developer</code></li>
-<li>All scripts and paths are relative to the folder
-<code>deploy/src/main/deploy/openshift</code></li>
-<li>Some parts of this tutorial may need <em>cluster admin</em> privileges. When cluster
-admin privileges are required, the tutorial will indicate this by the command
-<code>oc login -u admin</code>. It will indicate the end of a section requiring cluster
-admin privileges by the command <code>oc login -u developer</code>.
-<br /></li>
-</ul>
-
-<p><strong>Note:</strong> Those command may be different on your installation. They only act
- as an example.</p>
-
-<h3 id="linux-like-environment">Linux like environment</h3>
-
-<p>The deployment guide assumes that you have a Linux like environment with things
-like <code>bash</code>, <code>curl</code>, <code>git</code>, … Mac OS X 10.13+ works as well, Windows with
-some kind of Unix tooling should also be possible.</p>
-
-<h3 id="openshift-origin-client-tools">OpenShift Origin client tools</h3>
-
-<p>The client tools can be downloaded from the
-<a href="https://github.com/openshift/origin/releases">OpenShift Origin</a> project
-repository. Simply download the archive, unpack it and drop it into a directory
-where it can be found by the local PATH lookup.</p>
-
-<h3 id="minishift">Minishift</h3>
-
-<p>This tutorial is targeted towards running Hono on a production-ready OpenShift
-cluster. However it still is possible and useful to run the same setup on
-a local test cluster with “minishift”.</p>
-
-<p>Minishift is a tool that helps you run OpenShift locally by running a
-single-node OpenShift cluster inside a VM. Follow
-<a href="https://docs.openshift.org/latest/minishift/getting-started/index.html">this guide</a>
-for installing and having Minishift up and running.</p>
-
-<p>The default resource limits for Minishift however are to small, so please
-ensure that you are running Minishift with the following settings:</p>
-
-<pre><code>minishift start --cpus 4 --memory 16GB --disk-size 40GB
-</code></pre>
-
-<div class="alert alert-notice">
- <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Resource limits</h4>
- <div>Once you created your Minishift cluster instance with <code>minishift start</code> the
-resource arguments (like <code>--cpus</code>) are ignored in future calls to
-<code>minishift start</code> as the virtual machine has already been created. You will
-need to destroy the instance using <code>minishift delete</code> before it will accept
-the new resource limits.</div>
-</div>
-
-
-<p>When using minishift you can find your cluster URL by executing the following
-command:</p>
-
-<pre><code>minishift console --url
-</code></pre>
-
-<p>Some of the operations may require <em>cluster admin</em> privileges. For minishift
-an admin user can be created by executing the following commands, having a
-running minishift instance:</p>
-
-<pre><code>minishift addons apply admin-user
-</code></pre>
-
-<p>This will create a user named <code>admin</code>, with a password of <code>admin</code>, that has
-cluster admin privileges.</p>
-
-<h3 id="operator-lifecycle-manager">Operator Lifecycle Manager</h3>
-
-<p>A simple way to install additional operators in your cluster is via the
-<a href="https://github.com/operator-framework/operator-lifecycle-manager">Operator Lifecycle Manager</a> (aka OLM).
-It can be enabled in OpenShift 3.11+ by setting <code>openshift_enable_olm=true</code>
-in the Ansible inventory file.</p>
-
-<p>For Minishift, it can be enabled by execute the following commands as
-cluster admin:</p>
-
-<pre><code>git clone https://github.com/operator-framework/operator-lifecycle-manager
-cd operator-lifecycle-manager
-
-oc login -u admin
-oc new-project operator-lifecycle-manager
-oc create -f deploy/okd/manifests/latest/
-oc login -u developer
-</code></pre>
-
-<p>See also: <a href="https://github.com/operator-framework/operator-lifecycle-manager/blob/master/Documentation/install/install.md">https://github.com/operator-framework/operator-lifecycle-manager/blob/master/Documentation/install/install.md</a></p>
-
-<p>This guide will use OLM in order to install the optional
-<a href="https://github.com/coreos/prometheus-operator">Prometheus Operator</a>,
-which enables the aggregation of metrics from different Hono components.</p>
-
-<h3 id="persistent-volumes">Persistent volumes</h3>
-
-<p>You will need two persistent volumes for this deployment. The default
-required volumes are:</p>
-
-<table>
-<thead>
-<tr>
-<th>Name</th>
-<th align="right">Size</th>
-<th>Purpose</th>
-</tr>
-</thead>
-
-<tbody>
-<tr>
-<td>hono-pv</td>
-<td align="right">128 Mi</td>
-<td>Storing device registry information</td>
-</tr>
-
-<tr>
-<td>grafana-pv</td>
-<td align="right">1 Gi</td>
-<td>Grafana configuration database</td>
-</tr>
-</tbody>
-</table>
-
-<p>In the folder <code>admin/storage</code> you will find a set of sub folders containing
-YAML files for setting up the persistent volumes (PVs). As there are multiple
-storage providers available you need to choose <strong>only one</strong> and must modify it
-to match your OpenShift setup (see the following subsections).</p>
-
-<p>It may also be possible that your cluster supports automatic provisioning of
-storage, in this case you don’t need to create PVs explicitly.</p>
-
-<p>The PVs can be created by executing the following command with a user that
-has cluster wide privileges:</p>
-
-<pre><code>oc create -f admin/storage/<type>/grafana-pv.yml
-oc create -f admin/storage/<type>/hono-pv.yml
-</code></pre>
-
-<h4 id="minishift-1">Minishift</h4>
-
-<p>When you are running minishift, then you have automatic provisioning for PVs
-available. There is no need to create any PVs manually.</p>
-
-<h4 id="local">Local</h4>
-
-<p>In the <code>admin/storage/local</code> folder you will find YAML files for setting up
-local storage volumes. Those volumes will be kept available when pods are
-restarted, but are only available on he local disk of a node. So pods can
-only run on this single node and not be migrated throughout a cluster.</p>
-
-<p>If you have a single node cluster anyway, it might still be an easy option.</p>
-
-<p>You will need to change the field <code>.spec.hostPath.path</code> to point to an
-existing directory which grants all access to “other” (<code>chmod a+rwx .</code>).</p>
-
-<p>The storage capacity will only be used for matching PVs with PVCs and is not
-being enforced with this storage type.</p>
-
-<h4 id="nfs">NFS</h4>
-
-<p>The folder <code>admin/storage/nfs</code> contains a set of YAML files for setting up
-NFS based PVs. For this to work you will need a running NFS server and set up
-proper exports. It is possible to re-use the NFS server of your OpenShift
-installation if you already have one.</p>
-
-<p>You will need to change the following fields:</p>
-
-<ul>
-<li><code>.spec.nfs.server</code> – Hostname of the NFS server</li>
-<li><code>.spec.nfs.path</code> – The name of the exported path</li>
-</ul>
-
-<div class="alert alert-warning">
- <h4 class="alert-heading"><i class="fas fa-exclamation-triangle"></i> Don't use in production</h4>
- <div>Applications running of top of NFS may have issues with things like file locking
-behavior, …. So it isn’t recommended to use NFS without proper testing and
-ensuring that it works the way you expect it. If you accept the risk of
-corrupted data, it might still be a simple setup for testing a multi-node setup.</div>
-</div>
-
-
-<p>Also see: <a href="https://docs.openshift.org/latest/install_config/persistent_storage/persistent_storage_nfs.html">https://docs.openshift.org/latest/install_config/persistent_storage/persistent_storage_nfs.html</a></p>
-
-<h3 id="ability-to-create-new-projects">Ability to create new projects</h3>
-
-<p>The following guide requires three projects in the OpenShift cluster. It still
-is possible to modify the deployment to deploy to a single project, however this
-guide focuses on a setup having multiple projects.</p>
-
-<p>If you don’t have permissions to create new projects yourself, then you will
-need to request three projects. The guide expects the projects names to be:</p>
-
-<ul>
-<li><code>enmasse</code> – Hosting the EnMasse components.</li>
-<li><code>hono</code> – For running Eclipse Hono.</li>
-<li><code>grafana</code> – For running an instance of Grafana. Primarily
- for showing Hono dashboards.</li>
-</ul>
-
-<p>Those projects must be allowed to perform internal communication.</p>
-
-<p>If projects will be created for you, then you can ignore the
-calls to <code>oc new-project</code> in the following sections.</p>
-
-<h3 id="certificates">Certificates</h3>
-
-<p>Certificates are a difficult topic, as every components brings in its own
-concept about how certificates are handled. This deployment guide tries to
-align everything with OpenShifts capabilities of managing certificates. That
-means that internal communication tries to use cluster generated certificates,
-signed by the cluster CA. And externally it tries to re-use the OpenShift
-router certificates, which are provided during the installation of OpenShift.
-One exception to that are the AMQP and MQTT protocols. As those currently
-cannot be re-encrypted.</p>
-
-<p>If you deploy OpenShift without proper certificates, then you will automatically
-have self-signed certificates. In this case it is required to disable e.g.
-hostname validation later on. This deployment guide assumes that you have
-proper certificates set up, and will try to assist if that is not the case.</p>
-
-<div class="alert alert-notice">
- <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Let's encrypt</h4>
- <div>As <a href="https://letsencrypt.org/">Let’s encrypt</a> now supports wildcard certificates,
-having proper certificates may only be a few commands away for you.</div>
-</div>
-
-
-<p>In general, <code>curl</code> commands require the parameter <code>--insecure</code> in order to
-work with self-signed certificates.</p>
-
-<div class="alert alert-warning">
- <h4 class="alert-heading"><i class="fas fa-exclamation-triangle"></i> Mac OS X 10.13+</h4>
- <div><p>The <code>curl</code> binary on Mac OS X before 10.13 suffers from an issue with TLS SNI.
-Also see: <a href="https://github.com/curl/curl/issues/1533">https://github.com/curl/curl/issues/1533</a></p>
-
-<p>As the use of SNI is required for Kubernetes/OpenShift, when it comes to routing
-requests to services, it is not possible to use the provided version of
-<code>curl</code> on Mac OS X before 10.13.</p>
-
-<p>You can install a working <code>curl</code> version using in those Mac OS X released with
-the following commands:</p>
-
-<pre><code>brew install curl --with-openssl
-</code></pre>
-
-<p>Or upgrade your existing installation using:</p>
-
-<pre><code>brew reinstall curl --with-openssl
-</code></pre>
-
-<p>Or use proper certificates.</p>
-</div>
-</div>
-
-
-<h2 id="clone-the-hono-repository">Clone the Hono repository</h2>
-
-<p>In order to have access to some of the requires scripts and resource of this
-deployment guide, you will need to clone the Hono repository to your local
-machine. You can do this with the following command:</p>
-
-<pre><code>git clone https://github.com/eclipse/hono.git
-</code></pre>
-
-<p>Or if you want to check out a specific branch (e.g. <code>0.9.x</code>):</p>
-
-<pre><code>git clone -b 0.9.x https://github.com/eclipse/hono.git
-</code></pre>
-
-<div class="alert alert-notice">
- <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Different branches</h4>
- <div><p>This deployment description is based on the master branch of Hono. However this
-branch is also the current development and may be unstable at times.</p>
-
-<p>If you experience any problems, it is
-recommended to switch to a release branch (e.g. <code>0.9.x</code>) instead of using
-the default master branch. However this documentation is only published from
-the master branch, so there may be inconsistencies between the repository
-content and the documentation. In this case you can read through <code>index.md</code>
-file, checked out from the branch you cloned. The file is located in the
-directory <code>hono-site/content/deployment/openshift</code>.</p>
-</div>
-</div>
-
-
-<h2 id="setting-up-enmasse">Setting up EnMasse</h2>
-
-<p>This section describes how to install EnMasse, the messaging layer which Hono is
-based on.</p>
-
-<p>Start by downloading and unpacking EnMasse:</p>
-
-<pre><code>curl -LO https://github.com/EnMasseProject/enmasse/releases/download/0.25.0/enmasse-0.25.0.tgz
-tar xzf enmasse-0.25.0.tgz
-</code></pre>
-
-<div class="alert alert-notice">
- <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Other versions</h4>
- <div>Other versions of EnMasse might work as well, but are untested by this deployment
-guide. Unless you explicitly want to try out a different version, it is
-recommended to use to the version documented in this tutorial.</div>
-</div>
-
-
-<p>First switch to a user with <em>cluster admin</em> privileges, e.g.:</p>
-
-<pre><code>oc login -u admin
-</code></pre>
-
-<p>Then create a new project:</p>
-
-<pre><code>oc new-project enmasse-infra --display-name='EnMasse'
-</code></pre>
-
-<p>And perform the deployment:</p>
-
-<pre><code>oc apply -f enmasse-0.25.0/install/bundles/enmasse-with-standard-authservice
-</code></pre>
-
-<p>Wait for the admin console to completely start up. You can check this with
-the following command:</p>
-
-<pre><code>oc get deploy/api-server deploy/keycloak
-</code></pre>
-
-<p>Verify that the “AVAILABLE” column shows “1”:</p>
-
-<pre><code>NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
-api-server 1 1 1 1 1m
-keycloak 1 1 1 1 1m
-</code></pre>
-
-<p>Finally switch back to your normal application user:</p>
-
-<pre><code>oc login -u developer
-</code></pre>
-
-<h2 id="setting-up-hono">Setting up Hono</h2>
-
-<p>Start by creating a new project using:</p>
-
-<pre><code>oc new-project hono --display-name='Eclipse Hono™'
-</code></pre>
-
-<p>Then create the EnMasse address space to use:</p>
-
-<pre><code>oc create -f hono-address-space.yml
-</code></pre>
-
-<p>Before proceeding to the next step, ensure that the address space has been
-created and is ready. Executing the following command should contain
-<code>Is Ready: true</code> in the status section:</p>
-
-<pre><code>oc describe addressspace/default
-</code></pre>
-
-<p>You can also quickly check for <code>isReady</code> with a JSON path query:</p>
-
-<pre><code>oc get addressspace/default -o jsonpath='{.status.isReady}'
-</code></pre>
-
-<p>Then process and execute the main Hono template in order to deploy the
-Hono services:</p>
-
-<pre><code>oc process -f hono-template.yml | oc create -f -
-</code></pre>
-
-<p>OpenShift templates allow to use <em>parameters</em> which can customize provided
-templates. If you want to specify template parameters from the command line
-use the following syntax:</p>
-
-<pre><code>oc process -f hono-template.yml \
- -p GIT_REPOSITORY=https://github.com/your/hono.git \
- -p GIT_BRANCH=0.9.x| oc create -f -
-</code></pre>
-
-<div class="alert alert-notice">
- <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Align branches</h4>
- <div><p>By default the Hono template uses the <code>master</code> branch for deploying Hono. As
-this branch might be unstable this may not be what you are looking for, but it
-also is the default branch of the Hono Git repository where you checked out
-the deployment template.</p>
-
-<p>It is recommended that when you execute the guide from an alternate branch
-(e.g. <code>0.9.x</code>) that you also pass the same branch as <code>GIT_BRANCH</code> to the
-template.</p>
-</div>
-</div>
-
-
-<p>And register the template for creating new Hono tenants. This only registers
-the template, but does not create a new tenant yet:</p>
-
-<pre><code>oc create -f hono-tenant-template.yml
-</code></pre>
-
-<p>Next you will need to create a tenant, execute the following command to create
-the <em>default tenant</em>:</p>
-
-<pre><code>oc process hono-tenant HONO_TENANT_NAME=DEFAULT_TENANT RESOURCE_NAME=defaulttenant CONSUMER_USER_NAME=consumer CONSUMER_USER_PASSWORD="$(echo -n verysecret | base64)"| oc create -f -
-</code></pre>
-
-<div class="alert alert-notice">
- <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Creating tenants</h4>
- <div>Creating a new tenant using the template currently only creates the necessary
-resources in EnMasse for the tenant. It does not create the tenant in the Hono
-device registry.</div>
-</div>
-
-
-<h2 id="enabling-metrics">Enabling metrics</h2>
-
-<p>The default OpenShift deployment of Hono does support the use of Prometheus as
-a metrics backend. However it is still required to deploy an instance of
-Prometheus and Grafana to your installation in order to actually gather and
-visualize the metrics.</p>
-
-<h3 id="adding-prometheus-support">Adding Prometheus support</h3>
-
-<p>This section will explain how to set up Prometheus via the OLM and the
-Prometheus Operator. This is only an example, it is possible to install
-Prometheus in different ways. Or skip the installation of Prometheus, if you
-want to use a different metrics backend.</p>
-
-<p>Run the following commands to register the prometheus operator and create a
-new instance:</p>
-
-<pre><code>oc project hono
-oc create -f ../resource-descriptors/prometheus/operator.yml
-oc create -f ../resource-descriptors/prometheus/instance.yml
-</code></pre>
-
-<h3 id="setting-up-grafana">Setting up Grafana</h3>
-
-<p>Start by creating a new project using:</p>
-
-<pre><code>oc new-project grafana --display-name='Grafana Dashboard'
-</code></pre>
-
-<p>Create the config resources:</p>
-
-<pre><code>oc create configmap grafana-provisioning-dashboards --from-file=../../config/grafana/provisioning/dashboards
-oc create configmap grafana-dashboard-defs --from-file=../../config/grafana/dashboard-definitions
-oc label configmap grafana-provisioning-dashboards app=hono-metrics
-oc label configmap grafana-dashboard-defs app=hono-metrics
-</code></pre>
-
-<p>Then deploy the Grafana instance using:</p>
-
-<pre><code>oc process -f grafana-template.yml \
- -p ADMIN_PASSWORD=admin | oc create -f -
-</code></pre>
-
-<p>OpenShift templates allow to use <em>parameters</em> which can customize provided
-templates. If you want to specify template parameters from the command line
-use the following syntax:</p>
-
-<pre><code>oc process -f grafana-template.yml \
- -p ADMIN_PASSWORD=admin \
- -p HONO_NAMESPACE=hono \
- -p GIT_REPOSITORY=https://github.com/your/hono.git \
- -p GIT_BRANCH=0.9.x| oc create -f -
-</code></pre>
-
-<h2 id="configuring-the-installation">Configuring the installation</h2>
-
-<p>The default installation of Hono can be tweaked in a few ways. The following
-sub-sections describe a few aspects that can be modified.</p>
-
-<h3 id="configure-maximum-number-of-devices-per-tenant">Configure maximum number of devices per tenant</h3>
-
-<p>The default settings for the example Hono device registry limit the number of
-devices to 100 per tenant. If this is not enough for your setup you can change
-the setting by executing the following command, which will increase the number
-to 10.000 devices per tenant:</p>
-
-<pre><code>oc set env -n hono dc/hono-service-device-registry HONO_REGISTRY_SVC_MAX_DEVICES_PER_TENANT=10000
-</code></pre>
-
-<h3 id="adding-jaeger-support">Adding Jaeger support</h3>
-
-<p>By default Hono has the capability to work with OpenTracing, and it also
-provides a build profile for enabling the “Jaeger” implementation of
-OpenTracing.</p>
-
-<p>There are a few manual steps required to modify the default Hono deployment
-for OpenShift in order to enable this profile.</p>
-
-<h4 id="enable-the-build-profile">Enable the build profile</h4>
-
-<p>The Hono profile needs to be enabled, to include the Jaeger components in the
-S2I builds.</p>
-
-<p>Modify the Hono templates to add the <code>jaeger</code> profile in the builds. e.g.:</p>
-
-<pre><code class="language-diff"> name: fabric8-s2i-java-custom:2.3
- env:
- - name: MAVEN_ARGS_APPEND
-- value: -B -pl org.eclipse.hono:hono-adapter-mqtt-vertx --also-make -Pnetty-tcnative
-+ value: -B -pl org.eclipse.hono:hono-adapter-mqtt-vertx --also-make -Pnetty-tcnative -Pjaeger
- - name: ARTIFACT_DIR
- value: adapters/mqtt-vertx/target
- - name: ARTIFACT_COPY_ARGS
-</code></pre>
-
-<p>Be sure to trigger new builds if you already built the container images before.</p>
-
-<h4 id="add-the-jaeger-agent-sidecar">Add the Jaeger agent sidecar</h4>
-
-<p>In order to add capture output from the Jaeger client and forward it to the
-main Jaeger application, a Jaeger agent is required. This will be deployed
-alongside each Hono service, as a dedicated container, but in the same pod
-(aka sidecar).</p>
-
-<p>This requires a new image stream:</p>
-
-<pre><code class="language-yml">kind: ImageStream
-apiVersion: v1
-metadata:
- name: jaeger-agent
-spec:
- lookupPolicy:
- local: false
- tags:
- - name: "latest"
- from:
- kind: DockerImage
- name: docker.io/jaegertracing/jaeger-agent:latest
- importPolicy:
- scheduled: true
- referencePolicy:
- type: Source
-</code></pre>
-
-<p>Then you need to modify the deployment configuration for each Hono service that
-should use the Jaeger agent:</p>
-
-<pre><code class="language-diff"> - kind: DeploymentConfig
- apiVersion: v1
- metadata:
- name: hono-adapter-mqtt-vertx
- labels:
- app: hono-adapter
- deploymentconfig: hono-adapter-mqtt-vertx
- spec:
- replicas: 1
- selector:
- app: hono-adapter
- deploymentconfig: hono-adapter-mqtt-vertx
- strategy:
- type: Rolling
- rollingParams:
- timeoutSeconds: 3600
- triggers:
- - type: ConfigChange
- - type: ImageChange
- imageChangeParams:
- automatic: true
- containerNames:
- - eclipsehono-hono-adapter-mqtt-vertx
- from:
- kind: ImageStreamTag
- name: hono-adapter-mqtt-vertx:latest
-+ - type: ImageChange
-+ imageChangeParams:
-+ automatic: true
-+ containerNames:
-+ - jaeger-agent
-+ from:
-+ kind: ImageStreamTag
-+ name: jaeger-agent:latest
- template:
- metadata:
- labels:
- app: hono-adapter
- deploymentconfig: hono-adapter-mqtt-vertx
- spec:
- containers:
- - name: eclipsehono-hono-adapter-mqtt-vertx
- image: hono-adapter-mqtt-vertx
- imagePullPolicy: Always
- env:
- - name: SPRING_CONFIG_LOCATION
- value: file:///etc/config/
- - name: SPRING_PROFILES_ACTIVE
- value:
- - name: LOGGING_CONFIG
- value: file:///etc/config/logback-spring.xml
- - name: KUBERNETES_NAMESPACE
- valueFrom:
- fieldRef:
- fieldPath: metadata.namespace
- - name: HONO_MESSAGING_HOST
- valueFrom:
- configMapKeyRef:
- name: hono-configuration
- key: downstream.host
- - name: HONO_MESSAGING_PORT
- valueFrom:
- configMapKeyRef:
- name: hono-configuration
- key: downstream.port
- - name: HONO_COMMAND_HOST
- valueFrom:
- configMapKeyRef:
- name: hono-configuration
- key: downstream.host
- - name: HONO_COMMAND_PORT
- valueFrom:
- configMapKeyRef:
- name: hono-configuration
- key: downstream.port
- - name: HONO_REGISTRATION_HOST
- value: hono-service-device-registry.$(KUBERNETES_NAMESPACE).svc
- - name: HONO_CREDENTIALS_HOST
- value: hono-service-device-registry.$(KUBERNETES_NAMESPACE).svc
- - name: HONO_TENANT_HOST
- value: hono-service-device-registry.$(KUBERNETES_NAMESPACE).svc
- - name: MANAGEMENT_METRICS_EXPORT_GRAPHITE_HOST
- value: influxdb.$(KUBERNETES_NAMESPACE).svc
- - name: AB_JOLOKIA_USER
- value: jolokia
- - name: AB_JOLOKIA_PASSWORD_RANDOM
- value: "false"
- - name: AB_JOLOKIA_PASSWORD
- valueFrom:
- secretKeyRef:
- name: hono-secrets
- key: jolokia.password
- readinessProbe:
- httpGet:
- path: /readiness
- port: 8088
- scheme: HTTPS
- initialDelaySeconds: 10
- livenessProbe:
- httpGet:
- path: /liveness
- port: 8088
- scheme: HTTPS
- initialDelaySeconds: 180
- resources:
- limits:
- memory: 512Mi
- ports:
- - containerPort: 8778
- name: jolokia
- - containerPort: 8088
- name: radan-http
- protocol: TCP
- - containerPort: 8883
- name: secure-mqtt
- protocol: TCP
- - containerPort: 1883
- name: mqtt
- protocol: TCP
- securityContext:
- privileged: false
- volumeMounts:
- - mountPath: /etc/config
- name: conf
- - mountPath: /etc/secrets
- name: secrets
- readOnly: true
- - mountPath: /etc/tls
- name: tls
- readOnly: true
-+ - image: jaeger-agent
-+ name: jaeger-agent
-+ ports:
-+ - containerPort: 5775
-+ protocol: UDP
-+ - containerPort: 5778
-+ - containerPort: 6831
-+ protocol: UDP
-+ - containerPort: 6832
-+ protocol: UDP
-+ command:
-+ - "/go/bin/agent-linux"
-+ - "--collector.host-port=jaeger-collector.jaeger.svc:14267"
-+ env:
-+ - name: JAEGER_SERVICE_NAME
-+ value: hono-adapter-mqtt
- volumes:
- - name: conf
- configMap:
- name: hono-adapter-mqtt-vertx-config
- - name: secrets
- secret:
- secretName: hono-mqtt-secrets
- - name: tls
- secret:
- secretName: hono-adapter-mqtt-vertx-tls
-</code></pre>
-
-<p>The important parts are only the modifications, which add a new image stream
-trigger, and also add the additional agent container to the deployment. This
-example assumes that the Jaeger collector will be available at the hostname
-<code>jaeger-collector.jaeger.svc</code>. This will be true if you follow the next
-section on deploying a development-only Jaeger cluster. Should you deploy
-Jaeger differently, then this hostname and/or port may be different.</p>
-
-<h4 id="deploy-jaeger">Deploy Jaeger</h4>
-
-<p>Setting up a full Jaeger cluster is a complicated task. However there is a good
-tutorial at the Jaeger repository at: <a href="https://github.com/jaegertracing/jaeger-openshift">https://github.com/jaegertracing/jaeger-openshift</a></p>
-
-<p>A simple deployment, for testing purposes only, can be performed by running
-the development setup template of Jaeger for OpenShift:</p>
-
-<pre><code>oc new-project jaeger
-oc process -f https://raw.githubusercontent.com/jaegertracing/jaeger-openshift/master/all-in-one/jaeger-all-in-one-template.yml | oc create -f -
-</code></pre>
-
-<p>Please be aware of the official note in the <a href="https://github.com/jaegertracing/jaeger-openshift#development-setup">documentation</a>:</p>
-
-<blockquote>
-<p>This template uses an in-memory storage with a limited functionality for local testing and development. Do not use this template in production environments.</p>
-</blockquote>
-
-<h2 id="using-the-installation">Using the installation</h2>
-
-<p>All following examples make use of the running Hono instance. They pretty much
-follow the other examples. Please note that, compared to the more simple
-OpenShift deployment, in this case we need to take care of different project
-names when looking up route host names via <code>oc get</code>. You can use the command
-line argument <code>-n <project></code> to specify the project name without changing the
-default selected project.</p>
-
-<p>All examples in the following sub-sections assume that you are located in the
-<code>cli</code> directory.</p>
-
-<h3 id="extract-certificates">Extract certificates</h3>
-
-<p>In order to connect the external consumer to Enmasse, we need to extract the
-certificate which messaging endpoint of EnMasse uses. This allows to validate
-the connection to the endpoint and encrypt the communication using TLS.</p>
-
-<p>The following command extracts the certificate of the endpoint (not the key):</p>
-
-<pre><code>oc -n hono get addressspace default -o jsonpath={.status.endpointStatuses[?(@.name==\'messaging\')].cert} | base64 -d > target/config/hono-demo-certs-jar/tls.crt
-</code></pre>
-
-<p>This will retrieve the certificate, decode the base64 encoded string and
-store it in the file <code>target/config/hono-demo-certs-jar/tls.crt</code>. Although
-the file is a “demo cert” as the path might indicate, it still is stored in
-the same location in order to align the with the other example commands of the
-Hono documentation.</p>
-
-<h3 id="running-consumer">Running consumer</h3>
-
-<p>As described in the <a href="https://www.eclipse.org/hono/getting-started/
-">Getting Started</a>
-guide, data produced by devices is usually consumed by downstream applications
-which connect directly to the router network service. You can start the client
-from the <code>cli</code> folder as follows:</p>
-
-<pre><code>mvn spring-boot:run -Dspring-boot.run.arguments=--hono.client.host=$(oc -n hono get addressspace default -o jsonpath={.status.endpointStatuses[?(@.name==\'messaging\')].externalHost}),--hono.client.port=443,--hono.client.username=consumer,--hono.client.password=verysecret,--hono.client.trustStorePath=target/config/hono-demo-certs-jar/tls.crt
-</code></pre>
-
-<h3 id="register-device">Register device</h3>
-
-<p>In order to upload telemetry data to Hono, the device needs to be registered
-with the system. You can register the device using the <em>Device Registry</em> by
-running the following command (i.e. for a device with ID <code>4711</code>):</p>
-
-<pre><code>curl -X POST -i -H 'Content-Type: application/json' -d '{"device-id": "4711"}' https://$(oc get -n hono route hono-service-device-registry-https --template='{{.spec.host}}')/registration/DEFAULT_TENANT
-</code></pre>
-
-<h3 id="uploading-telemetry-with-http">Uploading Telemetry with HTTP</h3>
-
-<p>After having the device registered, uploading telemetry is just a simple
-HTTP POST command to the <em>HTTP Adapter</em>:</p>
+<p>You can still deploy to OpenShift and OKD, using the Helm charts. And you can
+also use <em>routes</em> to expose services.
+Deploying using S2I is also still possible, however the Hono project simply no
+longer provides out-of-the box scripts for doing so.</p>
-<pre><code>curl -X POST -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'Content-Type: application/json' --data-binary '{"temp": 5}' https://$(oc -n hono get route hono-adapter-http-vertx-sec --template='{{.spec.host}}')/telemetry
-</code></pre>
<footer class=" footline" >
@@ -3080,20 +2226,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/deployment/openshift_01_hono_ready.png b/docs/deployment/openshift_01_hono_ready.png
deleted file mode 100644
index d0f15ed..0000000
--- a/docs/deployment/openshift_01_hono_ready.png
+++ /dev/null
Binary files differ
diff --git a/docs/deployment/openshift_09_enmasse_ready.png b/docs/deployment/openshift_09_enmasse_ready.png
deleted file mode 100644
index d8bb4b3..0000000
--- a/docs/deployment/openshift_09_enmasse_ready.png
+++ /dev/null
Binary files differ
diff --git a/docs/deployment/resource-limitation/index.html b/docs/deployment/resource-limitation/index.html
index 6a6f200..d7f33c5 100644
--- a/docs/deployment/resource-limitation/index.html
+++ b/docs/deployment/resource-limitation/index.html
@@ -21,19 +21,19 @@
<title>Limiting Resource Usage :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/deployment/resource-limitation/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/deployment/resource-limitation/" selected>stable (1.0)</option>
@@ -1330,14 +1330,12 @@
<li>
<ul>
<li><a href="#java-s-view-of-the-world">Java’s View of the World</a></li>
-<li><a href="#limiting-a-container-s-memory-consumption">Limiting a Container’s Memory Consumption</a>
+<li><a href="#limiting-a-component-s-memory-consumption">Limiting a Component’s Memory Consumption</a>
<ul>
-<li><a href="#java-8">Java 8</a></li>
-<li><a href="#java-9-and-later">Java 9 and later</a></li>
<li><a href="#kubernetes">Kubernetes</a></li>
</ul></li>
<li><a href="#limiting-the-number-of-device-connections">Limiting the Number of Device Connections</a></li>
-<li><a href="#limiting-the-number-of-messages">Limiting the Number of Messages</a></li>
+<li><a href="#limiting-the-data-volume">Limiting the Data Volume</a></li>
</ul></li>
</ul>
</nav>
@@ -1368,24 +1366,9 @@
<p>This is a reasonable approach when running on <em>bare metal</em> or a VM where other processes are expected to be running on the same machine, thus competing for the same computing resources. However, containers are usually configured to run a single process only so that it makes more sense to dedicate almost all of the available resources to running that process, leaving the (small) rest for the operating system itself.</p>
-<p>As described above, a Docker container can easily be configured with a limit for memory and CPU resources that it may use during runtime. These limits are set and enforced using Linux <em>CGroups</em>. When a Java VM is run inside of such a Docker container which has been configured with a memory limit, then the result of the JVM’s attempt to determine the available resources during startup will not reflect the memory limit imposed on the container. That is because the JVM by default does not consider the CGroup limit but instead queries the operating system for the overall amount of memory available. The same is true for the way that the JVM determines the number of available CPU cores.</p>
+<p>As described above, a Docker container can easily be configured with a limit for memory and CPU resources that it may use during runtime. These limits are set and enforced using Linux <em>CGroups</em>.</p>
-<p>As described above, a Docker container can easily be configured with a limit for memory and CPU resources that it may use during runtime. These limits are set and enforced using Linux <em>CGroups</em>. When a pre version 9 Java VM is run inside of such a Docker container which has been configured with a memory limit, then the result of the JVM’s attempt to determine the available resources during startup will not reflect the memory limit imposed on the container. That is because the JVM by default does not consider the CGroup limit but instead queries the operating system for the overall amount of memory available. The same is true for the way that the JVM determines the number of available CPU cores. Starting with version 9 Java correctly determines the amount of memory and CPUs available when running in a container.</p>
-
-<h2 id="limiting-a-container-s-memory-consumption">Limiting a Container’s Memory Consumption</h2>
-
-<h3 id="java-8">Java 8</h3>
-
-<p>OpenJDK 8 has introduced the experimental <code>-XX:+UseCGroupMemoryLimitForHeap</code> option to make the JVM consider CGroup limits when determining the amount of available memory. Using this option, it is possible to explicitly configure a Java 8 VM’s memory consumption within the boundaries of the container’s (limited) resources. However, the JVM will still only allocate a quarter of the (limited) amount of memory, thus leaving a lot of the memory available to the container unused.</p>
-
-<p>Either of the following JVM options can be used in Java 8 in order to change this behavior:</p>
-
-<ul>
-<li><code>-XX:MaxRAMFraction</code> can be used to set the fraction of total memory that may be allocated for the heap. The default value is 4 (meaning that up to a quarter of the memory will be allocated), so in order to increase the amount of memory, the value can be set to 2 (using up to 50% of the memory) or 1 (using up to 100% of the memory). Setting the option to 1 is strongly discouraged because it would leave no memory left for the JVM’s other memory areas nor any additional processes run by the operating system.</li>
-<li><code>-Xmx</code> can be used to explicitly set the maximum amount of memory used for the heap. As a rule of thumb, setting this value to 60-70% of the container’s (limited) amount of memory should usually work. Based on the application’s memory usage characteristics, increasing the value to 80 or even 90% might also work.</li>
-</ul>
-
-<h3 id="java-9-and-later">Java 9 and later</h3>
+<h2 id="limiting-a-component-s-memory-consumption">Limiting a Component’s Memory Consumption</h2>
<p>Starting with Java 9, the JVM will correctly determine the total memory and number of CPUs available when running inside of a container. All of the Docker images provided by Hono run with OpenJDK 11 by default, thus ensuring that the JVM considers any memory limits configured for the container when configuring its heap during startup. However, the default algorithm will still only allocate a quarter of the (limited) amount of memory, thus leaving a lot of memory available to the container unused.</p>
@@ -1445,9 +1428,9 @@
<p>Hono supports limiting the overall number of simultaneously connected devices per tenant. Please refer to the <a href="/hono/docs/concepts/resource-limits/#connections-limit">connections limit concept</a> for more information. The limit needs to be configured at the tenant level using the <em>resource-limits</em> configuration property. Please refer to the <a href="/hono/docs/api/tenant/#tenant-information-format">Tenant API</a> for configuration details.</p>
-<h2 id="limiting-the-number-of-messages">Limiting the Number of Messages</h2>
+<h2 id="limiting-the-data-volume">Limiting the Data Volume</h2>
-<p>Hono supports limiting the number of messages that devices of a tenant can publish to Hono during a given time interval. Please refer to the <a href="/hono/docs/concepts/resource-limits/#messages-limit">messages limit concept</a> for more information. The limit needs to be configured at the tenant level using the <em>resource-limits</em> configuration property. Please refer to the <a href="/hono/docs/api/tenant/#tenant-information-format">Tenant API</a> for configuration details.</p>
+<p>Hono supports limiting the amount of data that devices of a tenant can publish to Hono during a given time interval. Please refer to the <a href="/hono/docs/concepts/resource-limits/#messages-limit">messages limit concept</a> for more information. The limit needs to be configured at the tenant level using the <em>resource-limits</em> configuration property. Please refer to the <a href="/hono/docs/api/tenant/#tenant-information-format">Tenant API</a> for configuration details.</p>
<footer class=" footline" >
@@ -2322,20 +2305,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev-guide/building_hono/index.html b/docs/dev-guide/building_hono/index.html
index b25d59d..5717113 100644
--- a/docs/dev-guide/building_hono/index.html
+++ b/docs/dev-guide/building_hono/index.html
@@ -21,19 +21,19 @@
<title>Building from Source :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/dev-guide/building_hono/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/dev-guide/building_hono/" selected>stable (1.0)</option>
@@ -2289,20 +2289,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev-guide/custom_http_adapter/index.html b/docs/dev-guide/custom_http_adapter/index.html
index d8cb649..a18df29 100644
--- a/docs/dev-guide/custom_http_adapter/index.html
+++ b/docs/dev-guide/custom_http_adapter/index.html
@@ -21,19 +21,19 @@
<title>Implement a Custom Hono HTTP Protocol Adapter :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/dev-guide/custom_http_adapter/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/dev-guide/custom_http_adapter/" selected>stable (1.0)</option>
@@ -2337,20 +2337,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev-guide/index.html b/docs/dev-guide/index.html
index b6e1951..5850b3d 100644
--- a/docs/dev-guide/index.html
+++ b/docs/dev-guide/index.html
@@ -21,19 +21,19 @@
<title>Developer Guide :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/dev-guide/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/dev-guide/" selected>stable (1.0)</option>
@@ -1332,7 +1332,7 @@
<h1 id="developer-guide">Developer Guide</h1>
-<p>Learn how to integrate your custom components with Hono™.</p>
+<p>Learn how to build Eclipse Hono™ and how to integrate your custom components with it.</p>
<footer class=" footline" >
@@ -2205,20 +2205,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev-guide/java_client_consumer/index.html b/docs/dev-guide/java_client_consumer/index.html
index cd9d1f4..d889487 100644
--- a/docs/dev-guide/java_client_consumer/index.html
+++ b/docs/dev-guide/java_client_consumer/index.html
@@ -21,19 +21,19 @@
<title>Consuming Messages from Java :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/dev-guide/java_client_consumer/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/dev-guide/java_client_consumer/" selected>stable (1.0)</option>
@@ -1403,13 +1403,13 @@
<p>It is started by</p>
-<pre><code># in directory: hono/example/
+<pre><code class="language-sh"># in directory: hono/example/
mvn exec:java -Dexec.mainClass=org.eclipse.hono.vertx.example.HonoExampleApplication
</code></pre>
-<p>or - if e.g. the host of the AMQP network should be changed -</p>
+<p>or — if e.g. the host of the AMQP network should be changed —</p>
-<pre><code>mvn exec:java -Dexec.mainClass=org.eclipse.hono.vertx.example.HonoExampleApplication -Dconsumer.host=192.168.99.100
+<pre><code class="language-sh">mvn exec:java -Dexec.mainClass=org.eclipse.hono.vertx.example.HonoExampleApplication -Dconsumer.host=192.168.99.100
</code></pre>
<h3 id="telemetry-and-event-messages">Telemetry and Event messages</h3>
@@ -2307,20 +2307,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/404.html b/docs/dev/404.html
index 45ad459..6331626 100644
--- a/docs/dev/404.html
+++ b/docs/dev/404.html
@@ -18,16 +18,16 @@
<title>404 Page not found</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/horsey.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/horsey.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
<style type="text/css">
:root #header + #content > #left > #rlblock_left {
diff --git a/docs/dev/admin-guide/amqp-adapter-config/index.html b/docs/dev/admin-guide/amqp-adapter-config/index.html
index bba70dd..f314739 100644
--- a/docs/dev/admin-guide/amqp-adapter-config/index.html
+++ b/docs/dev/admin-guide/amqp-adapter-config/index.html
@@ -21,19 +21,19 @@
<title>AMQP Adapter Configuration :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/amqp-adapter-config/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/amqp-adapter-config/">stable (1.0)</option>
@@ -2555,20 +2555,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/amqp-network-config/index.html b/docs/dev/admin-guide/amqp-network-config/index.html
index e0c46fb..37ae59a 100644
--- a/docs/dev/admin-guide/amqp-network-config/index.html
+++ b/docs/dev/admin-guide/amqp-network-config/index.html
@@ -21,19 +21,19 @@
<title>AMQP 1.0 Messaging Network Configuration :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/amqp-network-config/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/amqp-network-config/">stable (1.0)</option>
@@ -2246,20 +2246,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/auth-server-config/index.html b/docs/dev/admin-guide/auth-server-config/index.html
index b0e3163..005ea1e 100644
--- a/docs/dev/admin-guide/auth-server-config/index.html
+++ b/docs/dev/admin-guide/auth-server-config/index.html
@@ -21,19 +21,19 @@
<title>Auth Server Configuration :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/auth-server-config/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/auth-server-config/">stable (1.0)</option>
@@ -2452,20 +2452,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/common-config/index.html b/docs/dev/admin-guide/common-config/index.html
index 9dbca85..24c423d 100644
--- a/docs/dev/admin-guide/common-config/index.html
+++ b/docs/dev/admin-guide/common-config/index.html
@@ -21,19 +21,19 @@
<title>Common Configuration :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/common-config/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/common-config/">stable (1.0)</option>
@@ -2317,20 +2317,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/device-connection-config/index.html b/docs/dev/admin-guide/device-connection-config/index.html
index f045734..aa20444 100644
--- a/docs/dev/admin-guide/device-connection-config/index.html
+++ b/docs/dev/admin-guide/device-connection-config/index.html
@@ -21,19 +21,19 @@
<title>Configuring the Device Connection Service :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/device-connection-config/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/device-connection-config/">stable (1.0)</option>
@@ -2504,20 +2504,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/device-registry-config/index.html b/docs/dev/admin-guide/device-registry-config/index.html
index 9ede293..b7926d1 100644
--- a/docs/dev/admin-guide/device-registry-config/index.html
+++ b/docs/dev/admin-guide/device-registry-config/index.html
@@ -21,19 +21,19 @@
<title>Device Registry Configuration :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/device-registry-config/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/device-registry-config/">stable (1.0)</option>
@@ -2703,20 +2703,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/hono-client-configuration/index.html b/docs/dev/admin-guide/hono-client-configuration/index.html
index 52b887f..8da4751 100644
--- a/docs/dev/admin-guide/hono-client-configuration/index.html
+++ b/docs/dev/admin-guide/hono-client-configuration/index.html
@@ -21,19 +21,19 @@
<title>Hono Client Configuration :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/hono-client-configuration/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/hono-client-configuration/">stable (1.0)</option>
@@ -2507,20 +2507,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/http-adapter-config/index.html b/docs/dev/admin-guide/http-adapter-config/index.html
index 3d23af2..38c86d1 100644
--- a/docs/dev/admin-guide/http-adapter-config/index.html
+++ b/docs/dev/admin-guide/http-adapter-config/index.html
@@ -21,19 +21,19 @@
<title>HTTP Adapter Configuration :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/http-adapter-config/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/http-adapter-config/">stable (1.0)</option>
@@ -2541,20 +2541,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/index.html b/docs/dev/admin-guide/index.html
index 6b2f846..abcffaa 100644
--- a/docs/dev/admin-guide/index.html
+++ b/docs/dev/admin-guide/index.html
@@ -21,19 +21,19 @@
<title>Admin Guide :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/">stable (1.0)</option>
@@ -2211,20 +2211,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/kura-adapter-config/index.html b/docs/dev/admin-guide/kura-adapter-config/index.html
index 95e561d..c6831d4 100644
--- a/docs/dev/admin-guide/kura-adapter-config/index.html
+++ b/docs/dev/admin-guide/kura-adapter-config/index.html
@@ -21,19 +21,19 @@
<title>Kura Adapter Configuration :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/kura-adapter-config/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/kura-adapter-config/">stable (1.0)</option>
@@ -2555,20 +2555,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/monitoring-tracing-config/index.html b/docs/dev/admin-guide/monitoring-tracing-config/index.html
index f3b604a..7af06a1 100644
--- a/docs/dev/admin-guide/monitoring-tracing-config/index.html
+++ b/docs/dev/admin-guide/monitoring-tracing-config/index.html
@@ -21,19 +21,19 @@
<title>Monitoring & Tracing :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/monitoring-tracing-config/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/monitoring-tracing-config/">stable (1.0)</option>
@@ -2440,20 +2440,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/mqtt-adapter-config/index.html b/docs/dev/admin-guide/mqtt-adapter-config/index.html
index 9cd014c..d2636e1 100644
--- a/docs/dev/admin-guide/mqtt-adapter-config/index.html
+++ b/docs/dev/admin-guide/mqtt-adapter-config/index.html
@@ -21,19 +21,19 @@
<title>MQTT Adapter Configuration :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/mqtt-adapter-config/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/mqtt-adapter-config/">stable (1.0)</option>
@@ -2548,20 +2548,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/admin-guide/secure_communication/index.html b/docs/dev/admin-guide/secure_communication/index.html
index fb27c83..e3a105f 100644
--- a/docs/dev/admin-guide/secure_communication/index.html
+++ b/docs/dev/admin-guide/secure_communication/index.html
@@ -21,19 +21,19 @@
<title>Secure Communication :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/admin-guide/secure_communication/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/admin-guide/secure_communication/">stable (1.0)</option>
@@ -2513,20 +2513,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/authentication/index.html b/docs/dev/api/authentication/index.html
index eee5351..05926fd 100644
--- a/docs/dev/api/authentication/index.html
+++ b/docs/dev/api/authentication/index.html
@@ -21,19 +21,19 @@
<title>Authentication API Specification :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/authentication/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/authentication/">stable (1.0)</option>
@@ -2394,20 +2394,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/command-and-control/index.html b/docs/dev/api/command-and-control/index.html
index c6f1d69..37236ac 100644
--- a/docs/dev/api/command-and-control/index.html
+++ b/docs/dev/api/command-and-control/index.html
@@ -21,19 +21,19 @@
<title>Command & Control API Specification :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/command-and-control/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/command-and-control/">stable (1.0)</option>
@@ -2646,20 +2646,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/credentials/index.html b/docs/dev/api/credentials/index.html
index 779a8df..0de3abe 100644
--- a/docs/dev/api/credentials/index.html
+++ b/docs/dev/api/credentials/index.html
@@ -21,19 +21,19 @@
<title>Credentials API Specification :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/credentials/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/credentials/">stable (1.0)</option>
@@ -1371,7 +1371,7 @@
-<p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports the look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p>
+<p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports to look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p>
<p>Credentials are of a certain <em>type</em> which indicates which authentication mechanism the credentials can be used with. Each set of credentials also contains an <em>authentication identity</em> which is the identity claimed by the device during authentication. This authentication identity is usually different from the <em>device-id</em> the device has been registered under. A device may have multiple sets of credentials, using arbitrary <em>authentication identities</em>.</p>
@@ -1402,7 +1402,7 @@
<p><strong>Message Flow</strong></p>
<figure>
- <img src="getCredentials_Success.svg"
+ <img src="get-credentials-success.svg"
alt="A client sends a request message for looking up device credentials and receives a response containing the credentials"/> <figcaption>
<h4>Client looking up credentials for a device</h4>
</figcaption>
@@ -1446,7 +1446,7 @@
<td align="center">yes</td>
<td align="left"><em>properties</em></td>
<td align="left"><em>string</em></td>
-<td align="left">MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions">Preconditions</a>).</td>
+<td align="left">MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions-for-invoking-the-credentials-api">Preconditions</a>).</td>
</tr>
<tr>
@@ -2863,20 +2863,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/device-connection/index.html b/docs/dev/api/device-connection/index.html
index f1c8a22..5af435a 100644
--- a/docs/dev/api/device-connection/index.html
+++ b/docs/dev/api/device-connection/index.html
@@ -21,19 +21,19 @@
<title>Device Connection API Specification :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/device-connection/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/device-connection/">stable (1.0)</option>
@@ -1649,7 +1649,7 @@
<td align="center">yes</td>
<td align="left"><em>properties</em></td>
<td align="left"><em>string</em></td>
-<td align="left">MUST contain the source address that the client wants to received response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions">Preconditions</a>).</td>
+<td align="left">MUST contain the source address that the client wants to received response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions-for-invoking-the-device-connection-api">Preconditions</a>).</td>
</tr>
<tr>
@@ -2602,20 +2602,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/device-registration/index.html b/docs/dev/api/device-registration/index.html
index 0b29425..8bfb8ea 100644
--- a/docs/dev/api/device-registration/index.html
+++ b/docs/dev/api/device-registration/index.html
@@ -21,19 +21,19 @@
<title>Device Registration API Specification :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/device-registration/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/device-registration/">stable (1.0)</option>
@@ -1449,7 +1449,7 @@
<td align="center">yes</td>
<td align="left"><em>properties</em></td>
<td align="left"><em>string</em></td>
-<td align="left">MUST contain the source address that the client wants to received response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions">Preconditions</a>).</td>
+<td align="left">MUST contain the source address that the client wants to received response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions-for-invoking-the-device-registration-api">Preconditions</a>).</td>
</tr>
<tr>
@@ -2494,20 +2494,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/event/index.html b/docs/dev/api/event/index.html
index ae0d72e..063f810 100644
--- a/docs/dev/api/event/index.html
+++ b/docs/dev/api/event/index.html
@@ -21,19 +21,19 @@
<title>Event API Specification :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/event/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/event/">stable (1.0)</option>
@@ -2469,20 +2469,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/index.html b/docs/dev/api/index.html
index 01b08c1..4275c3b 100644
--- a/docs/dev/api/index.html
+++ b/docs/dev/api/index.html
@@ -21,19 +21,19 @@
<title>API :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/">stable (1.0)</option>
@@ -2213,20 +2213,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/index.xml b/docs/dev/api/index.xml
index ae2115d..53820e6 100644
--- a/docs/dev/api/index.xml
+++ b/docs/dev/api/index.xml
@@ -76,7 +76,7 @@
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.eclipse.org/hono/docs/dev/api/credentials/</guid>
- <description><p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports the look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p></description>
+ <description><p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports to look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p></description>
</item>
<item>
diff --git a/docs/dev/api/management/index.html b/docs/dev/api/management/index.html
index 0e6d198..3e0c478 100644
--- a/docs/dev/api/management/index.html
+++ b/docs/dev/api/management/index.html
@@ -21,19 +21,19 @@
<title>Device Registry Management API Specification :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -86,14 +86,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1204,7 +1204,7 @@
- <option id="stable" value="/hono/docs/api/management/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/management/">stable (1.0)</option>
@@ -2255,20 +2255,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/metrics/index.html b/docs/dev/api/metrics/index.html
index ac56c9b..edbdad3 100644
--- a/docs/dev/api/metrics/index.html
+++ b/docs/dev/api/metrics/index.html
@@ -21,19 +21,19 @@
<title>Metrics :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/metrics/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/metrics/">stable (1.0)</option>
@@ -1374,7 +1374,7 @@
<p>Hono uses <a href="https://micrometer.io/">Micrometer</a> in combination with Spring Boot
to internally collect metrics. Those metrics can be exported to different
-back ends. Please refer to <a href="/hono/docs/dev/admin-guide/monitoring-tracing-config/#configuring-metrics">Configuring Metrics</a>
+back ends. Please refer to <a href="/hono/docs/dev/admin-guide/monitoring-tracing-config/#configuring-a-metrics-back-end">Configuring Metrics</a>
for details.</p>
<p>The example deployment by default uses <a href="https://prometheus.io/">Prometheus</a> as the metrics back end.</p>
@@ -2468,20 +2468,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/telemetry/index.html b/docs/dev/api/telemetry/index.html
index 96c2177..4a17c2d 100644
--- a/docs/dev/api/telemetry/index.html
+++ b/docs/dev/api/telemetry/index.html
@@ -21,19 +21,19 @@
<title>Telemetry API Specification :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/telemetry/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/telemetry/">stable (1.0)</option>
@@ -2438,20 +2438,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/api/tenant/index.html b/docs/dev/api/tenant/index.html
index 5e3d670..7c0bbd7 100644
--- a/docs/dev/api/tenant/index.html
+++ b/docs/dev/api/tenant/index.html
@@ -21,19 +21,19 @@
<title>Tenant API Specification :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/api/tenant/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/api/tenant/">stable (1.0)</option>
@@ -1447,7 +1447,7 @@
<td align="center">yes</td>
<td align="left"><em>properties</em></td>
<td align="left"><em>string</em></td>
-<td align="left">MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions">Preconditions</a>).</td>
+<td align="left">MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client’s receive link (see <a href="#preconditions-for-invoking-the-tenant-api">Preconditions</a>).</td>
</tr>
<tr>
@@ -2898,20 +2898,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/architecture/auth/index.html b/docs/dev/architecture/auth/index.html
index e9dafbd..a13716d 100644
--- a/docs/dev/architecture/auth/index.html
+++ b/docs/dev/architecture/auth/index.html
@@ -21,19 +21,19 @@
<title>Authentication/Authorization :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/architecture/auth/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/architecture/auth/">stable (1.0)</option>
@@ -2289,20 +2289,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/architecture/component-view/index.html b/docs/dev/architecture/component-view/index.html
index 1676a2e..eeba3bb 100644
--- a/docs/dev/architecture/component-view/index.html
+++ b/docs/dev/architecture/component-view/index.html
@@ -21,19 +21,19 @@
<title>Component View :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/architecture/component-view/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/architecture/component-view/">stable (1.0)</option>
@@ -2288,20 +2288,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/architecture/index.html b/docs/dev/architecture/index.html
index f1aa162..17653d3 100644
--- a/docs/dev/architecture/index.html
+++ b/docs/dev/architecture/index.html
@@ -21,19 +21,19 @@
<title>Architecture :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/architecture/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/architecture/">stable (1.0)</option>
@@ -2211,20 +2211,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/categories/index.html b/docs/dev/categories/index.html
index ce43629..bd6bcb1 100644
--- a/docs/dev/categories/index.html
+++ b/docs/dev/categories/index.html
@@ -21,19 +21,19 @@
<title>Categories :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/categories/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/categories/">stable (1.0)</option>
@@ -2192,20 +2192,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/concepts/command-and-control/index.html b/docs/dev/concepts/command-and-control/index.html
index 684e1d2..0ef67bb 100644
--- a/docs/dev/concepts/command-and-control/index.html
+++ b/docs/dev/concepts/command-and-control/index.html
@@ -21,19 +21,19 @@
<title>Command & Control :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/command-and-control/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/command-and-control/">stable (1.0)</option>
@@ -1418,7 +1418,7 @@
<p>The <em>hono-cmd-req-id</em> response header is needed for the command response to correlate it. It has to be sent back from the device to the adapter in a following operation (5).</p>
<p>The device needs to respond to the command (5), to inform the business application about the outcome of executing the command. For this purpose
-specific URIs are defined in <a href="/hono/docs/dev/user-guide/http-adapter/#sending-a-response-to-a-previously-received-command">HTTP Adapter</a>.</p>
+specific URIs are defined in <a href="/hono/docs/dev/user-guide/http-adapter/#sending-a-response-to-a-command-authenticated-device">HTTP Adapter</a>.</p>
<p>The URI contains the <em>hono-cmd-req-id</em> and a status code indicating the outcome of executing the command.</p>
@@ -2347,20 +2347,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/concepts/connection-events/index.html b/docs/dev/concepts/connection-events/index.html
index 47ae153..ab0a9ed 100644
--- a/docs/dev/concepts/connection-events/index.html
+++ b/docs/dev/concepts/connection-events/index.html
@@ -21,19 +21,19 @@
<title>Connection Events :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/connection-events/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/connection-events/">stable (1.0)</option>
@@ -2248,20 +2248,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/concepts/device-identity/index.html b/docs/dev/concepts/device-identity/index.html
index 2b4d78f..247129d 100644
--- a/docs/dev/concepts/device-identity/index.html
+++ b/docs/dev/concepts/device-identity/index.html
@@ -21,19 +21,19 @@
<title>Device Identity :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/device-identity/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/device-identity/">stable (1.0)</option>
@@ -2263,20 +2263,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/concepts/device-notifications/index.html b/docs/dev/concepts/device-notifications/index.html
index 49bbcb0..193f3df 100644
--- a/docs/dev/concepts/device-notifications/index.html
+++ b/docs/dev/concepts/device-notifications/index.html
@@ -21,19 +21,19 @@
<title>Device Notifications :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/device-notifications/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/device-notifications/">stable (1.0)</option>
@@ -2339,20 +2339,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/concepts/index.html b/docs/dev/concepts/index.html
index 997ee46..168e3a7 100644
--- a/docs/dev/concepts/index.html
+++ b/docs/dev/concepts/index.html
@@ -21,19 +21,19 @@
<title>Concepts :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/">stable (1.0)</option>
@@ -2208,20 +2208,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/concepts/resource-limits/index.html b/docs/dev/concepts/resource-limits/index.html
index 71ad13f..f1e1a3f 100644
--- a/docs/dev/concepts/resource-limits/index.html
+++ b/docs/dev/concepts/resource-limits/index.html
@@ -21,19 +21,19 @@
<title>Resource limits :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/resource-limits/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/resource-limits/">stable (1.0)</option>
@@ -2275,20 +2275,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/concepts/tenancy/index.html b/docs/dev/concepts/tenancy/index.html
index 6cc66f1..a0be8de 100644
--- a/docs/dev/concepts/tenancy/index.html
+++ b/docs/dev/concepts/tenancy/index.html
@@ -21,19 +21,19 @@
<title>Multi-Tenancy :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/concepts/tenancy/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/concepts/tenancy/">stable (1.0)</option>
@@ -2377,20 +2377,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/deployment/create-kubernetes-cluster/index.html b/docs/dev/deployment/create-kubernetes-cluster/index.html
index dfa1b2f..0d4f82c 100644
--- a/docs/dev/deployment/create-kubernetes-cluster/index.html
+++ b/docs/dev/deployment/create-kubernetes-cluster/index.html
@@ -21,19 +21,19 @@
<title>Setting up a Kubernetes Cluster :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/deployment/create-kubernetes-cluster/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/deployment/create-kubernetes-cluster/">stable (1.0)</option>
@@ -2372,20 +2372,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/deployment/helm-based-deployment/index.html b/docs/dev/deployment/helm-based-deployment/index.html
index 3038ab2..fd7f0cd 100644
--- a/docs/dev/deployment/helm-based-deployment/index.html
+++ b/docs/dev/deployment/helm-based-deployment/index.html
@@ -21,19 +21,19 @@
<title>Helm based Deployment :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/deployment/helm-based-deployment/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/deployment/helm-based-deployment/">stable (1.0)</option>
@@ -2805,20 +2805,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/deployment/index.html b/docs/dev/deployment/index.html
index 16f6ca8..2556ebd 100644
--- a/docs/dev/deployment/index.html
+++ b/docs/dev/deployment/index.html
@@ -21,19 +21,19 @@
<title>Deployment :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/deployment/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/deployment/">stable (1.0)</option>
@@ -2211,20 +2211,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/deployment/openshift/index.html b/docs/dev/deployment/openshift/index.html
index 3c1a7c1..1608511 100644
--- a/docs/dev/deployment/openshift/index.html
+++ b/docs/dev/deployment/openshift/index.html
@@ -21,19 +21,19 @@
<title>OpenShift / OKD :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/deployment/openshift/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/deployment/openshift/">stable (1.0)</option>
@@ -2232,20 +2232,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/deployment/openshift_01_hono_ready.png b/docs/dev/deployment/openshift_01_hono_ready.png
deleted file mode 100644
index d0f15ed..0000000
--- a/docs/dev/deployment/openshift_01_hono_ready.png
+++ /dev/null
Binary files differ
diff --git a/docs/dev/deployment/openshift_09_enmasse_ready.png b/docs/dev/deployment/openshift_09_enmasse_ready.png
deleted file mode 100644
index d8bb4b3..0000000
--- a/docs/dev/deployment/openshift_09_enmasse_ready.png
+++ /dev/null
Binary files differ
diff --git a/docs/dev/deployment/resource-limitation/index.html b/docs/dev/deployment/resource-limitation/index.html
index 8746547..cd9a3d8 100644
--- a/docs/dev/deployment/resource-limitation/index.html
+++ b/docs/dev/deployment/resource-limitation/index.html
@@ -21,19 +21,19 @@
<title>Limiting Resource Usage :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/deployment/resource-limitation/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/deployment/resource-limitation/">stable (1.0)</option>
@@ -2311,20 +2311,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/dev-guide/building_hono/index.html b/docs/dev/dev-guide/building_hono/index.html
index 819a248..6b05ff4 100644
--- a/docs/dev/dev-guide/building_hono/index.html
+++ b/docs/dev/dev-guide/building_hono/index.html
@@ -21,19 +21,19 @@
<title>Building from Source :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/dev-guide/building_hono/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/dev-guide/building_hono/">stable (1.0)</option>
@@ -2295,20 +2295,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/dev-guide/custom_http_adapter/index.html b/docs/dev/dev-guide/custom_http_adapter/index.html
index 0cc1b3e..e328a2d 100644
--- a/docs/dev/dev-guide/custom_http_adapter/index.html
+++ b/docs/dev/dev-guide/custom_http_adapter/index.html
@@ -21,19 +21,19 @@
<title>Implement a Custom Hono HTTP Protocol Adapter :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/dev-guide/custom_http_adapter/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/dev-guide/custom_http_adapter/">stable (1.0)</option>
@@ -2343,20 +2343,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/dev-guide/index.html b/docs/dev/dev-guide/index.html
index 2ab212e..452d47c 100644
--- a/docs/dev/dev-guide/index.html
+++ b/docs/dev/dev-guide/index.html
@@ -21,19 +21,19 @@
<title>Developer Guide :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/dev-guide/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/dev-guide/">stable (1.0)</option>
@@ -2211,20 +2211,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/dev-guide/java_client_consumer/index.html b/docs/dev/dev-guide/java_client_consumer/index.html
index ebe1770..42bb1e0 100644
--- a/docs/dev/dev-guide/java_client_consumer/index.html
+++ b/docs/dev/dev-guide/java_client_consumer/index.html
@@ -21,19 +21,19 @@
<title>Consuming Messages from Java :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/dev-guide/java_client_consumer/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/dev-guide/java_client_consumer/">stable (1.0)</option>
@@ -2313,20 +2313,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/index.html b/docs/dev/index.html
index 4936cb2..6963a14 100644
--- a/docs/dev/index.html
+++ b/docs/dev/index.html
@@ -21,19 +21,19 @@
<title>Documentation :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/">stable (1.0)</option>
@@ -2163,20 +2163,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/index.json b/docs/dev/index.json
index 2177a1a..db6bf2d 100644
--- a/docs/dev/index.json
+++ b/docs/dev/index.json
@@ -88,7 +88,7 @@
"title": "AMQP Adapter",
"tags": [],
"description": "",
- "content": "The AMQP protocol adapter allows clients (devices or gateway components) supporting the AMQP 1.0 protocol to publish messages to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry, Event and Command \u0026amp; Control endpoints.\nDevice Authentication By default, all Hono protocol adapters require clients (devices or gateway components) to authenticate during connection establishment. This is the preferred way for devices to publish data via protocol adapters. The AMQP adapter supports both the SASL PLAIN and SASL EXTERNAL authentication mechanisms. The former uses a username and password to authenticate to the adapter while the latter uses a client certificate.\nIn this guide, we will give examples for publishing telemetry and events for authenticated (using SASL PLAIN) and unauthenticated clients.\nNB The AMQP adapter can be configured to allow unauthenticated devices to connect by setting configuration variable HONO_AMQP_AUTHENTICATION_REQUIRED to false.\nSASL PLAIN Authentication The AMQP adapter supports authenticating clients using a username and password. This means that clients need to provide a username and a password when connecting to the AMQP adapter. If the adapter is configured for multi-tenancy (i.e HONO_AMQP_SINGLE_TENANT is set to false), then the username must match the pattern [auth-id@tenant], e.g. sensor1@DEFAULT_TENANT. Otherwise the DEFAULT_TENANT is assumed and the tenant-id can be omitted from the username.\nThe adapter verifies the credentials provided by the client against the credentials that the Credentials Service has on record for the device. If the credentials match, then authentication is successful and the client device can proceed to publish messages to Hono.\nThe examples below refer to devices 4711 and gw-1 of tenant DEFAULT_TENANT using auth-ids sensor1 and gw1 and corresponding passwords. The example deployment as described in the Deployment Guides comes pre-configured with the corresponding entities in its device registry component.\nNB There is a subtle difference between the device identifier (device-id) and the auth-id a device uses for authentication. See Device Identity for a discussion of the concepts.\nSASL EXTERNAL Authentication When a device uses a client certificate for authentication, the TLS handshake is initiated during TCP connection establishment. If no trust anchor is configured for the AMQP adapter, the TLS handshake will succeed only if the certificate has not yet expired. Once the TLS handshake completes and a secure connection is established, the certificate\u0026rsquo;s signature is checked during the SASL handshake. To complete the SASL handshake and authenticate the client, the adapter performs the following steps:\n Adapter extracts the client certificate\u0026rsquo;s Issuer DN and uses it to us the Tenant service to look up the tenant that the client belongs to. In order for the lookup to succeed, the tenant’s trust anchor needs to be configured by means of registering the trusted certificate authority. If the lookup succeeds, the Tenant service returns the tenant, thus implicitly establishing the tenant that the device belongs to. Adapter validates the device’s client certificate using the registered trust anchor for the tenant. Finally, adapter authenticates the client certificate using Hono\u0026rsquo;s credentials API. In this step, the adapter uses the client certificate’s Subject DN (as authentication identifier) and x509-cert (for the credentials type) in order to determine the device ID. NB The AMQP adapter needs to be configured for TLS in order to support this mechanism.\nConnection Limits After verifying the credentials, the number of existing connections is checked against the configured resource-limits by the AMQP adapter. If the limit is exceeded then the connection request is not accepted.\nMessage Limits Before accepting any telemetry or event or command messages, the AMQP adapter verifies that the configured message limit is not exceeded. The incoming message is discarded if the limit is exceeded.\nConnection Event The AMQP Adapter can send a Connection Event once the connection with a device has been successfully established or ended. Note that this requires the HONO_CONNECTION_EVENTS_PRODUCER configuration property to be explicitly set to events.\nLink Establishment The AMQP adapter supports the Anonymous Terminus for Message Routing specification and requires clients to create a single sender link using the null target address for publishing all types of messages to the AMQP adapter.\nUsing AT MOST ONCE delivery semantics, the client will not wait for the message to be accepted and settled by the downstream consumer. However, with AT LEAST ONCE, the client sends the message and waits for the message to be delivered to and accepted by the downstream consumer. If the message cannot be delivered due to a failure, the client will be notified.\nThe client indicates its preferred message delivery mode by means of the snd-settle-mode and rcv-settle-mode fields of its attach frame during link establishment. Clients should use mixed as the snd-settle-mode and first as the rcv-settle-mode in order to be able to use the same link for sending all types of messages using different delivery semantics as described in the following sections.\nError Handling The AMQP adapter distinguishes between two types of errors when a message is published using at least once:\n An error caused by the client side, e.g invalid message address, content-type, adapter disabled for tenant etc. An error caused by the server side, e.g no downstream consumers registered, downstream connection loss etc. For a client side error, the adapter settles the message transfer with the rejected outcome and provides an error description in the corresponding disposition frame. In the case of a server-side error, the adapter settles the message with the released outcome, indicating to the client that the message itself was OK but it cannot be delivered due to a failure beyond the control of the client. In the latter case, a client may attempt to re-send the message unaltered.\nAMQP Command-line Client For purposes of demonstrating the usage of the AMQP adapter, the Hono CLI Module contains an AMQP command-line client for interacting with the AMQP adapter. The client can be used to send telemetry or events and to receive/respond to command request messages.\nThe command-line client supports the following parameters (with default values):\n --spring.profiles.active=amqp-send: Profile for sending telemetry data or events to Hono. --spring.profiles.active=amqp-command: Profile for receiving and responding to command request messages. --message.address: The AMQP 1.0 message address (default: telemetry) --message.payload: The message payload body (default: '{\u0026quot;temp\u0026quot;: 5}') --hono.client.host: The host name that the AMQP adapter is running on (default: localhost) --hono.client.port: The port that the adapter is listening for incoming connections (default: 5672) To run the client to send a telemetry message to Hono, open a terminal and execute the following:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret Accepted{} The client prints the outcome of the operation to standard out. The outcome above (Accepted) indicates that the request to upload the data has succeeded.\nNB There are two JAR files in the hono/cli/target directory. The JAR to use for the client is the hono-cli-$VERSION-exec.jar and not the hono-cli-$VERSION.jar file. Running the latter will not work and will output the message: no main manifest attribute, in hono-cli-$VERSION.jar\nPublishing Telemetry Data The client indicates the delivery mode to use when uploading telemetry messages by means of the settled and rcv-settle-mode properties of the AMQP transfer frame(s) it uses for uploading the message. The AMQP adapter will accept messages using a delivery mode according to the following table:\n settled rcv-settle-mode Delivery semantics false first The adapter will forward the message to the downstream AMQP 1.0 Messaging Network and will forward any AMQP disposition frame received from the AMQP 1.0 Messaging Network to the client as is. It is up to the client\u0026rsquo;s discretion if and how it processes the disposition frame. The adapter will accept any re-delivered message. Sending unsettled messages allows for clients to implement either AT LEAST ONCE or AT MOST ONCE delivery semantics, depending on whether a client actually waits for and considers the disposition frames it receives from the adapter or not. This is the recommended mode for uploading telemetry data. true first The adapter will acknowledge and settle any received message spontaneously before forwarding it to the downstream AMQP 1.0 Messaging Network. The adapter will ignore any AMQP disposition frames it receives from the AMQP 1.0 Messaging Network. Sending pre-settled messages allows for clients to implement AT MOST ONCE delivery semantics only. This is the fastest mode of delivery but has the drawback of less reliable end-to-end flow control and potential loss of messages without notice. All other combinations are not supported by the adapter and will result in the message being ignored (pre-settled) or rejected (unsettled).\nPublish Telemetry Data (authenticated Device) The AMQP adapter supports publishing of telemetry data to Hono\u0026rsquo;s Telemetry API. Telemetry messages can be published using either AT LEAST ONCE or AT MOST ONCE delivery semantics.\n Message Address: telemetry or t This refers to the to property of the message. Settlement Mode: presettled (AT MOST ONCE) or unsettled (AT LEAST ONCE) Authentication: SASL PLAIN or SASL EXTERNAL Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to one of the following: (hono:bad-request): Request rejected due to a bad client request. (amqp:unauthorized-access): Request rejected because the adapter is disabled for tenant. (amqp:precondition-failed): Request does not fulfill certain requirements e.g adapter cannot assert device registration etc. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. When a device publishes data to the telemetry address, the AMQP adapter automatically determines the device\u0026rsquo;s identity and tenant during the authentication process.\nExample\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret Notice that we only supplied a new value for the message address, leaving the other default values.\nPublish some JSON data for device 4711 using a client certificate for authentication:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.port=5671 --hono.client.certPath=config/hono-demo-certs-jar/device-4711-cert.pem --hono.client.keyPath=config/hono-demo-certs-jar/device-4711-key.pem --hono.client.trustStorePath=config/hono-demo-certs-jar/trusted-certs.pem --hono.client.hostnameVerificationRequired=false Publish Telemetry Data (unauthenticated Device) Message Address: telemetry/${tenant-id}/${device-id} or t/${tenant-id}/${device-id} Settlement Mode: presettled (AT MOST ONCE) or unsettled (AT LEAST ONCE) Authentication: none Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. Note how verbose the address is for unauthenticated devices. This address can be used by devices that have not authenticated to the protocol adapter. This requires the HONO_AMQP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false before starting the protocol adapter.\nExamples\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --message.address=t/DEFAULT_TENANT/4711 Publish Telemetry Data (authenticated Gateway) A device that publishes data on behalf of another device is called a gateway device. The message address is used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the message address is used to identify the device that the gateway publishes data for.\nExamples\nA gateway connecting to the adapter using gw@DEFAULT_TENANT as username and gw-secret as password and then publishing some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=gw@DEFAULT_TENANT --hono.client.password=gw-secret --message.address=t/DEFAULT_TENANT/4711 In this example, we are using message address t/DEFAULT_TENANT/4711 which contains the device that the gateway is publishing the message for.\nPublishing Events The adapter supports AT LEAST ONCE delivery of Event messages only. A client therefore MUST set the settled property to false and the rcv-settle-mode property to first in all transfer frame(s) it uses for uploading events. All other combinations are not supported by the adapter and result in the message being rejected.\nPublish an Event (authenticated Device) Message Address: event or e Settlement Mode: unsettled (AT LEAST ONCE) Authentication: SASL PLAIN or SASL EXTERNAL Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. This is the preferred way for devices to publish events. It is available only if the protocol adapter has been configured to require devices to authenticate (which is the default).\nExample\nUpload a JSON string for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret --message.address=event --message.payload='{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (unauthenticated Device) Message Address: event/${tenant-id}/${device-id} or e/${tenant-id}/${device-id} Settlement Mode: unsettled (AT LEAST ONCE) Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. This address format is used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_AMQP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --message.address=e/DEFAULT_TENANT/4711 --message.payload='{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (authenticated Gateway) Examples\nA gateway connecting to the adapter using gw@DEFAULT_TENANT as username and gw-secret as password and then publishing some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=gw@DEFAULT_TENANT --hono.client.password=gw-secret --message.address=e/DEFAULT_TENANT/4711 In this example, we are using message address e/DEFAULT_TENANT/4711 which contains the device that the gateway is publishing the message for.\nCommand \u0026amp; Control The AMQP adapter supports devices to receive commands that have been sent by business applications by means of opening a receiver link using a device specific source address as described below. When a device no longer wants to receive commands anymore, it can simply close the link.\nWhen a device has successfully opened a receiver link for commands, the adapter sends an empty notification on behalf of the device to the downstream AMQP 1.0 Messaging Network with the ttd header set to -1, indicating that the device will be ready to receive commands until further notice. Analogously, the adapter sends an empty notification with the ttd header set to 0 when a device closes the link or disconnects.\nDevices send their responses to commands by means of sending an AMQP message with properties specific to the command that has been executed. The AMQP adapter accepts responses being published using either at most once (QoS 0) or at least once (QoS 1) delivery semantics. The device must send the command response messages using the same (sender) link that it uses for sending telemetry data and events.\nThe AMQP adapter checks the configured message limit before accepting any command requests and responses. In case of incoming command requests from business applications or the command responses from devices, if the message limit is exceeded, the Adapter rejects the message with the reason amqp:resource-limit-exceeded.\nReceiving Commands A device MUST use the following source address in its attach frame to open a link for receiving commands:\n command (authenticated device) command (authenticated gateway receiving commands for all devices it acts on behalf of) command/${tenant}/${device-id} (unauthenticated device) command/${tenant}/${device-id} (authenticated gateway receiving commands for a specific device it acts on behalf of) Note Previous versions of Hono used control instead of command as address prefix. Using the control prefix is still supported but deprecated. The adapter supports AT LEAST ONCE delivery of command messages only. A client therefore MUST use unsettled for the snd-settle-mode and first for the rcv-settle-mode fields of its attach frame during link establishment. All other combinations are not supported and result in the termination of the link.\nOnce the link has been established, the adapter will send command messages having the following properties:\n Name Mandatory Location Type Description subject yes properties string Contains the name of the command to be executed. reply-to no properties string Contains the address to which the command response should be sent. This property will be empty for one-way commands. correlation-id no properties string This property will be empty for one-way commands, otherwise it will contain the identifier used to correlate the response with the command request. device_id no application-properties string This property will only be set if an authenticated gateway has connected to the adapter. It will contain the id of the device (connected to the gateway) that the command is targeted at. Authenticated gateways will receive commands for devices which do not connect to a protocol adapter directly but instead are connected to the gateway. Corresponding devices have to be configured so that they can be used with a gateway. See Configuring Gateway Devices for details.\nIf a device is configured in such a way that there can be one gateway, acting on behalf of the device, a command sent to this device will by default be directed to that gateway.\nIf a device is configured to be used with multiple gateways, the particular gateway that last acted on behalf of the device will be the target that commands for that device will be routed to. The mapping of device and gateway last used by the device is updated whenever a device sends a telemetry, event or command response message via the gateway. This means that for a device configured to be used via multiple gateways to receive commands, the device first has to send at least one telemetry or event message to establish which gateway to use for receiving commands for that device.\nSending a Response to a Command A device only needs to respond to commands that contain a reply-to address and a correlation-id. However, if the application expects a response, then devices must publish a response back to the application. Devices may use the same anonymous sender link for this purpose that they also use for sending telemetry data and events.\nThe adapter supports AT LEAST ONCE delivery of command response messages only. A client therefore MUST set the settled property to true and the rcv-settle-mode property to first in all transfer frame(s) it uses for uploading command responses. All other combinations are not supported by the adapter and result in the message being rejected.\nThe table below provides an overview of the properties that must be set on a command response message:\n Name Mandatory Location Type Description to yes properties string MUST contain the value of the reply-to property of the command request message. correlation-id yes properties string MUST contain the value of the correlation-id property of the command request message. status yes application-properties integer MUST contain a status code indicating the outcome of processing the command at the device (see Command \u0026amp; Control API for details). Examples The AMQP adapter client can be used to simulate a device which receives commands and sends responses back to the application. The command line client is used to simulate an application sending commands to devices and receiving command responses from devices.\nStart the AMQP adapter client, as follows:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-command --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret After successfully starting the client, a message indicating that the device is ready to receive commands will be printed to standard output. The device is now waiting to receive commands from applications.\nTo send a command to the device, open a new terminal shell and start the command application, as shown below:\n# in directory: hono/cli/ java -jar target/hono-cli-*-exec.jar --hono.client.host=localhost --hono.client.username=consumer@HONO --hono.client.password=verysecret --spring.profiles.active=command,ssl Note Change into the cli directory before running the command above to start the command application. If you change into the target directory (i.e cli/target), then the client will not be able to locate to certificate needed to connect to the messaging network. Once the command application starts successfully, enter a command name, payload and content-type of the command to send to the device.\n\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter name of command for device [DEFAULT_TENANT:4711] (prefix with 'ow:' to send one-way command): setBrightness \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter command payload: some-payload \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter content type: text/plain After sending the command, the device (i.e. AMQP command client) will print out the command name and payload that it receives and automatically sends a command response to the application.\nReceived Command Message : [Command name: setBrightness, Command payload: some-payload] Command response sent [outcome: Accepted{}] Downstream Meta Data The adapter includes the following meta data in the application properties of messages being sent downstream:\n Name Type Description device_id string The identifier of the device that the message originates from. orig_adapter string Contains the adapter\u0026rsquo;s type name which can be used by downstream consumers to determine the protocol adapter that the message has been received over. The AMQP adapter\u0026rsquo;s type name is hono-amqp. orig_address string Contains the AMQP target address that the device has used to send the data. The adapter also considers defaults registered for the device at either the tenant or the device level. The values of the default properties are determined as follows:\n If the message already contains a non-empty property of the same name, the value if unchanged. Otherwise, if a default property of the same name is defined in the device\u0026rsquo;s registration information, that value is used. Otherwise, if a default property of the same name is defined for the tenant that the device belongs to, that value is used. Note that of the standard AMQP 1.0 message properties only the content-type and ttl can be set this way to a default value.\nEvent Message Time-to-live Events published by devices will usually be persisted by the AMQP Messaging Network in order to support deferred delivery to downstream consumers. In most cases the AMQP Messaging Network can be configured with a maximum time-to-live to apply to the events so that the events will be removed from the persistent store if no consumer has attached to receive the event before the message expires.\nIn order to support environments where the AMQP Messaging Network cannot be configured accordingly, the protocol adapter supports setting a downstream event message\u0026rsquo;s ttl property based on the default ttl and max-ttl values configured for a tenant/device as described in the Tenant API.\nTenant specific Configuration The adapter uses the Tenant API to retrieve tenant specific configuration for adapter type hono-amqp. The following properties are (currently) supported:\n Name Type Default Value Description enabled boolean true If set to false the adapter will reject all data from devices belonging to the tenant and respond with a amqp:unauthorized-access as the error condition value for rejecting the message. "
+ "content": "The AMQP protocol adapter allows clients (devices or gateway components) supporting the AMQP 1.0 protocol to publish messages to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry, Event and Command \u0026amp; Control endpoints.\nDevice Authentication By default, all Hono protocol adapters require clients (devices or gateway components) to authenticate during connection establishment. This is the preferred way for devices to publish data via protocol adapters. The AMQP adapter supports both the SASL PLAIN and SASL EXTERNAL authentication mechanisms. The former uses a username and password to authenticate to the adapter while the latter uses a client certificate.\nIn this guide, we will give examples for publishing telemetry and events for authenticated (using SASL PLAIN) and unauthenticated clients.\nNB The AMQP adapter can be configured to allow unauthenticated devices to connect by setting configuration variable HONO_AMQP_AUTHENTICATION_REQUIRED to false.\nSASL PLAIN Authentication The AMQP adapter supports authenticating clients using a username and password. This means that clients need to provide a username and a password when connecting to the AMQP adapter. If the adapter is configured for multi-tenancy (i.e HONO_AMQP_SINGLE_TENANT is set to false), then the username must match the pattern [auth-id@tenant], e.g. sensor1@DEFAULT_TENANT. Otherwise the DEFAULT_TENANT is assumed and the tenant-id can be omitted from the username.\nThe adapter verifies the credentials provided by the client against the credentials the configured Credentials service has on record for the client. If the credentials match, then authentication is successful and the client device can proceed to publish messages to Hono.\nThe examples below refer to devices 4711 and gw-1 of tenant DEFAULT_TENANT using auth-ids sensor1 and gw1 and corresponding passwords. The example deployment as described in the Deployment Guides comes pre-configured with the corresponding entities in its device registry component.\nNB There is a subtle difference between the device identifier (device-id) and the auth-id a device uses for authentication. See Device Identity for a discussion of the concepts.\nSASL EXTERNAL Authentication When a device uses a client certificate for authentication, the TLS handshake is initiated during TCP connection establishment. If no trust anchor is configured for the AMQP adapter, the TLS handshake will succeed only if the certificate has not yet expired. Once the TLS handshake completes and a secure connection is established, the certificate\u0026rsquo;s signature is checked during the SASL handshake. To complete the SASL handshake and authenticate the client, the adapter performs the following steps:\n Adapter extracts the client certificate\u0026rsquo;s Issuer DN and uses it to us the Tenant service to look up the tenant that the client belongs to. In order for the lookup to succeed, the tenant’s trust anchor needs to be configured by means of registering the trusted certificate authority. If the lookup succeeds, the Tenant service returns the tenant, thus implicitly establishing the tenant that the device belongs to. Adapter validates the device’s client certificate using the registered trust anchor for the tenant. Finally, adapter authenticates the client certificate using Hono\u0026rsquo;s credentials API. In this step, the adapter uses the client certificate’s Subject DN (as authentication identifier) and x509-cert (for the credentials type) in order to determine the device ID. NB The AMQP adapter needs to be configured for TLS in order to support this mechanism.\nConnection Limits After verifying the credentials, the number of existing connections is checked against the configured resource-limits by the AMQP adapter. If the limit is exceeded then the connection request is not accepted.\nMessage Limits Before accepting any telemetry or event or command messages, the AMQP adapter verifies that the configured message limit is not exceeded. The incoming message is discarded if the limit is exceeded.\nConnection Event The AMQP Adapter can send a Connection Event once the connection with a device has been successfully established or ended. Note that this requires the HONO_CONNECTION_EVENTS_PRODUCER configuration property to be explicitly set to events.\nLink Establishment The AMQP adapter supports the Anonymous Terminus for Message Routing specification and requires clients to create a single sender link using the null target address for publishing all types of messages to the AMQP adapter.\nUsing AT MOST ONCE delivery semantics, the client will not wait for the message to be accepted and settled by the downstream consumer. However, with AT LEAST ONCE, the client sends the message and waits for the message to be delivered to and accepted by the downstream consumer. If the message cannot be delivered due to a failure, the client will be notified.\nThe client indicates its preferred message delivery mode by means of the snd-settle-mode and rcv-settle-mode fields of its attach frame during link establishment. Clients should use mixed as the snd-settle-mode and first as the rcv-settle-mode in order to be able to use the same link for sending all types of messages using different delivery semantics as described in the following sections.\nError Handling The AMQP adapter distinguishes between two types of errors when a message is published using at least once:\n An error caused by the client side, e.g invalid message address, content-type, adapter disabled for tenant etc. An error caused by the server side, e.g no downstream consumers registered, downstream connection loss etc. For a client side error, the adapter settles the message transfer with the rejected outcome and provides an error description in the corresponding disposition frame. In the case of a server-side error, the adapter settles the message with the released outcome, indicating to the client that the message itself was OK but it cannot be delivered due to a failure beyond the control of the client. In the latter case, a client may attempt to re-send the message unaltered.\nAMQP Command-line Client For purposes of demonstrating the usage of the AMQP adapter, the Hono CLI Module contains an AMQP command-line client for interacting with the AMQP adapter. The client can be used to send telemetry or events and to receive/respond to command request messages.\nThe command-line client supports the following parameters (with default values):\n --spring.profiles.active=amqp-send: Profile for sending telemetry data or events to Hono. --spring.profiles.active=amqp-command: Profile for receiving and responding to command request messages. --message.address: The AMQP 1.0 message address (default: telemetry) --message.payload: The message payload body (default: '{\u0026quot;temp\u0026quot;: 5}') --hono.client.host: The host name that the AMQP adapter is running on (default: localhost) --hono.client.port: The port that the adapter is listening for incoming connections (default: 5672) To run the client to send a telemetry message to Hono, open a terminal and execute the following:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret Accepted{} The client prints the outcome of the operation to standard out. The outcome above (Accepted) indicates that the request to upload the data has succeeded.\nNB There are two JAR files in the hono/cli/target directory. The JAR to use for the client is the hono-cli-$VERSION-exec.jar and not the hono-cli-$VERSION.jar file. Running the latter will not work and will output the message: no main manifest attribute, in hono-cli-$VERSION.jar\nPublishing Telemetry Data The client indicates the delivery mode to use when uploading telemetry messages by means of the settled and rcv-settle-mode properties of the AMQP transfer frame(s) it uses for uploading the message. The AMQP adapter will accept messages using a delivery mode according to the following table:\n settled rcv-settle-mode Delivery semantics false first The adapter will forward the message to the downstream AMQP 1.0 Messaging Network and will forward any AMQP disposition frame received from the AMQP 1.0 Messaging Network to the client as is. It is up to the client\u0026rsquo;s discretion if and how it processes the disposition frame. The adapter will accept any re-delivered message. Sending unsettled messages allows for clients to implement either AT LEAST ONCE or AT MOST ONCE delivery semantics, depending on whether a client actually waits for and considers the disposition frames it receives from the adapter or not. This is the recommended mode for uploading telemetry data. true first The adapter will acknowledge and settle any received message spontaneously before forwarding it to the downstream AMQP 1.0 Messaging Network. The adapter will ignore any AMQP disposition frames it receives from the AMQP 1.0 Messaging Network. Sending pre-settled messages allows for clients to implement AT MOST ONCE delivery semantics only. This is the fastest mode of delivery but has the drawback of less reliable end-to-end flow control and potential loss of messages without notice. All other combinations are not supported by the adapter and will result in the message being ignored (pre-settled) or rejected (unsettled).\nPublish Telemetry Data (authenticated Device) The AMQP adapter supports publishing of telemetry data to Hono\u0026rsquo;s Telemetry API. Telemetry messages can be published using either AT LEAST ONCE or AT MOST ONCE delivery semantics.\n Message Address: telemetry or t This refers to the to property of the message. Settlement Mode: presettled (AT MOST ONCE) or unsettled (AT LEAST ONCE) Authentication: SASL PLAIN or SASL EXTERNAL Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to one of the following: (hono:bad-request): Request rejected due to a bad client request. (amqp:unauthorized-access): Request rejected because the adapter is disabled for tenant. (amqp:precondition-failed): Request does not fulfill certain requirements e.g adapter cannot assert device registration etc. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. When a device publishes data to the telemetry address, the AMQP adapter automatically determines the device\u0026rsquo;s identity and tenant during the authentication process.\nExample\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret Notice that we only supplied a new value for the message address, leaving the other default values.\nPublish some JSON data for device 4711 using a client certificate for authentication:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.port=5671 --hono.client.certPath=config/hono-demo-certs-jar/device-4711-cert.pem --hono.client.keyPath=config/hono-demo-certs-jar/device-4711-key.pem --hono.client.trustStorePath=config/hono-demo-certs-jar/trusted-certs.pem --hono.client.hostnameVerificationRequired=false Publish Telemetry Data (unauthenticated Device) Message Address: telemetry/${tenant-id}/${device-id} or t/${tenant-id}/${device-id} Settlement Mode: presettled (AT MOST ONCE) or unsettled (AT LEAST ONCE) Authentication: none Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. Note how verbose the address is for unauthenticated devices. This address can be used by devices that have not authenticated to the protocol adapter. This requires the HONO_AMQP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false before starting the protocol adapter.\nExamples\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --message.address=t/DEFAULT_TENANT/4711 Publish Telemetry Data (authenticated Gateway) A device that publishes data on behalf of another device is called a gateway device. The message address is used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the message address is used to identify the device that the gateway publishes data for.\nExamples\nA gateway connecting to the adapter using gw@DEFAULT_TENANT as username and gw-secret as password and then publishing some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=gw@DEFAULT_TENANT --hono.client.password=gw-secret --message.address=t/DEFAULT_TENANT/4711 In this example, we are using message address t/DEFAULT_TENANT/4711 which contains the device that the gateway is publishing the message for.\nPublishing Events The adapter supports AT LEAST ONCE delivery of Event messages only. A client therefore MUST set the settled property to false and the rcv-settle-mode property to first in all transfer frame(s) it uses for uploading events. All other combinations are not supported by the adapter and result in the message being rejected.\nPublish an Event (authenticated Device) Message Address: event or e Settlement Mode: unsettled (AT LEAST ONCE) Authentication: SASL PLAIN or SASL EXTERNAL Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. This is the preferred way for devices to publish events. It is available only if the protocol adapter has been configured to require devices to authenticate (which is the default).\nExample\nUpload a JSON string for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret --message.address=event --message.payload='{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (unauthenticated Device) Message Address: event/${tenant-id}/${device-id} or e/${tenant-id}/${device-id} Settlement Mode: unsettled (AT LEAST ONCE) Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. This address format is used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_AMQP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --message.address=e/DEFAULT_TENANT/4711 --message.payload='{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (authenticated Gateway) Examples\nA gateway connecting to the adapter using gw@DEFAULT_TENANT as username and gw-secret as password and then publishing some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=gw@DEFAULT_TENANT --hono.client.password=gw-secret --message.address=e/DEFAULT_TENANT/4711 In this example, we are using message address e/DEFAULT_TENANT/4711 which contains the device that the gateway is publishing the message for.\nCommand \u0026amp; Control The AMQP adapter supports devices to receive commands that have been sent by business applications by means of opening a receiver link using a device specific source address as described below. When a device no longer wants to receive commands anymore, it can simply close the link.\nWhen a device has successfully opened a receiver link for commands, the adapter sends an empty notification on behalf of the device to the downstream AMQP 1.0 Messaging Network with the ttd header set to -1, indicating that the device will be ready to receive commands until further notice. Analogously, the adapter sends an empty notification with the ttd header set to 0 when a device closes the link or disconnects.\nDevices send their responses to commands by means of sending an AMQP message with properties specific to the command that has been executed. The AMQP adapter accepts responses being published using either at most once (QoS 0) or at least once (QoS 1) delivery semantics. The device must send the command response messages using the same (sender) link that it uses for sending telemetry data and events.\nThe AMQP adapter checks the configured message limit before accepting any command requests and responses. In case of incoming command requests from business applications or the command responses from devices, if the message limit is exceeded, the Adapter rejects the message with the reason amqp:resource-limit-exceeded.\nReceiving Commands A device MUST use the following source address in its attach frame to open a link for receiving commands:\n command (authenticated device) command (authenticated gateway receiving commands for all devices it acts on behalf of) command/${tenant}/${device-id} (unauthenticated device) command/${tenant}/${device-id} (authenticated gateway receiving commands for a specific device it acts on behalf of) Note Previous versions of Hono used control instead of command as address prefix. Using the control prefix is still supported but deprecated. The adapter supports AT LEAST ONCE delivery of command messages only. A client therefore MUST use unsettled for the snd-settle-mode and first for the rcv-settle-mode fields of its attach frame during link establishment. All other combinations are not supported and result in the termination of the link.\nOnce the link has been established, the adapter will send command messages having the following properties:\n Name Mandatory Location Type Description subject yes properties string Contains the name of the command to be executed. reply-to no properties string Contains the address to which the command response should be sent. This property will be empty for one-way commands. correlation-id no properties string This property will be empty for one-way commands, otherwise it will contain the identifier used to correlate the response with the command request. device_id no application-properties string This property will only be set if an authenticated gateway has connected to the adapter. It will contain the id of the device (connected to the gateway) that the command is targeted at. Authenticated gateways will receive commands for devices which do not connect to a protocol adapter directly but instead are connected to the gateway. Corresponding devices have to be configured so that they can be used with a gateway. See Configuring Gateway Devices for details.\nIf a device is configured in such a way that there can be one gateway, acting on behalf of the device, a command sent to this device will by default be directed to that gateway.\nIf a device is configured to be used with multiple gateways, the particular gateway that last acted on behalf of the device will be the target that commands for that device will be routed to. The mapping of device and gateway last used by the device is updated whenever a device sends a telemetry, event or command response message via the gateway. This means that for a device configured to be used via multiple gateways to receive commands, the device first has to send at least one telemetry or event message to establish which gateway to use for receiving commands for that device.\nSending a Response to a Command A device only needs to respond to commands that contain a reply-to address and a correlation-id. However, if the application expects a response, then devices must publish a response back to the application. Devices may use the same anonymous sender link for this purpose that they also use for sending telemetry data and events.\nThe adapter supports AT LEAST ONCE delivery of command response messages only. A client therefore MUST set the settled property to true and the rcv-settle-mode property to first in all transfer frame(s) it uses for uploading command responses. All other combinations are not supported by the adapter and result in the message being rejected.\nThe table below provides an overview of the properties that must be set on a command response message:\n Name Mandatory Location Type Description to yes properties string MUST contain the value of the reply-to property of the command request message. correlation-id yes properties string MUST contain the value of the correlation-id property of the command request message. status yes application-properties integer MUST contain a status code indicating the outcome of processing the command at the device (see Command \u0026amp; Control API for details). Examples The AMQP adapter client can be used to simulate a device which receives commands and sends responses back to the application. The command line client is used to simulate an application sending commands to devices and receiving command responses from devices.\nStart the AMQP adapter client, as follows:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-command --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret After successfully starting the client, a message indicating that the device is ready to receive commands will be printed to standard output. The device is now waiting to receive commands from applications.\nTo send a command to the device, open a new terminal shell and start the command application, as shown below:\n# in directory: hono/cli/ java -jar target/hono-cli-*-exec.jar --hono.client.host=localhost --hono.client.username=consumer@HONO --hono.client.password=verysecret --spring.profiles.active=command,ssl Note Change into the cli directory before running the command above to start the command application. If you change into the target directory (i.e cli/target), then the client will not be able to locate to certificate needed to connect to the messaging network. Once the command application starts successfully, enter a command name, payload and content-type of the command to send to the device.\n\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter name of command for device [DEFAULT_TENANT:4711] (prefix with 'ow:' to send one-way command): setBrightness \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter command payload: some-payload \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter content type: text/plain After sending the command, the device (i.e. AMQP command client) will print out the command name and payload that it receives and automatically sends a command response to the application.\nReceived Command Message : [Command name: setBrightness, Command payload: some-payload] Command response sent [outcome: Accepted{}] Downstream Meta Data The adapter includes the following meta data in the application properties of messages being sent downstream:\n Name Type Description device_id string The identifier of the device that the message originates from. orig_adapter string Contains the adapter\u0026rsquo;s type name which can be used by downstream consumers to determine the protocol adapter that the message has been received over. The AMQP adapter\u0026rsquo;s type name is hono-amqp. orig_address string Contains the AMQP target address that the device has used to send the data. The adapter also considers defaults registered for the device at either the tenant or the device level. The values of the default properties are determined as follows:\n If the message already contains a non-empty property of the same name, the value if unchanged. Otherwise, if a default property of the same name is defined in the device\u0026rsquo;s registration information, that value is used. Otherwise, if a default property of the same name is defined for the tenant that the device belongs to, that value is used. Note that of the standard AMQP 1.0 message properties only the content-type and ttl can be set this way to a default value.\nEvent Message Time-to-live Events published by devices will usually be persisted by the AMQP Messaging Network in order to support deferred delivery to downstream consumers. In most cases the AMQP Messaging Network can be configured with a maximum time-to-live to apply to the events so that the events will be removed from the persistent store if no consumer has attached to receive the event before the message expires.\nIn order to support environments where the AMQP Messaging Network cannot be configured accordingly, the protocol adapter supports setting a downstream event message\u0026rsquo;s ttl property based on the default ttl and max-ttl values configured for a tenant/device as described in the Tenant API.\nTenant specific Configuration The adapter uses the Tenant API to retrieve tenant specific configuration for adapter type hono-amqp. The following properties are (currently) supported:\n Name Type Default Value Description enabled boolean true If set to false the adapter will reject all data from devices belonging to the tenant and respond with a amqp:unauthorized-access as the error condition value for rejecting the message. "
},
{
"uri": "https://www.eclipse.org/hono/docs/dev/user-guide/kura-adapter/",
@@ -284,7 +284,7 @@
"title": "Credentials API Specification",
"tags": [],
"description": "",
- "content": "The Credentials API is used by Protocol Adapters to retrieve credentials used to authenticate Devices connecting to the adapter. In particular, the API supports the look up shared secrets which are often used by IoT devices by means of username/password based authentication schemes.\nCredentials are of a certain type which indicates which authentication mechanism the credentials can be used with. Each set of credentials also contains an authentication identity which is the identity claimed by the device during authentication. This authentication identity is usually different from the device-id the device has been registered under. A device may have multiple sets of credentials, using arbitrary authentication identities.\nThe Credentials API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using an AMQP 1.0 client in order to invoke operations of the API as described in the following sections.\n\nPreconditions for invoking the Credentials API Client has established an AMQP connection with the Credentials service. Client has established an AMQP link in role sender on the connection using target address credentials/${tenant_id}. This link is used by the client to send commands to the Credentials service. Client has established an AMQP link in role receiver on the connection using source address credentials/${tenant_id}/${reply-to} where reply-to may be any arbitrary string chosen by the client. This link is used by the client to receive responses to the requests it has sent to the Credentials service. This link\u0026rsquo;s source address is also referred to as the reply-to address for the request messages. Client connecting to Credentials service Get Credentials Protocol adapters use this command to look up credentials of a particular type for a device identity.\nMessage Flow\n Client looking up credentials for a device Request Message Format\nThe following table provides an overview of the properties a client needs to set on an get credentials message.\n Name Mandatory Location AMQP Type Description correlation-id no properties message-id MAY contain an ID used to correlate a response message to the original request. If set, it is used as the correlation-id property in the response, otherwise the value of the message-id property is used. Either this or the message-id property MUST be set. message-id no properties string MAY contain an identifier that uniquely identifies the message at the sender side. Either this or the correlation-id property MUST be set. reply-to yes properties string MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client\u0026rsquo;s receive link (see Preconditions). subject yes properties string MUST contain the value get. The body of the request MUST consist of a single Data section containing a UTF-8 encoded string representation of a single JSON object having the following members:\n Name Mandatory JSON Type Description type yes string The type of credentials to look up. Potential values include (but are not limited to) psk, x509-cert, hashed-password etc. auth-id yes string The authentication identifier to look up credentials for. Additionally, the body MAY contain arbitrary properties that service implementations can use to determine a device\u0026rsquo;s identity.\nThe following request payload may be used to look up the hashed password for a device with the authentication identifier sensor1:\n{ \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot; } Response Message Format\nA response to a get credentials request contains the following properties:\n Name Mandatory Location AMQP Type Description correlation-id yes properties message-id Contains the message-id (or the correlation-id, if specified) of the request message that this message is the response to. content-type no properties string MUST be set to application/json if the invocation of the operation was successful and the body of the response message contains payload as described below. status yes application-properties int Contains the status code indicating the outcome of the operation. Concrete values and their semantics are defined below. cache_control no application-properties string Contains an RFC 2616 compliant cache directive. The directive contained in the property MUST be obeyed by clients that are caching responses. The response message payload MUST contain credential information as defined in Credentials Format if the status is 200.\nThe response message\u0026rsquo;s status property may contain the following codes:\n Code Description 200 OK, the payload contains the credentials for the authentication identifier. 400 Bad Request, the request message did not contain all mandatory properties. 404 Not Found, there are no credentials registered matching the criteria. For status codes indicating an error (codes in the 400 - 499 range) the message body MAY contain a detailed description of the error that occurred. In this case, the response message\u0026rsquo;s content-type property SHOULD be set accordingly.\nDelivery States The Credentials service uses the following AMQP message delivery states when receiving request messages from clients:\n Delivery State Description ACCEPTED Indicates that the request message has been received and accepted for processing. REJECTED Indicates that the request message has been received but cannot be processed. The disposition frame\u0026rsquo;s error field contains information regarding the reason why. Clients should not try to re-send the request using the same message properties in this case. Credentials Format Credential data is carried in the body of an AMQP message as part of a single Data section. The message\u0026rsquo;s content-type property must be set to application/json.\nThe credential data is contained in the Data section as a UTF-8 encoded string representation of a single JSON object. It is an error to include payload that is not of this type.\nThe table below provides an overview of the standard members defined for the JSON object:\n Name Mandatory JSON Type Default Value Description device-id yes string The ID of the device to which the credentials belong. type yes string The credential type name. The value may be arbitrarily chosen by clients but SHOULD reflect the particular type of authentication mechanism the credentials are to be used with. Possible values include (but are not limited to) psk, x509-cert, hashed-password etc. auth-id yes string The identity that the device should be authenticated as. enabled no boolean true If set to false the credentials are not supposed to be used to authenticate devices any longer. This may e.g. be used to disable a particular mechanism for authenticating the device. NB It is the responsibility of the protocol adapter to make use of this information. secrets yes array A list of secrets scoped to a particular time period. See Secrets Format for details. NB This array must contain at least one element - an empty array is considered an error. For each set of credentials the combination of auth-id and type MUST be unique within a tenant.\nThe device registry may choose to not return information which is not suitable for authentication a device. This includes for example the enabled property. If set to false, then the device registry may choose to treat this request as if no credentials would be found. For secrets for example, this could mean that the device registry does not return secrets which are not valid at the current point in time.\nNB Care needs to be taken that the value for the authentication identifier is compliant with the authentication mechanism(s) it is supposed to be used with. For example, when using standard HTTP Basic authentication, the username part of the Basic Authorization header value (which corresponds to the auth-id) MUST not contain any colon (:) characters, because the colon character is used as the separator between username and password. Similar constraints may exist for other authentication mechanisms, so the authentication identifier needs to be chosen with the anticipated mechanism(s) being used in mind. Otherwise, devices may fail to authenticate with protocol adapters, even if the credentials provided by the device match the credentials registered for the device. In general, using only characters from the [a-zA-Z0-9_-] range for the authentication identifier should be compatible with most mechanisms.\nSecrets Format Each set of credentials may contain arbitrary secrets scoped to a particular validity period during which the secrets may be used for authenticating a device. The validity periods MAY overlap in order to support the process of changing a secret on a device that itself doesn\u0026rsquo;t support the definition of multiple secrets for gapless authentication across adjacent validity periods.\nThe table below contains the properties used to define the validity period of a single secret:\n Name Mandatory JSON Type Default Value Description not-before no string null The point in time from which on the secret may be used to authenticate devices. If not null, the value MUST be an ISO 8601 compliant combined date and time representation in extended format. NB It is up to the discretion of the protocol adapter to make use of this information. not-after no string null The point in time until which the secret may be used to authenticate devices. If not null, the value MUST be an ISO 8601 compliant combined date and time representation in extended format. NB It is up to the discretion of the protocol adapter to make use of this information. Examples Below is an example for a payload containing a hashed password for device 4711 with auth-id sensor1 using SHA512 as the hashing function with a 4 byte salt (Base64 encoding of 0x32AEF017). Note that the payload does not contain a not-before property, thus it may be used immediately up until X-mas eve 2017.\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [{ \u0026quot;not-after\u0026quot;: \u0026quot;2017-12-24T19:00:00+0100\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot;, \u0026quot;salt\u0026quot;: \u0026quot;Mq7wFw==\u0026quot;, \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot; }] } The next example contains two pre-shared keys with overlapping validity periods for device myDevice with PSK identity little-sensor2.\n{ \u0026quot;device-id\u0026quot;: \u0026quot;myDevice\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;little-sensor2\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [{ \u0026quot;not-after\u0026quot;: \u0026quot;2017-07-01T00:00:00+0100\u0026quot;, \u0026quot;key\u0026quot;: \u0026quot;cGFzc3dvcmRfb2xk\u0026quot; },{ \u0026quot;not-before\u0026quot;: \u0026quot;2017-06-29T00:00:00+0100\u0026quot;, \u0026quot;key\u0026quot;: \u0026quot;cGFzc3dvcmRfbmV3\u0026quot; }] } Credential Verification Protocol Adapters are responsible for authenticating devices when they connect. The Credentials API provides the Get Credentials operation to support Protocol Adapters in doing so as illustrated below:\nThe following sequence diagram illustrates the flow of messages involved in a Protocol Adapter authenticating a device. This is shown for the MQTT Protocol Adapter as example how a device authenticates with a username and a hashed-password. The mechanism can be transferred to other protocols in a similar manner.\n MQTT Adapter authenticates device using the Credentials service Protocol adapters MUST comply with the following rules when verifying credentials presented by a device:\n Credentials that have their enabled property set to false MUST NOT be used for authentication. Adapters MUST only consider secrets for authentication which\n have their not-before property set to either null or the current or a past point in time and have their not-after property set to either null or the current or a future point in time. Standard Credential Types The following sections define some standard credential types and their properties. Applications are encouraged to make use of these types. However, the types are not enforced anywhere in Hono and clients may of course add application specific properties to the credential types.\nCommon Properties All credential types used with Hono MUST contain device-id, type, auth-id, enabled and secrets properties as defined in Credentials Format.\nHashed Password A credential type for storing a (hashed) password for a device.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;pwd-hash\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot;, \u0026quot;salt\u0026quot;: \u0026quot;Mq7wFw==\u0026quot;, \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot; }] } Name Mandatory JSON Type Default Description type yes string The credential type name, always hashed-password. auth-id yes string The identity that the device should be authenticated as. pwd-hash yes string The password hash (see table below for details). salt no string The Base64 encoding of the salt used in the password hash (see table below for details). hash-function no string sha-256 The name of the hash function used to create the password hash. The hash functions supported by Hono are described in the table below. NB It is strongly recommended to use salted password hashes only. Furthermore, the salt should be unique per user and password, so no lookup table or rainbow table attacks can be used to crack the salt-hashed password. Whenever a password is updated for a user, the salt should change as well.\nNB The example above does not contain any of the not-before, not-after and enabled properties, thus the credentials can be used at any time according to the rules defined in Credential Verification.\nThe table below describes the hash functions supported by Hono and how they map to the secret structure.\n Name Salt Usage Salt Location Password Hash Format sha-256 optional salt field The Base64 encoding of the bytes resulting from applying the sha-256 hash function to the byte array consisting of the salt bytes (if a salt is used) and the UTF-8 encoding of the clear text password. sha-512 optional salt field The Base64 encoding of the bytes resulting from applying the sha-512 hash function to the byte array consisting of the salt bytes (if a salt is used) and the UTF-8 encoding of the clear text password. bcrypt mandatory pwd-hash value The output of applying the Bcrypt hash function to the clear text password. The salt is contained in the password hash.\nNB Hono (currently) uses Spring Security for matching clear text passwords against Bcrypt hashes. However, this library only supports hashes containing the $2a$ prefix (see https://github.com/fpirsch/twin-bcrypt#about-prefixes) so Hono will fail to verify any passwords for which the corresponding Bcrypt hashes returned by the Credentials service contain e.g. the $2y$ prefix. Pre-Shared Key A credential type for storing a Pre-shared Key as used in TLS handshakes.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;little-sensor2\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;key\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot; }] } Name Mandatory JSON Type Description type yes string The credential type name, always psk. auth-id yes string The PSK identity. key yes string The Base64 encoded bytes representing the shared (secret) key. NB The example above does not contain any of the not-before, not-after and enabled properties, thus the credentials can be used at any time according to the rules defined in Credential Verification.\nX.509 Certificate A credential type for storing the RFC 2253 formatted subject DN of a client certificate that is used to authenticate the device as part of a TLS handshake.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;x509-cert\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;CN=device-1,O=ACME Corporation\u0026quot;, \u0026quot;secrets\u0026quot;: [{}] } Name Mandatory JSON Type Description type yes string The credential type name, always x509-cert. auth-id yes string The subject DN of the client certificate in the format defined by RFC 2253. NB The example above does not contain any of the not-before, not-after and enabled properties. The not-before and not-after properties should be omitted if the validity period is the same as the period indicated by the client certificate\u0026rsquo;s corresponding properties. It is still necessary to provide a (empty) JSON object in the secrets array, though.\n"
+ "content": "The Credentials API is used by Protocol Adapters to retrieve credentials used to authenticate Devices connecting to the adapter. In particular, the API supports to look up shared secrets which are often used by IoT devices by means of username/password based authentication schemes.\nCredentials are of a certain type which indicates which authentication mechanism the credentials can be used with. Each set of credentials also contains an authentication identity which is the identity claimed by the device during authentication. This authentication identity is usually different from the device-id the device has been registered under. A device may have multiple sets of credentials, using arbitrary authentication identities.\nThe Credentials API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using an AMQP 1.0 client in order to invoke operations of the API as described in the following sections.\n\nPreconditions for invoking the Credentials API Client has established an AMQP connection with the Credentials service. Client has established an AMQP link in role sender on the connection using target address credentials/${tenant_id}. This link is used by the client to send commands to the Credentials service. Client has established an AMQP link in role receiver on the connection using source address credentials/${tenant_id}/${reply-to} where reply-to may be any arbitrary string chosen by the client. This link is used by the client to receive responses to the requests it has sent to the Credentials service. This link\u0026rsquo;s source address is also referred to as the reply-to address for the request messages. Client connecting to Credentials service Get Credentials Protocol adapters use this command to look up credentials of a particular type for a device identity.\nMessage Flow\n Client looking up credentials for a device Request Message Format\nThe following table provides an overview of the properties a client needs to set on an get credentials message.\n Name Mandatory Location AMQP Type Description correlation-id no properties message-id MAY contain an ID used to correlate a response message to the original request. If set, it is used as the correlation-id property in the response, otherwise the value of the message-id property is used. Either this or the message-id property MUST be set. message-id no properties string MAY contain an identifier that uniquely identifies the message at the sender side. Either this or the correlation-id property MUST be set. reply-to yes properties string MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client\u0026rsquo;s receive link (see Preconditions). subject yes properties string MUST contain the value get. The body of the request MUST consist of a single Data section containing a UTF-8 encoded string representation of a single JSON object having the following members:\n Name Mandatory JSON Type Description type yes string The type of credentials to look up. Potential values include (but are not limited to) psk, x509-cert, hashed-password etc. auth-id yes string The authentication identifier to look up credentials for. Additionally, the body MAY contain arbitrary properties that service implementations can use to determine a device\u0026rsquo;s identity.\nThe following request payload may be used to look up the hashed password for a device with the authentication identifier sensor1:\n{ \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot; } Response Message Format\nA response to a get credentials request contains the following properties:\n Name Mandatory Location AMQP Type Description correlation-id yes properties message-id Contains the message-id (or the correlation-id, if specified) of the request message that this message is the response to. content-type no properties string MUST be set to application/json if the invocation of the operation was successful and the body of the response message contains payload as described below. status yes application-properties int Contains the status code indicating the outcome of the operation. Concrete values and their semantics are defined below. cache_control no application-properties string Contains an RFC 2616 compliant cache directive. The directive contained in the property MUST be obeyed by clients that are caching responses. The response message payload MUST contain credential information as defined in Credentials Format if the status is 200.\nThe response message\u0026rsquo;s status property may contain the following codes:\n Code Description 200 OK, the payload contains the credentials for the authentication identifier. 400 Bad Request, the request message did not contain all mandatory properties. 404 Not Found, there are no credentials registered matching the criteria. For status codes indicating an error (codes in the 400 - 499 range) the message body MAY contain a detailed description of the error that occurred. In this case, the response message\u0026rsquo;s content-type property SHOULD be set accordingly.\nDelivery States The Credentials service uses the following AMQP message delivery states when receiving request messages from clients:\n Delivery State Description ACCEPTED Indicates that the request message has been received and accepted for processing. REJECTED Indicates that the request message has been received but cannot be processed. The disposition frame\u0026rsquo;s error field contains information regarding the reason why. Clients should not try to re-send the request using the same message properties in this case. Credentials Format Credential data is carried in the body of an AMQP message as part of a single Data section. The message\u0026rsquo;s content-type property must be set to application/json.\nThe credential data is contained in the Data section as a UTF-8 encoded string representation of a single JSON object. It is an error to include payload that is not of this type.\nThe table below provides an overview of the standard members defined for the JSON object:\n Name Mandatory JSON Type Default Value Description device-id yes string The ID of the device to which the credentials belong. type yes string The credential type name. The value may be arbitrarily chosen by clients but SHOULD reflect the particular type of authentication mechanism the credentials are to be used with. Possible values include (but are not limited to) psk, x509-cert, hashed-password etc. auth-id yes string The identity that the device should be authenticated as. enabled no boolean true If set to false the credentials are not supposed to be used to authenticate devices any longer. This may e.g. be used to disable a particular mechanism for authenticating the device. NB It is the responsibility of the protocol adapter to make use of this information. secrets yes array A list of secrets scoped to a particular time period. See Secrets Format for details. NB This array must contain at least one element - an empty array is considered an error. For each set of credentials the combination of auth-id and type MUST be unique within a tenant.\nThe device registry may choose to not return information which is not suitable for authentication a device. This includes for example the enabled property. If set to false, then the device registry may choose to treat this request as if no credentials would be found. For secrets for example, this could mean that the device registry does not return secrets which are not valid at the current point in time.\nNB Care needs to be taken that the value for the authentication identifier is compliant with the authentication mechanism(s) it is supposed to be used with. For example, when using standard HTTP Basic authentication, the username part of the Basic Authorization header value (which corresponds to the auth-id) MUST not contain any colon (:) characters, because the colon character is used as the separator between username and password. Similar constraints may exist for other authentication mechanisms, so the authentication identifier needs to be chosen with the anticipated mechanism(s) being used in mind. Otherwise, devices may fail to authenticate with protocol adapters, even if the credentials provided by the device match the credentials registered for the device. In general, using only characters from the [a-zA-Z0-9_-] range for the authentication identifier should be compatible with most mechanisms.\nSecrets Format Each set of credentials may contain arbitrary secrets scoped to a particular validity period during which the secrets may be used for authenticating a device. The validity periods MAY overlap in order to support the process of changing a secret on a device that itself doesn\u0026rsquo;t support the definition of multiple secrets for gapless authentication across adjacent validity periods.\nThe table below contains the properties used to define the validity period of a single secret:\n Name Mandatory JSON Type Default Value Description not-before no string null The point in time from which on the secret may be used to authenticate devices. If not null, the value MUST be an ISO 8601 compliant combined date and time representation in extended format. NB It is up to the discretion of the protocol adapter to make use of this information. not-after no string null The point in time until which the secret may be used to authenticate devices. If not null, the value MUST be an ISO 8601 compliant combined date and time representation in extended format. NB It is up to the discretion of the protocol adapter to make use of this information. Examples Below is an example for a payload containing a hashed password for device 4711 with auth-id sensor1 using SHA512 as the hashing function with a 4 byte salt (Base64 encoding of 0x32AEF017). Note that the payload does not contain a not-before property, thus it may be used immediately up until X-mas eve 2017.\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [{ \u0026quot;not-after\u0026quot;: \u0026quot;2017-12-24T19:00:00+0100\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot;, \u0026quot;salt\u0026quot;: \u0026quot;Mq7wFw==\u0026quot;, \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot; }] } The next example contains two pre-shared keys with overlapping validity periods for device myDevice with PSK identity little-sensor2.\n{ \u0026quot;device-id\u0026quot;: \u0026quot;myDevice\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;little-sensor2\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [{ \u0026quot;not-after\u0026quot;: \u0026quot;2017-07-01T00:00:00+0100\u0026quot;, \u0026quot;key\u0026quot;: \u0026quot;cGFzc3dvcmRfb2xk\u0026quot; },{ \u0026quot;not-before\u0026quot;: \u0026quot;2017-06-29T00:00:00+0100\u0026quot;, \u0026quot;key\u0026quot;: \u0026quot;cGFzc3dvcmRfbmV3\u0026quot; }] } Credential Verification Protocol Adapters are responsible for authenticating devices when they connect. The Credentials API provides the Get Credentials operation to support Protocol Adapters in doing so as illustrated below:\nThe following sequence diagram illustrates the flow of messages involved in a Protocol Adapter authenticating a device. This is shown for the MQTT Protocol Adapter as example how a device authenticates with a username and a hashed-password. The mechanism can be transferred to other protocols in a similar manner.\n MQTT Adapter authenticates device using the Credentials service Protocol adapters MUST comply with the following rules when verifying credentials presented by a device:\n Credentials that have their enabled property set to false MUST NOT be used for authentication. Adapters MUST only consider secrets for authentication which\n have their not-before property set to either null or the current or a past point in time and have their not-after property set to either null or the current or a future point in time. Standard Credential Types The following sections define some standard credential types and their properties. Applications are encouraged to make use of these types. However, the types are not enforced anywhere in Hono and clients may of course add application specific properties to the credential types.\nCommon Properties All credential types used with Hono MUST contain device-id, type, auth-id, enabled and secrets properties as defined in Credentials Format.\nHashed Password A credential type for storing a (hashed) password for a device.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;pwd-hash\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot;, \u0026quot;salt\u0026quot;: \u0026quot;Mq7wFw==\u0026quot;, \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot; }] } Name Mandatory JSON Type Default Description type yes string The credential type name, always hashed-password. auth-id yes string The identity that the device should be authenticated as. pwd-hash yes string The password hash (see table below for details). salt no string The Base64 encoding of the salt used in the password hash (see table below for details). hash-function no string sha-256 The name of the hash function used to create the password hash. The hash functions supported by Hono are described in the table below. NB It is strongly recommended to use salted password hashes only. Furthermore, the salt should be unique per user and password, so no lookup table or rainbow table attacks can be used to crack the salt-hashed password. Whenever a password is updated for a user, the salt should change as well.\nNB The example above does not contain any of the not-before, not-after and enabled properties, thus the credentials can be used at any time according to the rules defined in Credential Verification.\nThe table below describes the hash functions supported by Hono and how they map to the secret structure.\n Name Salt Usage Salt Location Password Hash Format sha-256 optional salt field The Base64 encoding of the bytes resulting from applying the sha-256 hash function to the byte array consisting of the salt bytes (if a salt is used) and the UTF-8 encoding of the clear text password. sha-512 optional salt field The Base64 encoding of the bytes resulting from applying the sha-512 hash function to the byte array consisting of the salt bytes (if a salt is used) and the UTF-8 encoding of the clear text password. bcrypt mandatory pwd-hash value The output of applying the Bcrypt hash function to the clear text password. The salt is contained in the password hash.\nNB Hono (currently) uses Spring Security for matching clear text passwords against Bcrypt hashes. However, this library only supports hashes containing the $2a$ prefix (see https://github.com/fpirsch/twin-bcrypt#about-prefixes) so Hono will fail to verify any passwords for which the corresponding Bcrypt hashes returned by the Credentials service contain e.g. the $2y$ prefix. Pre-Shared Key A credential type for storing a Pre-shared Key as used in TLS handshakes.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;little-sensor2\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;key\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot; }] } Name Mandatory JSON Type Description type yes string The credential type name, always psk. auth-id yes string The PSK identity. key yes string The Base64 encoded bytes representing the shared (secret) key. NB The example above does not contain any of the not-before, not-after and enabled properties, thus the credentials can be used at any time according to the rules defined in Credential Verification.\nX.509 Certificate A credential type for storing the RFC 2253 formatted subject DN of a client certificate that is used to authenticate the device as part of a TLS handshake.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;x509-cert\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;CN=device-1,O=ACME Corporation\u0026quot;, \u0026quot;secrets\u0026quot;: [{}] } Name Mandatory JSON Type Description type yes string The credential type name, always x509-cert. auth-id yes string The subject DN of the client certificate in the format defined by RFC 2253. NB The example above does not contain any of the not-before, not-after and enabled properties. The not-before and not-after properties should be omitted if the validity period is the same as the period indicated by the client certificate\u0026rsquo;s corresponding properties. It is still necessary to provide a (empty) JSON object in the secrets array, though.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/dev/api/authentication/",
diff --git a/docs/dev/index.xml b/docs/dev/index.xml
index 55510d7..92bb61b 100644
--- a/docs/dev/index.xml
+++ b/docs/dev/index.xml
@@ -342,7 +342,7 @@
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.eclipse.org/hono/docs/dev/api/credentials/</guid>
- <description><p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports the look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p></description>
+ <description><p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports to look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p></description>
</item>
<item>
diff --git a/docs/dev/tags/index.html b/docs/dev/tags/index.html
index 1abfba3..e71e233 100644
--- a/docs/dev/tags/index.html
+++ b/docs/dev/tags/index.html
@@ -21,19 +21,19 @@
<title>Tags :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/tags/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/tags/">stable (1.0)</option>
@@ -2192,20 +2192,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/user-guide/amqp-adapter/index.html b/docs/dev/user-guide/amqp-adapter/index.html
index b085fc5..6bdaa4c 100644
--- a/docs/dev/user-guide/amqp-adapter/index.html
+++ b/docs/dev/user-guide/amqp-adapter/index.html
@@ -21,19 +21,19 @@
<title>AMQP Adapter :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/amqp-adapter/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/amqp-adapter/">stable (1.0)</option>
@@ -1399,7 +1399,7 @@
<p>The AMQP adapter supports authenticating clients using a <em>username</em> and <em>password</em>. This means that clients need to provide a <em>username</em> and a <em>password</em> when connecting to the AMQP adapter. If the adapter is configured for multi-tenancy (i.e <code>HONO_AMQP_SINGLE_TENANT</code> is set to <code>false</code>), then the <em>username</em> must match the pattern [<em>auth-id@tenant</em>], e.g. <code>sensor1@DEFAULT_TENANT</code>. Otherwise the <code>DEFAULT_TENANT</code> is assumed and the tenant-id can be omitted from the username.</p>
-<p>The adapter verifies the credentials provided by the client against the credentials that the <a href="#credentials-service-connection-configuration">Credentials Service</a> has on record for the device. If the credentials match, then authentication is successful and the client device can proceed to publish messages to Hono.</p>
+<p>The adapter verifies the credentials provided by the client against the credentials the <a href="/hono/docs/dev/admin-guide/amqp-adapter-config/#credentials-service-connection-configuration">configured Credentials service</a> has on record for the client. If the credentials match, then authentication is successful and the client device can proceed to publish messages to Hono.</p>
<p>The examples below refer to devices <code>4711</code> and <code>gw-1</code> of tenant <code>DEFAULT_TENANT</code> using <em>auth-ids</em> <code>sensor1</code> and <code>gw1</code> and corresponding passwords. The example deployment as described in the <a href="/hono/docs/dev/deployment/">Deployment Guides</a> comes pre-configured with the corresponding entities in its device registry component.</p>
@@ -1924,7 +1924,7 @@
</tbody>
</table>
-<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/dev/api/tenant/#payload-format">tenant</a> or the <a href="/hono/docs/dev/api/device-registration/#payload-format">device level</a>. The values of the default properties are determined as follows:</p>
+<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/dev/api/tenant/#tenant-information-format">tenant</a> or the <a href="/hono/docs/dev/api/device-registration/#assert-device-registration">device level</a>. The values of the default properties are determined as follows:</p>
<ol>
<li>If the message already contains a non-empty property of the same name, the value if unchanged.</li>
@@ -2841,20 +2841,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/user-guide/device-registry/index.html b/docs/dev/user-guide/device-registry/index.html
index 2477134..1752b3e 100644
--- a/docs/dev/user-guide/device-registry/index.html
+++ b/docs/dev/user-guide/device-registry/index.html
@@ -21,19 +21,19 @@
<title>Device Registry :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/device-registry/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/device-registry/">stable (1.0)</option>
@@ -2748,20 +2748,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/user-guide/http-adapter/index.html b/docs/dev/user-guide/http-adapter/index.html
index 97f7cd3..9bc9df6 100644
--- a/docs/dev/user-guide/http-adapter/index.html
+++ b/docs/dev/user-guide/http-adapter/index.html
@@ -21,19 +21,19 @@
<title>HTTP Adapter :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/http-adapter/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/http-adapter/">stable (1.0)</option>
@@ -1668,7 +1668,7 @@
<p>This resource can be used by <em>gateway</em> components to publish data <em>on behalf of</em> other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.</p>
-<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
+<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="/hono/docs/dev/admin-guide/http-adapter-config/#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
<p><strong>Examples</strong></p>
@@ -1898,7 +1898,7 @@
<p>This resource can be used by <em>gateway</em> components to publish data <em>on behalf of</em> other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.</p>
-<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
+<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="/hono/docs/dev/admin-guide/http-adapter-config/#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
<p><strong>Examples</strong></p>
@@ -2100,7 +2100,7 @@
<p>This resource can be used by <em>gateway</em> components to send the response to a command <em>on behalf of</em> other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.</p>
-<p>The protocol adapter checks the gateway’s authority to send responses to a command on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
+<p>The protocol adapter checks the gateway’s authority to send responses to a command on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="/hono/docs/dev/admin-guide/http-adapter-config/#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
<div class="alert alert-notice">
<h4 class="alert-heading"><i class="fas fa-info-circle"></i> Deprecation</h4>
@@ -2160,7 +2160,7 @@
</tbody>
</table>
-<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/dev/api/tenant/#payload-format">tenant</a> or the <a href="/hono/docs/dev/api/device-registration/#payload-format">device level</a>. The values of the default properties are determined as follows:</p>
+<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/dev/api/tenant/#tenant-information-format">tenant</a> or the <a href="/hono/docs/dev/api/device-registration/#assert-device-registration">device level</a>. The values of the default properties are determined as follows:</p>
<ol>
<li>If the message already contains a non-empty property of the same name, the value if unchanged.</li>
@@ -3085,20 +3085,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/user-guide/index.html b/docs/dev/user-guide/index.html
index 28c0699..8e4faf4 100644
--- a/docs/dev/user-guide/index.html
+++ b/docs/dev/user-guide/index.html
@@ -21,19 +21,19 @@
<title>User Guide :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/">stable (1.0)</option>
@@ -2211,20 +2211,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/user-guide/jmeter_load_tests/index.html b/docs/dev/user-guide/jmeter_load_tests/index.html
index ce32292..4b3c235 100644
--- a/docs/dev/user-guide/jmeter_load_tests/index.html
+++ b/docs/dev/user-guide/jmeter_load_tests/index.html
@@ -21,19 +21,19 @@
<title>Load Tests with JMeter :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/jmeter_load_tests/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/jmeter_load_tests/">stable (1.0)</option>
@@ -2262,20 +2262,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/user-guide/kura-adapter/index.html b/docs/dev/user-guide/kura-adapter/index.html
index 956250b..02f873e 100644
--- a/docs/dev/user-guide/kura-adapter/index.html
+++ b/docs/dev/user-guide/kura-adapter/index.html
@@ -21,19 +21,19 @@
<title>Kura Adapter :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/kura-adapter/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/kura-adapter/">stable (1.0)</option>
@@ -1418,7 +1418,7 @@
</tbody>
</table>
-<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/dev/api/tenant/#payload-format">tenant</a> or the <a href="/hono/docs/dev/api/device-registration/#payload-format">device level</a>. The values of the default properties are determined as follows:</p>
+<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/dev/api/tenant/#tenant-information-format">tenant</a> or the <a href="/hono/docs/dev/api/device-registration/#assert-device-registration">device level</a>. The values of the default properties are determined as follows:</p>
<ol>
<li>If the message already contains a non-empty property of the same name, the value if unchanged.</li>
@@ -2335,20 +2335,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/user-guide/mqtt-adapter/index.html b/docs/dev/user-guide/mqtt-adapter/index.html
index d45a98d..ab4c7cc 100644
--- a/docs/dev/user-guide/mqtt-adapter/index.html
+++ b/docs/dev/user-guide/mqtt-adapter/index.html
@@ -21,19 +21,19 @@
<title>MQTT Adapter :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/mqtt-adapter/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/mqtt-adapter/">stable (1.0)</option>
@@ -1405,7 +1405,7 @@
<h3 id="client-certificate">Client Certificate</h3>
-<p>When a device uses a client certificate for authentication during the TLS handshake, the adapter tries to determine the tenant that the device belongs to, based on the <em>issuer DN</em> contained in the certificate. In order for the lookup to succeed, the tenant’s trust anchor needs to be configured by means of registering the <a href="/hono/docs/dev/api/tenant/#payload-format">trusted certificate authority</a>. The device’s client certificate will then be validated using the registered trust anchor, thus implicitly establishing the tenant that the device belongs to. In a second step, the adapter then uses the Credentials API’s <em>get</em> operation with the client certificate’s <em>subject DN</em> as the <em>auth-id</em> and <code>x509-cert</code> as the <em>type</em> of secret as query parameters.</p>
+<p>When a device uses a client certificate for authentication during the TLS handshake, the adapter tries to determine the tenant that the device belongs to, based on the <em>issuer DN</em> contained in the certificate. In order for the lookup to succeed, the tenant’s trust anchor needs to be configured by means of registering the <a href="/hono/docs/dev/api/tenant/#tenant-information-format">trusted certificate authority</a>. The device’s client certificate will then be validated using the registered trust anchor, thus implicitly establishing the tenant that the device belongs to. In a second step, the adapter then uses the Credentials API’s <em>get</em> operation with the client certificate’s <em>subject DN</em> as the <em>auth-id</em> and <code>x509-cert</code> as the <em>type</em> of secret as query parameters.</p>
<p><strong>NB</strong> The adapter needs to be <a href="/hono/docs/dev/admin-guide/secure_communication/#mqtt-adapter">configured for TLS</a> in order to support this mechanism.</p>
@@ -1508,7 +1508,7 @@
<p>This topic can be used by <em>gateway</em> components to publish data <em>on behalf of</em> other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the topic name are used to identify the device that the gateway publishes data for.</p>
-<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
+<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="/hono/docs/dev/admin-guide/mqtt-adapter-config/#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
<p><strong>Examples</strong></p>
@@ -1604,7 +1604,7 @@
<p>This topic can be used by <em>gateway</em> components to publish data <em>on behalf of</em> other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the topic name are used to identify the device that the gateway publishes data for.</p>
-<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
+<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="/hono/docs/dev/admin-guide/mqtt-adapter-config/#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
<p><strong>Examples</strong></p>
@@ -1844,7 +1844,7 @@
</tbody>
</table>
-<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/dev/api/tenant/#payload-format">tenant</a> or the <a href="/hono/docs/dev/api/device-registration/#payload-format">device level</a>. The values of the default properties are determined as follows:</p>
+<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/dev/api/tenant/#tenant-information-format">tenant</a> or the <a href="/hono/docs/dev/api/device-registration/#assert-device-registration">device level</a>. The values of the default properties are determined as follows:</p>
<ol>
<li>If the message already contains a non-empty property of the same name, the value if unchanged.</li>
@@ -2762,20 +2762,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/dev/user-guide/sigfox-adapter/index.html b/docs/dev/user-guide/sigfox-adapter/index.html
index 69bf9c5..7bc22de 100644
--- a/docs/dev/user-guide/sigfox-adapter/index.html
+++ b/docs/dev/user-guide/sigfox-adapter/index.html
@@ -21,19 +21,19 @@
<title>Sigfox Adapter :: Eclipse Hono™ Vers.: dev</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/\/dev";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/sigfox-adapter/">stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/sigfox-adapter/">stable (1.0)</option>
@@ -2380,20 +2380,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/index.html b/docs/index.html
index fad1eda..dbaace4 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -21,19 +21,19 @@
<title>Documentation :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/" selected>stable (1.0)</option>
@@ -1292,7 +1292,7 @@
<h1 id="documentation">Documentation</h1>
-<p>Learn about Hono™ and look-up details.</p>
+<p>Learn about Eclipse Hono™ and look up details.</p>
@@ -2157,20 +2157,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275523"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275523"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275523"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275523"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275523"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275523"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361813"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361813"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361813"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361813"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361813"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361813"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275523"></script>
- <script src="/hono/docs/js/learn.js?1571275523"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275523"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361813"></script>
+ <script src="/hono/docs/js/learn.js?1571361813"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361813"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275523" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275523"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361813" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361813"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/index.json b/docs/index.json
index e0b92cc..86abced 100644
--- a/docs/index.json
+++ b/docs/index.json
@@ -4,49 +4,49 @@
"title": "Documentation",
"tags": [],
"description": "",
- "content": " Documentation Learn about Hono\u0026trade; and look-up details.\n"
+ "content": " Documentation Learn about Eclipse Hono\u0026trade; and look up details.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/concepts/",
"title": "Concepts",
"tags": [],
"description": "",
- "content": " Concepts Understand the concepts behind Hono\u0026trade;.\n"
+ "content": " Concepts Understand the concepts behind Eclipse Hono\u0026trade;.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/concepts/device-identity/",
"title": "Device Identity",
"tags": [],
"description": "",
- "content": "This page describes how devices are represented and identified throughout Hono and its APIs.\nThe main purpose of Hono is to provide a uniform API for applications to interact with devices, regardless of the particular communication protocol the devices natively use. In order to do so, Hono uses a unique logical identifier to refer to each device individually.\nHono does not make any assumptions about the format of a device identifier (or device-id for short). It basically is a string which is defined at the time a device is registered. Once registered, the device can be referred to by this identifier when using Hono\u0026rsquo;s APIs until the device is unregistered.\nTenant Hono supports the logical partitioning of devices into groups called tenants. Each tenant has a unique identifier, a string called the tenant-id, and can be used to provide a logical grouping of devices belonging e.g. to the same application scope or organizational unit. Each device can thus be uniquely identified by the tuple (tenant-id, device-id). This tuple is broadly used throughout Hono\u0026rsquo;s APIs when addressing a particular device.\nDevice Registration Hono components use the Device Registration API to access device registration information. The API defines the mandatory to implement assert Registration operation for verifying a device\u0026rsquo;s registration status. In addition to that, it defines optional CRUD operations to register, update and remove device registration information. These operations are optional because Hono components do not require them during runtime. From a Hono perspective, it is not important how devices have been registered or how they are managed.\nIn many real world scenarios there will already be a component in place which keeps track of devices and which supports the particular provisioning process being used to bring devices into life. In such cases it makes sense to simply implement the mandatory operation of Hono\u0026rsquo;s Device Registration API as a facade on top of the existing component.\nFor demonstration purposes, Hono comes with a simple default implementation of the Device Registration API which keeps all data in memory only. This component implements all mandatory and optional operations but is not supposed to be used in production scenarios.\nDevice Authentication Devices connect to protocol adapters in order to publish telemetry data or events. Downstream applications consuming this data often take particular actions based on the content of the messages. Such actions may include simply updating some statistics, e.g. tracking the average room temperature, but may also trigger more serious activities like shutting down a power plant. It is therefore important that applications can rely on the fact that the messages they process have in fact been produced by the device indicated by a message\u0026rsquo;s source address.\nHono relies on protocol adapters to establish a device\u0026rsquo;s identity before it is allowed to publish telemetry data or send events. Conceptually, Hono distinguishes between two identities\n an identity associated with the authentication credentials (termed the authentication identity or auth-id), and an identity to act as (the device identity or device-id). A device therefore presents an auth-id as part of its credentials during the authentication process which is then resolved to a device identity by the protocol adapter on successful verification of the credentials.\nIn order to support the protocol adapters in the process of verifying credentials presented by a device, the Credentials API provides means to look up secrets on record for the device and use this information to verify the credentials.\nThe Credentials API supports registration of multiple sets of credentials for each device. A set of credentials consists of an auth-id and some sort of secret information. The particular type of secret determines the kind of information kept. Please refer to the Standard Credential Types defined in the Credentials API for details. Based on this approach, a device may be authenticated using different types of secrets, e.g. a hashed password or a pre-shared key, depending on the capabilities of the device and/or protocol adapter.\nOnce the protocol adapter has resolved the device-id for a device, it uses this identity when referring to the device in all subsequent API invocations, e.g. when forwarding telemetry messages downstream to the AMQP Messaging Network.\n"
+ "content": "This page describes how devices are represented and identified throughout Hono and its APIs.\nThe main purpose of Hono is to provide a uniform API for applications to interact with devices, regardless of the particular communication protocol the devices natively use. In order to do so, Hono uses a unique logical identifier to refer to each device individually.\nHono does not make any assumptions about the format of a device identifier (or device-id for short). It basically is a string which is defined at the time a device is registered. Once registered, the device can be referred to by this identifier when using Hono\u0026rsquo;s APIs until the device is unregistered.\nTenant Hono supports the logical partitioning of devices into groups called tenants. Each tenant has a unique identifier, a string called the tenant-id, and can be used to provide a logical grouping of devices belonging e.g. to the same application scope or organizational unit. Each device can thus be uniquely identified by the tuple (tenant-id, device-id). This tuple is broadly used throughout Hono\u0026rsquo;s APIs when addressing a particular device.\nDevice Registration Hono components use the Device Registration API to access device registration information. The API defines the assert Registration operation for verifying a device\u0026rsquo;s registration status. In many real world scenarios there will already be a component in place which keeps track of devices and which supports the particular provisioning process being used to bring devices into life. In such cases it makes sense to simply implement the Device Registration API as a facade on top of the existing component.\nIn addition to that, Hono defines a Device Registry Management API, which can be implemented to take advantage of standardized operations for managing devices and credentials. This API is optional because Hono components do not require it during runtime.\nFor demonstration purposes, Hono comes with a simple default implementation of both APIs which keeps all data in memory only. Therefore it is not supposed to be used in production scenarios. For the future, it is planned that a production-ready Device Registry will be released as part of Hono that implements both APIs.\nDevice Authentication Devices connect to protocol adapters in order to publish telemetry data or events. Downstream applications consuming this data often take particular actions based on the content of the messages. Such actions may include simply updating some statistics, e.g. tracking the average room temperature, but may also trigger more serious activities like shutting down a power plant. It is therefore important that applications can rely on the fact that the messages they process have in fact been produced by the device indicated by a message\u0026rsquo;s source address.\nHono relies on protocol adapters to establish a device\u0026rsquo;s identity before it is allowed to publish downstream data or receive commands. Conceptually, Hono distinguishes between two identities\n an identity associated with the authentication credentials (termed the authentication identity or auth-id), and an identity to act as (the device identity or device-id). A device therefore presents an auth-id as part of its credentials during the authentication process which is then resolved to a device identity by the protocol adapter on successful verification of the credentials.\nIn order to support the protocol adapters in the process of verifying credentials presented by a device, the Credentials API provides means to look up secrets on record for the device and use this information to verify the credentials.\nThe Credentials API supports registration of multiple sets of credentials for each device. A set of credentials consists of an auth-id and some sort of secret information. The particular type of secret determines the kind of information kept. Please refer to the Standard Credential Types defined in the Credentials API for details. Based on this approach, a device may be authenticated using different types of secrets, e.g. a hashed password or a pre-shared key, depending on the capabilities of the device and/or protocol adapter.\nOnce the protocol adapter has resolved the device-id for a device, it uses this identity when referring to the device in all subsequent API invocations, e.g. when forwarding telemetry messages downstream to the AMQP Messaging Network.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/concepts/tenancy/",
"title": "Multi-Tenancy",
"tags": [],
"description": "",
- "content": " Hono is designed to structure the set of all internally managed data and data streams into strictly isolated subsets. This includes the registration data and credentials of devices, internal users that are used for authentication, and the Business Applications that are part of such subsets as well.\nThis way of strict isolation is generally known as multi-tenancy, where a tenant is the term for such a subset. Such an isolation is essential for enabling a scalable distributed architecture to handle independent subsets as if each subset had its own installation (which would be much harder to maintain and would not benefit from runtime cost sharing).\nHono\u0026rsquo;s multi-tenancy concept is based on handling tenants as own entities. All functionality of Hono is provided in the context of a previously created tenant - except the creation of a tenant itself.\nIn the following the different aspects of multi-tenancy in Hono are addressed and a full overview of the concept is given.\nThe Tenant API By means of the Tenant API Hono handles tenants as own entities.\nThe API defines how to retrieve the details of a specific tenant. This offers the possibility to handle arbitrary properties on the level of a tenant (see e.g. Protocol adapter configuration).\nFor convenience, there are CRUD operations for the handling of tenants, which can be found in the Device Registry.\nProtocol Adapters respect the Tenant API When a device connects to one of Hono\u0026rsquo;s protocol adapters, the adapter determines the tenant this device belongs to. How this is done is described in the User Guide.\nAfter the tenant is determined, the adapter retrieves the details of the determined tenant by means of the Tenant API. Only if the tenant exists and is enabled the adapter further processes the data of the device that is connecting. Otherwise the connection will be closed.\nProtocol Adapter Configuration Protocol adapters retrieve parts of their configuration on a tenant level by using the details of the determined tenant.\nThis includes e.g. if a specific protocol adapter is enabled at all for this tenant, allowing to define tenants with only a subset of Hono\u0026rsquo;s functionality. This feature is foreseen to be especially important for production setups.\nExample: a tenant that\n can use the MQTT protocol adapter but is not allowed to use the HTTP protocol adapter Please refer to the Tenant API to find out which protocol adapter properties are configurable on a tenant level. The number of such properties may grow during further development of Hono.\nAMQP 1.0 Endpoints The AMQP 1.0 endpoints for all APIs of Hono are scoped to a tenant, by using the scheme \u0026lt;api-name\u0026gt;/TENANT/....\nExamples:\n telemetry/TENANT registration/TENANT etc.\nThis separates the AMQP endpoints from each other on a tenant level.\nThe only exception to this is the Tenant API, which does not follow this scheme since it is addressing the tenants themselves.\nDevices and Tenants All devices of Hono belong to exactly one tenant, so any data is sent in the context of the tenant a device belongs to.\nIt is important here to focus on Hono\u0026rsquo;s view of a device: it is on a logical level, meaning a device is created in the context of a tenant purely by using Hono\u0026rsquo;s Credentials and Device Registration API.\nUsually a physical device will be created in Hono as exactly one logical device, and thus belongs to exactly one tenant.\nThe following diagram shows the relation between tenants, devices and their credentials:\n Tenants, Devices and Credentials Tenant based Flow Control An important detail in Hono\u0026rsquo;s architecture is that data sent downstream is transported via the tenant scoped AMQP 1.0 links from the protocol adapters to the AMQP 1.0 network.\nEach tenant has its own pair of AMQP 1.0 links and is treated independently from other tenants regarding the back pressure mechanism that AMQP 1.0 offers.\nThis enables a Business application to limit the rate at which it consumes AMQP 1.0 messages per tenant.\nAuthorization at Tenant Level Hono\u0026rsquo;s components authenticate each other by means of the Authentication API.\nThe returned token for a successful authentication contains authorization information that is addressing the AMQP 1.0 endpoints. Since the endpoints (as outlined above) are scoped to a tenant, this enables to configure tenants that are authorized to only a subset of Hono\u0026rsquo;s full functionality.\nExample: a tenant (defined by means of authorization configuration) that\n is allowed to send telemetry data downstream but is not allowed to send event data This is done by not including the event endpoint in the authorization token for these tenants.\nBusiness Applications and Tenants The northbound Business applications are always connecting to the AMQP 1.0 endpoints of Hono.\nBy means of the authentication and authorization setup and the fact that the endpoints are scoped to a tenant, the Business application is only acting in the context of one tenant.\nSeparation of Tenants Tenants are separated from each other in all of Hono\u0026rsquo;s components.\nHere is a summary of how this is implemented:\n the registration of devices are strictly scoped to a tenant the credentials of devices are strictly scoped to a tenant protocol adapters can be enabled/disabled for a tenant the downstream data flow is isolated for every tenant Business applications need to authenticate to the AMQP 1.0 network and are by that mechanism scoped to their tenant Hints for Production To be flexible for the different needs of production setups, Hono tries to make as few assumptions about the combination of the different APIs as possible. This means e.g. that the Device Registry does not enforce referential integrity of the APIs:\n devices can be created for a tenant that is not existing (yet) credentials can be created for a tenant and/or a device that is not existing (yet) tenants can be deleted and leave their scoped devices and credentials still in the configuration (which may not be usable anymore, since the tenant is missing) These are points that production setups may want to implement differently.\n"
+ "content": " Hono is designed to structure the set of all internally managed data and data streams into strictly isolated subsets. This includes the registration data and credentials of devices, internal users that are used for authentication, and the Business Applications that are part of such subsets as well.\nThis way of strict isolation is generally known as multi-tenancy, where a tenant is the term for such a subset. Such an isolation is essential for enabling a scalable distributed architecture to handle independent subsets as if each subset had its own installation (which would be much harder to maintain and would not benefit from runtime cost sharing).\nHono\u0026rsquo;s multi-tenancy concept is based on handling tenants as own entities. All functionality of Hono is provided in the context of a previously created tenant - except the creation of a tenant itself.\nIn the following the different aspects of multi-tenancy in Hono are addressed and a full overview of the concept is given.\nThe Tenant API By means of the Tenant API Hono handles tenants as own entities. The API defines how to retrieve the details of a specific tenant. This offers the possibility to handle arbitrary properties on the level of a tenant (see e.g. Protocol adapter configuration). For convenience, there are CRUD operations for the handling of tenants, which can be found in the Device Registry.\nProtocol Adapters respect the Tenant API When a device connects to one of Hono\u0026rsquo;s protocol adapters, the adapter determines the tenant this device belongs to. How this is done is described in the User Guide. After the tenant is determined, the adapter retrieves the details of the determined tenant by means of the Tenant API. Only if the tenant exists and is enabled the adapter further processes the data of the device that is connecting. Otherwise the connection will be closed.\nProtocol Adapter Configuration Protocol adapters retrieve parts of their configuration on a tenant level by using the details of the determined tenant. This includes e.g. if a specific protocol adapter is enabled at all for this tenant, allowing to define tenants with only a subset of Hono\u0026rsquo;s functionality. This feature is foreseen to be especially important for production setups.\nExample: a tenant that\n can use the MQTT protocol adapter but is not allowed to use the HTTP protocol adapter Please refer to the Tenant API to find out which protocol adapter properties can be configured at the tenant level.\nAMQP 1.0 Endpoints The AMQP 1.0 endpoints for all APIs of Hono are scoped to a tenant, by using the scheme \u0026lt;api-name\u0026gt;/TENANT/....\nExamples:\n telemetry/TENANT registration/TENANT etc.\nThis separates the AMQP endpoints from each other on a tenant level.\nThe only exception to this is the Tenant API, which does not follow this scheme since it is addressing the tenants themselves.\nDevices and Tenants A physical device will usually be represented in Hono as an entity in the device registry, having a unique identity and belonging to exactly one tenant. All data sent from a device, as well as from the application to the device, is therefore treated as belonging to the corresponding tenant.\nThe following diagram shows the relation between tenants, devices and their credentials:\n Tenants, Devices and Credentials Tenant based Flow Control An important detail in Hono\u0026rsquo;s architecture is that data sent downstream is transported via the tenant scoped AMQP 1.0 links from the protocol adapters to the AMQP 1.0 network. Each tenant has its own pair of AMQP 1.0 links and is treated independently from other tenants regarding the back pressure mechanism that AMQP 1.0 offers. This enables a Business application to limit the rate at which it consumes AMQP 1.0 messages per tenant.\nFor the other direction, when commands are sent from the application to the device, the rate is also limited per tenant.\nAuthorization at Tenant Level Hono\u0026rsquo;s components authenticate each other by means of the Authentication API. The returned token for a successful authentication contains authorization information that is addressing the AMQP 1.0 endpoints. Since the endpoints (as outlined above) are scoped to a tenant, this enables to configure tenants that are authorized to only a subset of Hono\u0026rsquo;s full functionality.\nExample: a tenant (defined by means of authorization configuration) that\n is allowed to send telemetry data downstream but is not allowed to send event data This is done by not including the event endpoint in the authorization token for these tenants.\nBusiness Applications and Tenants The northbound Business applications are always connecting to the AMQP 1.0 endpoints of Hono. By means of the authentication and authorization setup and the fact that the endpoints are scoped to a tenant, the Business application is only acting in the context of one tenant.\nSeparation of Tenants Tenants are separated from each other in all of Hono\u0026rsquo;s components. Here is a summary of how this is implemented:\n the registration of devices are strictly scoped to a tenant the credentials of devices are strictly scoped to a tenant protocol adapters can be enabled/disabled for a tenant the downstream data flow is isolated for every tenant the upstream data flow (Command \u0026amp; Control) is isolated for every tenant Business applications need to authenticate to the AMQP 1.0 network and are by that mechanism scoped to their tenant Hints for Production To be flexible for the different needs of production setups, Hono tries to make as few assumptions about the combination of the different APIs as possible. This means e.g. that the Device Registry does not enforce referential integrity of the APIs:\n devices can be created for a tenant that is not existing (yet) credentials can be created for a tenant and/or a device that is not existing (yet) tenants can be deleted and leave their scoped devices and credentials still in the configuration (which may not be usable anymore, since the tenant is missing) These are points that production setups may want to implement differently.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/concepts/device-notifications/",
"title": "Device Notifications",
"tags": [],
"description": "",
- "content": "Business Applications need to know when an attempt to send a command to device is feasible, e.g. because the device is then known to be connected to a protocol adapter. Devices and Protocol Adapters can indicate to Business Applications a device\u0026rsquo;s intent to e.g. receive commands using specific notifications.\nTime until Disconnect Notification Devices and Protocol Adapters can notify an application about the fact that a device is connected and ready to receive one or more commands by means of including a time \u0026lsquo;til disconnect (ttd) property in downstream AMQP 1.0 messages containing data originating from a connected device.\nThe ttd property value indicates the time that the device will stay connected to the protocol adapter. Using this value together with the creation-time of the message, an application can determine whether an attempt to send a command to the device has a reasonable chance of succeeding.\nThe ttd property can be included in any regular telemetry or event message. However, if a device does not have any telemetry data or event to upload to the adapter, it can also use an empty notification instead.\nHono includes utility classes that application developers can use to register a callback to be notified when a device sends a ttd notification. See Hono\u0026rsquo;s example module for details where such a notification callback is used.\nPlease refer to the Telemetry API and the Event API for further details.\nThe following table defines the possible values of the ttd property and their semantics:\n TTD Description \u0026gt; 0 The value indicates the number of seconds that the device will stay connected. Devices using a stateless protocol like HTTP will be able to receive a single command only before disconnecting. -1 The device is now connected (i.e. available to receive upstream messages) until further notice. 0 The device is now disconnected (i.e. not available anymore to receive upstream messages). Determining a Device\u0026rsquo;s Connection Status An application receiving a downstream message containing a ttd property can check if the device is currently connected (and thus ready to receive a command) by\n adding the ttd value to the creation-time to determine the expiration time, and then comparing the current time with the expiration time If the current time is after the expiration time, the device should be assumed to already have disconnected again.\nSource of the ttd Value While it seems to be natural that a device itself indicates when it is ready to receive a command, it may not always be possible or desirable to do so.\nA device could e.g. be not capable to specify the value for ttd in it\u0026rsquo;s message, or all devices of a particular setup would always use the same value for ttd, so it would not make much sense to provide this value always again.\nAdditionally different protocols may or may not let a sender set specific values for a message, so a device using a specific protocol may not be able to provide a value for the ttd property at all.\nFor these reasons there are (resp. may be) additional ways of setting the value of ttd:\n Hono\u0026rsquo;s Tenant and Device Registration APIs support the inclusion of default values for application-properties in the AMQP 1.0 message. By these means a device can be configured to always have a specific value for ttd. In a future extension there may be a configuration value per tenant and protocol adapter that sets the value of ttd if it was not provided by other means already (like provided to the protocol adapter or by setting a default value). Hono\u0026rsquo;s HTTP protocol adapter Hono\u0026rsquo;s HTTP protocol adapter supports the setting of the ttd value in requests explicitly - please refer to the HTTP Adapter for details.\nAlternatively the default property values for devices from the Device Registry can be used (described above).\nHono\u0026rsquo;s MQTT protocol adapter The MQTT protocol adapter automatically sends a Time until disconnect notification with a ttd value of -1 for a device that subscribes to the appropriate command topic (refer to the MQTT Adapter user guide for details).\nWhen a device unsubscribes again, the adapter automatically sends a Time until disconnect notification with a ttd value of 0.\nExamples The following sequence diagram shows a Time until disconnect notification while sending a telemetry message downstream via the HTTP protocol adapter:\n Device command readiness with telemetry data The following sequence diagram shows a Time until disconnect notification by sending an empty event message downstream via the HTTP protocol adapter:\n Device command readiness with explicit event "
+ "content": "Business Applications need to know when an attempt to send a command to device is feasible, e.g. because the device is then known to be connected to a protocol adapter. Devices and Protocol Adapters can indicate to Business Applications a device\u0026rsquo;s intent to e.g. receive commands using specific notifications.\nTime until Disconnect Notification Devices and Protocol Adapters can notify an application about the fact that a device is connected and ready to receive one or more commands by means of including a time \u0026lsquo;til disconnect (ttd) property in telemetry or event messages.\nThe ttd property value indicates the time that the device will stay connected to the protocol adapter. Using this value together with the creation-time of the message, an application can determine whether an attempt to send a command to the device has a reasonable chance of succeeding. The ttd property can be included in any regular telemetry or event message. However, if a device does not have any telemetry data or event to upload to the adapter, it can also use an empty notification instead.\nHono includes utility classes that application developers can use to register a callback to be notified when a device sends a ttd notification. See Hono\u0026rsquo;s example module for details where such a notification callback is used. Please refer to the Telemetry API and the Event API for further details.\nThe following table defines the possible values of the ttd property and their semantics:\n TTD Description \u0026gt; 0 The value indicates the number of seconds that the device will stay connected. Devices using a stateless protocol like HTTP will be able to receive a single command only before disconnecting. -1 The device is now connected (i.e. available to receive upstream messages) until further notice. 0 The device is now disconnected (i.e. not available anymore to receive upstream messages). Determining a Device\u0026rsquo;s Connection Status An application receiving a downstream message containing a ttd property can check if the device is currently connected (and thus ready to receive a command) by\n adding the ttd value to the creation-time to determine the expiration time, and then comparing the current time with the expiration time If the current time is after the expiration time, the device should be assumed to already have disconnected again.\nSource of the ttd Value While it seems to be natural that a device itself indicates when it is ready to receive a command, it may not always be possible or desirable to do so. A device could e.g. be not capable to specify the value for ttd in it\u0026rsquo;s message, or all devices of a particular setup would always use the same value for ttd, so it would not make much sense to provide this value always again. Additionally different protocols may or may not let a sender set specific values for a message, so a device using a specific protocol may not be able to provide a value for the ttd property at all. For these reasons there are (resp. may be) additional ways of setting the value of ttd:\n Hono\u0026rsquo;s Tenant and Device Registration APIs support the inclusion of default values for application-properties in the AMQP 1.0 message. By these means a device can be configured to always have a specific value for ttd. In a future extension there may be a configuration value per tenant and protocol adapter that sets the value of ttd if it was not provided by other means already (like provided to the protocol adapter or by setting a default value). Hono\u0026rsquo;s HTTP protocol adapter Hono\u0026rsquo;s HTTP protocol adapter supports the setting of the ttd value in requests explicitly - please refer to the HTTP Adapter for details. Alternatively the default property values for devices from the Device Registry can be used (described above).\nHono\u0026rsquo;s MQTT protocol adapter The MQTT protocol adapter automatically sends a Time until disconnect notification with a ttd value of -1 for a device that subscribes to the appropriate command topic (refer to the MQTT Adapter user guide for details).\nWhen a device unsubscribes again, the adapter automatically sends a Time until disconnect notification with a ttd value of 0.\nExamples The following sequence diagram shows a Time until disconnect notification while sending a telemetry message downstream via the HTTP protocol adapter:\n Device command readiness with telemetry data The following sequence diagram shows a Time until disconnect notification by sending an empty event message downstream via the HTTP protocol adapter:\n Device command readiness with explicit event "
},
{
"uri": "https://www.eclipse.org/hono/docs/concepts/command-and-control/",
"title": "Command & Control",
"tags": [],
"description": "",
- "content": "Business applications can send commands to devices following the Command \u0026amp; Control API. This concept page describes how this API is used by applications to send commands to devices that connected to one of Hono\u0026rsquo;s protocol adapters.\nCommands can be sent following a request/response or a one-way pattern. For Request/Response commands, there is always a response expected from the device.\nCommand \u0026amp; Control over HTTP Adapter The following sequence diagrams give an overview of a device connecting via HTTP, which gets a command from the business application in the response to a downstream message - being an arbitrary event in this example. The application and the adapter connect to the AMQP Network, which forwards the transfer - for clarity this is not shown in the diagram.\n(Request/Response) command over HTTP:\n Command \u0026amp; Control over HTTP Adapter One-way command over HTTP:\n One-way Command \u0026amp; Control over HTTP Adapter With the hono-ttd request parameter in (1) the device indicates it will stay connected for max. 30 seconds. In the shown example this means that it can handle the response to the HTTP request for up to 30 seconds before considering the request being expired.\nInternally the application is notified that there is a time interval of 30 seconds to send a command (see Device notifications for details). This notification will be consumed by the application (2) and it now tries to send a command (3) to the device at the given address command/TENANT/4711. If the device is not connected or the time interval is expired already, there is no such link open and the application would get no credits so send the command.\nThe HTTP Adapter gets the command and writes it in the response of the devices send event (4), if the request was successful (status 2xx). The HTTP Adapter sets the following response headers and optionally a payload.\n Response Header Description hono-cmd The name of the command to execute. Any input data required will be contained in the response body. hono-cmd-req-id Only set for Request/Response commands : The unique identifier of the command. This identifier is used to correlate the device\u0026rsquo;s response to the command with the request. The hono-cmd is the command that should be executed by the device. Typically this command needs to be known by the device and the payload may contain additional details of the command.\nFor Request/Response commands:\nThe hono-cmd-req-id response header is needed for the command response to correlate it. It has to be sent back from the device to the adapter in a following operation (5).\nThe device needs to respond to the command (5), to inform the business application about the outcome of executing the command. For this purpose specific URIs are defined in HTTP Adapter.\nThe URI contains the hono-cmd-req-id and a status code indicating the outcome of executing the command.\nThe HTTP Adapter will send the payload of the response back to the Business Application (6) by using the receiver link that was opened by the application. If the response reached the application, the response request will be replied with 202 Accepted.\nCommand \u0026amp; Control over MQTT Adapter When the device is connected to the MQTT Adapter it receives Request/Response commands on the topic:\n command/[${tenant}]/[${device-id}]/req/${req-id}/${command} and one-way commands on the topic:\n command/[${tenant}]/[${device-id}]/req//${command} Authenticated devices typically subscribe to\n command/+/+/req/# while unauthenticated devices have to fully specify their ${tenant} and ${device-id} during the subscription.\nThe response of the command will be sent by the device to\n command/[${tenant}]/[${device-id}]/res/${req-id}/${status} If the device is authenticated, the ${tenant} and ${device-id} are left empty (resulting in 3 subsequent /s).\nThe following diagrams show the message flow for commands over the MQTT adapter:\nRequest/Response commands :\n Request/Response Command over MQTT Adapter one-way commands :\n One-way Command over MQTT Adapter Command \u0026amp; Control over AMQP Adapter When a device connected to the AMQP adapter wants to receive commands from the adapter, it opens a receiver link specifying the following source address:\n command for authenticated devices command/${tenant}/${device-id} for unauthenticated devices Once the receiver link is opened, the AMQP adapter sends command messages to devices through the link. The subject property of the request message contains the actual command to be executed on the device.\nIf the command request is a one-way command, then the device need not publish a command response message. However, if the application expects a response, then devices should publish a response back to the application. If an anonymous sender link is already opened by the device (e.g for publishing telemetry or events), then the device can reuse that link to publish the command response message. Otherwise, the device should publish the response by opening an anonymous sender link. The device should set the message address, status and correlation-id properties of the response accordingly. Consult the table below for a list of properties that a device must set on a command response message.\nCommand Request Message Properties\nThe following properties are set by the AMQP adapter on a command message sent to devices.\n Name Mandatory Location Type Description subject yes properties string Contains the name of the command to be executed on a device. reply-to yes properties string Contains the address to which the command response should be published to. This value is empty for one-way commands. correlation-id yes properties string Contains the identifier used to correlate the response with the command request. If the command sent by the application contains a correlation-id, then that value is used as the correlation-id of the command request sent to the device. Otherwise, the value of the message-id property is used instead. Command Response Message Properties\nIf the application expects a response (i.e the reply-to property is set), then the device should set the following properties on a command response message.\n Name Mandatory Location Type Description to yes properties string MUST contain the address to which the command response should be published to, which is the value of the reply-to property of the command request message. correlation-id yes properties string MUST contain the identifier used to correlate the response with the original request, which is the value of the correlation-id of the original request. status yes application-properties string The status code indicating the outcome of processing the command by the device. MUST be set by the device after executing the command. Command \u0026amp; Control over AMQP Adapter "
+ "content": "Business applications can send commands to devices following the Command \u0026amp; Control API. This concept page describes how this API is used by applications to send commands to devices that connected to one of Hono\u0026rsquo;s protocol adapters.\nCommands can be sent following a request/response or a one-way pattern. For Request/Response commands, there is always a response expected from the device.\nCommand \u0026amp; Control over HTTP Adapter The following sequence diagrams give an overview of a device connecting via HTTP, which gets a command from the business application in the response to a downstream message - being an arbitrary event in this example. Device Notifications are used to indicate to the application the period in which the device is ready to receive a command.\nThe application and the adapter connect to the AMQP Network, which forwards the transfer - for clarity this is not shown in the diagrams.\n One-way Command over HTTP Adapter Request/Response Command over HTTP Adapter With the hono-ttd request parameter in (1) the device indicates it will stay connected for max. 30 seconds. In the shown example this means that it can handle the response to the HTTP request for up to 30 seconds before considering the request being expired.\nInternally the application is notified that there is a time interval of 30 seconds to send a command (see Device notifications for details). This notification will be consumed by the application (2) and it now tries to send a command (3) to the device at the given address command/TENANT/4711. If the device is not connected or the time interval is expired already, there is no such link open and the application would get no credits so send the command.\nThe HTTP Adapter gets the command and writes it in the response of the devices send event (4), if the request was successful (status 2xx). The HTTP Adapter sets the following response headers and optionally a payload.\n Response Header Description hono-cmd The name of the command to execute. Any input data required will be contained in the response body. hono-cmd-req-id Only set for Request/Response commands : The unique identifier of the command. This identifier is used to correlate the device\u0026rsquo;s response to the command with the request. The hono-cmd is the command that should be executed by the device. Typically this command needs to be known by the device and the payload may contain additional details of the command.\nFor Request/Response commands:\nThe hono-cmd-req-id response header is needed for the command response to correlate it. It has to be sent back from the device to the adapter in a following operation (5).\nThe device needs to respond to the command (5), to inform the business application about the outcome of executing the command. For this purpose specific URIs are defined in HTTP Adapter.\nThe URI contains the hono-cmd-req-id and a status code indicating the outcome of executing the command.\nThe HTTP Adapter will send the payload of the response back to the Business Application (6) by using the receiver link that was opened by the application. If the response reached the application, the response request will be replied with 202 Accepted.\nCommand \u0026amp; Control over MQTT Adapter When the device is connected to the MQTT adapter, it can subscribe to the topic filters described in the User Guide. The topic on which commands are published has the structure command/[${tenant-id}]/[${device-id}]/req/[${req-id}]/${command}.\nFor authenticated devices, the tenant-id and device-id topic levels are empty, and for one-way commands, the ${req-id} level is. For example, authenticated devices typically subscribe to command///req/#.\nGateways (which always need to authenticate) subscribe to commands for all devices they act on behalf of using topic filter command//+/req/# and will receive commands on a topic that contains the target device id.\nIn the case of request/response commands, the device must publish the response on the topic command///res/${req-id}/${status}, inserting the ${req-id} from the command.\nThe following diagrams show the message flow for commands over the MQTT adapter:\n One-way Command over MQTT Adapter Request/Response Command over MQTT Adapter Command \u0026amp; Control over AMQP Adapter When a device connected to the AMQP adapter wants to receive commands from the adapter, it opens a receiver link specifying the following source address:\n command for authenticated devices command/${tenant}/${device-id} for unauthenticated devices Once the receiver link is opened, the AMQP adapter sends command messages to devices through the link. The subject property of the request message contains the actual command to be executed on the device.\nIf the command request is a one-way command, then the device need not publish a command response message. However, if the application expects a response, then devices should publish a response back to the application. If an anonymous sender link is already opened by the device (e.g for publishing telemetry or events), then the device can reuse that link to publish the command response message. Otherwise, the device should publish the response by opening an anonymous sender link. The device should set the message address, status and correlation-id properties of the response accordingly.\nConsult the User Guide for a list of properties in request and response messages.\n Command \u0026amp; Control over AMQP Adapter "
},
{
"uri": "https://www.eclipse.org/hono/docs/concepts/resource-limits/",
"title": "Resource limits",
"tags": [],
"description": "",
- "content": " Resource limits such as the maximum number of device connections allowed per tenant or the allowed data volume of the messages over a period of time per tenant can be set in Hono.\nHono specifies an API ResourceLimitChecks that is used by the protocol adapters for the verification of the configured resource limits. A default implementation of this API is shipped with Hono. This default implementation uses the live metrics data retrieved from a Prometheus server to verify the resource-limits, if configured. To enable and use this default implementation, please refer to the protocol adapter admin guides. Based on the requirements, a custom version of the above API can be implemented and used. The resource-limits for a tenant can be set using the tenant configuration. Please refer to the Tenant API for more details.\nConnections Limit Before accepting a new connection request from a device, the number of existing connections is checked against the configured limit by the protocol adapters. The connection request is declined if the limit is exceeded.\nThe MQTT and AMQP protocol adapters keep the connections longer opened than their counterparts such as HTTP. Thereby the MQTT and AMQP adapters are enabled to check the connection limits before accepting any new connection to a device.\nMessages Limit Hono supports limiting the number of messages that devices and north bound applications of a tenant can publish to Hono during a given time interval. Before accepting any telemetry or event or command messages from devices or north bound applications, it is checked by the protocol adapters that if the message limit is exceeded or not. The incoming message is discarded if the limit is exceeded.\nThe default prometheus based implementation uses data volume as the factor to limit the messages. The data volume already consumed by a tenant over the given time interval is compared with the configured message limit before accepting any messages.\n"
+ "content": " Resource limits such as the maximum number of device connections allowed per tenant or the allowed data volume of the messages over a period of time per tenant can be set in Hono.\nHono specifies an API ResourceLimitChecks that is used by the protocol adapters for the verification of the configured resource limits. A default implementation of this API is shipped with Hono. This default implementation uses the live metrics data retrieved from a Prometheus server to verify the resource-limits, if configured. To enable and use this default implementation, please refer to the protocol adapter admin guides. Based on the requirements, a custom version of the above API can be implemented and used. The resource-limits for a tenant can be set using the tenant configuration. Please refer to the Tenant API for more details.\nConnections Limit Before accepting a new connection request from a device, the number of existing connections is checked against the configured limit by the protocol adapters. The connection request is declined if the limit is exceeded.\nThe MQTT and AMQP protocol adapters keep the connections longer opened than their counterparts such as HTTP. Thereby the MQTT and AMQP adapters are enabled to check the connection limits before accepting any new connection to a device.\nMessages Limit Hono supports limiting the number of messages that devices and north bound applications of a tenant can publish to Hono during a given time interval. Before accepting any telemetry or event or command messages from devices or north bound applications, it is checked by the protocol adapters that if the message limit is exceeded or not. The incoming message is discarded if the limit is exceeded.\nThe default Prometheus based implementation uses data volume as the factor to limit the messages. The data volume already consumed by a tenant over the given time interval is compared with the configured message limit before accepting any messages. The default implementation supports two modes of message limits calculation namely days and monthly. For more details on how to set the mode refer to the Tenant API.\nIn the monthly mode, the message limit check ensures that the data usage from the beginning till the end of a (Gregorian) calendar month does not exceed the max-bytes value. But for the first month on which the message limit became effective, the effective max-bytes are calculated based on the max-bytes with respect to the remaining days in that month from the effective-since date.\nBelow is a sample resource limit configuration for a tenant and it has been defined that the message limit became effective on 10.Jul.2019 and the maximum bytes allowed for a month is 2 GB. It means that from August 2019, the message limit check ensures that the data usage in a month does not exceed 2 GB. But in case of July 2019, the month on which the message limit became effective, the effective max-bytes is calculated by finding the average limit for a day from the max-bytes and multiplying it with the number of days from the effective-since date till the end of that month. In this case it is calculated as (2 GB / 31 days) x 22 days which is 1.4 GB. It means that for the month of July 2019, the data usage should not exceed 1.4GB.\n\u0026quot;resource-limits\u0026quot;: { \u0026quot;data-volume\u0026quot;: { \u0026quot;effective-since\u0026quot;: \u0026quot;2019-07-10T14:30:00Z\u0026quot;, \u0026quot;max-bytes\u0026quot;: 2147483648, \u0026quot;period\u0026quot;: { \u0026quot;mode\u0026quot;: \u0026quot;monthly\u0026quot; } } } In the days mode, the message limit check ensures that the data usage for the defined no-of-days does not exceed the max-bytes value. In the below sample configuration, the mode is configured as days and the accounting duration as 30 days. In this case the message limit check ensures that the data usage for every 30 days from 10.Jul.2019 (effective-since) does not exceed the 2GB limit.\n\u0026quot;resource-limits\u0026quot;: { \u0026quot;data-volume\u0026quot;: { \u0026quot;effective-since\u0026quot;: \u0026quot;2019-07-10T14:30:00Z\u0026quot;, \u0026quot;max-bytes\u0026quot;: 2147483648, \u0026quot;period\u0026quot;: { \u0026quot;mode\u0026quot;: \u0026quot;days\u0026quot;, \u0026quot;no-of-days\u0026quot;: 30 } } } "
},
{
"uri": "https://www.eclipse.org/hono/docs/concepts/connection-events/",
@@ -60,42 +60,42 @@
"title": "User Guide",
"tags": [],
"description": "",
- "content": " User Guide Learn how to quickly send data with Hono\u0026trade; from devices to business applications \u0026ndash; as well as commands the other way round.\n"
+ "content": " User Guide Learn how Eclipse Hono\u0026trade; enables you to quickly send data from devices to business applications and vice versa.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/user-guide/device-registry/",
"title": "Device Registry",
"tags": [],
"description": "",
- "content": "The Device Registry component provides exemplary implementations of Hono\u0026rsquo;s Tenant API, Device Registration API and Credentials API.\nAs such it exposes AMQP 1.0 based endpoints for retrieving the relevant information and persists data in the local filesystem.\nIn addition, the Device Registry also exposes HTTP resources for managing the contents of the registry according to the Device Registry HTTP API.\n Warning The Device Registry is not intended to be used in production environments. In particular, access to the HTTP resources described below is not restricted to authorized clients only.\nThe resources have been designed to provide convenient access to the registry\u0026rsquo;s content using command line tools like curl or HTTPie.\n Managing Tenants The following sections describe the resources representing the operations of the Tenant API and how they can be used to manage tenants. Please refer to the Device Registry HTTP API for the specific elements that are explained in detail there.\nAdd a Tenant URI: /v1/tenants/${tenantId} Method: POST Request Headers: (required) Content-Type: application/json (no other type supported) Request Body: (required) A JSON object as specified by Tenant schema of the HTTP API specification. Status Codes: 201 (Created): Tenant has been added successfully under the resource indicated by Location header. 400 (Bad Request): The tenant has not been created because the request was malformed, e .g. because the payload was malformed. The response body may contain hints regarding the cause of the problem. 409 (Conflict): A tenant with the given tenantId already exists. The request has not been processed. Response Headers: Location: The URI under which the newly created resource can be accessed. ETag: Version of the resource Example\nThe following commands add some tenants with different adapter configurations:\nAdd a tenant that has all adapters set to enabled:\ncurl -i -X POST -H 'Content-Type: application/json' http://localhost:28080/v1/tenants/tenantAllAdapters HTTP/1.1 201 Created ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4 Location: /v1/tenants/tenantAllAdapters Content-Type: application/json; charset=utf-8 {\u0026quot;id\u0026quot;: \u0026quot;tenantAllAdapters\u0026quot;} Add a tenant that can only use the MQTT adapter:\ncurl -i -X POST -H 'Content-Type: application/json' --data-binary '{ \u0026quot;adapters\u0026quot; : [ { \u0026quot;type\u0026quot; : \u0026quot;hono-mqtt\u0026quot;, \u0026quot;enabled\u0026quot; : true } ] }' http://localhost:28080/v1/tenants/tenantMqttAdapter HTTP/1.1 201 Created ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4 Location: /v1/tenants/tenantMqttAdapter Content-Type: application/json; charset=utf-8 {\u0026quot;id\u0026quot;: \u0026quot;tenantMqttAdapter\u0026quot;} Get configuration details of a Tenant URI: /v1/tenants/${tenantId} Method: GET Status Codes: 200 (OK): A tenant with the given identifier has been found. The response body contains the tenant data as specified by Tenant schema of the HTTP API specification. 404 (Not Found): No tenant with the given identifier is registered. Example\nThe following command retrieves the details for the tenant tenantMqttAdapter:\ncurl -i http://localhost:28080/v1/tenants/tenantMqttAdapter HTTP/1.1 200 OK ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4 Content-Type: application/json; charset=utf-8 { \u0026quot;enabled\u0026quot; : true, \u0026quot;adapters\u0026quot; : [ { \u0026quot;type\u0026quot; : \u0026quot;hono-mqtt\u0026quot;, \u0026quot;enabled\u0026quot; : true } ] } Update Tenant URI: /v1/tenants/${tenantId} Method: PUT Request Headers: (required) Content-Type: application/json (no other type supported) Request Body: (required) A JSON object as specified by Tenant schema of the HTTP API specification. Status Codes: 204 (No Content): The tenant has been updated successfully. 400 (Bad Request): The tenant has not been updated because the request was malformed, e .g. because the payload was malformed. The response body may contain hints regarding the cause of the problem. 404 (Not Found): The request could not be processed because no tenant with the given identifier exists. This resource can be used to change the configuration of a particular tenant.\nExample\nThe following command disables the MQTT adapter for devices that belong to the tenant tenantMqttAdapter:\ncurl -i -X PUT -H 'Content-Type: application/json' --data-binary '{ \u0026quot;adapters\u0026quot; : [ { \u0026quot;type\u0026quot; : \u0026quot;hono-mqtt\u0026quot;, \u0026quot;enabled\u0026quot; : true } ] }' http://localhost:28080/v1/tenants/tenantMqttAdapter HTTP/1.1 204 No Content ETag: 8919c736-30aa-40ce-a45a-830b90c4cd42 Content-Length: 0 Delete Tenant URI: /v1/tenants/${tenantId} Method: DELETE Status Codes: 204 (No Content): The tenant with the given identifier has been deleted. 404 (Not Found): The request could not be processed because no tenant with the given identifier exists. Example\ncurl -i -X DELETE http://localhost:28080/v1/tenants/tenantMqttAdapter HTTP/1.1 204 No Content Content-Length: 0 Managing Device Registration Information The following sections describe the resources representing the operations of the Device Registration API and how they can be used to manage device registration information. Please refer to the Device Registry HTTP API for the specific elements that are explained in detail there.\nRegister Device URI: /v1/devices/${tenantId}/${deviceId} Method: POST Headers: (required) Content-Type: application/json Request Body: (required) A JSON object as specified by Device schema of the HTTP API specification. Status Codes: 201 (Created): Device has been registered successfully under resource indicated by Location header. 400 (Bad Request): Device has not been registered because the request was malformed, e .g. a required header is missing (the body may contain hints regarding the problem). 409 (Conflict): There already exists a device with the given ID. The request has not been processed. Example\nThe following command registers a device with ID 4711 for tenant DEFAULT_TENANT\ncurl -i -X POST -H 'Content-Type: application/json' --data-binary '{ \u0026quot;ext\u0026quot;: { \u0026quot;ep\u0026quot;: \u0026quot;IMEI4711\u0026quot; } }' http://localhost:28080/v1/devices/DEFAULT_TENANT/4711 The response will contain a Location header containing the resource path created for the device. In this example it will look like this:\nHTTP/1.1 201 Created Location: /v1/devices/DEFAULT_TENANT/4711 ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4 Content-Type: application/json; charset=utf-8 {\u0026quot;id\u0026quot;: \u0026quot;4711\u0026quot;} Read Device URI: /v1/devices/${tenantId}/${deviceId} Method: GET Status Codes: 200 (OK): A device with the given identifier has been found. The response body contains the registration information as specified by Device schema of the HTTP API specification. 404 (Not Found): No device with the given identifier is registered for the given tenant. Example\nThe following command retrieves registration data for device 4711:\ncurl -i http://localhost:28080/v1/devices/DEFAULT_TENANT/4711 HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 { \u0026quot;enabled\u0026quot;: true, \u0026quot;ext\u0026quot;: { \u0026quot;ep\u0026quot;: \u0026quot;IMEI4711\u0026quot; } } Update Device URI: /devices/v1/${tenantId}/${deviceId} Method: PUT Headers: (required) Content-Type: application/json Parameters (encoded as a JSON object in the request body): Request Body: (required) A JSON object as specified by Device schema of the HTTP API specification. All existing registration information will be replaced by the data provided in the object. Status Codes: 204 (No Content): Device registration data has been updated. 400 (Bad Request): Device registration has not been updated because the request was malformed, e .g. a required header is missing (the body may contain hints regarding the problem). 404 (Not Found): No device with the given identifier is registered for the given tenant. Example\ncurl -i -X PUT -H 'Content-Type: application/json' --data-binary '{ \u0026quot;ext\u0026quot;: { \u0026quot;ep\u0026quot;: \u0026quot;IMEI4711\u0026quot;, \u0026quot;psk-id\u0026quot;: \u0026quot;psk4711\u0026quot; } }' http://localhost:28080/v1/devices/DEFAULT_TENANT/4711 HTTP/1.1 204 No Content Content-Length: 0 Delete Device URI: /v1/devices/${tenantId}/${deviceId} Method: DELETE Status Codes: 204 (No Content): Device registration has been deleted. 404 (Not Found): No device with the given identifier is registered for the given tenant. Example\ncurl -i -X DELETE http://localhost:28080/v1/devices/DEFAULT_TENANT/4711 HTTP/1.1 204 No Content Content-Length: 0 Managing Credentials The following sections describe the resources representing the operations of the Credentials API and how they can be used to manage credentials for devices. Please refer to the Device Registry HTTP API for the specific elements that are explained in detail there.\nUpdate Credentials for a Device URI: /v1/credentials/${tenantId}/${deviceId} Method: PUT Request Headers: (required) Content-Type: application/json (no other type supported) Request Body: (required) A JSON object as specified by Credentials schema of the HTTP API specification. Status Codes: 204 (No Content): Credentials have been updated successfully. 400 (Bad Request): The credentials have not been added because the request was malformed, e .g. because the payload did not contain required values. The response body may contain hints regarding the cause of the problem. Response Headers: ETag: Version of the resource Example\nThe following command adds some hashed-password credentials from a given plain text password for device 4710 using authentication identifier sensor10:\ncurl -i -X PUT -H 'Content-Type: application/json' --data-binary '[{ \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor10\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;pwd-plain\u0026quot;: \u0026quot;mylittlesecret\u0026quot; }] }]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710 HTTP/1.1 204 No Content ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4x This uses a convenient option which lets the Device Registry do the hashing of the password. The following command retrieves the credentials that are stored by the Device Registry as a result of the command above:\ncurl -i http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710 HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4x [{ \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor10\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [ { \u0026quot;pwd-hash\u0026quot;: \u0026quot;$2a$10$uc.qVDwXeDRE1DWa1sM9iOaY9wuevjfALGMtXmHKP.SJDEqg0q7M6\u0026quot;, \u0026quot;hash-function\u0026quot;: \u0026quot;bcrypt\u0026quot; } ] }] The following commands add some hashed-password credentials for device 4720 using authentication identifier sensor20:\nPWD_HASH=$(echo -n \u0026quot;mylittlesecret\u0026quot; | openssl dgst -binary -sha512 | base64 -w 0) curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[{ \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;hash-function\u0026quot; : \u0026quot;sha-512\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;'$PWD_HASH'\u0026quot; }] }]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720 HTTP/1.1 204 No Content ETag: 02c99fb5-af8c-409f-8520-b405e224b27f The following command adds an expiration date to the hashed-password credentials for authentication identifier sensor20:\nPWD_HASH=$(echo -n \u0026quot;mylittlesecret\u0026quot; | openssl dgst -binary -sha512 | base64 -w 0) curl -i -X PUT -H 'Content-Type: application/json' --data-binary '{ \u0026quot;device-id\u0026quot;: \u0026quot;4720\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;hash-function\u0026quot; : \u0026quot;sha-512\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;'$PWD_HASH'\u0026quot;, \u0026quot;not-after\u0026quot;: \u0026quot;2018-01-01T00:00:00+01:00\u0026quot; }] }' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720 HTTP/1.1 204 No Content ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4x Multiple credentials of different type can be registered for the same authentication identifier. The following commands add psk credentials for the same device 4720 using authentication identifier sensor20:\nSHARED_KEY=$(echo -n \u0026quot;TheSharedKey\u0026quot; | base64 -w 0) curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[ { \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;hash-function\u0026quot; : \u0026quot;bcrypt\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;$2a$10$uc.qVDwXeDRE1DWa1sM9iOaY9wuevjfALGMtXmHKP.SJDEqg0q7M6\u0026quot; }] }, { \u0026quot;device-id\u0026quot;: \u0026quot;4720\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;key\u0026quot; : \u0026quot;'$SHARED_KEY'\u0026quot; }] }]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720 HTTP/1.1 204 No Content ETag: 122c971a-505a-4336-8f7d-640360e909bc The following command deletes all credentials for device 4710:\ncurl -i -X PUT -H 'Content-Type: application/json' --data-binary '[]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710 HTTP/1.1 204 No Content ETag: d383ba4d-1853-4d03-b322-b7ff5af05ae2 Get all Credentials for a Device URI: /v1/credentials/${tenantId}/${deviceId} Method: GET Status Codes: 200 (OK): Credentials for the device have been found, body contains the credentials. The response body contains the registration information as specified by Credentials schema of the HTTP API specification. 404 (Not Found): No credentials for the device are registered. Example\nThe following command retrieves credentials for device 4720:\ncurl -i http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720 HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 ETag: f3449b77-2c84-4b09-8d04-2b305876e0cb {[ { \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [ { \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;tnxz0zDFs+pJGdCVSuoPE4TnamXsfIjBEOb0rg3e9WFD9KfbCkoRuwVZKgRWInfqp87kCLsoV/HEwdJwgw793Q==\u0026quot; } ], \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot; }, { \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [ { \u0026quot;key\u0026quot;: \u0026quot;VGhlU2hhcmVkS2V5\u0026quot; } ], \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot; } ]} "
+ "content": "The Device Registry component provides exemplary implementations of Hono\u0026rsquo;s Tenant API, Device Registration API and Credentials API.\nAs such it exposes AMQP 1.0 based endpoints for retrieving the relevant information and persists data in the local filesystem.\nIn addition, the Device Registry also exposes HTTP resources for managing the contents of the registry according to the Device Registry HTTP API.\n Warning The Device Registry is not intended to be used in production environments. In particular, access to the HTTP resources described below is not restricted to authorized clients only.\nThe resources have been designed to provide convenient access to the registry\u0026rsquo;s content using command line tools like curl or HTTPie.\n Managing Tenants The following sections describe the resources representing the operations of the Tenant API and how they can be used to manage tenants. Please refer to the Device Registry HTTP API for the specific elements that are explained in detail there.\nAdd a Tenant URI: /v1/tenants/${tenantId} Method: POST Request Headers: (required) Content-Type: application/json (no other type supported) Request Body: (required) A JSON object as specified by Tenant schema of the HTTP API specification. Status Codes: 201 (Created): Tenant has been added successfully under the resource indicated by Location header. 400 (Bad Request): The tenant has not been created because the request was malformed, e .g. because the payload was malformed. The response body may contain hints regarding the cause of the problem. 409 (Conflict): A tenant with the given tenantId already exists. The request has not been processed. Response Headers: Location: The URI under which the newly created resource can be accessed. ETag: Version of the resource Example\nThe following commands add some tenants with different adapter configurations:\nAdd a tenant that has all adapters set to enabled:\ncurl -i -X POST -H 'Content-Type: application/json' http://localhost:28080/v1/tenants/tenantAllAdapters HTTP/1.1 201 Created ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4 Location: /v1/tenants/tenantAllAdapters Content-Type: application/json; charset=utf-8 {\u0026quot;id\u0026quot;: \u0026quot;tenantAllAdapters\u0026quot;} Add a tenant that can only use the MQTT adapter:\ncurl -i -X POST -H 'Content-Type: application/json' --data-binary '{ \u0026quot;adapters\u0026quot;: [ { \u0026quot;type\u0026quot;: \u0026quot;hono-mqtt\u0026quot;, \u0026quot;enabled\u0026quot;: true } ] }' http://localhost:28080/v1/tenants/tenantMqttAdapter HTTP/1.1 201 Created ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4 Location: /v1/tenants/tenantMqttAdapter Content-Type: application/json; charset=utf-8 {\u0026quot;id\u0026quot;: \u0026quot;tenantMqttAdapter\u0026quot;} Get configuration details of a Tenant URI: /v1/tenants/${tenantId} Method: GET Status Codes: 200 (OK): A tenant with the given identifier has been found. The response body contains the tenant data as specified by Tenant schema of the HTTP API specification. 404 (Not Found): No tenant with the given identifier is registered. Example\nThe following command retrieves the details for the tenant tenantMqttAdapter:\ncurl -i http://localhost:28080/v1/tenants/tenantMqttAdapter HTTP/1.1 200 OK ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4 Content-Type: application/json; charset=utf-8 { \u0026quot;enabled\u0026quot;: true, \u0026quot;adapters\u0026quot;: [ { \u0026quot;type\u0026quot;: \u0026quot;hono-mqtt\u0026quot;, \u0026quot;enabled\u0026quot;: true } ] } Update Tenant URI: /v1/tenants/${tenantId} Method: PUT Request Headers: (required) Content-Type: application/json (no other type supported) Request Body: (required) A JSON object as specified by Tenant schema of the HTTP API specification. Status Codes: 204 (No Content): The tenant has been updated successfully. 400 (Bad Request): The tenant has not been updated because the request was malformed, e .g. because the payload was malformed. The response body may contain hints regarding the cause of the problem. 404 (Not Found): The request could not be processed because no tenant with the given identifier exists. This resource can be used to change the configuration of a particular tenant.\nExample\nThe following command disables the MQTT adapter for devices that belong to the tenant tenantMqttAdapter:\ncurl -i -X PUT -H 'Content-Type: application/json' --data-binary '{ \u0026quot;adapters\u0026quot;: [ { \u0026quot;type\u0026quot;: \u0026quot;hono-mqtt\u0026quot;, \u0026quot;enabled\u0026quot;: true } ] }' http://localhost:28080/v1/tenants/tenantMqttAdapter HTTP/1.1 204 No Content ETag: 8919c736-30aa-40ce-a45a-830b90c4cd42 Content-Length: 0 Delete Tenant URI: /v1/tenants/${tenantId} Method: DELETE Status Codes: 204 (No Content): The tenant with the given identifier has been deleted. 404 (Not Found): The request could not be processed because no tenant with the given identifier exists. Example\ncurl -i -X DELETE http://localhost:28080/v1/tenants/tenantMqttAdapter HTTP/1.1 204 No Content Content-Length: 0 Managing Device Registration Information The following sections describe the resources representing the operations of the Device Registration API and how they can be used to manage device registration information. Please refer to the Device Registry HTTP API for the specific elements that are explained in detail there.\nRegister Device URI: /v1/devices/${tenantId}/${deviceId} Method: POST Headers: (required) Content-Type: application/json Request Body: (required) A JSON object as specified by Device schema of the HTTP API specification. Status Codes: 201 (Created): Device has been registered successfully under resource indicated by Location header. 400 (Bad Request): Device has not been registered because the request was malformed, e .g. a required header is missing (the body may contain hints regarding the problem). 409 (Conflict): There already exists a device with the given ID. The request has not been processed. Example\nThe following command registers a device with ID 4711 for tenant DEFAULT_TENANT\ncurl -i -X POST -H 'Content-Type: application/json' --data-binary '{ \u0026quot;ext\u0026quot;: { \u0026quot;ep\u0026quot;: \u0026quot;IMEI4711\u0026quot; } }' http://localhost:28080/v1/devices/DEFAULT_TENANT/4711 The response will contain a Location header containing the resource path created for the device. In this example it will look like this:\nHTTP/1.1 201 Created Location: /v1/devices/DEFAULT_TENANT/4711 ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4 Content-Type: application/json; charset=utf-8 {\u0026quot;id\u0026quot;: \u0026quot;4711\u0026quot;} Read Device URI: /v1/devices/${tenantId}/${deviceId} Method: GET Status Codes: 200 (OK): A device with the given identifier has been found. The response body contains the registration information as specified by Device schema of the HTTP API specification. 404 (Not Found): No device with the given identifier is registered for the given tenant. Example\nThe following command retrieves registration data for device 4711:\ncurl -i http://localhost:28080/v1/devices/DEFAULT_TENANT/4711 HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 { \u0026quot;enabled\u0026quot;: true, \u0026quot;ext\u0026quot;: { \u0026quot;ep\u0026quot;: \u0026quot;IMEI4711\u0026quot; } } Update Device URI: /devices/v1/${tenantId}/${deviceId} Method: PUT Headers: (required) Content-Type: application/json Parameters (encoded as a JSON object in the request body): Request Body: (required) A JSON object as specified by Device schema of the HTTP API specification. All existing registration information will be replaced by the data provided in the object. Status Codes: 204 (No Content): Device registration data has been updated. 400 (Bad Request): Device registration has not been updated because the request was malformed, e .g. a required header is missing (the body may contain hints regarding the problem). 404 (Not Found): No device with the given identifier is registered for the given tenant. Example\ncurl -i -X PUT -H 'Content-Type: application/json' --data-binary '{ \u0026quot;ext\u0026quot;: { \u0026quot;ep\u0026quot;: \u0026quot;IMEI4711\u0026quot;, \u0026quot;psk-id\u0026quot;: \u0026quot;psk4711\u0026quot; } }' http://localhost:28080/v1/devices/DEFAULT_TENANT/4711 HTTP/1.1 204 No Content Content-Length: 0 Delete Device URI: /v1/devices/${tenantId}/${deviceId} Method: DELETE Status Codes: 204 (No Content): Device registration has been deleted. 404 (Not Found): No device with the given identifier is registered for the given tenant. Example\ncurl -i -X DELETE http://localhost:28080/v1/devices/DEFAULT_TENANT/4711 HTTP/1.1 204 No Content Content-Length: 0 Managing Credentials The following sections describe the resources representing the operations of the Credentials API and how they can be used to manage credentials for devices. Please refer to the Device Registry HTTP API for the specific elements that are explained in detail there.\nUpdate Credentials for a Device URI: /v1/credentials/${tenantId}/${deviceId} Method: PUT Request Headers: (required) Content-Type: application/json (no other type supported) Request Body: (required) A JSON object as specified by Credentials schema of the HTTP API specification. Status Codes: 204 (No Content): Credentials have been updated successfully. 400 (Bad Request): The credentials have not been added because the request was malformed, e .g. because the payload did not contain required values. The response body may contain hints regarding the cause of the problem. Response Headers: ETag: Version of the resource Example\nThe following command adds some hashed-password credentials from a given plain text password for device 4710 using authentication identifier sensor10:\ncurl -i -X PUT -H 'Content-Type: application/json' --data-binary '[{ \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor10\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;pwd-plain\u0026quot;: \u0026quot;mylittlesecret\u0026quot; }] }]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710 HTTP/1.1 204 No Content ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4x This uses a convenient option which lets the Device Registry do the hashing of the password. The following command retrieves the credentials that are stored by the Device Registry as a result of the command above:\ncurl -i http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710 HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4x [{ \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor10\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [ { \u0026quot;pwd-hash\u0026quot;: \u0026quot;$2a$10$uc.qVDwXeDRE1DWa1sM9iOaY9wuevjfALGMtXmHKP.SJDEqg0q7M6\u0026quot;, \u0026quot;hash-function\u0026quot;: \u0026quot;bcrypt\u0026quot; } ] }] The following commands add some hashed-password credentials for device 4720 using authentication identifier sensor20:\nPWD_HASH=$(echo -n \u0026quot;mylittlesecret\u0026quot; | openssl dgst -binary -sha512 | base64 -w 0) curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[{ \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;'$PWD_HASH'\u0026quot; }] }]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720 HTTP/1.1 204 No Content ETag: 02c99fb5-af8c-409f-8520-b405e224b27f The following command adds an expiration date to the hashed-password credentials for authentication identifier sensor20:\nPWD_HASH=$(echo -n \u0026quot;mylittlesecret\u0026quot; | openssl dgst -binary -sha512 | base64 -w 0) curl -i -X PUT -H 'Content-Type: application/json' --data-binary '{ \u0026quot;device-id\u0026quot;: \u0026quot;4720\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;'$PWD_HASH'\u0026quot;, \u0026quot;not-after\u0026quot;: \u0026quot;2018-01-01T00:00:00+01:00\u0026quot; }] }' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720 HTTP/1.1 204 No Content ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4x Multiple credentials of different type can be registered for the same authentication identifier. The following commands add psk credentials for the same device 4720 using authentication identifier sensor20:\nSHARED_KEY=$(echo -n \u0026quot;TheSharedKey\u0026quot; | base64 -w 0) curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[ { \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;hash-function\u0026quot;: \u0026quot;bcrypt\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;$2a$10$uc.qVDwXeDRE1DWa1sM9iOaY9wuevjfALGMtXmHKP.SJDEqg0q7M6\u0026quot; }] }, { \u0026quot;device-id\u0026quot;: \u0026quot;4720\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;key\u0026quot;: \u0026quot;'$SHARED_KEY'\u0026quot; }] }]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720 HTTP/1.1 204 No Content ETag: 122c971a-505a-4336-8f7d-640360e909bc The following command deletes all credentials for device 4710:\ncurl -i -X PUT -H 'Content-Type: application/json' --data-binary '[]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710 HTTP/1.1 204 No Content ETag: d383ba4d-1853-4d03-b322-b7ff5af05ae2 Get all Credentials for a Device URI: /v1/credentials/${tenantId}/${deviceId} Method: GET Status Codes: 200 (OK): Credentials for the device have been found, body contains the credentials. The response body contains the registration information as specified by Credentials schema of the HTTP API specification. 404 (Not Found): No credentials for the device are registered. Example\nThe following command retrieves credentials for device 4720:\ncurl -i http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720 HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 ETag: f3449b77-2c84-4b09-8d04-2b305876e0cb {[ { \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [ { \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;tnxz0zDFs+pJGdCVSuoPE4TnamXsfIjBEOb0rg3e9WFD9KfbCkoRuwVZKgRWInfqp87kCLsoV/HEwdJwgw793Q==\u0026quot; } ], \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot; }, { \u0026quot;auth-id\u0026quot;: \u0026quot;sensor20\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [ { \u0026quot;key\u0026quot;: \u0026quot;VGhlU2hhcmVkS2V5\u0026quot; } ], \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot; } ]} "
},
{
"uri": "https://www.eclipse.org/hono/docs/user-guide/http-adapter/",
"title": "HTTP Adapter",
"tags": [],
"description": "",
- "content": "The HTTP protocol adapter exposes HTTP based endpoints for Eclipse Hono\u0026trade;\u0026rsquo;s south bound Telemetry, Event and Command \u0026amp; Control APIs.\nDevice Authentication The HTTP adapter by default requires clients (devices or gateway components) to authenticate during connection establishment. The adapter supports both the Basic HTTP authentication scheme as well as client certificate based authentication as part of a TLS handshake for that purpose.\nThe adapter tries to authenticate the device using these mechanisms in the following order\nClient Certificate When a device uses a client certificate for authentication during the TLS handshake, the adapter tries to determine the tenant that the device belongs to, based on the issuer DN contained in the certificate. In order for the lookup to succeed, the tenant\u0026rsquo;s trust anchor needs to be configured by means of registering the trusted certificate authority. The device\u0026rsquo;s client certificate will then be validated using the registered trust anchor, thus implicitly establishing the tenant that the device belongs to. In a second step, the adapter then uses the Credentials API\u0026rsquo;s get operation with the client certificate\u0026rsquo;s subject DN as the auth-id and x509-cert as the type of secret as query parameters.\nNB: The HTTP adapter needs to be configured for TLS in order to support this mechanism.\nHTTP Basic Auth The username provided in the header must have the form auth-id@tenant, e.g. sensor1@DEFAULT_TENANT. The adapter verifies the credentials provided by the client against the credentials that the configured Credentials service has on record for the client. The adapter uses the Credentials API\u0026rsquo;s get operation to retrieve the credentials on record with the tenant and auth-id provided by the device in the username and hashed-password as the type of secret as query parameters.\nThe examples below refer to devices 4711 and gw-1 of tenant DEFAULT_TENANT using auth-ids sensor1 and gw1 and corresponding passwords. The example deployment as described in the Deployment Guides comes pre-configured with the corresponding entities in its device registry component. Please refer to the Credentials API for details regarding the different types of secrets.\nNB There is a subtle difference between the device identifier (device-id) and the auth-id a device uses for authentication. See Device Identity for a discussion of the concepts.\nMessage Limits Before accepting any telemetry or event or command messages, the HTTP adapter verifies that the configured message limit is not exceeded. If the limit is exceeded then the incoming message is discarded with the status code 429 Too Many Requests.\nPublish Telemetry Data (authenticated Device) URI: /telemetry Method: POST Request Headers: (optional) authorization: The device\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the device to present a client certificate as part of the TLS handshake during connection establishment. (required) content-type: The type of payload contained in the request body. (optional) hono-ttd: The number of seconds the device will wait for the response. (optional) qos-level: The QoS level for publishing telemetry messages. The adapter supports at most once (0) and at least once (1) QoS levels. The default value of 0 is assumed if this header is omitted. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The telemetry data has been accepted for processing. The response contains a command for the device to execute. 202 (Accepted): The telemetry data has been accepted for processing. Note that if the qos-level request header is omitted (at most once semantics), this status code does not mean that the message has been delivered to any potential consumer. However, if the QoS level header is set to 1 (at least once semantics), then the adapter waits for the message to be delivered and accepted by a downstream consumer before responding with this status code. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty. The QoS header value is invalid. 401 (Unauthorized): The request cannot be processed because the request does not contain valid credentials. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The given tenant is not allowed to use this protocol adapter. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono. This is the preferred way for devices to publish telemetry data. It is available only if the protocol adapter is configured to require devices to authenticate (which is the default).\nExamples\nPublish some JSON data for device 4711:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4711 using at least once QoS:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' -H 'QoS-Level: 1' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://localhost:8080/telemetry HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4711, indicating that the device will wait for 10 seconds to receive the response:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' -H 'hono-ttd: 10' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://localhost:8080/telemetry HTTP/1.1 200 OK hono-command: set hono-cmd-req-id: 1010a7249aa5-f742-4376-8458-bbfc88c72d92 content-length: 23 { \u0026quot;brightness\u0026quot; : 87 } Publish some JSON data for device 4711 using a client certificate for authentication:\n# in base directory of Hono repository: curl -i --cert demo-certs/certs/device-4711-cert.pem --key demo-certs/certs/device-4711-key.pem --cacert demo-certs/certs/trusted-certs.pem -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' https://localhost:8443/telemetry HTTP/1.1 202 Accepted content-length: 0 NB: The example above assumes that the HTTP adapter is configured for TLS and the secure port is used.\nPublish Telemetry Data (unauthenticated Device) URI: /telemetry/${tenantId}/${deviceId} Method: PUT Request Headers: (required) content-type: The type of payload contained in the body. (optional) hono-ttd: The number of seconds the device will wait for the response. (optional) qos-level: The QoS level for publishing telemetry messages. The adapter supports at most once (0) and at least once (1) QoS levels. The default value of 0 is assumed if this header is omitted. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The telemetry data has been accepted for processing. The response contains a command for the device to execute. 202 (Accepted): The telemetry data has been accepted for processing. Note that if the qos-level request header is omitted (at most once semantics), this status code does not mean that the message has been delivered to any potential consumer. However, if the QoS level header is set to 1 (at least once semantics), then the adapter waits for the message to be delivered and accepted by a downstream consumer before responding with this status code. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty. The QoS header value is invalid. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The given tenant is not allowed to use this protocol adapter. The given device does not belong to the given tenant. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono. This resource MUST be used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_HTTP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\ncurl -i -X PUT -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry/DEFAULT_TENANT/4711 HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4711 using at least once QoS:\ncurl -i -X PUT -H 'content-type: application/json' -H 'qos-level: 1' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry/DEFAULT_TENANT/4711 HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4711, indicating that the device will wait for 10 seconds to receive the response:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' -H 'hono-ttd: 10' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://localhost:8080/telemetry HTTP/1.1 200 OK hono-command: set hono-cmd-req-id: 1010a7249aa5-f742-4376-8458-bbfc88c72d92 content-length: 23 { \u0026quot;brightness\u0026quot; : 87 } Publish Telemetry Data (authenticated Gateway) URI: /telemetry/${tenantId}/${deviceId} Method: PUT Request Headers: (optional) authorization: The gateway\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the gateway to present a client certificate as part of the TLS handshake during connection establishment. Request Headers: (required) content-type: The type of payload contained in the body. (optional) hono-ttd: The number of seconds the device will wait for the response. (optional) qos-level: The QoS level for publishing telemetry messages. The adapter supports at most once (0) and at least once (1) QoS levels. The default value of 0 is assumed if this header is omitted. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The telemetry data has been accepted for processing. The response contains a command for the device to execute. 202 (Accepted): The telemetry data has been accepted for processing. Note that if the qos-level request header is omitted (at most once semantics), this status code does not mean that the message has been delivered to any potential consumer. However, if the QoS level header is set to 1 (at least once semantics), then the adapter waits for the message to be delivered and accepted by a downstream consumer before responding with this status code. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty. The QoS header value is invalid. 401 (Unauthorized): The request cannot be processed because the request does not contain valid credentials. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The tenant that the gateway belongs to is not allowed to use this protocol adapter. The device belongs to another tenant than the gateway. The gateway is not authorized to act on behalf of the device. The gateway associated with the device is not registered or disabled. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono. This resource can be used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.\nThe protocol adapter checks the gateway\u0026rsquo;s authority to publish data on behalf of the device implicitly by means of retrieving a registration assertion for the device from the configured Device Registration service.\nExamples\nPublish some JSON data for device 4712:\ncurl -i -X PUT -u gw@DEFAULT_TENANT:gw-secret -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry/DEFAULT_TENANT/4712 HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4712 using at least once QoS:\ncurl -i -X PUT -u gw@DEFAULT_TENANT:gw-secret -H 'content-type: application/json' -H 'qos-level: 1' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry/DEFAULT_TENANT/4712 HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4712, indicating that the gateway will wait for 10 seconds to receive the response:\ncurl -i -X PUT -u gw@DEFAULT_TENANT:gw-secret -H 'content-type: application/json' -H 'hono-ttd: 10' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://localhost:8080/telemetry/DEFAULT_TENANT/4712 HTTP/1.1 200 OK hono-command: set hono-cmd-req-id: 1010a7249aa5-f742-4376-8458-bbfc88c72d92 content-length: 23 { \u0026quot;brightness\u0026quot; : 87 } NB: The example above assumes that a gateway device has been registered with hashed-password credentials with auth-id gw and password gw-secret which is authorized to publish data on behalf of device 4712.\nPublish an Event (authenticated Device) URI: /event Method: POST Request Headers: (optional) authorization: The device\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the device to present a client certificate as part of the TLS handshake during connection establishment. (required) content-type: The type of payload contained in the body. (optional) hono-ttd: The number of seconds the device will wait for the response. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The telemetry data has been accepted for processing. The response contains a command for the device to execute. 202 (Accepted): The event has been accepted for processing. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty but the event is not of type empty-notification. 401 (Unauthorized): The request cannot be processed because the request does not contain valid credentials. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The given tenant is not allowed to use this protocol adapter. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono. This is the preferred way for devices to publish events. It is available only if the protocol adapter is configured to require devices to authenticate (which is the default).\nExample\nPublish some JSON data for device 4711:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' --data-binary '{\u0026quot;alarm\u0026quot;: true}' http://127.0.0.1:8080/event HTTP/1.1 202 Accepted content-length: 0 Publish an Event (unauthenticated Device) URI: /event/${tenantId}/${deviceId} Method: PUT Request Headers: (required) content-type: The type of payload contained in the body. (optional) hono-ttd: The number of seconds the device will wait for the response. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The event has been accepted and put to a persistent store for delivery to consumers. The response contains a command for the device to execute. 202 (Accepted): The event has been accepted and put to a persistent store for delivery to consumers. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty but the event is not of type empty-notification. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The given tenant is not allowed to use this protocol adapter. The given device does not belong to the given tenant. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono. This resource MUST be used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_HTTP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\ncurl -i -X PUT -H 'content-type: application/json' --data-binary '{\u0026quot;alarm\u0026quot;: true}' http://127.0.0.1:8080/event/DEFAULT_TENANT/4711 HTTP/1.1 202 Accepted content-length: 0 Publish an Event (authenticated Gateway) URI: /event/${tenantId}/${deviceId} Method: PUT Request Headers: (optional) authorization: The gateway\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the gateway to present a client certificate as part of the TLS handshake during connection establishment. (required) content-type: The type of payload contained in the body. (optional) hono-ttd: The number of seconds the device will wait for the response. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The event has been accepted and put to a persistent store for delivery to consumers. The response contains a command for the device to execute. 202 (Accepted): The event has been accepted and put to a persistent store for delivery to consumers. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty but the event is not of type empty-notification. 401 (Unauthorized): The request cannot be processed because the request does not contain valid credentials. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The tenant that the gateway belongs to is not allowed to use this protocol adapter. The device belongs to another tenant than the gateway. The gateway is not authorized to act on behalf of the device. The gateway associated with the device is not registered or disabled. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono. This resource can be used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.\nThe protocol adapter checks the gateway\u0026rsquo;s authority to publish data on behalf of the device implicitly by means of retrieving a registration assertion for the device from the configured Device Registration service.\nExamples\nPublish some JSON data for device 4712:\ncurl -i -X PUT -u gw@DEFAULT_TENANT:gw-secret -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/event/DEFAULT_TENANT/4712 HTTP/1.1 202 Accepted content-length: 0 NB: The example above assumes that a gateway device has been registered with hashed-password credentials with auth-id gw and password gw-secret which is authorized to publish data on behalf of device 4712.\nSpecifying the Time a Device will wait for a Response The adapter lets devices indicate the number of seconds they will wait for a response by setting a header or a query parameter.\nUsing an HTTP Header The (optional) hono-ttd header can be set in requests for publishing telemetry data or events.\nExample:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' -H 'hono-ttd: 60' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry HTTP/1.1 202 Accepted content-length: 0 Using a Query Parameter Alternatively the hono-ttd query parameter can be used:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry?hono-ttd=60 HTTP/1.1 202 Accepted content-length: 0 Sending a Response to a Command (authenticated Device) Since: 0.7 URI: /command/res/${commandRequestId} or /command/res/${commandRequestId}?hono-cmd-status=${status} Method: POST Request Headers: (optional) authorization: The device\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the device to present a client certificate as part of the TLS handshake during connection establishment. (optional) content-type: A media type describing the semantics and format of the payload contained in the request body. This header may be set if the result of processing the command on the device is non-empty. In this case the result data is contained in the request body. (optional) hono-cmd-status: The status of the command execution. If not set, the adapter expects that the URI contains it as request parameter at the end. Request Body: (optional) Arbitrary data representing the result of processing the command on the device. Status Codes: 202 (Accepted): The response has been successfully delivered to the application that has sent the command. 400 (Bad Request): The request cannot be processed because the command status is missing. 401 (Unauthorized): The request cannot be processed because the request does not contain valid credentials.\n 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The given tenant is not allowed to use this protocol adapter. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed. Possible reasons for this include: There is no application listening for a reply to the given commandRequestId. The application has already given up on waiting for a response. This is the preferred way for devices to respond to commands. It is available only if the protocol adapter is configured to require devices to authenticate (which is the default).\n Deprecation Previous versions of Hono used control instead of command as prefix in the command response URI. Using the control prefix is still supported but deprecated. Example\nSend a response to a previously received command with the command-request-id req-id-uuid for device 4711:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' --data-binary '{\u0026quot;brightness-changed\u0026quot;: true}' http://127.0.0.1:8080/command/res/req-id-uuid?hono-cmd-status=200 HTTP/1.1 202 Accepted content-length: 0 Sending a Response to a Command (unauthenticated Device) Since: 0.7 URI: /command/res/${tenantId}/${deviceId}/${commandRequestId} or /command/res/${tenantId}/${deviceId}/${commandRequestId}?hono-cmd-status=${status} Method: PUT Request Headers: (optional) content-type: A media type describing the semantics and format of the payload contained in the request body (the outcome of processing the command). (optional) hono-cmd-status: The status of the command execution. If not set, the adapter expects that the URI contains it as request parameter at the end. Request Body: (optional) Arbitrary data representing the result of processing the command on the device. Status Codes: 202 (Accepted): The response has been successfully delivered to the application that has sent the command. 400 (Bad Request): The request cannot be processed because the command status is missing. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this might be: The given tenant is not allowed to use this protocol adapter. The given device does not belong to the given tenant. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed. Possible reasons for this include: There is no application listening for a reply to the given commandRequestId. The application has already given up on waiting for a response. This resource MUST be used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_HTTP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\n Deprecation Previous versions of Hono used control instead of command as prefix in the command response URI. Using the control prefix is still supported but deprecated. Examples\nSend a response to a previously received command with the command-request-id req-id-uuid for the unauthenticated device 4711:\ncurl -i -X PUT -H 'content-type: application/json' --data-binary '{\u0026quot;brightness-changed\u0026quot;: true}' http://127.0.0.1:8080/command/res/DEFAULT_TENANT/4711/req-id-uuid?hono-cmd-status=200 HTTP/1.1 202 Accepted content-length: 0 Sending a Response to a Command (authenticated Gateway) Since: 0.7 URI: /command/res/${tenantId}/${deviceId}/${commandRequestId} or /command/res/${tenantId}/${deviceId}/${commandRequestId}?hono-cmd-status=${status} Method: PUT Request Headers: (optional) authorization: The gateway\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the gateway to present a client certificate as part of the TLS handshake during connection establishment. (optional) content-type: A media type describing the semantics and format of the payload contained in the request body (the outcome of processing the command). (optional) hono-cmd-status: The status of the command execution. If not set, the adapter expects that the URI contains it as request parameter at the end. Request Body: (optional) Arbitrary data representing the result of processing the command on the device. Status Codes: 202 (Accepted): The response has been successfully delivered to the application that has sent the command. 400 (Bad Request): The request cannot be processed because the command status is missing. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this might be: The given tenant is not allowed to use this protocol adapter. The given device does not belong to the given tenant. The gateway is not authorized to act on behalf of the device. The gateway associated with the device is not registered or disabled. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed. Possible reasons for this include: There is no application listening for a reply to the given commandRequestId. The application has already given up on waiting for a response. This resource can be used by gateway components to send the response to a command on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.\nThe protocol adapter checks the gateway\u0026rsquo;s authority to send responses to a command on behalf of the device implicitly by means of retrieving a registration assertion for the device from the configured Device Registration service.\n Deprecation Previous versions of Hono used control instead of command as prefix in the command response URI. Using the control prefix is still supported but deprecated. Examples\nSend a response to a previously received command with the command-request-id req-id-uuid for device 4712:\ncurl -i -X PUT -u gw@DEFAULT_TENANT:gw-secret -H 'content-type: application/json' --data-binary '{\u0026quot;brightness-changed\u0026quot;: true}' http://127.0.0.1:8080/command/res/DEFAULT_TENANT/4712/req-id-uuid?hono-cmd-status=200 HTTP/1.1 202 Accepted content-length: 0 NB: The example above assumes that a gateway device has been registered with hashed-password credentials with auth-id gw and password gw-secret which is authorized to publish data on behalf of device 4712.\nDownstream Meta Data The adapter includes the following meta data in the application properties of messages being sent downstream:\n Name Type Description device_id string The identifier of the device that the message originates from. orig_adapter string Contains the adapter\u0026rsquo;s type name which can be used by downstream consumers to determine the protocol adapter that the message has been received over. The HTTP adapter\u0026rsquo;s type name is hono-http. orig_address string Contains the (relative) URI that the device has originally posted the data to. ttd integer Contains the effective number of seconds that the device will wait for a response. This property is only set if the HTTP request contains the hono-ttd header or request parameter. The adapter also considers defaults registered for the device at either the tenant or the device level. The values of the default properties are determined as follows:\n If the message already contains a non-empty property of the same name, the value if unchanged. Otherwise, if a default property of the same name is defined in the device\u0026rsquo;s registration information, that value is used. Otherwise, if a default property of the same name is defined for the tenant that the device belongs to, that value is used. Note that of the standard AMQP 1.0 message properties only the content-type and ttl can be set this way to a default value.\nTenant specific Configuration The adapter uses the Tenant API to retrieve tenant specific configuration for adapter type hono-http. The following properties are (currently) supported:\n Name Type Default Value Description enabled boolean true If set to false the adapter will reject all data from devices belonging to the tenant. max-ttd integer 60 Defines a tenant specific upper limit for the time until disconnect property that devices may include in requests for uploading telemetry data or events. Please refer to the Command \u0026amp; Control concept page for a discussion of this parameter\u0026rsquo;s purpose and usage.\nIf this property is not set for the hono-http adapter type, the adapter will try to read this property from the tenant level configuration. "
+ "content": "The HTTP protocol adapter exposes HTTP based endpoints for Eclipse Hono\u0026trade;\u0026rsquo;s south bound Telemetry, Event and Command \u0026amp; Control APIs.\nDevice Authentication The HTTP adapter by default requires clients (devices or gateway components) to authenticate during connection establishment. The adapter supports both the Basic HTTP authentication scheme as well as client certificate based authentication as part of a TLS handshake for that purpose.\nThe adapter tries to authenticate the device using these mechanisms in the following order\nClient Certificate When a device uses a client certificate for authentication during the TLS handshake, the adapter tries to determine the tenant that the device belongs to, based on the issuer DN contained in the certificate. In order for the lookup to succeed, the tenant\u0026rsquo;s trust anchor needs to be configured by means of registering the trusted certificate authority. The device\u0026rsquo;s client certificate will then be validated using the registered trust anchor, thus implicitly establishing the tenant that the device belongs to. In a second step, the adapter then uses the Credentials API\u0026rsquo;s get operation with the client certificate\u0026rsquo;s subject DN as the auth-id and x509-cert as the type of secret as query parameters.\nNB The HTTP adapter needs to be configured for TLS in order to support this mechanism.\nHTTP Basic Auth The username provided in the header must have the form auth-id@tenant, e.g. sensor1@DEFAULT_TENANT. The adapter verifies the credentials provided by the client against the credentials that the configured Credentials service has on record for the client. The adapter uses the Credentials API\u0026rsquo;s get operation to retrieve the credentials on record with the tenant and auth-id provided by the device in the username and hashed-password as the type of secret as query parameters.\nThe examples below refer to devices 4711 and gw-1 of tenant DEFAULT_TENANT using auth-ids sensor1 and gw1 and corresponding passwords. The example deployment as described in the Deployment Guides comes pre-configured with the corresponding entities in its device registry component. Please refer to the Credentials API for details regarding the different types of secrets.\nNB There is a subtle difference between the device identifier (device-id) and the auth-id a device uses for authentication. See Device Identity for a discussion of the concepts.\nMessage Limits Before accepting any telemetry or event or command messages, the HTTP adapter verifies that the configured message limit is not exceeded. If the limit is exceeded then the incoming message is discarded with the status code 429 Too Many Requests.\nPublish Telemetry Data (authenticated Device) URI: /telemetry Method: POST Request Headers: (optional) authorization: The device\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the device to present a client certificate as part of the TLS handshake during connection establishment. (required) content-type: The type of payload contained in the request body. (optional) hono-ttd: The number of seconds the device will wait for the response. (optional) qos-level: The QoS level for publishing telemetry messages. The adapter supports at most once (0) and at least once (1) QoS levels. The default value of 0 is assumed if this header is omitted. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-target-device: The id of the device that shall execute the command. This header will only be present if the response contains a command to be executed by the device and if the response goes to a gateway that acts on behalf of the target device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The telemetry data has been accepted for processing. The response contains a command for the device to execute. 202 (Accepted): The telemetry data has been accepted for processing. Note that if the qos-level request header is omitted (at most once semantics), this status code does not mean that the message has been delivered to any potential consumer. However, if the QoS level header is set to 1 (at least once semantics), then the adapter waits for the message to be delivered and accepted by a downstream consumer before responding with this status code. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty. The QoS header value is invalid. 401 (Unauthorized): The request cannot be processed because the request does not contain valid credentials. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The given tenant is not allowed to use this protocol adapter. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono. This is the preferred way for devices to publish telemetry data. It is available only if the protocol adapter is configured to require devices to authenticate (which is the default).\nIf the hono-ttd header is set in order to receive a command and if the authenticated device is actually a gateway, the returned command will be the first command that the northbound application has sent to either the gateway itself or (if not using the legacy control endpoint) to any device that has last sent a telemetry or event message via this gateway.\nExamples\nPublish some JSON data for device 4711:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4711 using at least once QoS:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' -H 'qos-level: 1' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://localhost:8080/telemetry HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4711, indicating that the device will wait for 10 seconds to receive the response:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' -H 'hono-ttd: 10' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://localhost:8080/telemetry HTTP/1.1 200 OK hono-command: set hono-cmd-req-id: 1010a7249aa5-f742-4376-8458-bbfc88c72d92 content-length: 23 { \u0026quot;brightness\u0026quot;: 87 } Publish some JSON data for device 4711 using a client certificate for authentication:\n# in base directory of Hono repository: curl -i --cert demo-certs/certs/device-4711-cert.pem --key demo-certs/certs/device-4711-key.pem --cacert demo-certs/certs/trusted-certs.pem -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' https://localhost:8443/telemetry HTTP/1.1 202 Accepted content-length: 0 NB The example above assumes that the HTTP adapter is configured for TLS and the secure port is used.\nPublish Telemetry Data (unauthenticated Device) URI: /telemetry/${tenantId}/${deviceId} Method: PUT Request Headers: (required) content-type: The type of payload contained in the request body. (optional) hono-ttd: The number of seconds the device will wait for the response. (optional) qos-level: The QoS level for publishing telemetry messages. The adapter supports at most once (0) and at least once (1) QoS levels. The default value of 0 is assumed if this header is omitted. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The telemetry data has been accepted for processing. The response contains a command for the device to execute. 202 (Accepted): The telemetry data has been accepted for processing. Note that if the qos-level request header is omitted (at most once semantics), this status code does not mean that the message has been delivered to any potential consumer. However, if the QoS level header is set to 1 (at least once semantics), then the adapter waits for the message to be delivered and accepted by a downstream consumer before responding with this status code. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty. The QoS header value is invalid. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The given tenant is not allowed to use this protocol adapter. The given device does not belong to the given tenant. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono. This resource MUST be used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_HTTP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\ncurl -i -X PUT -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry/DEFAULT_TENANT/4711 HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4711 using at least once QoS:\ncurl -i -X PUT -H 'content-type: application/json' -H 'qos-level: 1' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry/DEFAULT_TENANT/4711 HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4711, indicating that the device will wait for 10 seconds to receive the response:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' -H 'hono-ttd: 10' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://localhost:8080/telemetry HTTP/1.1 200 OK hono-command: set hono-cmd-req-id: 1010a7249aa5-f742-4376-8458-bbfc88c72d92 content-length: 23 { \u0026quot;brightness\u0026quot;: 87 } Publish Telemetry Data (authenticated Gateway) URI: /telemetry/${tenantId}/${deviceId} Method: PUT Request Headers: (optional) authorization: The gateway\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the gateway to present a client certificate as part of the TLS handshake during connection establishment. (required) content-type: The type of payload contained in the request body. (optional) hono-ttd: The number of seconds the device will wait for the response. (optional) qos-level: The QoS level for publishing telemetry messages. The adapter supports at most once (0) and at least once (1) QoS levels. The default value of 0 is assumed if this header is omitted. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-target-device: The id of the device that shall execute the command. This header will only be present if the response contains a command to be executed by the device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The telemetry data has been accepted for processing. The response contains a command for the device to execute. 202 (Accepted): The telemetry data has been accepted for processing. Note that if the qos-level request header is omitted (at most once semantics), this status code does not mean that the message has been delivered to any potential consumer. However, if the QoS level header is set to 1 (at least once semantics), then the adapter waits for the message to be delivered and accepted by a downstream consumer before responding with this status code. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty. The QoS header value is invalid. 401 (Unauthorized): The request cannot be processed because the request does not contain valid credentials. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The tenant that the gateway belongs to is not allowed to use this protocol adapter. The device belongs to another tenant than the gateway. The gateway is not authorized to act on behalf of the device. The gateway associated with the device is not registered or disabled. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono. This resource can be used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.\nThe protocol adapter checks the gateway\u0026rsquo;s authority to publish data on behalf of the device implicitly by means of retrieving a registration assertion for the device from the configured Device Registration service.\nExamples\nPublish some JSON data for device 4712:\ncurl -i -X PUT -u gw@DEFAULT_TENANT:gw-secret -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry/DEFAULT_TENANT/4712 HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4712 using at least once QoS:\ncurl -i -X PUT -u gw@DEFAULT_TENANT:gw-secret -H 'content-type: application/json' -H 'qos-level: 1' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry/DEFAULT_TENANT/4712 HTTP/1.1 202 Accepted content-length: 0 Publish some JSON data for device 4712, indicating that the gateway will wait for 10 seconds to receive the response:\ncurl -i -X PUT -u gw@DEFAULT_TENANT:gw-secret -H 'content-type: application/json' -H 'hono-ttd: 10' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://localhost:8080/telemetry/DEFAULT_TENANT/4712 HTTP/1.1 200 OK hono-command: set hono-cmd-req-id: 1010a7249aa5-f742-4376-8458-bbfc88c72d92 content-length: 23 { \u0026quot;brightness\u0026quot;: 87 } NB The example above assumes that a gateway device has been registered with hashed-password credentials with auth-id gw and password gw-secret which is authorized to publish data on behalf of device 4712.\nPublish an Event (authenticated Device) URI: /event Method: POST Request Headers: (optional) authorization: The device\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the device to present a client certificate as part of the TLS handshake during connection establishment. (required) content-type: The type of payload contained in the request body. (optional) hono-ttd: The number of seconds the device will wait for the response. (optional) hono-ttl: The time-to-live in number of seconds for event messages.\n Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-target-device: The id of the device that shall execute the command. This header will only be present if the response contains a command to be executed by the device and if the response goes to a gateway that acts on behalf of the target device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The event has been accepted for processing. The response contains a command for the device to execute. 202 (Accepted): The event has been accepted for processing. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty but the event is not of type empty-notification. 401 (Unauthorized): The request cannot be processed because the request does not contain valid credentials. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The given tenant is not allowed to use this protocol adapter. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of events for the given tenant connected to Hono. This is the preferred way for devices to publish events. It is available only if the protocol adapter is configured to require devices to authenticate (which is the default).\nIf the hono-ttd header is set in order to receive a command and if the authenticated device is actually a gateway, the returned command will be the first command that the northbound application has sent to either the gateway itself or (if not using the legacy control endpoint) to any device that has last sent a telemetry or event message via this gateway.\nExample\nPublish some JSON data for device 4711:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' --data-binary '{\u0026quot;alarm\u0026quot;: true}' http://127.0.0.1:8080/event HTTP/1.1 202 Accepted content-length: 0 Publish an Event (unauthenticated Device) URI: /event/${tenantId}/${deviceId} Method: PUT Request Headers: (required) content-type: The type of payload contained in the request body. (optional) hono-ttd: The number of seconds the device will wait for the response. (optional) hono-ttl: The time-to-live in number of seconds for event messages. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The event has been accepted and put to a persistent store for delivery to consumers. The response contains a command for the device to execute. 202 (Accepted): The event has been accepted and put to a persistent store for delivery to consumers. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty but the event is not of type empty-notification. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The given tenant is not allowed to use this protocol adapter. The given device does not belong to the given tenant. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of events for the given tenant connected to Hono. This resource MUST be used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_HTTP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\ncurl -i -X PUT -H 'content-type: application/json' --data-binary '{\u0026quot;alarm\u0026quot;: true}' http://127.0.0.1:8080/event/DEFAULT_TENANT/4711 HTTP/1.1 202 Accepted content-length: 0 Publish an Event (authenticated Gateway) URI: /event/${tenantId}/${deviceId} Method: PUT Request Headers: (optional) authorization: The gateway\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the gateway to present a client certificate as part of the TLS handshake during connection establishment. (required) content-type: The type of payload contained in the request body. (optional) hono-ttd: The number of seconds the device will wait for the response. (optional) hono-ttl: The time-to-live in number of seconds for event messages. Request Body: (required) Arbitrary payload encoded according to the given content type. Response Headers: (optional) content-type: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data. (optional) hono-command: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-req-id: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device. (optional) hono-cmd-target-device: The id of the device that shall execute the command. This header will only be present if the response contains a command to be executed by the device. Response Body: (optional) Arbitrary data serving as input to a command to be executed by the device, if status code is 200. (optional) Error details, if status code is \u0026gt;= 400. Status Codes: 200 (OK): The event has been accepted and put to a persistent store for delivery to consumers. The response contains a command for the device to execute. 202 (Accepted): The event has been accepted and put to a persistent store for delivery to consumers. 400 (Bad Request): The request cannot be processed. Possible reasons for this include: The content type header is missing. The request body is empty but the event is not of type empty-notification. 401 (Unauthorized): The request cannot be processed because the request does not contain valid credentials. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The tenant that the gateway belongs to is not allowed to use this protocol adapter. The device belongs to another tenant than the gateway. The gateway is not authorized to act on behalf of the device. The gateway associated with the device is not registered or disabled. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed because there is no consumer of events for the given tenant connected to Hono. This resource can be used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.\nThe protocol adapter checks the gateway\u0026rsquo;s authority to publish data on behalf of the device implicitly by means of retrieving a registration assertion for the device from the configured Device Registration service.\nExamples\nPublish some JSON data for device 4712:\ncurl -i -X PUT -u gw@DEFAULT_TENANT:gw-secret -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/event/DEFAULT_TENANT/4712 HTTP/1.1 202 Accepted content-length: 0 NB The example above assumes that a gateway device has been registered with hashed-password credentials with auth-id gw and password gw-secret which is authorized to publish data on behalf of device 4712.\nSpecifying the Time a Device will wait for a Response The adapter lets devices indicate the number of seconds they will wait for a response by setting a header or a query parameter.\nUsing an HTTP Header The (optional) hono-ttd header can be set in requests for publishing telemetry data or events.\nExample:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' -H 'hono-ttd: 60' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry HTTP/1.1 202 Accepted content-length: 0 Using a Query Parameter Alternatively the hono-ttd query parameter can be used:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' http://127.0.0.1:8080/telemetry?hono-ttd=60 HTTP/1.1 202 Accepted content-length: 0 Sending a Response to a Command (authenticated Device) Since: 0.7 URI: /command/res/${commandRequestId} or /command/res/${commandRequestId}?hono-cmd-status=${status} Method: POST Request Headers: (optional) authorization: The device\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the device to present a client certificate as part of the TLS handshake during connection establishment. (optional) content-type: A media type describing the semantics and format of the payload contained in the request body. This header may be set if the result of processing the command on the device is non-empty. In this case the result data is contained in the request body. (optional) hono-cmd-status: The status of the command execution. If not set, the adapter expects that the URI contains it as request parameter at the end. Request Body: (optional) Arbitrary data representing the result of processing the command on the device. Status Codes: 202 (Accepted): The response has been successfully delivered to the application that has sent the command. 400 (Bad Request): The request cannot be processed because the command status is missing. 401 (Unauthorized): The request cannot be processed because the request does not contain valid credentials.\n 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this include: The given tenant is not allowed to use this protocol adapter. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed. Possible reasons for this include: There is no application listening for a reply to the given commandRequestId. The application has already given up on waiting for a response. This is the preferred way for devices to respond to commands. It is available only if the protocol adapter is configured to require devices to authenticate (which is the default).\n Deprecation Previous versions of Hono used control instead of command as prefix in the command response URI. Using the control prefix is still supported but deprecated. Example\nSend a response to a previously received command with the command-request-id req-id-uuid for device 4711:\ncurl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' --data-binary '{\u0026quot;brightness-changed\u0026quot;: true}' http://127.0.0.1:8080/command/res/req-id-uuid?hono-cmd-status=200 HTTP/1.1 202 Accepted content-length: 0 Sending a Response to a Command (unauthenticated Device) Since: 0.7 URI: /command/res/${tenantId}/${deviceId}/${commandRequestId} or /command/res/${tenantId}/${deviceId}/${commandRequestId}?hono-cmd-status=${status} Method: PUT Request Headers: (optional) content-type: A media type describing the semantics and format of the payload contained in the request body (the outcome of processing the command). (optional) hono-cmd-status: The status of the command execution. If not set, the adapter expects that the URI contains it as request parameter at the end. Request Body: (optional) Arbitrary data representing the result of processing the command on the device. Status Codes: 202 (Accepted): The response has been successfully delivered to the application that has sent the command. 400 (Bad Request): The request cannot be processed because the command status is missing. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this might be: The given tenant is not allowed to use this protocol adapter. The given device does not belong to the given tenant. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed. Possible reasons for this include: There is no application listening for a reply to the given commandRequestId. The application has already given up on waiting for a response. This resource MUST be used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_HTTP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\n Deprecation Previous versions of Hono used control instead of command as prefix in the command response URI. Using the control prefix is still supported but deprecated. Examples\nSend a response to a previously received command with the command-request-id req-id-uuid for the unauthenticated device 4711:\ncurl -i -X PUT -H 'content-type: application/json' --data-binary '{\u0026quot;brightness-changed\u0026quot;: true}' http://127.0.0.1:8080/command/res/DEFAULT_TENANT/4711/req-id-uuid?hono-cmd-status=200 HTTP/1.1 202 Accepted content-length: 0 Sending a Response to a Command (authenticated Gateway) Since: 0.7 URI: /command/res/${tenantId}/${deviceId}/${commandRequestId} or /command/res/${tenantId}/${deviceId}/${commandRequestId}?hono-cmd-status=${status} Method: PUT Request Headers: (optional) authorization: The gateway\u0026rsquo;s auth-id and plain text password encoded according to the Basic HTTP authentication scheme. If not set, the adapter expects the gateway to present a client certificate as part of the TLS handshake during connection establishment. (optional) content-type: A media type describing the semantics and format of the payload contained in the request body (the outcome of processing the command). (optional) hono-cmd-status: The status of the command execution. If not set, the adapter expects that the URI contains it as request parameter at the end. Request Body: (optional) Arbitrary data representing the result of processing the command on the device. Status Codes: 202 (Accepted): The response has been successfully delivered to the application that has sent the command. 400 (Bad Request): The request cannot be processed because the command status is missing. 403 (Forbidden): The request cannot be processed because the device\u0026rsquo;s registration status cannot be asserted. Possible reasons for this might be: The given tenant is not allowed to use this protocol adapter. The given device does not belong to the given tenant. The gateway is not authorized to act on behalf of the device. The gateway associated with the device is not registered or disabled. 404 (Not Found): The request cannot be processed because the device is disabled or does not exist. 429 (Too Many Requests): The request cannot be processed because the tenant\u0026rsquo;s message limit for the current period is exceeded. 503 (Service Unavailable): The request cannot be processed. Possible reasons for this include: There is no application listening for a reply to the given commandRequestId. The application has already given up on waiting for a response. This resource can be used by gateway components to send the response to a command on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.\nThe protocol adapter checks the gateway\u0026rsquo;s authority to send responses to a command on behalf of the device implicitly by means of retrieving a registration assertion for the device from the configured Device Registration service.\n Deprecation Previous versions of Hono used control instead of command as prefix in the command response URI. Using the control prefix is still supported but deprecated. Examples\nSend a response to a previously received command with the command-request-id req-id-uuid for device 4712:\ncurl -i -X PUT -u gw@DEFAULT_TENANT:gw-secret -H 'content-type: application/json' --data-binary '{\u0026quot;brightness-changed\u0026quot;: true}' http://127.0.0.1:8080/command/res/DEFAULT_TENANT/4712/req-id-uuid?hono-cmd-status=200 HTTP/1.1 202 Accepted content-length: 0 NB The example above assumes that a gateway device has been registered with hashed-password credentials with auth-id gw and password gw-secret which is authorized to publish data on behalf of device 4712.\nDownstream Meta Data The adapter includes the following meta data in the application properties of messages being sent downstream:\n Name Type Description device_id string The identifier of the device that the message originates from. orig_adapter string Contains the adapter\u0026rsquo;s type name which can be used by downstream consumers to determine the protocol adapter that the message has been received over. The HTTP adapter\u0026rsquo;s type name is hono-http. orig_address string Contains the (relative) URI that the device has originally posted the data to. ttd integer Contains the effective number of seconds that the device will wait for a response. This property is only set if the HTTP request contains the hono-ttd header or request parameter. The adapter also considers defaults registered for the device at either the tenant or the device level. The values of the default properties are determined as follows:\n If the message already contains a non-empty property of the same name, the value if unchanged. Otherwise, if a default property of the same name is defined in the device\u0026rsquo;s registration information, that value is used. Otherwise, if a default property of the same name is defined for the tenant that the device belongs to, that value is used. Note that of the standard AMQP 1.0 message properties only the content-type and ttl can be set this way to a default value.\nEvent Message Time-to-live Events published by devices will usually be persisted by the AMQP Messaging Network in order to support deferred delivery to downstream consumers. In most cases the AMQP Messaging Network can be configured with a maximum time-to-live to apply to the events so that the events will be removed from the persistent store if no consumer has attached to receive the event before the message expires.\nIn order to support environments where the AMQP Messaging Network cannot be configured accordingly, the protocol adapter supports setting a downstream event message\u0026rsquo;s ttl property based on the hono-ttl property set as a header or a query parameter in the event requests by the devices. Also the default ttl and max-ttl values can be configured for a tenant/device as described in the Tenant API.\nTenant specific Configuration The adapter uses the Tenant API to retrieve tenant specific configuration for adapter type hono-http. The following properties are (currently) supported:\n Name Type Default Value Description enabled boolean true If set to false the adapter will reject all data from devices belonging to the tenant. max-ttd integer 60 Defines a tenant specific upper limit for the time until disconnect property that devices may include in requests for uploading telemetry data or events. Please refer to the Command \u0026amp; Control concept page for a discussion of this parameter\u0026rsquo;s purpose and usage.\nThis property can be set for the hono-http adapter type as an extension property in the adapter section of the tenant configuration.\nIf it is not set, then the default value of 60 seconds is used. "
},
{
"uri": "https://www.eclipse.org/hono/docs/user-guide/mqtt-adapter/",
"title": "MQTT Adapter",
"tags": [],
"description": "",
- "content": "The MQTT protocol adapter exposes an MQTT topic hierarchy for publishing telemetry data and events to downstream consumers and for receiving commands from applications and sending back responses.\nThe MQTT adapter is not a general purpose MQTT broker. In particular the adapter\n supports MQTT 3.1.1 only. does not maintain session state for clients and thus always sets the session present flag in its CONNACK packet to 0, regardless of the value of the clean session flag provided in a client\u0026rsquo;s CONNECT packet. ignores any Will included in a client\u0026rsquo;s CONNECT packet. only supports topic names/filters for devices to publish and subscribe to that are specific to Hono\u0026rsquo;s functionality as described in the following sections. does not support retaining messages. However, if an event or telemetry message\u0026rsquo;s retain flag is set to 1 then the corresponding AMQP 1.0 message being sent downstream by the adapter will contain an x-opt-retain message annotation containing the boolean value true. A downstream consumer may then react according to the presence of this annotation. Authentication The MQTT adapter by default requires clients (devices or gateway components) to authenticate during connection establishment. The adapter supports both the authentication based on the username/password provided in an MQTT CONNECT packet as well as client certificate based authentication as part of a TLS handshake for that purpose.\nThe adapter tries to authenticate the device using these mechanisms in the following order\nClient Certificate When a device uses a client certificate for authentication during the TLS handshake, the adapter tries to determine the tenant that the device belongs to, based on the issuer DN contained in the certificate. In order for the lookup to succeed, the tenant\u0026rsquo;s trust anchor needs to be configured by means of registering the trusted certificate authority. The device\u0026rsquo;s client certificate will then be validated using the registered trust anchor, thus implicitly establishing the tenant that the device belongs to. In a second step, the adapter then uses the Credentials API\u0026rsquo;s get operation with the client certificate\u0026rsquo;s subject DN as the auth-id and x509-cert as the type of secret as query parameters.\nNB The adapter needs to be configured for TLS in order to support this mechanism.\nUsername/Password When a device wants to authenticate using this mechanism, it needs to provide a username and a password in the MQTT CONNECT packet it sends in order to initiate the connection. The username must have the form auth-id@tenant, e.g. sensor1@DEFAULT_TENANT. The adapter verifies the credentials provided by the client against the credentials the configured Credentials service has on record for the client. The adapter uses the Credentials API\u0026rsquo;s get operation to retrieve the credentials on record with the tenant and auth-id provided by the client in the username and hashed-password as the type of secret as query parameters.\nThe examples below refer to devices 4711 and gw-1 of tenant DEFAULT_TENANT using auth-ids sensor1 and gw1 and corresponding passwords. The example deployment as described in the Deployment Guides comes pre-configured with the corresponding entities in its device registry component.\nNB There is a subtle difference between the device identifier (device-id) and the auth-id a device uses for authentication. See Device Identity for a discussion of the concepts.\nConnection Limits After verifying the credentials, the number of existing connections is checked against the configured resource-limits by the MQTT adapter. If the limit is exceeded then a return code 0x05 indicating Connection Refused: not authorised is sent back.\nMessage Limits Before accepting any telemetry or event or command messages, the MQTT adapter verifies that the configured message limit is not exceeded. The incoming message is discarded if the limit is exceeded.\nPublishing Telemetry Data The MQTT adapter supports the publishing of telemetry data by means of MQTT PUBLISH packets using either QoS 0 or QoS 1. Using QoS 1 will result in the adapter sending an MQTT PUBACK packet to the client once the message has been settled with the accepted outcome by the AMQP 1.0 Messaging Network.\nThis requires that\n the AMQP 1.0 Messaging Network has capacity to process telemetry messages for the client\u0026rsquo;s tenant and the messages published by the client comply with the format defined by the Telemetry API. The protocol adapter checks the configured message limit before accepting any telemetry messages. If the message limit is exceeded or the incoming telemetry message cannot be processed, the connection to the client is closed.\nPublish Telemetry Data (authenticated Device) Topic: telemetry or t Authentication: required Payload: (required) Arbitrary payload This is the preferred way for devices to publish telemetry data. It is available only if the protocol adapter is configured to require devices to authenticate (which is the default). When using this topic, the MQTT adapter determines the device\u0026rsquo;s tenant and device identity as part of the authentication process.\nExample\nPublish some JSON data for device 4711:\nmosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t telemetry -m '{\u0026quot;temp\u0026quot;: 5}' Publish some JSON data for device 4711 using a client certificate for authentication:\n# in base directory of Hono repository: mosquitto_pub -p 8883 -t telemetry -m '{\u0026quot;temp\u0026quot;: 5}' --cert demo-certs/certs/device-4711-cert.pem --key demo-certs/certs/device-4711-key.pem --cafile demo-certs/certs/trusted-certs.pem NB: The example above assumes that the MQTT adapter is configured for TLS and the secure port is used.\nPublish Telemetry Data (unauthenticated Device) Topic: telemetry/${tenant-id}/${device-id} or t/${tenant-id}/${device-id} Authentication: none Payload: (required) Arbitrary payload This topic can be used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_MQTT_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\nmosquitto_pub -t telemetry/DEFAULT_TENANT/4711 -m '{\u0026quot;temp\u0026quot;: 5}' Publish Telemetry Data (authenticated Gateway) Topic: telemetry/${tenant-id}/${device-id} or t/${tenant-id}/${device-id} Authentication: required Payload: (required) Arbitrary payload This topic can be used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the topic name are used to identify the device that the gateway publishes data for.\nThe protocol adapter checks the gateway\u0026rsquo;s authority to publish data on behalf of the device implicitly by means of retrieving a registration assertion for the device from the configured Device Registration service.\nExamples\nPublish some JSON data for device 4712 via gateway gw-1:\nmosquitto_pub -u 'gw@DEFAULT_TENANT' -P gw-secret -t telemetry/DEFAULT_TENANT/4712 -m '{\u0026quot;temp\u0026quot;: 5}' NB: The example above assumes that a gateway device with ID gw-1 has been registered with hashed-password credentials with auth-id gw and password gw-secret.\nPublishing Events The MQTT adapter supports the publishing of events by means of MQTT PUBLISH packets using QoS 1 only. The adapter will send an MQTT PUBACK packet to the client once the event has been settled with the accepted outcome by the AMQP 1.0 Messaging Network.\nThis requires that\n the AMQP 1.0 Messaging Network has capacity to process events for the client\u0026rsquo;s tenant and the events published by the client comply with the format defined by the Event API. The protocol adapter checks the configured message limit before accepting any event messages. If the message limit is exceeded or the incoming event message cannot be processed, the connection to the client is closed.\nPublish an Event (authenticated Device) Topic: event or e Authentication: required Payload: (required) Arbitrary payload This is the preferred way for devices to publish events. It is available only if the protocol adapter has been configured to require devices to authenticate (which is the default).\nExample\nUpload a JSON string for device 4711:\nmosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t event -q 1 -m '{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (unauthenticated Device) Topic: event/${tenant-id}/${device-id} or e/${tenant-id}/${device-id} Authentication: none Payload: (required) Arbitrary payload This topic can be used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_MQTT_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\nmosquitto_pub -t event/DEFAULT_TENANT/4711 -q 1 -m '{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (authenticated Gateway) Topic: event/${tenant-id}/${device-id} or e/${tenant-id}/${device-id} Authentication: required Payload: (required) Arbitrary payload This topic can be used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the topic name are used to identify the device that the gateway publishes data for.\nThe protocol adapter checks the gateway\u0026rsquo;s authority to publish data on behalf of the device implicitly by means of retrieving a registration assertion for the device from the configured Device Registration service.\nExamples\nPublish some JSON data for device 4712 via gateway gw-1:\nmosquitto_pub -u 'gw@DEFAULT_TENANT' -P gw-secret -t event/DEFAULT_TENANT/4712 -q 1 -m '{\u0026quot;temp\u0026quot;: 5}' NB: The example above assumes that a gateway device with ID gw-1 has been registered with hashed-password credentials with auth-id gw and password gw-secret.\nCommand \u0026amp; Control The MQTT adapter supports devices to receive commands that have been sent by business applications by means of sending an MQTT SUBSCRIBE packet containing a device specific topic filter as described below. Devices can subscribe with QoS 1 or QoS 0. The adapter indicates the outcome of the subscription request by sending back a corresponding SUBACK packet. The SUBACK packet will contain Success - QoS 0 (0x00) or Success - QoS 1 (0x01) for a command topic filter indicating QoS 0 or 1 and will contain the Failure (0x80) value for all other filters. When a device no longer wants to receive commands anymore, it can send an MQTT UNSUBSCRIBE packet to the adapter, including the same topic filter that has been used to subscribe.\nWhen a device has successfully subscribed, the adapter sends an empty notification on behalf of the device to the downstream AMQP 1.0 Messaging Network with the ttd header set to -1, indicating that the device will be ready to receive commands until further notice. Analogously, the adapter sends an empty notification with the ttd header set to 0 when a device unsubscribes from commands.\nCommands can be sent following a request/response pattern or being one-way.\nFor Request/Response commands, devices send their responses to commands by means of sending an MQTT PUBLISH message to a topic that is specific to the command that has been executed. The MQTT adapter accepts responses being published using either QoS 0 or QoS 1.\nThe MQTT adapter checks the configured message limit before accepting any command requests and responses. In case of incoming command requests from business applications, if the message limit is exceeded, the Adapter rejects the message with the reason amqp:resource-limit-exceeded. And for the incoming command responses from devices, the Adapter rejects the message and closes the connection to the client.\nThe following sections define the topic filters/names to use for subscribing to and responding to commands. The following shorthand versions of topic path segments are supported:\n c instead of command q instead of req s instead of res Note Previous versions of Hono used control instead of command as topic prefix. Using the control prefix is still supported but deprecated. The following variables are used:\n ${command} : is an arbitrary string that indicates the command to execute, e.g. setBrightness. The command is provided by the application that sends the command. ${req-id} (only for Request/Response commands) : denotes the unique identifier of the command execution request and is passed to the device as part of the name of the topic that the command is published to. The device needs to publish its response to the command to a topic which includes this identifier, thus allowing the adapter to correlate the response with the request. ${status} : is the HTTP status code indicating the outcome of executing the command. This status code is passed on to the application in the AMQP message\u0026rsquo;s status header. The property-bag is an optional collection of properties intended for the receiver of the message. A property bag is only allowed at the very end of a topic. It always starts with a ? character, followed by pairs of URL encoded property names and values that are separated by \u0026amp;. The following example shows a property bag that contains two properties seqNo and importance:\n/topic/name/?seqNo=10034\u0026amp;importance=\u0026quot;high\u0026quot; The MQTT adapter currently does not require nor use any properties.\nReceiving Commands (authenticated Device) An authenticated device MUST use the following topic filter to subscribe to commands:\n command/+/+/req/# Example\nmosquitto_sub -v -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t command/+/+/req/# The adapter will then publish commands for the device to topic:\n for Request/Response commands: command///req/${req-id}/${command}[/*][/property-bag] for one-way commands: command///req//${command}[/*][/property-bag] Example\nFor example, if the HonoExampleApplication was started, after the ttd event requested by the subscription of mosquitto_sub, it layers a command that arrives as follows:\ncommand///q/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/setBrightness { \u0026quot;brightness\u0026quot; : 79 } If the command is a one-way command, it will arrive as follows:\ncommand///q//setBrightness { \u0026quot;brightness\u0026quot; : 79 } Receiving Commands (unauthenticated Device) An unauthenticated device MUST use the following topic filter to subscribe to commands:\n command/${tenant-id}/${device-id}/req/# Example\nmosquitto_sub -v -t command/DEFAULT_TENANT/4711/req/# The adapter will then publish Request/Response commands for the device to topic:\n command/${tenant-id}/${device-id}/req/${req-id}/${command}[/*][/property-bag] and one-way commands to the topic:\n command/${tenant-id}/${device-id}/req//${command}[/*][/property-bag] (For an example of the incoming command see above at authenticated device)\nSending a Response to a Command (authenticated Device) An authenticated device MUST send the response to a previously received command to the following topic:\n command///res/${req-id}/${status} Example\nAfter a command has arrived as in the above example, you send a response using the arrived ${req-id}:\nmosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t command///res/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/200 -m '{\u0026quot;lumen\u0026quot;: 200}' Sending a Response to a Command (unauthenticated Device) An unauthenticated device MUST send the response to a previously received command to the following topic:\n command/${tenant-id}/${device-id}/res/${req-id}/${status} Example\nAfter a command has arrived as in the above example, you send a response using the arrived ${req-id}:\nmosquitto_pub -t command/DEFAULT_TENANT/4711/res/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/200 -m '{\u0026quot;lumen\u0026quot;: 200}' Downstream Meta Data The adapter includes the following meta data in messages being sent downstream:\n Name Location Type Description device_id application string The identifier of the device that the message originates from. orig_adapter application string Contains the adapter\u0026rsquo;s type name which can be used by downstream consumers to determine the protocol adapter that the message has been received over. The MQTT adapter\u0026rsquo;s type name is hono-mqtt. orig_address application string Contains the name of the MQTT topic that the device has originally published the data to. x-opt-retain * message-annotations boolean Contains true if the device has published an event or telemetry message with its retain flag set to 1 The adapter also considers defaults registered for the device at either the tenant or the device level. The values of the default properties are determined as follows:\n If the message already contains a non-empty property of the same name, the value if unchanged. Otherwise, if a default property of the same name is defined in the device\u0026rsquo;s registration information, that value is used. Otherwise, if a default property of the same name is defined for the tenant that the device belongs to, that value is used. Note that of the standard AMQP 1.0 message properties only the content-type and ttl can be set this way to a default value.\nTenant specific Configuration The adapter uses the Tenant API to retrieve tenant specific configuration for adapter type hono-mqtt. The following properties are (currently) supported:\n Name Type Default Value Description enabled boolean true If set to false the adapter will reject all data from devices belonging to the tenant. "
+ "content": "The MQTT protocol adapter exposes an MQTT topic hierarchy for publishing telemetry data and events to downstream consumers and for receiving commands from applications and sending back responses.\nThe MQTT adapter is not a general purpose MQTT broker. In particular the adapter\n supports MQTT 3.1.1 only. does not maintain session state for clients and thus always sets the session present flag in its CONNACK packet to 0, regardless of the value of the clean session flag provided in a client\u0026rsquo;s CONNECT packet. ignores any Will included in a client\u0026rsquo;s CONNECT packet. only supports topic names/filters for devices to publish and subscribe to that are specific to Hono\u0026rsquo;s functionality as described in the following sections. does not support retaining messages. However, if an event or telemetry message\u0026rsquo;s retain flag is set to 1 then the corresponding AMQP 1.0 message being sent downstream by the adapter will contain an x-opt-retain message annotation containing the boolean value true. A downstream consumer may then react according to the presence of this annotation. Authentication The MQTT adapter by default requires clients (devices or gateway components) to authenticate during connection establishment. The adapter supports both the authentication based on the username/password provided in an MQTT CONNECT packet as well as client certificate based authentication as part of a TLS handshake for that purpose.\nThe adapter tries to authenticate the device using these mechanisms in the following order\nClient Certificate When a device uses a client certificate for authentication during the TLS handshake, the adapter tries to determine the tenant that the device belongs to, based on the issuer DN contained in the certificate. In order for the lookup to succeed, the tenant\u0026rsquo;s trust anchor needs to be configured by means of registering the trusted certificate authority. The device\u0026rsquo;s client certificate will then be validated using the registered trust anchor, thus implicitly establishing the tenant that the device belongs to. In a second step, the adapter then uses the Credentials API\u0026rsquo;s get operation with the client certificate\u0026rsquo;s subject DN as the auth-id and x509-cert as the type of secret as query parameters.\nNB The adapter needs to be configured for TLS in order to support this mechanism.\nUsername/Password When a device wants to authenticate using this mechanism, it needs to provide a username and a password in the MQTT CONNECT packet it sends in order to initiate the connection. The username must have the form auth-id@tenant, e.g. sensor1@DEFAULT_TENANT. The adapter verifies the credentials provided by the client against the credentials the configured Credentials service has on record for the client. The adapter uses the Credentials API\u0026rsquo;s get operation to retrieve the credentials on record with the tenant and auth-id provided by the client in the username and hashed-password as the type of secret as query parameters.\nThe examples below refer to devices 4711 and gw-1 of tenant DEFAULT_TENANT using auth-ids sensor1 and gw1 and corresponding passwords. The example deployment as described in the Deployment Guides comes pre-configured with the corresponding entities in its device registry component.\nNB There is a subtle difference between the device identifier (device-id) and the auth-id a device uses for authentication. See Device Identity for a discussion of the concepts.\nConnection Limits After verifying the credentials, the number of existing connections is checked against the configured resource-limits by the MQTT adapter. If the limit is exceeded then a return code 0x05 indicating Connection Refused: not authorised is sent back.\nMessage Limits Before accepting any telemetry or event or command messages, the MQTT adapter verifies that the configured message limit is not exceeded. The incoming message is discarded if the limit is exceeded.\nConnection Event The MQTT Adapter can send a Connection Event once the connection with a device has been successfully established or ended. Note that this requires the HONO_CONNECTION_EVENTS_PRODUCER configuration property to be explicitly set to events.\nPublishing Telemetry Data The MQTT adapter supports the publishing of telemetry data by means of MQTT PUBLISH packets using either QoS 0 or QoS 1. Using QoS 1 will result in the adapter sending an MQTT PUBACK packet to the client once the message has been settled with the accepted outcome by the AMQP 1.0 Messaging Network.\nThis requires that\n the AMQP 1.0 Messaging Network has capacity to process telemetry messages for the client\u0026rsquo;s tenant and the messages published by the client comply with the format defined by the Telemetry API. The protocol adapter checks the configured message limit before accepting any telemetry messages. If the message limit is exceeded or the incoming telemetry message cannot be processed, the connection to the client is closed.\nPublish Telemetry Data (authenticated Device) Topic: telemetry or t Authentication: required Payload: (required) Arbitrary payload This is the preferred way for devices to publish telemetry data. It is available only if the protocol adapter is configured to require devices to authenticate (which is the default). When using this topic, the MQTT adapter determines the device\u0026rsquo;s tenant and device identity as part of the authentication process.\nExample\nPublish some JSON data for device 4711:\nmosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t telemetry -m '{\u0026quot;temp\u0026quot;: 5}' Publish some JSON data for device 4711 using a client certificate for authentication:\n# in base directory of Hono repository: mosquitto_pub -p 8883 -t telemetry -m '{\u0026quot;temp\u0026quot;: 5}' --cert demo-certs/certs/device-4711-cert.pem --key demo-certs/certs/device-4711-key.pem --cafile demo-certs/certs/trusted-certs.pem NB The example above assumes that the MQTT adapter is configured for TLS and the secure port is used.\nPublish Telemetry Data (unauthenticated Device) Topic: telemetry/${tenant-id}/${device-id} or t/${tenant-id}/${device-id} Authentication: none Payload: (required) Arbitrary payload This topic can be used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_MQTT_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\nmosquitto_pub -t telemetry/DEFAULT_TENANT/4711 -m '{\u0026quot;temp\u0026quot;: 5}' Publish Telemetry Data (authenticated Gateway) Topic: telemetry/${tenant-id}/${device-id} or t/${tenant-id}/${device-id} Authentication: required Payload: (required) Arbitrary payload This topic can be used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the topic name are used to identify the device that the gateway publishes data for.\nThe protocol adapter checks the gateway\u0026rsquo;s authority to publish data on behalf of the device implicitly by means of retrieving a registration assertion for the device from the configured Device Registration service.\nExamples\nPublish some JSON data for device 4712 via gateway gw-1:\nmosquitto_pub -u 'gw@DEFAULT_TENANT' -P gw-secret -t telemetry/DEFAULT_TENANT/4712 -m '{\u0026quot;temp\u0026quot;: 5}' NB The example above assumes that a gateway device with ID gw-1 has been registered with hashed-password credentials with auth-id gw and password gw-secret.\nPublishing Events The MQTT adapter supports the publishing of events by means of MQTT PUBLISH packets using QoS 1 only. The adapter will send an MQTT PUBACK packet to the client once the event has been settled with the accepted outcome by the AMQP 1.0 Messaging Network.\nThis requires that\n the AMQP 1.0 Messaging Network has capacity to process events for the client\u0026rsquo;s tenant and the events published by the client comply with the format defined by the Event API. The protocol adapter checks the configured message limit before accepting any event messages. If the message limit is exceeded or the incoming event message cannot be processed, the connection to the client is closed.\nThe devices can optionally indicate a time-to-live duration for event messages by setting the hono-ttl property explicitly in the property-bag. The property-bag is an optional collection of properties intended for the receiver of the message. A property bag is only allowed at the very end of a topic. It always starts with a /? character, followed by pairs of URL encoded property names and values that are separated by \u0026amp;. For example, a property bag containing two properties seqNo and importance looks like this: /topic/name/?seqNo=10034\u0026amp;importance=high.\nThe MQTT adapter currently does not use any properties except hono-ttl.\nPublish an Event (authenticated Device) Topic: event or e Authentication: required Payload: (required) Arbitrary payload This is the preferred way for devices to publish events. It is available only if the protocol adapter has been configured to require devices to authenticate (which is the default).\nExample\nUpload a JSON string for device 4711:\nmosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t event -q 1 -m '{\u0026quot;alarm\u0026quot;: 1}' Upload a JSON string for device 4711 with time-to-live as 10 seconds:\nmosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t event/?hono-ttl=10 -q 1 -m '{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (unauthenticated Device) Topic: event/${tenant-id}/${device-id} or e/${tenant-id}/${device-id} Authentication: none Payload: (required) Arbitrary payload This topic can be used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_MQTT_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\nmosquitto_pub -t event/DEFAULT_TENANT/4711 -q 1 -m '{\u0026quot;alarm\u0026quot;: 1}' Publish some JSON data for device 4711 with time-to-live as 15 seconds:\nmosquitto_pub -t event/DEFAULT_TENANT/4711/?hono-ttl=15 -q 1 -m '{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (authenticated Gateway) Topic: event/${tenant-id}/${device-id} or e/${tenant-id}/${device-id} Authentication: required Payload: (required) Arbitrary payload This topic can be used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the topic name are used to identify the device that the gateway publishes data for.\nThe protocol adapter checks the gateway\u0026rsquo;s authority to publish data on behalf of the device implicitly by means of retrieving a registration assertion for the device from the configured Device Registration service.\nExamples\nPublish some JSON data for device 4712 via gateway gw-1:\nmosquitto_pub -u 'gw@DEFAULT_TENANT' -P gw-secret -t event/DEFAULT_TENANT/4712 -q 1 -m '{\u0026quot;temp\u0026quot;: 5}' NB The example above assumes that a gateway device with ID gw-1 has been registered with hashed-password credentials with auth-id gw and password gw-secret.\nCommand \u0026amp; Control The MQTT adapter supports devices to receive commands that have been sent by business applications by means of sending an MQTT SUBSCRIBE packet containing a device specific topic filter as described below. Devices can subscribe with QoS 1 or QoS 0. The adapter indicates the outcome of the subscription request by sending back a corresponding SUBACK packet. The SUBACK packet will contain Success - QoS 0 (0x00) or Success - QoS 1 (0x01) for a command topic filter indicating QoS 0 or 1 and will contain the Failure (0x80) value for all other filters. When a device no longer wants to receive commands anymore, it can send an MQTT UNSUBSCRIBE packet to the adapter, including the same topic filter that has been used to subscribe.\nWhen a device has successfully subscribed, the adapter sends an empty notification on behalf of the device to the downstream AMQP 1.0 Messaging Network with the ttd header set to -1, indicating that the device will be ready to receive commands until further notice. Analogously, the adapter sends an empty notification with the ttd header set to 0 when a device unsubscribes from commands.\nCommands can be sent following a request/response pattern or being one-way.\nFor Request/Response commands, devices send their responses to commands by means of sending an MQTT PUBLISH message to a topic that is specific to the command that has been executed. The MQTT adapter accepts responses being published using either QoS 0 or QoS 1.\nThe MQTT adapter checks the configured message limit before accepting any command requests and responses. In case of incoming command requests from business applications, if the message limit is exceeded, the Adapter rejects the message with the reason amqp:resource-limit-exceeded. And for the incoming command responses from devices, the Adapter rejects the message and closes the connection to the client.\nThe following sections define the topic filters/names to use for subscribing to and responding to commands. The following shorthand versions of topic path segments are supported:\n c instead of command q instead of req s instead of res Deprecation Previous versions of Hono required devices to use control instead of command as the topic prefix. The control prefix is deprecated. Devices MAY still use it until support for it will be removed in a future Hono version. The following variables are used:\n ${command} : An arbitrary string that indicates the command to execute, e.g. setBrightness. The command is provided by the application that sends the command. ${req-id} (only for Request/Response commands) : The unique identifier of the command execution request. The identifier is passed to the device as part of the name of the topic that the command is published to. The device needs to publish its response to the command to a topic which includes this identifier, thus allowing the adapter to correlate the response with the request. ${status} : The HTTP status code indicating the outcome of executing the command. This status code is passed on to the application in the AMQP message\u0026rsquo;s status application property. Receiving Commands (authenticated Device) An authenticated device MUST use the topic filter command///req/# to subscribe to commands.\n Deprecation Previous versions of Hono required authenticated devices to use command/+/+/req/# for subscribing to commands. This old topic filter is deprecated. Devices MAY still use it until support for it will be removed in a future Hono version. Example\nmosquitto_sub -v -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t command///req/# The adapter will then publish Request/Response commands for the device to topic command///req/${req-id}/${command} and one-way commands to topic command///req//${command}.\nFor example, a request/response command with name setBrightness from an application might look like this:\ncommand///q/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/setBrightness { \u0026quot;brightness\u0026quot;: 79 } A corresponding one-way command might look like this:\ncommand///q//setBrightness { \u0026quot;brightness\u0026quot;: 79 } Note that the topic in the latter case doesn\u0026rsquo;t contain a request identifier.\nReceiving Commands (unauthenticated Device) An unauthenticated device MUST use the topic filter command/${tenant-id}/${device-id}/req/# to subscribe to commands.\nExample\nmosquitto_sub -v -t command/DEFAULT_TENANT/4711/req/# The adapter will then publish Request/Response commands for the device to topic command/${tenant-id}/${device-id}/req/${req-id}/${command} and one-way commands to topic command/${tenant-id}/${device-id}/req//${command}.\nFor example, a request/response command with name setBrightness from an application might look like this:\ncommand/DEFAULT_TENANT/4711/q/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/setBrightness { \u0026quot;brightness\u0026quot;: 79 } A corresponding one-way command might look like this:\ncommand/DEFAULT_TENANT/4711/q//setBrightness { \u0026quot;brightness\u0026quot;: 79 } Note that the topic in the latter case doesn\u0026rsquo;t contain a request identifier.\nReceiving Commands (authenticated Gateway) Gateway components can receive commands for devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. Corresponding devices have to be configured so that they can be used with a gateway. See Configuring Gateway Devices for details.\nIf a device is configured in such a way that there can be one gateway, acting on behalf of the device, a command sent to this device will by default be directed to that gateway.\nIf a device is configured to be used with multiple gateways, the particular gateway that last acted on behalf of the device will be the target that commands for that device will be routed to. The mapping of device and gateway last used by the device is updated whenever a device sends a telemetry, event or command response message via the gateway. This means that for a device configured to be used via multiple gateways to receive commands, the device first has to send at least one telemetry or event message to establish which gateway to use for receiving commands for that device.\nAn authenticated gateway MUST use the topic filter command//+/req/# to subscribe to commands for all devices in whose behalf it acts.\nTo subscribe only to commands for a specific device, an authenticated gateway MUST use the topic filter command//${device-id}/req/#.\n Deprecation Previous versions of Hono required authenticated gateways to use command/+/+/req/# for subscribing to commands. This old topic filter is deprecated. Gateways MAY still use it until support for it will be removed in a future Hono version. Example\nA subscription to commands for all devices that a gateway acts on behalf of looks like this:\nmosquitto_sub -v -u 'gw@DEFAULT_TENANT' -P gw-secret -t command//+/req/# A subscription to commands for a specific device can be done like this:\nmosquitto_sub -v -u 'gw@DEFAULT_TENANT' -P gw-secret -t command//4711/req/# The adapter will then publish Request/Response commands for devices, that the gateway has acted on behalf of, to topic command//${device-id}/req/${req-id}/${command} and one-way commands to topic command//${device-id}/req//${command}.\nFor example, a request/response command for device 4711 with name setBrightness from an application might look like this:\ncommand//4711/q/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/setBrightness { \u0026quot;brightness\u0026quot;: 79 } A corresponding one-way command might look like this:\ncommand//4711/q//setBrightness { \u0026quot;brightness\u0026quot;: 79 } Note that the topic in the latter case doesn\u0026rsquo;t contain a request identifier.\nSending a Response to a Command (authenticated Device) An authenticated device MUST send the response to a previously received command to the topic command///res/${req-id}/${status}.\nExample\nAfter a command has arrived as in the above example, you send a response using the arrived ${req-id}:\nmosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t command///res/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/200 -m '{\u0026quot;lumen\u0026quot;: 200}' Sending a Response to a Command (unauthenticated Device) An unauthenticated device MUST send the response to a previously received command to the topic command/${tenant-id}/${device-id}/res/${req-id}/${status}.\nExample\nAfter a command has arrived as in the above example, you send a response using the arrived ${req-id}:\nmosquitto_pub -t command/DEFAULT_TENANT/4711/res/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/200 -m '{\u0026quot;lumen\u0026quot;: 200}' Sending a Response to a Command (authenticated Gateway) An authenticated gateway MUST send a device\u0026rsquo;s response to a command it has received on behalf of the device to the topic command//${device-id}/res/${req-id}/${status}.\nExample\nAfter a command has arrived as in the above example, the response is sent using the ${req-id} from the topic that the command had been published to:\nmosquitto_pub -u 'gw@DEFAULT_TENANT' -P gw-secret -t command//4711/res/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/200 -m '{\u0026quot;lumen\u0026quot;: 200}' Downstream Meta Data The adapter includes the following meta data in messages being sent downstream:\n Name Location Type Description device_id application string The identifier of the device that the message originates from. orig_adapter application string Contains the adapter\u0026rsquo;s type name which can be used by downstream consumers to determine the protocol adapter that the message has been received over. The MQTT adapter\u0026rsquo;s type name is hono-mqtt. orig_address application string Contains the name of the MQTT topic that the device has originally published the data to. x-opt-retain * message-annotations boolean Contains true if the device has published an event or telemetry message with its retain flag set to 1 The adapter also considers defaults registered for the device at either the tenant or the device level. The values of the default properties are determined as follows:\n If the message already contains a non-empty property of the same name, the value if unchanged. Otherwise, if a default property of the same name is defined in the device\u0026rsquo;s registration information, that value is used. Otherwise, if a default property of the same name is defined for the tenant that the device belongs to, that value is used. Note that of the standard AMQP 1.0 message properties only the content-type and ttl can be set this way to a default value.\nEvent Message Time-to-live Events published by devices will usually be persisted by the AMQP Messaging Network in order to support deferred delivery to downstream consumers. In most cases the AMQP Messaging Network can be configured with a maximum time-to-live to apply to the events so that the events will be removed from the persistent store if no consumer has attached to receive the event before the message expires.\nIn order to support environments where the AMQP Messaging Network cannot be configured accordingly, the MQTT protocol adapter supports setting a downstream event message\u0026rsquo;s ttl property based on the hono-ttl property set as property-bag at the end of the event topic. Also the default ttl and max-ttl values can be configured for a tenant/device as described in the Tenant API.\nTenant specific Configuration The adapter uses the Tenant API to retrieve tenant specific configuration for adapter type hono-mqtt. The following properties are (currently) supported:\n Name Type Default Value Description enabled boolean true If set to false the adapter will reject all data from devices belonging to the tenant. "
},
{
"uri": "https://www.eclipse.org/hono/docs/user-guide/amqp-adapter/",
"title": "AMQP Adapter",
"tags": [],
"description": "",
- "content": "The AMQP protocol adapter allows clients (devices or gateway components) supporting the AMQP 1.0 protocol to publish messages to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry, Event and Command \u0026amp; Control endpoints.\nDevice Authentication By default, all Hono protocol adapters require clients (devices or gateway components) to authenticate during connection establishment. This is the preferred way for devices to publish data via protocol adapters. The AMQP adapter supports both the SASL PLAIN and SASL EXTERNAL authentication mechanisms. The former uses a username and password to authenticate to the adapter while the latter uses a client certificate.\nIn this guide, we will give examples for publishing telemetry and events for authenticated (using SASL PLAIN) and unauthenticated clients.\nNB: The AMQP adapter can be configured to allow unauthenticated devices to connect by setting configuration variable HONO_AMQP_AUTHENTICATION_REQUIRED to false.\nSASL PLAIN Authentication The AMQP adapter supports authenticating clients using a username and password. This means that clients need to provide a username and a password when connecting to the AMQP adapter. If the adapter is configured for multi-tenancy (i.e HONO_AMQP_SINGLE_TENANT is set to false), then the username must match the pattern [auth-id@tenant], e.g. sensor1@DEFAULT_TENANT. Otherwise the DEFAULT_TENANT is assumed and the tenant-id can be omitted from the username.\nThe adapter verifies the credentials provided by the client against the credentials that the Credentials Service has on record for the device. If the credentials match, then authentication is successful and the client device can proceed to publish messages to Hono.\nThe examples below refer to devices 4711 and gw-1 of tenant DEFAULT_TENANT using auth-ids sensor1 and gw1 and corresponding passwords. The example deployment as described in the Deployment Guides comes pre-configured with the corresponding entities in its device registry component.\nNB There is a subtle difference between the device identifier (device-id) and the auth-id a device uses for authentication. See Device Identity for a discussion of the concepts.\nSASL EXTERNAL Authentication When a device uses a client certificate for authentication, the TLS handshake is initiated during TCP connection establishment. If no trust anchor is configured for the AMQP adapter, the TLS handshake will succeed only if the certificate has not yet expired. Once the TLS handshake completes and a secure connection is established, the certificate\u0026rsquo;s signature is checked during the SASL handshake. To complete the SASL handshake and authenticate the client, the adapter performs the following steps:\n Adapter extracts the client certificate\u0026rsquo;s Issuer DN and uses it to us the Tenant service to look up the tenant that the client belongs to. In order for the lookup to succeed, the tenant’s trust anchor needs to be configured by means of registering the trusted certificate authority. If the lookup succeeds, the Tenant service returns the tenant, thus implicitly establishing the tenant that the device belongs to. Adapter validates the device’s client certificate using the registered trust anchor for the tenant. Finally, adapter authenticates the client certificate using Hono\u0026rsquo;s credentials API. In this step, the adapter uses the client certificate’s Subject DN (as authentication identifier) and x509-cert (for the credentials type) in order to determine the device ID. NB: The AMQP adapter needs to be configured for TLS in order to support this mechanism.\nConnection Limits After verifying the credentials, the number of existing connections is checked against the configured resource-limits by the AMQP adapter. If the limit is exceeded then the connection request is not accepted.\nMessage Limits Before accepting any telemetry or event or command messages, the AMQP adapter verifies that the configured message limit is not exceeded. The incoming message is discarded if the limit is exceeded.\nLink Establishment Clients can publish all types of messages to the AMQP adapter via a single anonymous sender link. Using AT MOST ONCE delivery semantics, the client will not wait for the message to be accepted and settled by the downstream consumer. However, with AT LEAST ONCE, the client sends the message and waits for the message to be delivered to and accepted by the downstream consumer. If the message cannot be delivered due to a failure, the client will be notified.\nThe client indicates its preferred message delivery mode by means of the snd-settle-mode and rcv-settle-mode fields of its attach frame during link establishment. Clients should use mixed as the snd-settle-mode and first as the rcv-settle-mode in order to be able to use the same link for sending all types of messages using different delivery semantics as described in the following sections.\nError Handling The AMQP adapter distinguishes between two types of errors when a message is published using at least once:\n An error caused by the client side, e.g invalid message address, content-type, adapter disabled for tenant etc. An error caused by the server side, e.g no downstream consumers registered, downstream connection loss etc. For a client side error, the adapter settles the message transfer with the rejected outcome and provides an error description in the corresponding disposition frame. In the case of a server-side error, the adapter settles the message with the released outcome, indicating to the client that the message itself was OK but it cannot be delivered due to a failure beyond the control of the client. In the latter case, a client may attempt to re-send the message unaltered.\nAMQP Command-line Client For purposes of demonstrating the usage of the AMQP adapter, the Hono CLI Module contains an AMQP command-line client for interacting with the AMQP adapter. The client can be used to send telemetry or events and to receive/respond to command request messages.\nThe command-line client supports the following parameters (with default values):\n --spring.profiles.active=amqp-send: Profile for sending telemetry data or events to Hono. --spring.profiles.active=amqp-command: Profile for receiving and responding to command request messages. --message.address: The AMQP 1.0 message address (default: telemetry) --message.payload: The message payload body (default: '{\u0026quot;temp\u0026quot;: 5}') --hono.client.host: The host name that the AMQP adapter is running on (default: localhost) --hono.client.port: The port that the adapter is listening for incoming connections (default: 5672) To run the client to send a telemetry message to Hono, open a terminal and execute the following:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret Accepted{} The client prints the outcome of the operation to standard out. The outcome above (Accepted) indicates that the request to upload the data has succeeded.\nNB There are two JAR files in the hono/cli/target directory. The JAR to use for the client is the hono-cli-$VERSION-exec.jar and not the hono-cli-$VERSION.jar file. Running the latter will not work and will output the message: no main manifest attribute, in hono-cli-$VERSION.jar\nPublishing Telemetry Data The client indicates the delivery mode to use when uploading telemetry messages by means of the settled and rcv-settle-mode properties of the AMQP transfer frame(s) it uses for uploading the message. The AMQP adapter will accept messages using a delivery mode according to the following table:\n settled rcv-settle-mode Delivery semantics false first The adapter will forward the message to the downstream AMQP 1.0 Messaging Network and will forward any AMQP disposition frame received from the AMQP 1.0 Messaging Network to the client as is. It is up to the client\u0026rsquo;s discretion if and how it processes the disposition frame. The adapter will accept any re-delivered message. Sending unsettled messages allows for clients to implement either AT LEAST ONCE or AT MOST ONCE delivery semantics, depending on whether a client actually waits for and considers the disposition frames it receives from the adapter or not. This is the recommended mode for uploading telemetry data. true first The adapter will acknowledge and settle any received message spontaneously before forwarding it to the downstream AMQP 1.0 Messaging Network. The adapter will ignore any AMQP disposition frames it receives from the AMQP 1.0 Messaging Network. Sending pre-settled messages allows for clients to implement AT MOST ONCE delivery semantics only. This is the fastest mode of delivery but has the drawback of less reliable end-to-end flow control and potential loss of messages without notice. All other combinations are not supported by the adapter and will result in the message being ignored (pre-settled) or rejected (unsettled).\nPublish Telemetry Data (authenticated Device) The AMQP adapter supports publishing of telemetry data to Hono\u0026rsquo;s Telemetry API. Telemetry messages can be published using either AT LEAS ONCE or *AT MOST ONCE delivery semantics.\n Message Address: telemetry or t This refers to the to property of the message. Settlement Mode: presettled (AT MOST ONCE) or unsettled (AT LEAST ONCE) Authentication: SASL PLAIN or SASL EXTERNAL Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to one of the following: (hono:bad-request): Request rejected due to a bad client request. (amqp:unauthorized-access): Request rejected because the adapter is disabled for tenant. (amqp:precondition-failed): Request does not fulfill certain requirements e.g adapter cannot assert device registration etc. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. When a device publishes data to the telemetry address, the AMQP adapter automatically determines the device\u0026rsquo;s identity and tenant during the authentication process.\nExample\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret Notice that we only supplied a new value for the message address, leaving the other default values.\nPublish some JSON data for device 4711 using a client certificate for authentication:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.port=5671 --hono.client.certPath=config/hono-demo-certs-jar/device-4711-cert.pem --hono.client.keyPath=config/hono-demo-certs-jar/device-4711-key.pem --hono.client.trustStorePath=config/hono-demo-certs-jar/trusted-certs.pem --hono.client.hostnameVerificationRequired=false Publish Telemetry Data (unauthenticated Device) Message Address: telemetry/${tenant-id}/${device-id} or t/${tenant-id}/${device-id} Settlement Mode: presettled (AT MOST ONCE) or unsettled (AT LEAST ONCE) Authentication: none Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. Note how verbose the address is for unauthenticated devices. This address can be used by devices that have not authenticated to the protocol adapter. This requires the HONO_AMQP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false before starting the protocol adapter.\nExamples\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --message.address=t/DEFAULT_TENANT/4711 Publish Telemetry Data (authenticated Gateway) A device that publishes data on behalf of another device is called a gateway device. The message address is used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the message address is used to identify the device that the gateway publishes data for.\nExamples\nA Gateway connecting to the adapter using gw@DEFAULT_TENANT as username and gw-secret as password and then publishing some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=gw@DEFAULT_TENANT --hono.client.password=gw-secret --message.address=t/DEFAULT_TENANT/4711 In this example, we are using message address t/DEFAULT_TENANT/4711 which contains the device that the gateway is publishing the message for.\nPublishing Events The adapter supports AT LEAST ONCE delivery of Event messages only. A client therefore MUST set the settled property to false and the rcv-settle-mode property to first in all transfer frame(s) it uses for uploading events. All other combinations are not supported by the adapter and result in the message being rejected.\nPublish an Event (authenticated Device) Message Address: event or e Settlement Mode: unsettled (AT LEAST ONCE) Authentication: SASL PLAIN or SASL EXTERNAL Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. This is the preferred way for devices to publish events. It is available only if the protocol adapter has been configured to require devices to authenticate (which is the default).\nExample\nUpload a JSON string for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret --message.address=event --message.payload='{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (unauthenticated Device) Message Address: event/${tenant-id}/${device-id} or e/${tenant-id}/${device-id} Settlement Mode: unsettled (AT LEAST ONCE) Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. This address format is used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_AMQP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --message.address=e/DEFAULT_TENANT/4711 --message.payload='{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (authenticated Gateway) Examples\nA Gateway connecting to the adapter using gw@DEFAULT_TENANT as username and gw-secret as password and then publishing some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=gw@DEFAULT_TENANT --hono.client.password=gw-secret --message.address=e/DEFAULT_TENANT/4711 In this example, we are using message address e/DEFAULT_TENANT/4711 which contains the device that the gateway is publishing the message for.\nCommand \u0026amp; Control The AMQP adapter supports devices to receive commands that have been sent by business applications by means of opening a receiver link using a device specific source address as described below. When a device no longer wants to receive commands anymore, it can simply close the link.\nWhen a device has successfully opened a receiver link for commands, the adapter sends an empty notification on behalf of the device to the downstream AMQP 1.0 Messaging Network with the ttd header set to -1, indicating that the device will be ready to receive commands until further notice. Analogously, the adapter sends an empty notification with the ttd header set to 0 when a device closes the link or disconnects.\nDevices send their responses to commands by means of sending an AMQP message with properties specific to the command that has been executed. The AMQP adapter accepts responses being published using either at most once (QoS 0) or at least once (QoS 1) delivery semantics. The device must send the command response messages using the same (sender) link that it uses for sending telemetry data and events.\nThe AMQP adapter checks the configured message limit before accepting any command requests and responses. In case of incoming command requests from business applications or the command responses from devices, if the message limit is exceeded, the Adapter rejects the message with the reason amqp:resource-limit-exceeded.\nReceiving Commands A device MUST use the following source address in its attach frame to open a link for receiving commands:\n command (authenticated device) command/${tenant}/${device-id} (unauthenticated device) Note Previous versions of Hono used control instead of command as address prefix. Using the control prefix is still supported but deprecated. The adapter supports AT LEAST ONCE delivery of command messages only. A client therefore MUST use unsettled for the snd-settle-mode and first for the rcv-settle-mode fields of its attach frame during link establishment. All other combinations are not supported and result in the termination of the link.\nOnce the link has been established, the adapter will send command messages having the following properties:\n Name Mandatory Location Type Description subject yes properties string Contains the name of the command to be executed. reply-to no properties string Contains the address to which the command response should be sent. This property will be empty for one-way commands. correlation-id no properties string This property will be empty for one-way commands, otherwise it will contain the identifier used to correlate the response with the command request. Sending a Response to a Command A device only needs to respond to commands that contain a reply-to address and a correlation-id. However, if the application expects a response, then devices must publish a response back to the application. Devices may use the same anonymous sender link for this purpose that they also use for sending telemetry data and events.\nThe adapter supports AT LEAST ONCE delivery of command response messages only. A client therefore MUST set the settled property to true and the rcv-settle-mode property to first in all transfer frame(s) it uses for uploading command responses. All other combinations are not supported by the adapter and result in the message being rejected.\nThe table below provides an overview of the properties that must be set on a command response message:\n Name Mandatory Location Type Description to yes properties string MUST contain the value of the reply-to property of the command request message. correlation-id yes properties string MUST contain the value of the correlation-id property of the command request message. status yes application-properties integer MUST contain a status code indicating the outcome of processing the command at the device (see Command \u0026amp; Control API for details). Examples The AMQP adapter client can be used to simulate a device which receives commands and sends responses back to the application. The command line client is used to simulate an application sending commands to devices and receiving command responses from devices.\nStart the AMQP adapter client, as follows:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-command --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret Device is now ready to receive commands (Press Ctrl + c to terminate) After successfully starting the client, a message indicating that the device is ready to receive commands will be printed to standard output. The device is now waiting to receive commands from applications. To send a command to the device, open a new terminal shell and start the command application, as shown below:\n# in directory: hono/cli/ java -jar target/hono-cli-*-exec.jar --hono.client.host=localhost --hono.client.username=consumer@HONO --hono.client.password=verysecret --spring.profiles.active=command,ssl \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter name of command for device [DEFAULT_TENANT:4711] (prefix with 'ow:' to send one-way command): setBrightness \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter command payload: some-payload \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter content type: text/plain Note Change into the cli directory before running the command above to start the command application. If you change into the target directory (i.e cli/target), then the client will not be able to locate to certificate needed to connect to the messaging network. Once the command application starts successfully, enter a command name, payload and content-type of the command to send to the device.\nAfter sending the command, the device (i.e AMQP command client) will print out the command name and payload that it receives and automatically sends a command response to the application.\n$ Received Command Message : [Command name: setBrightness, Command payload: some-payload] $ Command response sent [outcome: Accepted{}] Downstream Meta Data The adapter includes the following meta data in the application properties of messages being sent downstream:\n Name Type Description device_id string The identifier of the device that the message originates from. orig_adapter string Contains the adapter\u0026rsquo;s type name which can be used by downstream consumers to determine the protocol adapter that the message has been received over. The AMQP adapter\u0026rsquo;s type name is hono-amqp. orig_address string Contains the AMQP target address that the device has used to send the data. The adapter also considers defaults registered for the device at either the tenant or the device level. The values of the default properties are determined as follows:\n If the message already contains a non-empty property of the same name, the value if unchanged. Otherwise, if a default property of the same name is defined in the device\u0026rsquo;s registration information, that value is used. Otherwise, if a default property of the same name is defined for the tenant that the device belongs to, that value is used. Note that of the standard AMQP 1.0 message properties only the content-type and ttl can be set this way to a default value.\nTenant specific Configuration The adapter uses the Tenant API to retrieve tenant specific configuration for adapter type hono-amqp. The following properties are (currently) supported:\n Name Type Default Value Description enabled boolean true If set to false the adapter will reject all data from devices belonging to the tenant and respond with a amqp:unauthorized-access as the error condition value for rejecting the message. "
+ "content": "The AMQP protocol adapter allows clients (devices or gateway components) supporting the AMQP 1.0 protocol to publish messages to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry, Event and Command \u0026amp; Control endpoints.\nDevice Authentication By default, all Hono protocol adapters require clients (devices or gateway components) to authenticate during connection establishment. This is the preferred way for devices to publish data via protocol adapters. The AMQP adapter supports both the SASL PLAIN and SASL EXTERNAL authentication mechanisms. The former uses a username and password to authenticate to the adapter while the latter uses a client certificate.\nIn this guide, we will give examples for publishing telemetry and events for authenticated (using SASL PLAIN) and unauthenticated clients.\nNB The AMQP adapter can be configured to allow unauthenticated devices to connect by setting configuration variable HONO_AMQP_AUTHENTICATION_REQUIRED to false.\nSASL PLAIN Authentication The AMQP adapter supports authenticating clients using a username and password. This means that clients need to provide a username and a password when connecting to the AMQP adapter. If the adapter is configured for multi-tenancy (i.e HONO_AMQP_SINGLE_TENANT is set to false), then the username must match the pattern [auth-id@tenant], e.g. sensor1@DEFAULT_TENANT. Otherwise the DEFAULT_TENANT is assumed and the tenant-id can be omitted from the username.\nThe adapter verifies the credentials provided by the client against the credentials the configured Credentials service has on record for the client. If the credentials match, then authentication is successful and the client device can proceed to publish messages to Hono.\nThe examples below refer to devices 4711 and gw-1 of tenant DEFAULT_TENANT using auth-ids sensor1 and gw1 and corresponding passwords. The example deployment as described in the Deployment Guides comes pre-configured with the corresponding entities in its device registry component.\nNB There is a subtle difference between the device identifier (device-id) and the auth-id a device uses for authentication. See Device Identity for a discussion of the concepts.\nSASL EXTERNAL Authentication When a device uses a client certificate for authentication, the TLS handshake is initiated during TCP connection establishment. If no trust anchor is configured for the AMQP adapter, the TLS handshake will succeed only if the certificate has not yet expired. Once the TLS handshake completes and a secure connection is established, the certificate\u0026rsquo;s signature is checked during the SASL handshake. To complete the SASL handshake and authenticate the client, the adapter performs the following steps:\n Adapter extracts the client certificate\u0026rsquo;s Issuer DN and uses it to us the Tenant service to look up the tenant that the client belongs to. In order for the lookup to succeed, the tenant’s trust anchor needs to be configured by means of registering the trusted certificate authority. If the lookup succeeds, the Tenant service returns the tenant, thus implicitly establishing the tenant that the device belongs to. Adapter validates the device’s client certificate using the registered trust anchor for the tenant. Finally, adapter authenticates the client certificate using Hono\u0026rsquo;s credentials API. In this step, the adapter uses the client certificate’s Subject DN (as authentication identifier) and x509-cert (for the credentials type) in order to determine the device ID. NB The AMQP adapter needs to be configured for TLS in order to support this mechanism.\nConnection Limits After verifying the credentials, the number of existing connections is checked against the configured resource-limits by the AMQP adapter. If the limit is exceeded then the connection request is not accepted.\nMessage Limits Before accepting any telemetry or event or command messages, the AMQP adapter verifies that the configured message limit is not exceeded. The incoming message is discarded if the limit is exceeded.\nConnection Event The AMQP Adapter can send a Connection Event once the connection with a device has been successfully established or ended. Note that this requires the HONO_CONNECTION_EVENTS_PRODUCER configuration property to be explicitly set to events.\nLink Establishment The AMQP adapter supports the Anonymous Terminus for Message Routing specification and requires clients to create a single sender link using the null target address for publishing all types of messages to the AMQP adapter.\nUsing AT MOST ONCE delivery semantics, the client will not wait for the message to be accepted and settled by the downstream consumer. However, with AT LEAST ONCE, the client sends the message and waits for the message to be delivered to and accepted by the downstream consumer. If the message cannot be delivered due to a failure, the client will be notified.\nThe client indicates its preferred message delivery mode by means of the snd-settle-mode and rcv-settle-mode fields of its attach frame during link establishment. Clients should use mixed as the snd-settle-mode and first as the rcv-settle-mode in order to be able to use the same link for sending all types of messages using different delivery semantics as described in the following sections.\nError Handling The AMQP adapter distinguishes between two types of errors when a message is published using at least once:\n An error caused by the client side, e.g invalid message address, content-type, adapter disabled for tenant etc. An error caused by the server side, e.g no downstream consumers registered, downstream connection loss etc. For a client side error, the adapter settles the message transfer with the rejected outcome and provides an error description in the corresponding disposition frame. In the case of a server-side error, the adapter settles the message with the released outcome, indicating to the client that the message itself was OK but it cannot be delivered due to a failure beyond the control of the client. In the latter case, a client may attempt to re-send the message unaltered.\nAMQP Command-line Client For purposes of demonstrating the usage of the AMQP adapter, the Hono CLI Module contains an AMQP command-line client for interacting with the AMQP adapter. The client can be used to send telemetry or events and to receive/respond to command request messages.\nThe command-line client supports the following parameters (with default values):\n --spring.profiles.active=amqp-send: Profile for sending telemetry data or events to Hono. --spring.profiles.active=amqp-command: Profile for receiving and responding to command request messages. --message.address: The AMQP 1.0 message address (default: telemetry) --message.payload: The message payload body (default: '{\u0026quot;temp\u0026quot;: 5}') --hono.client.host: The host name that the AMQP adapter is running on (default: localhost) --hono.client.port: The port that the adapter is listening for incoming connections (default: 5672) To run the client to send a telemetry message to Hono, open a terminal and execute the following:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret Accepted{} The client prints the outcome of the operation to standard out. The outcome above (Accepted) indicates that the request to upload the data has succeeded.\nNB There are two JAR files in the hono/cli/target directory. The JAR to use for the client is the hono-cli-$VERSION-exec.jar and not the hono-cli-$VERSION.jar file. Running the latter will not work and will output the message: no main manifest attribute, in hono-cli-$VERSION.jar\nPublishing Telemetry Data The client indicates the delivery mode to use when uploading telemetry messages by means of the settled and rcv-settle-mode properties of the AMQP transfer frame(s) it uses for uploading the message. The AMQP adapter will accept messages using a delivery mode according to the following table:\n settled rcv-settle-mode Delivery semantics false first The adapter will forward the message to the downstream AMQP 1.0 Messaging Network and will forward any AMQP disposition frame received from the AMQP 1.0 Messaging Network to the client as is. It is up to the client\u0026rsquo;s discretion if and how it processes the disposition frame. The adapter will accept any re-delivered message. Sending unsettled messages allows for clients to implement either AT LEAST ONCE or AT MOST ONCE delivery semantics, depending on whether a client actually waits for and considers the disposition frames it receives from the adapter or not. This is the recommended mode for uploading telemetry data. true first The adapter will acknowledge and settle any received message spontaneously before forwarding it to the downstream AMQP 1.0 Messaging Network. The adapter will ignore any AMQP disposition frames it receives from the AMQP 1.0 Messaging Network. Sending pre-settled messages allows for clients to implement AT MOST ONCE delivery semantics only. This is the fastest mode of delivery but has the drawback of less reliable end-to-end flow control and potential loss of messages without notice. All other combinations are not supported by the adapter and will result in the message being ignored (pre-settled) or rejected (unsettled).\nPublish Telemetry Data (authenticated Device) The AMQP adapter supports publishing of telemetry data to Hono\u0026rsquo;s Telemetry API. Telemetry messages can be published using either AT LEAST ONCE or AT MOST ONCE delivery semantics.\n Message Address: telemetry or t This refers to the to property of the message. Settlement Mode: presettled (AT MOST ONCE) or unsettled (AT LEAST ONCE) Authentication: SASL PLAIN or SASL EXTERNAL Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to one of the following: (hono:bad-request): Request rejected due to a bad client request. (amqp:unauthorized-access): Request rejected because the adapter is disabled for tenant. (amqp:precondition-failed): Request does not fulfill certain requirements e.g adapter cannot assert device registration etc. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. When a device publishes data to the telemetry address, the AMQP adapter automatically determines the device\u0026rsquo;s identity and tenant during the authentication process.\nExample\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret Notice that we only supplied a new value for the message address, leaving the other default values.\nPublish some JSON data for device 4711 using a client certificate for authentication:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.port=5671 --hono.client.certPath=config/hono-demo-certs-jar/device-4711-cert.pem --hono.client.keyPath=config/hono-demo-certs-jar/device-4711-key.pem --hono.client.trustStorePath=config/hono-demo-certs-jar/trusted-certs.pem --hono.client.hostnameVerificationRequired=false Publish Telemetry Data (unauthenticated Device) Message Address: telemetry/${tenant-id}/${device-id} or t/${tenant-id}/${device-id} Settlement Mode: presettled (AT MOST ONCE) or unsettled (AT LEAST ONCE) Authentication: none Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. Note how verbose the address is for unauthenticated devices. This address can be used by devices that have not authenticated to the protocol adapter. This requires the HONO_AMQP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false before starting the protocol adapter.\nExamples\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --message.address=t/DEFAULT_TENANT/4711 Publish Telemetry Data (authenticated Gateway) A device that publishes data on behalf of another device is called a gateway device. The message address is used by gateway components to publish data on behalf of other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like SigFox or LoRa. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the message address is used to identify the device that the gateway publishes data for.\nExamples\nA gateway connecting to the adapter using gw@DEFAULT_TENANT as username and gw-secret as password and then publishing some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=gw@DEFAULT_TENANT --hono.client.password=gw-secret --message.address=t/DEFAULT_TENANT/4711 In this example, we are using message address t/DEFAULT_TENANT/4711 which contains the device that the gateway is publishing the message for.\nPublishing Events The adapter supports AT LEAST ONCE delivery of Event messages only. A client therefore MUST set the settled property to false and the rcv-settle-mode property to first in all transfer frame(s) it uses for uploading events. All other combinations are not supported by the adapter and result in the message being rejected.\nPublish an Event (authenticated Device) Message Address: event or e Settlement Mode: unsettled (AT LEAST ONCE) Authentication: SASL PLAIN or SASL EXTERNAL Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. This is the preferred way for devices to publish events. It is available only if the protocol adapter has been configured to require devices to authenticate (which is the default).\nExample\nUpload a JSON string for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret --message.address=event --message.payload='{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (unauthenticated Device) Message Address: event/${tenant-id}/${device-id} or e/${tenant-id}/${device-id} Settlement Mode: unsettled (AT LEAST ONCE) Message Body: (optional) Arbitrary payload Message properties: (optional) Arbitrary properties (content-type, correlation-id, \u0026hellip;) Disposition Frames: Accepted: Message successfully processed by the adapter. Released: Message cannot be processed and should be redelivered. Rejected: Adapter rejects the message due to: (hono:bad-request): A bad client request (e.g invalid content-type). (amqp:unauthorized-access): The adapter is disabled for tenant. (amqp:precondition-failed): Request not fulfilling certain requirements. (amqp:resource-limit-exceeded): Request rejected because the message limit for the given tenant is exceeded. This address format is used by devices that have not authenticated to the protocol adapter. Note that this requires the HONO_AMQP_AUTHENTICATION_REQUIRED configuration property to be explicitly set to false.\nExamples\nPublish some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --message.address=e/DEFAULT_TENANT/4711 --message.payload='{\u0026quot;alarm\u0026quot;: 1}' Publish an Event (authenticated Gateway) Examples\nA gateway connecting to the adapter using gw@DEFAULT_TENANT as username and gw-secret as password and then publishing some JSON data for device 4711:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=gw@DEFAULT_TENANT --hono.client.password=gw-secret --message.address=e/DEFAULT_TENANT/4711 In this example, we are using message address e/DEFAULT_TENANT/4711 which contains the device that the gateway is publishing the message for.\nCommand \u0026amp; Control The AMQP adapter supports devices to receive commands that have been sent by business applications by means of opening a receiver link using a device specific source address as described below. When a device no longer wants to receive commands anymore, it can simply close the link.\nWhen a device has successfully opened a receiver link for commands, the adapter sends an empty notification on behalf of the device to the downstream AMQP 1.0 Messaging Network with the ttd header set to -1, indicating that the device will be ready to receive commands until further notice. Analogously, the adapter sends an empty notification with the ttd header set to 0 when a device closes the link or disconnects.\nDevices send their responses to commands by means of sending an AMQP message with properties specific to the command that has been executed. The AMQP adapter accepts responses being published using either at most once (QoS 0) or at least once (QoS 1) delivery semantics. The device must send the command response messages using the same (sender) link that it uses for sending telemetry data and events.\nThe AMQP adapter checks the configured message limit before accepting any command requests and responses. In case of incoming command requests from business applications or the command responses from devices, if the message limit is exceeded, the Adapter rejects the message with the reason amqp:resource-limit-exceeded.\nReceiving Commands A device MUST use the following source address in its attach frame to open a link for receiving commands:\n command (authenticated device) command (authenticated gateway receiving commands for all devices it acts on behalf of) command/${tenant}/${device-id} (unauthenticated device) command/${tenant}/${device-id} (authenticated gateway receiving commands for a specific device it acts on behalf of) Note Previous versions of Hono used control instead of command as address prefix. Using the control prefix is still supported but deprecated. The adapter supports AT LEAST ONCE delivery of command messages only. A client therefore MUST use unsettled for the snd-settle-mode and first for the rcv-settle-mode fields of its attach frame during link establishment. All other combinations are not supported and result in the termination of the link.\nOnce the link has been established, the adapter will send command messages having the following properties:\n Name Mandatory Location Type Description subject yes properties string Contains the name of the command to be executed. reply-to no properties string Contains the address to which the command response should be sent. This property will be empty for one-way commands. correlation-id no properties string This property will be empty for one-way commands, otherwise it will contain the identifier used to correlate the response with the command request. device_id no application-properties string This property will only be set if an authenticated gateway has connected to the adapter. It will contain the id of the device (connected to the gateway) that the command is targeted at. Authenticated gateways will receive commands for devices which do not connect to a protocol adapter directly but instead are connected to the gateway. Corresponding devices have to be configured so that they can be used with a gateway. See Configuring Gateway Devices for details.\nIf a device is configured in such a way that there can be one gateway, acting on behalf of the device, a command sent to this device will by default be directed to that gateway.\nIf a device is configured to be used with multiple gateways, the particular gateway that last acted on behalf of the device will be the target that commands for that device will be routed to. The mapping of device and gateway last used by the device is updated whenever a device sends a telemetry, event or command response message via the gateway. This means that for a device configured to be used via multiple gateways to receive commands, the device first has to send at least one telemetry or event message to establish which gateway to use for receiving commands for that device.\nSending a Response to a Command A device only needs to respond to commands that contain a reply-to address and a correlation-id. However, if the application expects a response, then devices must publish a response back to the application. Devices may use the same anonymous sender link for this purpose that they also use for sending telemetry data and events.\nThe adapter supports AT LEAST ONCE delivery of command response messages only. A client therefore MUST set the settled property to true and the rcv-settle-mode property to first in all transfer frame(s) it uses for uploading command responses. All other combinations are not supported by the adapter and result in the message being rejected.\nThe table below provides an overview of the properties that must be set on a command response message:\n Name Mandatory Location Type Description to yes properties string MUST contain the value of the reply-to property of the command request message. correlation-id yes properties string MUST contain the value of the correlation-id property of the command request message. status yes application-properties integer MUST contain a status code indicating the outcome of processing the command at the device (see Command \u0026amp; Control API for details). Examples The AMQP adapter client can be used to simulate a device which receives commands and sends responses back to the application. The command line client is used to simulate an application sending commands to devices and receiving command responses from devices.\nStart the AMQP adapter client, as follows:\n# in directory: hono/cli/target/ java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-command --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret After successfully starting the client, a message indicating that the device is ready to receive commands will be printed to standard output. The device is now waiting to receive commands from applications.\nTo send a command to the device, open a new terminal shell and start the command application, as shown below:\n# in directory: hono/cli/ java -jar target/hono-cli-*-exec.jar --hono.client.host=localhost --hono.client.username=consumer@HONO --hono.client.password=verysecret --spring.profiles.active=command,ssl Note Change into the cli directory before running the command above to start the command application. If you change into the target directory (i.e cli/target), then the client will not be able to locate to certificate needed to connect to the messaging network. Once the command application starts successfully, enter a command name, payload and content-type of the command to send to the device.\n\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter name of command for device [DEFAULT_TENANT:4711] (prefix with 'ow:' to send one-way command): setBrightness \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter command payload: some-payload \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; Enter content type: text/plain After sending the command, the device (i.e. AMQP command client) will print out the command name and payload that it receives and automatically sends a command response to the application.\nReceived Command Message : [Command name: setBrightness, Command payload: some-payload] Command response sent [outcome: Accepted{}] Downstream Meta Data The adapter includes the following meta data in the application properties of messages being sent downstream:\n Name Type Description device_id string The identifier of the device that the message originates from. orig_adapter string Contains the adapter\u0026rsquo;s type name which can be used by downstream consumers to determine the protocol adapter that the message has been received over. The AMQP adapter\u0026rsquo;s type name is hono-amqp. orig_address string Contains the AMQP target address that the device has used to send the data. The adapter also considers defaults registered for the device at either the tenant or the device level. The values of the default properties are determined as follows:\n If the message already contains a non-empty property of the same name, the value if unchanged. Otherwise, if a default property of the same name is defined in the device\u0026rsquo;s registration information, that value is used. Otherwise, if a default property of the same name is defined for the tenant that the device belongs to, that value is used. Note that of the standard AMQP 1.0 message properties only the content-type and ttl can be set this way to a default value.\nEvent Message Time-to-live Events published by devices will usually be persisted by the AMQP Messaging Network in order to support deferred delivery to downstream consumers. In most cases the AMQP Messaging Network can be configured with a maximum time-to-live to apply to the events so that the events will be removed from the persistent store if no consumer has attached to receive the event before the message expires.\nIn order to support environments where the AMQP Messaging Network cannot be configured accordingly, the protocol adapter supports setting a downstream event message\u0026rsquo;s ttl property based on the default ttl and max-ttl values configured for a tenant/device as described in the Tenant API.\nTenant specific Configuration The adapter uses the Tenant API to retrieve tenant specific configuration for adapter type hono-amqp. The following properties are (currently) supported:\n Name Type Default Value Description enabled boolean true If set to false the adapter will reject all data from devices belonging to the tenant and respond with a amqp:unauthorized-access as the error condition value for rejecting the message. "
},
{
"uri": "https://www.eclipse.org/hono/docs/user-guide/kura-adapter/",
"title": "Kura Adapter",
"tags": [],
"description": "",
- "content": "The Kura protocol adapter exposes an MQTT topic hierarchy allowing Eclipse Kura\u0026trade; based gateways to publish control and data messages to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry and Event endpoints.\n Note The Kura adapter is supposed to be used with gateways running Kura version 3.x. Gateways running Kura version 4 and later should connect to the MQTT adapter instead. The Kura adapter by default requires devices (gateways) to authenticate during connection establishment. In order to do so, gateways need to provide a username and a password in the MQTT CONNECT packet. The username must have the form auth-id@tenant, e.g. sensor1@DEFAULT_TENANT. The adapter verifies the credentials provided by the gateway against the credentials the configured Credentials service has on record for the gateway. The adapter uses the Credentials API\u0026rsquo;s get operation to retrieve the credentials-on-record with the tenant and auth-id provided by the device in the username and hashed-password as the type of secret as query parameters.\nPlease refer to the Eclipse Kura documentation on how to configure the gateway\u0026rsquo;s cloud service connection accordingly. It is important to set the gateway\u0026rsquo;s topic.context.account-name to the ID of the Hono tenant that the gateway has been registered with whereas the gateway\u0026rsquo;s client-id needs to be set to the corresponding Hono device ID. The auth-id used as part of the gateway\u0026rsquo;s username property needs to match the authentication identifier of a set of credentials registered for the device ID in Hono\u0026rsquo;s Credentials service. In other words, the credentials configured on the gateway need to belong to the corresponding device ID.\nOnce the gateway has established a connection to the Kura adapter, all control and data messages published by applications running on the gateway are sent to the adapter and mapped to Hono\u0026rsquo;s Telemetry and Event API endpoints as follows:\n The adapter treats all messages that are published to a topic starting with the configured HONO_KURA_CONTROL_PREFIX as control messages. All other messages are considered to be data messages. control messages with QoS 0 are forwarded to Hono\u0026rsquo;s telemetry endpoint whereas messages with QoS 1 are forwarded to the event endpoint. The corresponding AMQP 1.0 messages that are sent downstream have a content type of application/vnd.eclipse.kura-control. data messages with QoS 0 are forwarded to the telemetry endpoint whereas messages with QoS 1 are forwarded to the event endpoint. The corresponding AMQP 1.0 messages that are sent downstream have a content type of application/vnd.eclipse.kura-data. Downstream Meta Data The adapter includes the following meta data in messages being sent downstream:\n Name Location Type Description device_id application string The identifier of the device that the message originates from. orig_adapter application string Contains the adapter\u0026rsquo;s type name which can be used by downstream consumers to determine the protocol adapter that the message has been received over. The Kura adapter\u0026rsquo;s type name is hono-kura-mqtt. orig_address application string Contains the name of the MQTT topic that the Kura gateway has originally published the data to. The adapter also considers defaults registered for the device at either the tenant or the device level. The values of the default properties are determined as follows:\n If the message already contains a non-empty property of the same name, the value if unchanged. Otherwise, if a default property of the same name is defined in the device\u0026rsquo;s registration information, that value is used. Otherwise, if a default property of the same name is defined for the tenant that the device belongs to, that value is used. Note that of the standard AMQP 1.0 message properties only the content-type and ttl can be set this way to a default value.\nTenant specific Configuration The adapter uses the Tenant API to retrieve tenant specific configuration for adapter type hono-kura-mqtt. The following properties are (currently) supported:\n Name Type Default Value Description enabled boolean true If set to false the adapter will reject all data from devices belonging to the tenant. "
+ "content": "The Kura protocol adapter exposes an MQTT topic hierarchy allowing Eclipse Kura\u0026trade; based gateways to publish control and data messages to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry and Event endpoints.\n Note The Kura adapter is supposed to be used with gateways running Kura version 3.x. Gateways running Kura version 4 and later should connect to the MQTT adapter instead. The Kura adapter by default requires devices (gateways) to authenticate during connection establishment. In order to do so, gateways need to provide a username and a password in the MQTT CONNECT packet. The username must have the form auth-id@tenant, e.g. sensor1@DEFAULT_TENANT. The adapter verifies the credentials provided by the gateway against the credentials the configured Credentials service has on record for the gateway. The adapter uses the Credentials API\u0026rsquo;s get operation to retrieve the credentials-on-record with the tenant and auth-id provided by the device in the username and hashed-password as the type of secret as query parameters.\nPlease refer to the Eclipse Kura documentation on how to configure the gateway\u0026rsquo;s cloud service connection accordingly. It is important to set the gateway\u0026rsquo;s topic.context.account-name to the ID of the Hono tenant that the gateway has been registered with whereas the gateway\u0026rsquo;s client-id needs to be set to the corresponding Hono device ID. The auth-id used as part of the gateway\u0026rsquo;s username property needs to match the authentication identifier of a set of credentials registered for the device ID in Hono\u0026rsquo;s Credentials service. In other words, the credentials configured on the gateway need to belong to the corresponding device ID.\nOnce the gateway has established a connection to the Kura adapter, all control and data messages published by applications running on the gateway are sent to the adapter and mapped to Hono\u0026rsquo;s Telemetry and Event API endpoints as follows:\n The adapter treats all messages that are published to a topic starting with the configured HONO_KURA_CONTROL_PREFIX as control messages. All other messages are considered to be data messages. control messages with QoS 0 are forwarded to Hono\u0026rsquo;s telemetry endpoint whereas messages with QoS 1 are forwarded to the event endpoint. The corresponding AMQP 1.0 messages that are sent downstream have a content type of application/vnd.eclipse.kura-control. data messages with QoS 0 are forwarded to the telemetry endpoint whereas messages with QoS 1 are forwarded to the event endpoint. The corresponding AMQP 1.0 messages that are sent downstream have a content type of application/vnd.eclipse.kura-data. Downstream Meta Data The adapter includes the following meta data in messages being sent downstream:\n Name Location Type Description device_id application string The identifier of the device that the message originates from. orig_adapter application string Contains the adapter\u0026rsquo;s type name which can be used by downstream consumers to determine the protocol adapter that the message has been received over. The Kura adapter\u0026rsquo;s type name is hono-kura-mqtt. orig_address application string Contains the name of the MQTT topic that the Kura gateway has originally published the data to. The adapter also considers defaults registered for the device at either the tenant or the device level. The values of the default properties are determined as follows:\n If the message already contains a non-empty property of the same name, the value if unchanged. Otherwise, if a default property of the same name is defined in the device\u0026rsquo;s registration information, that value is used. Otherwise, if a default property of the same name is defined for the tenant that the device belongs to, that value is used. Note that of the standard AMQP 1.0 message properties only the content-type and ttl can be set this way to a default value.\nEvent Message Time-to-live Events published by devices will usually be persisted by the AMQP Messaging Network in order to support deferred delivery to downstream consumers. In most cases the AMQP Messaging Network can be configured with a maximum time-to-live to apply to the events so that the events will be removed from the persistent store if no consumer has attached to receive the event before the message expires.\nIn order to support environments where the AMQP Messaging Network cannot be configured accordingly, the protocol adapter supports setting a downstream event message\u0026rsquo;s ttl property based on the default ttl and max-ttl values configured for a tenant/device as described in the Tenant API.\nTenant specific Configuration The adapter uses the Tenant API to retrieve tenant specific configuration for adapter type hono-kura-mqtt. The following properties are (currently) supported:\n Name Type Default Value Description enabled boolean true If set to false the adapter will reject all data from devices belonging to the tenant. "
},
{
"uri": "https://www.eclipse.org/hono/docs/user-guide/sigfox-adapter/",
@@ -116,7 +116,7 @@
"title": "Admin Guide",
"tags": [],
"description": "",
- "content": " Admin Guide Learn how to operate Hono\u0026trade; and look-up the configuration options of it\u0026rsquo;s components.\n"
+ "content": " Admin Guide Learn how to operate Eclipse Hono\u0026trade; and look up the configuration options of its components.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/admin-guide/common-config/",
@@ -151,35 +151,35 @@
"title": "HTTP Adapter Configuration",
"tags": [],
"description": "",
- "content": "The HTTP protocol adapter exposes a HTTP based API for Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry and Event endpoints.\nThe adapter is implemented as a Spring Boot application. It can be run either directly from the command line or by means of starting the corresponding Docker image created from it.\nService Configuration In addition to the following options, this component supports the options described in Common Configuration.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the HTTP adapter.\n Environment Variable\nCommand Line Option Mandatory Default Description HONO_APP_MAX_INSTANCES\n--hono.app.maxInstances no #CPU cores The number of verticle instances to deploy. If not set, one verticle per processor core is deployed. HONO_HTTP_AUTHENTICATION_REQUIRED\n--hono.http.authenticationRequired no true If set to true the protocol adapter requires devices to authenticate when connecting to the adapter. The credentials provided by the device are verified using the configured Credentials Service. Devices that have failed to authenticate are not allowed to publish any data. HONO_HTTP_BIND_ADDRESS\n--hono.http.bindAddress no 127.0.0.1 The IP address of the network interface that the secure port should be bound to.\nSee Port Configuration below for details. HONO_HTTP_CERT_PATH\n--hono.http.certPath no - The absolute path to the PEM file containing the certificate that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_HTTP_KEY_PATH.\nAlternatively, the HONO_HTTP_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_HTTP_DEFAULTS_ENABLED\n--hono.http.defaultsEnabled no true If set to true the protocol adapter uses default values registered for a device to augment messages published by the device with missing information like a content type. In particular, the protocol adapter adds default values registered for the device as (application) properties with the same name to the AMQP 1.0 messages it sends downstream to the AMQP Messaging Network. HONO_HTTP_INSECURE_PORT\n--hono.http.insecurePort no - The insecure port the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_HTTP_INSECURE_PORT_BIND_ADDRESS\n--hono.http.insecurePortBindAddress no 127.0.0.1 The IP address of the network interface that the insecure port should be bound to.\nSee Port Configuration below for details. HONO_HTTP_INSECURE_PORT_ENABLED\n--hono.http.insecurePortEnabled no false If set to true the protocol adapter will open an insecure port (not secured by TLS) using either the port number set via HONO_HTTP_INSECURE_PORT or the default port number (8080) if not set explicitly.\nSee Port Configuration below for details. HONO_HTTP_KEY_PATH\n--hono.http.keyPath no - The absolute path to the (PKCS8) PEM file containing the private key that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_HTTP_CERT_PATH. Alternatively, the HONO_HTTP_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_HTTP_KEY_STORE_PASSWORD\n--hono.http.keyStorePassword no - The password required to read the contents of the key store. HONO_HTTP_KEY_STORE_PATH\n--hono.http.keyStorePath no - The absolute path to the Java key store containing the private key and certificate that the protocol adapter should use for authenticating to clients. Either this option or the HONO_HTTP_KEY_PATH and HONO_HTTP_CERT_PATH options need to be set in order to enable TLS secured connections with clients. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. HONO_HTTP_NATIVE_TLS_REQUIRED\n--hono.http.nativeTlsRequired no false The server will probe for OpenSLL on startup if a secure port is configured. By default, the server will fall back to the JVM\u0026rsquo;s default SSL engine if not available. However, if set to true, the server will fail to start at all in this case. HONO_HTTP_MAX_PAYLOAD_SIZE\n--hono.http.maxPayloadSize no 2048 The maximum allowed size of an incoming HTTP request\u0026rsquo;s body in bytes. Requests with a larger body size are rejected with a 413 Request entity too large response. HONO_HTTP_PORT\n--hono.http.port no 8443 The secure port that the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_HTTP_REALM\n--hono.http.realm no Hono The name of the realm that unauthenticated devices are prompted to provide credentials for. The realm is used in the WWW-Authenticate header returned to devices in response to unauthenticated requests. HONO_HTTP_SECURE_PROTOCOLS\n--hono.http.secureProtocols no TLSv1.2 A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the vert.x documentation for a list of supported protocol names. The variables only need to be set if the default value does not match your environment.\nPort Configuration The HTTP protocol adapter can be configured to listen for connections on\n a secure port only (default) or an insecure port only or both a secure and an insecure port (dual port configuration) The HTTP protocol adapter will fail to start if none of the ports is configured properly.\nSecure Port Only The protocol adapter needs to be configured with a private key and certificate in order to open a TLS secured port.\nThere are two alternative ways for doing so:\n Setting the HONO_HTTP_KEY_STORE_PATH and the HONO_HTTP_KEY_STORE_PASSWORD variables in order to load the key \u0026amp; certificate from a password protected key store, or setting the HONO_HTTP_KEY_PATH and HONO_HTTP_CERT_PATH variables in order to load the key and certificate from two separate PEM files in PKCS8 format. When starting up, the protocol adapter will bind a TLS secured socket to the default secure port 8443. The port number can also be set explicitly using the HONO_HTTP_PORT variable.\nThe HONO_HTTP_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. Setting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nInsecure Port Only The secure port will mostly be required for production scenarios. However, it might be desirable to expose a non-TLS secured port instead, e.g. for testing purposes. In any case, the non-secure port needs to be explicitly enabled either by\n explicitly setting HONO_HTTP_INSECURE_PORT to a valid port number, or by implicitly configuring the default port (8080) by simply setting HONO_HTTP_INSECURE_PORT_ENABLED to true. The protocol adapter issues a warning on the console if HONO_HTTP_INSECURE_PORT is set to the default secure HTTP port (8443).\nThe HONO_HTTP_INSECURE_PORT_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. This variable might be used to e.g. expose the non-TLS secured port on a local interface only, thus providing easy access from within the local network, while still requiring encrypted communication when accessed from the outside over public network infrastructure.\nSetting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nDual Port The protocol adapter may be configured to open both a secure and a non-secure port at the same time simply by configuring both ports as described above. For this to work, both ports must be configured to use different port numbers, otherwise startup will fail.\nEphemeral Ports Both the secure as well as the insecure port numbers may be explicitly set to 0. The protocol adapter will then use arbitrary (unused) port numbers determined by the operating system during startup.\nAMQP 1.0 Messaging Network Connection Configuration The adapter requires a connection to the AMQP 1.0 Messaging Network in order to forward telemetry data and events received from devices to downstream consumers.\nThe connection to the messaging network is configured according to Hono Client Configuration with HONO_MESSAGING being used as ${PREFIX}. Since there are no responses being received, the properties for configuring response caching can be ignored.\nTenant Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Tenant API in order to retrieve information for a tenant.\nThe connection to the Tenant Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_TENANT and the additional values for response caching apply.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Registration Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Registration API in order to retrieve registration status assertions for connected devices.\nThe connection to the Device Registration Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_REGISTRATION.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nCredentials Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Credentials API in order to retrieve credentials stored for devices that needs to be authenticated. During connection establishment, the adapter uses the Credentials API to retrieve the credentials on record for the device and matches that with the credentials provided by a device.\nThe connection to the Credentials Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_CREDENTIALS.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Connection Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Connection API in order to determine the gateway that a device is connected via to a protocol adapter. This information is required in order to forward commands issued by applications to the protocol adapter instance that the gateway is connected to.\nThe connection to the Device Connection service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_DEVICE_CONNECTION.\nResponses from the Device Connection service are never cached, so the properties for configuring the cache are ignored.\nResource Limits Checker Configuration The adapter can use metrics collected by a Prometheus server to enforce certain limits set at the tenant level like the overall number of connected devices allowed per tenant.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the checker.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_PLAN_PROMETHEUS_BASED_HOST\n--hono.plan.prometheusBased.host no none The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks. HONO_PLAN_PROMETHEUS_BASED_PORT\n--hono.plan.prometheusBased.port no 9090 The port of the Prometheus server to retrieve metrics data from. HONO_PLAN_PROMETHEUS_BASED_CACHE_MIN_SIZE\n--hono.plan.prometheusBased.cacheMinSize no 20 The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants. HONO_PLAN_PROMETHEUS_BASED_CACHE_MAX_SIZE\n--hono.plan.prometheusBased.cacheMaxSize no 1000 The maximum size of the cache to store the metrics data retrieved from the Prometheus server. HONO_PLAN_PROMETHEUS_BASED_CACHE_TIMEOUT\n--hono.plan.prometheusBased.cacheTimeout no 600 The number of seconds after which the cached metrics data should be considered invalid. Metrics Configuration See Monitoring \u0026amp; Tracing Admin Guide for details on how to configure the reporting of metrics.\n"
+ "content": "The HTTP protocol adapter exposes a HTTP based API for Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry and Event endpoints.\nThe adapter is implemented as a Spring Boot application. It can be run either directly from the command line or by means of starting the corresponding Docker image created from it.\nService Configuration In addition to the following options, this component supports the options described in Common Configuration.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the HTTP adapter.\n Environment Variable\nCommand Line Option Mandatory Default Description HONO_APP_MAX_INSTANCES\n--hono.app.maxInstances no #CPU cores The number of verticle instances to deploy. If not set, one verticle per processor core is deployed. HONO_HTTP_AUTHENTICATION_REQUIRED\n--hono.http.authenticationRequired no true If set to true the protocol adapter requires devices to authenticate when connecting to the adapter. The credentials provided by the device are verified using the configured Credentials Service. Devices that have failed to authenticate are not allowed to publish any data. HONO_HTTP_BIND_ADDRESS\n--hono.http.bindAddress no 127.0.0.1 The IP address of the network interface that the secure port should be bound to.\nSee Port Configuration below for details. HONO_HTTP_CERT_PATH\n--hono.http.certPath no - The absolute path to the PEM file containing the certificate that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_HTTP_KEY_PATH.\nAlternatively, the HONO_HTTP_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_HTTP_DEFAULTS_ENABLED\n--hono.http.defaultsEnabled no true If set to true the protocol adapter uses default values registered for a device to augment messages published by the device with missing information like a content type. In particular, the protocol adapter adds default values registered for the device as (application) properties with the same name to the AMQP 1.0 messages it sends downstream to the AMQP Messaging Network. HONO_HTTP_INSECURE_PORT\n--hono.http.insecurePort no - The insecure port the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_HTTP_INSECURE_PORT_BIND_ADDRESS\n--hono.http.insecurePortBindAddress no 127.0.0.1 The IP address of the network interface that the insecure port should be bound to.\nSee Port Configuration below for details. HONO_HTTP_INSECURE_PORT_ENABLED\n--hono.http.insecurePortEnabled no false If set to true the protocol adapter will open an insecure port (not secured by TLS) using either the port number set via HONO_HTTP_INSECURE_PORT or the default port number (8080) if not set explicitly.\nSee Port Configuration below for details. HONO_HTTP_KEY_PATH\n--hono.http.keyPath no - The absolute path to the (PKCS8) PEM file containing the private key that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_HTTP_CERT_PATH. Alternatively, the HONO_HTTP_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_HTTP_KEY_STORE_PASSWORD\n--hono.http.keyStorePassword no - The password required to read the contents of the key store. HONO_HTTP_KEY_STORE_PATH\n--hono.http.keyStorePath no - The absolute path to the Java key store containing the private key and certificate that the protocol adapter should use for authenticating to clients. Either this option or the HONO_HTTP_KEY_PATH and HONO_HTTP_CERT_PATH options need to be set in order to enable TLS secured connections with clients. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. HONO_HTTP_NATIVE_TLS_REQUIRED\n--hono.http.nativeTlsRequired no false The server will probe for OpenSLL on startup if a secure port is configured. By default, the server will fall back to the JVM\u0026rsquo;s default SSL engine if not available. However, if set to true, the server will fail to start at all in this case. HONO_HTTP_MAX_PAYLOAD_SIZE\n--hono.http.maxPayloadSize no 2048 The maximum allowed size of an incoming HTTP request\u0026rsquo;s body in bytes. Requests with a larger body size are rejected with a 413 Request entity too large response. HONO_HTTP_PORT\n--hono.http.port no 8443 The secure port that the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_HTTP_REALM\n--hono.http.realm no Hono The name of the realm that unauthenticated devices are prompted to provide credentials for. The realm is used in the WWW-Authenticate header returned to devices in response to unauthenticated requests. HONO_HTTP_SECURE_PROTOCOLS\n--hono.http.secureProtocols no TLSv1.2 A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the vert.x documentation for a list of supported protocol names. HONO_HTTP_TENANT_IDLE_TIMEOUT\n--hono.http.tenantIdleTimeout no 0ms The duration after which the protocol adapter removes local state of the tenant (e.g. open AMQP links) with an amount and a unit, e.g. 2h for 2 hours. See the Spring Boot documentation for an explanation of the format. The value 0ms disables the timeout. The variables only need to be set if the default value does not match your environment.\nPort Configuration The HTTP protocol adapter can be configured to listen for connections on\n a secure port only (default) or an insecure port only or both a secure and an insecure port (dual port configuration) The HTTP protocol adapter will fail to start if none of the ports is configured properly.\nSecure Port Only The protocol adapter needs to be configured with a private key and certificate in order to open a TLS secured port.\nThere are two alternative ways for doing so:\n Setting the HONO_HTTP_KEY_STORE_PATH and the HONO_HTTP_KEY_STORE_PASSWORD variables in order to load the key \u0026amp; certificate from a password protected key store, or setting the HONO_HTTP_KEY_PATH and HONO_HTTP_CERT_PATH variables in order to load the key and certificate from two separate PEM files in PKCS8 format. When starting up, the protocol adapter will bind a TLS secured socket to the default secure port 8443. The port number can also be set explicitly using the HONO_HTTP_PORT variable.\nThe HONO_HTTP_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. Setting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nInsecure Port Only The secure port will mostly be required for production scenarios. However, it might be desirable to expose a non-TLS secured port instead, e.g. for testing purposes. In any case, the non-secure port needs to be explicitly enabled either by\n explicitly setting HONO_HTTP_INSECURE_PORT to a valid port number, or by implicitly configuring the default port (8080) by simply setting HONO_HTTP_INSECURE_PORT_ENABLED to true. The protocol adapter issues a warning on the console if HONO_HTTP_INSECURE_PORT is set to the default secure HTTP port (8443).\nThe HONO_HTTP_INSECURE_PORT_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. This variable might be used to e.g. expose the non-TLS secured port on a local interface only, thus providing easy access from within the local network, while still requiring encrypted communication when accessed from the outside over public network infrastructure.\nSetting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nDual Port The protocol adapter may be configured to open both a secure and a non-secure port at the same time simply by configuring both ports as described above. For this to work, both ports must be configured to use different port numbers, otherwise startup will fail.\nEphemeral Ports Both the secure as well as the insecure port numbers may be explicitly set to 0. The protocol adapter will then use arbitrary (unused) port numbers determined by the operating system during startup.\nAMQP 1.0 Messaging Network Connection Configuration The adapter requires a connection to the AMQP 1.0 Messaging Network in order to forward telemetry data and events received from devices to downstream consumers.\nThe connection to the messaging network is configured according to Hono Client Configuration with HONO_MESSAGING being used as ${PREFIX}. Since there are no responses being received, the properties for configuring response caching can be ignored.\nTenant Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Tenant API in order to retrieve information for a tenant.\nThe connection to the Tenant Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_TENANT and the additional values for response caching apply.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Registration Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Registration API in order to retrieve registration status assertions for connected devices.\nThe connection to the Device Registration Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_REGISTRATION.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nCredentials Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Credentials API in order to retrieve credentials stored for devices that needs to be authenticated. During connection establishment, the adapter uses the Credentials API to retrieve the credentials on record for the device and matches that with the credentials provided by a device.\nThe connection to the Credentials Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_CREDENTIALS.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Connection Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Connection API in order to determine the gateway that a device is connected via to a protocol adapter. This information is required in order to forward commands issued by applications to the protocol adapter instance that the gateway is connected to.\nThe connection to the Device Connection service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_DEVICE_CONNECTION.\nResponses from the Device Connection service are never cached, so the properties for configuring the cache are ignored.\nResource Limits Checker Configuration The adapter can use metrics collected by a Prometheus server to enforce certain limits set at the tenant level like the overall number of connected devices allowed per tenant.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the checker.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_HOST\n--hono.resourceLimits.prometheusBased.host no none The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_PORT\n--hono.resourceLimits.prometheusBased.port no 9090 The port of the Prometheus server to retrieve metrics data from. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MIN_SIZE\n--hono.resourceLimits.prometheusBased.cacheMinSize no 20 The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MAX_SIZE\n--hono.resourceLimits.prometheusBased.cacheMaxSize no 1000 The maximum size of the cache to store the metrics data retrieved from the Prometheus server. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_TIMEOUT\n--hono.resourceLimits.prometheusBased.cacheTimeout no 600 The number of seconds after which the cached metrics data should be considered invalid. Metrics Configuration See Monitoring \u0026amp; Tracing Admin Guide for details on how to configure the reporting of metrics.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/admin-guide/amqp-adapter-config/",
"title": "AMQP Adapter Configuration",
"tags": [],
"description": "",
- "content": "The AMQP protocol adapter allows clients (devices and gateway components) that speaks AMQP 1.0 to publish telemetry messages and events to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry and Event endpoints.\nThe adapter is implemented as a Spring Boot application. It can be run either directly from the command line or by means of starting the corresponding Docker image created from it.\nService Configuration In addition to the following options, this component supports the options described in Common Configuration.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the AMQP adapter.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_AMQP_AUTHENTICATION_REQUIRED\n--hono.amqp.authenticationRequired no true If set to true the protocol adapter requires devices to authenticate when connecting to the adapter. The credentials provided by the device are verified using the configured Credentials Service. Devices that have failed to authenticate are not allowed to publish any data. HONO_AMQP_BIND_ADDRESS\n--hono.amqp.bindAddress no 127.0.0.1 The IP address of the network interface that the secure port should be bound to.\nSee Port Configuration below for details. HONO_AMQP_CERT_PATH\n--hono.amqp.certPath no - The absolute path to the PEM file containing the certificate that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_AMQP_KEY_PATH.\nAlternatively, the HONO_AMQP_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_AMQP_DEFAULTS_ENABLED\n--hono.amqp.defaultsEnabled no true If set to true the protocol adapter uses default values registered for a device to augment messages published by the device with missing information like a content type. In particular, the protocol adapter adds default values registered for the device as (application) properties with the same name to the AMQP 1.0 messages it sends downstream to the AMQP Messaging Network. HONO_AMQP_INSECURE_PORT_BIND_ADDRESS\n--hono.amqp.insecurePortBindAddress no 127.0.0.1 The IP address of the network interface that the insecure port should be bound to.\nSee Port Configuration below for details. HONO_AMQP_INSECURE_PORT\n--hono.amqp.insecurePort no 4040 The port number that the protocol adapter should listen on for insecure connections.\nSee Port Configuration below for details. HONO_AMQP_INSECURE_PORT_ENABLED\n--hono.amqp.insecurePortEnabled no false If set to true the protocol adapter will open an insecure port (not secured by TLS) using either the port number set via HONO_AMQP_INSECURE_PORT or the default AMQP port number (1883) if not set explicitly.\nSee Port Configuration below for details. HONO_AMQP_KEY_PATH\n--hono.amqp.keyPath no - The absolute path to the (PKCS8) PEM file containing the private key that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_AMQP_CERT_PATH. Alternatively, the HONO_AMQP_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_AMQP_KEY_STORE_PASSWORD\n--hono.amqp.keyStorePassword no - The password required to read the contents of the key store. HONO_AMQP_KEY_STORE_PATH\n--hono.amqp.keyStorePath no - The absolute path to the Java key store containing the private key and certificate that the protocol adapter should use for authenticating to clients. Either this option or the HONO_AMQP_KEY_PATH and HONO_AMQP_CERT_PATH options need to be set in order to enable TLS secured connections with clients. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. HONO_AMQP_MAX_CONNECTIONS\n--hono.amqp.maxConnections no 0 The maximum number of concurrent connections that the protocol adapter should accept. If not set (or set to 0), the protocol adapter determines a reasonable value based on the available resources like memory and CPU. HONO_AMQP_MAX_FRAME_SIZE\n--hono.amqp.maxFrameSize no 16384 The maximum number of bytes that can be sent in an AMQP message delivery over the connection with a device. When a client sends an AMQP frame of larger size, the connection is closed. HONO_AMQP_MAX_PAYLOAD_SIZE\n--hono.amqp.maxPayloadSize no 2048 The maximum allowed size of an incoming AMQP message in bytes. When a client sends a message with a larger payload, the message is discarded and the link to the client is closed. HONO_AMQP_MAX_SESSION_FRAMES\n--hono.amqp.maxSessionFrames no 30 The maximum number of AMQP transfer frames for sessions created on this connection. This is the number of transfer frames that may simultaneously be in flight for all links in the session. HONO_AMQP_NATIVE_TLS_REQUIRED\n--hono.amqp.nativeTlsRequired no false The server will probe for OpenSSL on startup if a secure port is configured. By default, the server will fall back to the JVM\u0026rsquo;s default SSL engine if not available. However, if set to true, the server will fail to start at all in this case. HONO_AMQP_PORT\n--hono.amqp.port no 4041 The secure port that the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_AMQP_SECURE_PROTOCOLS\n--hono.amqp.secureProtocols no TLSv1.2 A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the vert.x documentation for a list of supported protocol names. HONO_APP_MAX_INSTANCES\n--hono.app.maxInstances no #CPU cores The number of verticle instances to deploy. If not set, one verticle per processor core is deployed. The variables only need to be set if the default values do not match your environment.\nPort Configuration The AMQP protocol adapter can be configured to listen for connections on\n a secure port only (default) or an insecure port only or both a secure and an insecure port (dual port configuration) The AMQP protocol adapter will fail to start if none of the ports is configured properly.\nSecure Port Only The protocol adapter needs to be configured with a private key and certificate in order to open a TLS secured port.\nThere are two alternative ways for doing so:\n either setting the HONO_AMQP_KEY_STORE_PATH and the HONO_AMQP_KEY_STORE_PASSWORD variables in order to load the key \u0026amp; certificate from a password protected key store, or setting the HONO_AMQP_KEY_PATH and HONO_AMQP_CERT_PATH variables in order to load the key and certificate from two separate PEM files in PKCS8 format. When starting up, the protocol adapter will bind a TLS secured socket to the default secure port 4041. The port number can also be set explicitly using the HONO_AMQP_PORT variable.\nThe HONO_AMQP_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. Setting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nInsecure Port Only The secure port will mostly be required for production scenarios. However, it might be desirable to expose a non-TLS secured port instead, e.g. for testing purposes. In any case, the non-secure port needs to be explicitly enabled either by\n explicitly setting HONO_AMQP_INSECURE_PORT to a valid port number, or by implicitly configuring the default adapter port (4040) by simply setting HONO_AMQP_INSECURE_PORT_ENABLED to true. The protocol adapter issues a warning on the console if HONO_AMQP_INSECURE_PORT is set to the default secure port (4041) used by the adapter for secure connections.\nThe HONO_AMQP_INSECURE_PORT_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. This variable might be used to e.g. expose the non-TLS secured port on a local interface only, thus providing easy access from within the local network, while still requiring encrypted communication when accessed from the outside over public network infrastructure.\nSetting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nDual Port The protocol adapter may be configured to open both a secure and a non-secure port at the same time simply by configuring both ports as described above. For this to work, both ports must be configured to use different port numbers, otherwise startup will fail.\nEphemeral Ports Both the secure as well as the insecure port numbers may be explicitly set to 0. The protocol adapter will then use arbitrary (unused) port numbers determined by the operating system during startup.\nAMQP 1.0 Messaging Network Connection Configuration The adapter requires a connection to the AMQP 1.0 Messaging Network in order to forward telemetry data and events received from devices to downstream consumers.\nThe connection to the messaging network is configured according to Hono Client Configuration with HONO_MESSAGING being used as ${PREFIX}. Since there are no responses being received, the properties for configuring response caching can be ignored.\nTenant Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Tenant API in order to retrieve information for a tenant.\nThe connection to the Tenant Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_TENANT and the additional values for response caching apply.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Registration Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Registration API in order to retrieve registration status assertions for connected devices.\nThe connection to the Device Registration Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_REGISTRATION.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nCredentials Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Credentials API in order to retrieve credentials stored for devices that needs to be authenticated. During connection establishment, the adapter uses the Credentials API to retrieve the credentials on record for the device and matches that with the credentials provided by a device.\nThe connection to the Credentials Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_CREDENTIALS.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Connection Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Connection API in order to determine the gateway that a device is connected via to a protocol adapter. This information is required in order to forward commands issued by applications to the protocol adapter instance that the gateway is connected to.\nThe connection to the Device Connection service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_DEVICE_CONNECTION.\nResponses from the Device Connection service are never cached, so the properties for configuring the cache are ignored.\nResource Limits Checker Configuration The adapter can use metrics collected by a Prometheus server to enforce certain limits set at the tenant level like the overall number of connected devices allowed per tenant.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the checker.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_PLAN_PROMETHEUS_BASED_HOST\n--hono.plan.prometheusBased.host no none The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks. HONO_PLAN_PROMETHEUS_BASED_PORT\n--hono.plan.prometheusBased.port no 9090 The port of the Prometheus server to retrieve metrics data from. HONO_PLAN_PROMETHEUS_BASED_CACHE_MIN_SIZE\n--hono.plan.prometheusBased.cacheMinSize no 20 The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants. HONO_PLAN_PROMETHEUS_BASED_CACHE_MAX_SIZE\n--hono.plan.prometheusBased.cacheMaxSize no 1000 The maximum size of the cache to store the metrics data retrieved from the Prometheus server. HONO_PLAN_PROMETHEUS_BASED_CACHE_TIMEOUT\n--hono.plan.prometheusBased.cacheTimeout no 600 The number of seconds after which the cached metrics data should be considered invalid. Metrics Configuration See Monitoring \u0026amp; Tracing Admin Guide for details on how to configure the reporting of metrics.\n"
+ "content": "The AMQP protocol adapter allows clients (devices and gateway components) that speaks AMQP 1.0 to publish telemetry messages and events to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry and Event endpoints.\nThe adapter is implemented as a Spring Boot application. It can be run either directly from the command line or by means of starting the corresponding Docker image created from it.\nService Configuration In addition to the following options, this component supports the options described in Common Configuration.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the AMQP adapter.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_AMQP_AUTHENTICATION_REQUIRED\n--hono.amqp.authenticationRequired no true If set to true the protocol adapter requires devices to authenticate when connecting to the adapter. The credentials provided by the device are verified using the configured Credentials Service. Devices that have failed to authenticate are not allowed to publish any data. HONO_AMQP_BIND_ADDRESS\n--hono.amqp.bindAddress no 127.0.0.1 The IP address of the network interface that the secure port should be bound to.\nSee Port Configuration below for details. HONO_AMQP_CERT_PATH\n--hono.amqp.certPath no - The absolute path to the PEM file containing the certificate that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_AMQP_KEY_PATH.\nAlternatively, the HONO_AMQP_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_AMQP_DEFAULTS_ENABLED\n--hono.amqp.defaultsEnabled no true If set to true the protocol adapter uses default values registered for a device to augment messages published by the device with missing information like a content type. In particular, the protocol adapter adds default values registered for the device as (application) properties with the same name to the AMQP 1.0 messages it sends downstream to the AMQP Messaging Network. HONO_AMQP_INSECURE_PORT_BIND_ADDRESS\n--hono.amqp.insecurePortBindAddress no 127.0.0.1 The IP address of the network interface that the insecure port should be bound to.\nSee Port Configuration below for details. HONO_AMQP_INSECURE_PORT\n--hono.amqp.insecurePort no 5672 The port number that the protocol adapter should listen on for insecure connections.\nSee Port Configuration below for details. HONO_AMQP_INSECURE_PORT_ENABLED\n--hono.amqp.insecurePortEnabled no false If set to true the protocol adapter will open an insecure port (not secured by TLS) using either the port number set via HONO_AMQP_INSECURE_PORT or the default AMQP port number (1883) if not set explicitly.\nSee Port Configuration below for details. HONO_AMQP_KEY_PATH\n--hono.amqp.keyPath no - The absolute path to the (PKCS8) PEM file containing the private key that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_AMQP_CERT_PATH. Alternatively, the HONO_AMQP_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_AMQP_KEY_STORE_PASSWORD\n--hono.amqp.keyStorePassword no - The password required to read the contents of the key store. HONO_AMQP_KEY_STORE_PATH\n--hono.amqp.keyStorePath no - The absolute path to the Java key store containing the private key and certificate that the protocol adapter should use for authenticating to clients. Either this option or the HONO_AMQP_KEY_PATH and HONO_AMQP_CERT_PATH options need to be set in order to enable TLS secured connections with clients. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. HONO_AMQP_MAX_CONNECTIONS\n--hono.amqp.maxConnections no 0 The maximum number of concurrent connections that the protocol adapter should accept. If not set (or set to 0), the protocol adapter determines a reasonable value based on the available resources like memory and CPU. HONO_AMQP_MAX_FRAME_SIZE\n--hono.amqp.maxFrameSize no 16384 The maximum number of bytes that can be sent in an AMQP message delivery over the connection with a device. When a client sends an AMQP frame of larger size, the connection is closed. HONO_AMQP_MAX_PAYLOAD_SIZE\n--hono.amqp.maxPayloadSize no 2048 The maximum allowed size of an incoming AMQP message in bytes. When a client sends a message with a larger payload, the message is discarded and the link to the client is closed. HONO_AMQP_MAX_SESSION_FRAMES\n--hono.amqp.maxSessionFrames no 30 The maximum number of AMQP transfer frames for sessions created on this connection. This is the number of transfer frames that may simultaneously be in flight for all links in the session. HONO_AMQP_NATIVE_TLS_REQUIRED\n--hono.amqp.nativeTlsRequired no false The server will probe for OpenSSL on startup if a secure port is configured. By default, the server will fall back to the JVM\u0026rsquo;s default SSL engine if not available. However, if set to true, the server will fail to start at all in this case. HONO_AMQP_PORT\n--hono.amqp.port no 5671 The secure port that the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_AMQP_SECURE_PROTOCOLS\n--hono.amqp.secureProtocols no TLSv1.2 A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the vert.x documentation for a list of supported protocol names. HONO_AMQP_TENANT_IDLE_TIMEOUT\n--hono.amqp.tenantIdleTimeout no 0ms The duration after which the protocol adapter removes local state of the tenant (e.g. open AMQP links) with an amount and a unit, e.g. 2h for 2 hours. See the Spring Boot documentation for an explanation of the format. The value 0ms disables the timeout. HONO_APP_MAX_INSTANCES\n--hono.app.maxInstances no #CPU cores The number of verticle instances to deploy. If not set, one verticle per processor core is deployed. The variables only need to be set if the default values do not match your environment.\nPort Configuration The AMQP protocol adapter can be configured to listen for connections on\n a secure port only (default) or an insecure port only or both a secure and an insecure port (dual port configuration) The AMQP protocol adapter will fail to start if none of the ports is configured properly.\nSecure Port Only The protocol adapter needs to be configured with a private key and certificate in order to open a TLS secured port.\nThere are two alternative ways for doing so:\n either setting the HONO_AMQP_KEY_STORE_PATH and the HONO_AMQP_KEY_STORE_PASSWORD variables in order to load the key \u0026amp; certificate from a password protected key store, or setting the HONO_AMQP_KEY_PATH and HONO_AMQP_CERT_PATH variables in order to load the key and certificate from two separate PEM files in PKCS8 format. When starting up, the protocol adapter will bind a TLS secured socket to the default secure port 5671. The port number can also be set explicitly using the HONO_AMQP_PORT variable.\nThe HONO_AMQP_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. Setting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nInsecure Port Only The secure port will mostly be required for production scenarios. However, it might be desirable to expose a non-TLS secured port instead, e.g. for testing purposes. In any case, the non-secure port needs to be explicitly enabled either by\n explicitly setting HONO_AMQP_INSECURE_PORT to a valid port number, or by implicitly configuring the default adapter port (5672) by simply setting HONO_AMQP_INSECURE_PORT_ENABLED to true. The protocol adapter issues a warning on the console if HONO_AMQP_INSECURE_PORT is set to the default secure port (5671) used by the adapter for secure connections.\nThe HONO_AMQP_INSECURE_PORT_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. This variable might be used to e.g. expose the non-TLS secured port on a local interface only, thus providing easy access from within the local network, while still requiring encrypted communication when accessed from the outside over public network infrastructure.\nSetting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nDual Port The protocol adapter may be configured to open both a secure and a non-secure port at the same time simply by configuring both ports as described above. For this to work, both ports must be configured to use different port numbers, otherwise startup will fail.\nEphemeral Ports Both the secure as well as the insecure port numbers may be explicitly set to 0. The protocol adapter will then use arbitrary (unused) port numbers determined by the operating system during startup.\nAMQP 1.0 Messaging Network Connection Configuration The adapter requires a connection to the AMQP 1.0 Messaging Network in order to forward telemetry data and events received from devices to downstream consumers.\nThe connection to the messaging network is configured according to Hono Client Configuration with HONO_MESSAGING being used as ${PREFIX}. Since there are no responses being received, the properties for configuring response caching can be ignored.\nTenant Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Tenant API in order to retrieve information for a tenant.\nThe connection to the Tenant Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_TENANT and the additional values for response caching apply.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Registration Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Registration API in order to retrieve registration status assertions for connected devices.\nThe connection to the Device Registration Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_REGISTRATION.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nCredentials Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Credentials API in order to retrieve credentials stored for devices that needs to be authenticated. During connection establishment, the adapter uses the Credentials API to retrieve the credentials on record for the device and matches that with the credentials provided by a device.\nThe connection to the Credentials Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_CREDENTIALS.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Connection Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Connection API in order to determine the gateway that a device is connected via to a protocol adapter. This information is required in order to forward commands issued by applications to the protocol adapter instance that the gateway is connected to.\nThe connection to the Device Connection service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_DEVICE_CONNECTION.\nResponses from the Device Connection service are never cached, so the properties for configuring the cache are ignored.\nResource Limits Checker Configuration The adapter can use metrics collected by a Prometheus server to enforce certain limits set at the tenant level like the overall number of connected devices allowed per tenant.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the checker.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_HOST\n--hono.resourceLimits.prometheusBased.host no none The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_PORT\n--hono.resourceLimits.prometheusBased.port no 9090 The port of the Prometheus server to retrieve metrics data from. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MIN_SIZE\n--hono.resourceLimits.prometheusBased.cacheMinSize no 20 The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MAX_SIZE\n--hono.resourceLimits.prometheusBased.cacheMaxSize no 1000 The maximum size of the cache to store the metrics data retrieved from the Prometheus server. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_TIMEOUT\n--hono.resourceLimits.prometheusBased.cacheTimeout no 600 The number of seconds after which the cached metrics data should be considered invalid. Metrics Configuration See Monitoring \u0026amp; Tracing Admin Guide for details on how to configure the reporting of metrics.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/admin-guide/mqtt-adapter-config/",
"title": "MQTT Adapter Configuration",
"tags": [],
"description": "",
- "content": "The MQTT protocol adapter exposes an MQTT topic hierarchy for publishing messages and events to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry and Event endpoints.\nThe adapter is implemented as a Spring Boot application. It can be run either directly from the command line or by means of starting the corresponding Docker image created from it.\nService Configuration In addition to the following options, this component supports the options described in Common Configuration.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the MQTT adapter.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_APP_MAX_INSTANCES\n--hono.app.maxInstances no #CPU cores The number of verticle instances to deploy. If not set, one verticle per processor core is deployed. HONO_CONNECTION_EVENTS_PRODUCER\n--hono.connectionEvents.producer no logging The implementation of connection events producer which is to be used. This may be logging or events.\nSee Connection Events HONO_MQTT_AUTHENTICATION_REQUIRED\n--hono.mqtt.authenticationRequired no true If set to true the protocol adapter requires devices to authenticate when connecting to the adapter. The credentials provided by the device are verified using the configured Credentials Service. Devices that have failed to authenticate are not allowed to publish any data. HONO_MQTT_BIND_ADDRESS\n--hono.mqtt.bindAddress no 127.0.0.1 The IP address of the network interface that the secure port should be bound to.\nSee Port Configuration below for details. HONO_MQTT_CERT_PATH\n--hono.mqtt.certPath no - The absolute path to the PEM file containing the certificate that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_MQTT_KEY_PATH.\nAlternatively, the HONO_MQTT_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_MQTT_COMMAND_ACK_TIMEOUT\n--hono.mqtt.commandAckTimeout no 100 The amount of time (milliseconds) after which the sending of a command to a device using QoS 1 is considered to be failed. The value of this variable should be increased in cases where devices are connected over a network with high latency. HONO_MQTT_DEFAULTS_ENABLED\n--hono.mqtt.defaultsEnabled no true If set to true the protocol adapter uses default values registered for a device to augment messages published by the device with missing information like a content type. In particular, the protocol adapter adds default values registered for the device as (application) properties with the same name to the AMQP 1.0 messages it sends downstream to the AMQP Messaging Network. HONO_MQTT_INSECURE_PORT_BIND_ADDRESS\n--hono.mqtt.insecurePortBindAddress no 127.0.0.1 The IP address of the network interface that the insecure port should be bound to.\nSee Port Configuration below for details. HONO_MQTT_INSECURE_PORT_ENABLED\n--hono.mqtt.insecurePortEnabled no false If set to true the protocol adapter will open an insecure port (not secured by TLS) using either the port number set via HONO_MQTT_INSECURE_PORT or the default MQTT port number (1883) if not set explicitly.\nSee Port Configuration below for details. HONO_MQTT_KEY_PATH\n--hono.mqtt.keyPath no - The absolute path to the (PKCS8) PEM file containing the private key that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_MQTT_CERT_PATH. Alternatively, the HONO_MQTT_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_MQTT_KEY_STORE_PASSWORD\n--hono.mqtt.keyStorePassword no - The password required to read the contents of the key store. HONO_MQTT_KEY_STORE_PATH\n--hono.mqtt.keyStorePath no - The absolute path to the Java key store containing the private key and certificate that the protocol adapter should use for authenticating to clients. Either this option or the HONO_MQTT_KEY_PATH and HONO_MQTT_CERT_PATH options need to be set in order to enable TLS secured connections with clients. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. HONO_MQTT_MAX_CONNECTIONS\n--hono.mqtt.maxConnections no 0 The maximum number of concurrent connections that the protocol adapter should accept. If not set (or set to 0), the protocol adapter determines a reasonable value based on the available resources like memory and CPU. HONO_MQTT_MAX_PAYLOAD_SIZE\n--hono.mqtt.maxPayloadSize no 2048 The maximum allowed size of an incoming MQTT message\u0026rsquo;s payload in bytes. When a client sends a message with a larger payload, the message is discarded and the connection to the client gets closed. HONO_MQTT_NATIVE_TLS_REQUIRED\n--hono.mqtt.nativeTlsRequired no false The server will probe for OpenSLL on startup if a secure port is configured. By default, the server will fall back to the JVM\u0026rsquo;s default SSL engine if not available. However, if set to true, the server will fail to start at all in this case. HONO_MQTT_PORT\n--hono.mqtt.port no 8883 The secure port that the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_MQTT_SECURE_PROTOCOLS\n--hono.mqtt.secureProtocols no TLSv1.2 A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the vert.x documentation for a list of supported protocol names. The variables only need to be set if the default values do not match your environment.\nPort Configuration The MQTT protocol adapter can be configured to listen for connections on\n a secure port only (default) or an insecure port only or both a secure and an insecure port (dual port configuration) The MQTT protocol adapter will fail to start if none of the ports is configured properly.\nSecure Port Only The protocol adapter needs to be configured with a private key and certificate in order to open a TLS secured port.\nThere are two alternative ways for doing so:\n either setting the HONO_MQTT_KEY_STORE_PATH and the HONO_MQTT_KEY_STORE_PASSWORD variables in order to load the key \u0026amp; certificate from a password protected key store, or setting the HONO_MQTT_KEY_PATH and HONO_MQTT_CERT_PATH variables in order to load the key and certificate from two separate PEM files in PKCS8 format. When starting up, the protocol adapter will bind a TLS secured socket to the default secure MQTT port 8883. The port number can also be set explicitly using the HONO_MQTT_PORT variable.\nThe HONO_MQTT_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. Setting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nInsecure Port Only The secure port will mostly be required for production scenarios. However, it might be desirable to expose a non-TLS secured port instead, e.g. for testing purposes. In any case, the non-secure port needs to be explicitly enabled either by\n explicitly setting HONO_MQTT_INSECURE_PORT to a valid port number, or by implicitly configuring the default MQTT port (1883) by simply setting HONO_MQTT_INSECURE_PORT_ENABLED to true. The protocol adapter issues a warning on the console if HONO_MQTT_INSECURE_PORT is set to the default secure MQTT port (8883).\nThe HONO_MQTT_INSECURE_PORT_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. This variable might be used to e.g. expose the non-TLS secured port on a local interface only, thus providing easy access from within the local network, while still requiring encrypted communication when accessed from the outside over public network infrastructure.\nSetting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nDual Port The protocol adapter may be configured to open both a secure and a non-secure port at the same time simply by configuring both ports as described above. For this to work, both ports must be configured to use different port numbers, otherwise startup will fail.\nEphemeral Ports Both the secure as well as the insecure port numbers may be explicitly set to 0. The protocol adapter will then use arbitrary (unused) port numbers determined by the operating system during startup.\nAMQP 1.0 Messaging Network Connection Configuration The adapter requires a connection to the AMQP 1.0 Messaging Network in order to forward telemetry data and events received from devices to downstream consumers.\nThe connection to the messaging network is configured according to Hono Client Configuration with HONO_MESSAGING being used as ${PREFIX}. Since there are no responses being received, the properties for configuring response caching can be ignored.\nTenant Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Tenant API in order to retrieve information for a tenant.\nThe connection to the Tenant Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_TENANT and the additional values for response caching apply.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Registration Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Registration API in order to retrieve registration status assertions for connected devices.\nThe connection to the Device Registration Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_REGISTRATION.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nCredentials Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Credentials API in order to retrieve credentials stored for devices that needs to be authenticated. During connection establishment, the adapter uses the Credentials API to retrieve the credentials on record for the device and matches that with the credentials provided by a device.\nThe connection to the Credentials Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_CREDENTIALS.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Connection Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Connection API in order to determine the gateway that a device is connected via to a protocol adapter. This information is required in order to forward commands issued by applications to the protocol adapter instance that the gateway is connected to.\nThe connection to the Device Connection service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_DEVICE_CONNECTION.\nResponses from the Device Connection service are never cached, so the properties for configuring the cache are ignored.\nResource Limits Checker Configuration The adapter can use metrics collected by a Prometheus server to enforce certain limits set at the tenant level like the overall number of connected devices allowed per tenant.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the checker.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_PLAN_PROMETHEUS_BASED_HOST\n--hono.plan.prometheusBased.host no none The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks. HONO_PLAN_PROMETHEUS_BASED_PORT\n--hono.plan.prometheusBased.port no 9090 The port of the Prometheus server to retrieve metrics data from. HONO_PLAN_PROMETHEUS_BASED_CACHE_MIN_SIZE\n--hono.plan.prometheusBased.cacheMinSize no 20 The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants. HONO_PLAN_PROMETHEUS_BASED_CACHE_MAX_SIZE\n--hono.plan.prometheusBased.cacheMaxSize no 1000 The maximum size of the cache to store the metrics data retrieved from the Prometheus server. HONO_PLAN_PROMETHEUS_BASED_CACHE_TIMEOUT\n--hono.plan.prometheusBased.cacheTimeout no 600 The number of seconds after which the cached metrics data should be considered invalid. Metrics Configuration See Monitoring \u0026amp; Tracing Admin Guide for details on how to configure the reporting of metrics.\n"
+ "content": "The MQTT protocol adapter exposes an MQTT topic hierarchy for publishing messages and events to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry and Event endpoints.\nThe adapter is implemented as a Spring Boot application. It can be run either directly from the command line or by means of starting the corresponding Docker image created from it.\nService Configuration In addition to the following options, this component supports the options described in Common Configuration.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the MQTT adapter.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_APP_MAX_INSTANCES\n--hono.app.maxInstances no #CPU cores The number of verticle instances to deploy. If not set, one verticle per processor core is deployed. HONO_CONNECTION_EVENTS_PRODUCER\n--hono.connectionEvents.producer no logging The implementation of connection events producer which is to be used. This may be logging or events.\nSee Connection Events HONO_MQTT_AUTHENTICATION_REQUIRED\n--hono.mqtt.authenticationRequired no true If set to true the protocol adapter requires devices to authenticate when connecting to the adapter. The credentials provided by the device are verified using the configured Credentials Service. Devices that have failed to authenticate are not allowed to publish any data. HONO_MQTT_BIND_ADDRESS\n--hono.mqtt.bindAddress no 127.0.0.1 The IP address of the network interface that the secure port should be bound to.\nSee Port Configuration below for details. HONO_MQTT_CERT_PATH\n--hono.mqtt.certPath no - The absolute path to the PEM file containing the certificate that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_MQTT_KEY_PATH.\nAlternatively, the HONO_MQTT_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_MQTT_COMMAND_ACK_TIMEOUT\n--hono.mqtt.commandAckTimeout no 100 The amount of time (milliseconds) after which the sending of a command to a device using QoS 1 is considered to be failed. The value of this variable should be increased in cases where devices are connected over a network with high latency. HONO_MQTT_DEFAULTS_ENABLED\n--hono.mqtt.defaultsEnabled no true If set to true the protocol adapter uses default values registered for a device to augment messages published by the device with missing information like a content type. In particular, the protocol adapter adds default values registered for the device as (application) properties with the same name to the AMQP 1.0 messages it sends downstream to the AMQP Messaging Network. HONO_MQTT_INSECURE_PORT_BIND_ADDRESS\n--hono.mqtt.insecurePortBindAddress no 127.0.0.1 The IP address of the network interface that the insecure port should be bound to.\nSee Port Configuration below for details. HONO_MQTT_INSECURE_PORT_ENABLED\n--hono.mqtt.insecurePortEnabled no false If set to true the protocol adapter will open an insecure port (not secured by TLS) using either the port number set via HONO_MQTT_INSECURE_PORT or the default MQTT port number (1883) if not set explicitly.\nSee Port Configuration below for details. HONO_MQTT_KEY_PATH\n--hono.mqtt.keyPath no - The absolute path to the (PKCS8) PEM file containing the private key that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_MQTT_CERT_PATH. Alternatively, the HONO_MQTT_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_MQTT_KEY_STORE_PASSWORD\n--hono.mqtt.keyStorePassword no - The password required to read the contents of the key store. HONO_MQTT_KEY_STORE_PATH\n--hono.mqtt.keyStorePath no - The absolute path to the Java key store containing the private key and certificate that the protocol adapter should use for authenticating to clients. Either this option or the HONO_MQTT_KEY_PATH and HONO_MQTT_CERT_PATH options need to be set in order to enable TLS secured connections with clients. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. HONO_MQTT_MAX_CONNECTIONS\n--hono.mqtt.maxConnections no 0 The maximum number of concurrent connections that the protocol adapter should accept. If not set (or set to 0), the protocol adapter determines a reasonable value based on the available resources like memory and CPU. HONO_MQTT_MAX_PAYLOAD_SIZE\n--hono.mqtt.maxPayloadSize no 2048 The maximum allowed size of an incoming MQTT message\u0026rsquo;s payload in bytes. When a client sends a message with a larger payload, the message is discarded and the connection to the client gets closed. HONO_MQTT_NATIVE_TLS_REQUIRED\n--hono.mqtt.nativeTlsRequired no false The server will probe for OpenSLL on startup if a secure port is configured. By default, the server will fall back to the JVM\u0026rsquo;s default SSL engine if not available. However, if set to true, the server will fail to start at all in this case. HONO_MQTT_PORT\n--hono.mqtt.port no 8883 The secure port that the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_MQTT_SECURE_PROTOCOLS\n--hono.mqtt.secureProtocols no TLSv1.2 A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the vert.x documentation for a list of supported protocol names. HONO_MQTT_TENANT_IDLE_TIMEOUT\n--hono.mqtt.tenantIdleTimeout no 0ms The duration after which the protocol adapter removes local state of the tenant (e.g. open AMQP links) with an amount and a unit, e.g. 2h for 2 hours. See the Spring Boot documentation for an explanation of the format. The value 0ms disables the timeout. The variables only need to be set if the default values do not match your environment.\nPort Configuration The MQTT protocol adapter can be configured to listen for connections on\n a secure port only (default) or an insecure port only or both a secure and an insecure port (dual port configuration) The MQTT protocol adapter will fail to start if none of the ports is configured properly.\nSecure Port Only The protocol adapter needs to be configured with a private key and certificate in order to open a TLS secured port.\nThere are two alternative ways for doing so:\n either setting the HONO_MQTT_KEY_STORE_PATH and the HONO_MQTT_KEY_STORE_PASSWORD variables in order to load the key \u0026amp; certificate from a password protected key store, or setting the HONO_MQTT_KEY_PATH and HONO_MQTT_CERT_PATH variables in order to load the key and certificate from two separate PEM files in PKCS8 format. When starting up, the protocol adapter will bind a TLS secured socket to the default secure MQTT port 8883. The port number can also be set explicitly using the HONO_MQTT_PORT variable.\nThe HONO_MQTT_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. Setting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nInsecure Port Only The secure port will mostly be required for production scenarios. However, it might be desirable to expose a non-TLS secured port instead, e.g. for testing purposes. In any case, the non-secure port needs to be explicitly enabled either by\n explicitly setting HONO_MQTT_INSECURE_PORT to a valid port number, or by implicitly configuring the default MQTT port (1883) by simply setting HONO_MQTT_INSECURE_PORT_ENABLED to true. The protocol adapter issues a warning on the console if HONO_MQTT_INSECURE_PORT is set to the default secure MQTT port (8883).\nThe HONO_MQTT_INSECURE_PORT_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. This variable might be used to e.g. expose the non-TLS secured port on a local interface only, thus providing easy access from within the local network, while still requiring encrypted communication when accessed from the outside over public network infrastructure.\nSetting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nDual Port The protocol adapter may be configured to open both a secure and a non-secure port at the same time simply by configuring both ports as described above. For this to work, both ports must be configured to use different port numbers, otherwise startup will fail.\nEphemeral Ports Both the secure as well as the insecure port numbers may be explicitly set to 0. The protocol adapter will then use arbitrary (unused) port numbers determined by the operating system during startup.\nAMQP 1.0 Messaging Network Connection Configuration The adapter requires a connection to the AMQP 1.0 Messaging Network in order to forward telemetry data and events received from devices to downstream consumers.\nThe connection to the messaging network is configured according to Hono Client Configuration with HONO_MESSAGING being used as ${PREFIX}. Since there are no responses being received, the properties for configuring response caching can be ignored.\nTenant Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Tenant API in order to retrieve information for a tenant.\nThe connection to the Tenant Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_TENANT and the additional values for response caching apply.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Registration Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Registration API in order to retrieve registration status assertions for connected devices.\nThe connection to the Device Registration Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_REGISTRATION.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nCredentials Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Credentials API in order to retrieve credentials stored for devices that needs to be authenticated. During connection establishment, the adapter uses the Credentials API to retrieve the credentials on record for the device and matches that with the credentials provided by a device.\nThe connection to the Credentials Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_CREDENTIALS.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Connection Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Connection API in order to determine the gateway that a device is connected via to a protocol adapter. This information is required in order to forward commands issued by applications to the protocol adapter instance that the gateway is connected to.\nThe connection to the Device Connection service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_DEVICE_CONNECTION.\nResponses from the Device Connection service are never cached, so the properties for configuring the cache are ignored.\nResource Limits Checker Configuration The adapter can use metrics collected by a Prometheus server to enforce certain limits set at the tenant level like the overall number of connected devices allowed per tenant.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the checker.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_HOST\n--hono.resourceLimits.prometheusBased.host no none The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_PORT\n--hono.resourceLimits.prometheusBased.port no 9090 The port of the Prometheus server to retrieve metrics data from. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MIN_SIZE\n--hono.resourceLimits.prometheusBased.cacheMinSize no 20 The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MAX_SIZE\n--hono.resourceLimits.prometheusBased.cacheMaxSize no 1000 The maximum size of the cache to store the metrics data retrieved from the Prometheus server. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_TIMEOUT\n--hono.resourceLimits.prometheusBased.cacheTimeout no 600 The number of seconds after which the cached metrics data should be considered invalid. Metrics Configuration See Monitoring \u0026amp; Tracing Admin Guide for details on how to configure the reporting of metrics.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/admin-guide/kura-adapter-config/",
"title": "Kura Adapter Configuration",
"tags": [],
"description": "",
- "content": "The Kura protocol adapter exposes an MQTT topic hierarchy allowing Eclipse Kura\u0026trade; based gateways to publish control and data messages to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry and Event endpoints.\nThe adapter is implemented as a Spring Boot application. It can be run either directly from the command line or by means of starting the corresponding Docker image created from it.\nService Configuration In addition to the following options, this component supports the options described in Common Configuration.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the MQTT adapter.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_APP_MAX_INSTANCES\n--hono.app.maxInstances no #CPU cores The number of verticle instances to deploy. If not set, one verticle per processor core is deployed. HONO_KURA_AUTHENTICATION_REQUIRED\n--hono.kura.authenticationRequired no true If set to true the protocol adapter requires devices to authenticate when connecting to the adapter. The credentials provided by the device are verified using the configured Credentials Service. Devices that have failed to authenticate are not allowed to publish any data. HONO_KURA_BIND_ADDRESS\n--hono.kura.bindAddress no 127.0.0.1 The IP address of the network interface that the secure port should be bound to.\nSee Port Configuration below for details. HONO_KURA_CERT_PATH\n--hono.kura.certPath no - The absolute path to the PEM file containing the certificate that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_KURA_KEY_PATH.\nAlternatively, the HONO_KURA_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_KURA_CONTROL_PREFIX\n--hono.kura.controlPrefix no $EDC The topic.control-prefix to use for determining if a message published by a Kura gateway is a control message. All messages published to a topic that does not start with this prefix are considered data messages. HONO_KURA_CTRL_MSG_CONTENT_TYPE\n--hono.kura.ctrlMsgContentType no application/vnd.eclipse.kura-control The content type to set on AMQP messages created from Kura control messages. HONO_KURA_DATA_MSG_CONTENT_TYPE\n--hono.kura.dataMsgContentType no application/vnd.eclipse.kura-data The content type to set on AMQP messages created from Kura data messages. HONO_KURA_DEFAULTS_ENABLED\n--hono.kura.defaultsEnabled no true If set to true the protocol adapter uses default values registered for a device to augment messages published by the device with missing information like a content type. In particular, the protocol adapter adds default values registered for the device as (application) properties with the same name to the AMQP 1.0 messages it sends downstream to the AMQP Messaging Network. HONO_KURA_INSECURE_PORT\n--hono.kura.insecurePort no - The insecure port the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_KURA_INSECURE_PORT_BIND_ADDRESS\n--hono.kura.insecurePortBindAddress no 127.0.0.1 The IP address of the network interface that the insecure port should be bound to.\nSee Port Configuration below for details. HONO_KURA_INSECURE_PORT_ENABLED\n--hono.kura.insecurePortEnabled no false If set to true the protocol adapter will open an insecure port (not secured by TLS) using either the port number set via HONO_KURA_INSECURE_PORT or the default MQTT port number (1883) if not set explicitly.\nSee Port Configuration below for details. HONO_KURA_KEY_PATH\n--hono.kura.keyPath no - The absolute path to the (PKCS8) PEM file containing the private key that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_KURA_CERT_PATH. Alternatively, the HONO_KURA_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_KURA_KEY_STORE_PASSWORD\n--hono.kura.keyStorePassword no - The password required to read the contents of the key store. HONO_KURA_KEY_STORE_PATH\n--hono.kura.keyStorePath no - The absolute path to the Java key store containing the private key and certificate that the protocol adapter should use for authenticating to clients. Either this option or the HONO_KURA_KEY_PATH and HONO_KURA_CERT_PATH options need to be set in order to enable TLS secured connections with clients. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. HONO_KURA_MAX_PAYLOAD_SIZE\n--hono.kura.maxPayloadSize no 2048 The maximum allowed size of an incoming MQTT message\u0026rsquo;s payload in bytes. When a client sends a message with a larger payload, the message is discarded and the connection to the client gets closed. HONO_KURA_NATIVE_TLS_REQUIRED\n--hono.kura.nativeTlsRequired no false The server will probe for OpenSLL on startup if a secure port is configured. By default, the server will fall back to the JVM\u0026rsquo;s default SSL engine if not available. However, if set to true, the server will fail to start at all in this case. HONO_KURA_PORT\n--hono.kura.port no 8883 The secure port that the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_KURA_SECURE_PROTOCOLS\n--hono.kura.secureProtocols no TLSv1.2 A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the vert.x documentation for a list of supported protocol names. The variables only need to be set if the default values do not match your environment.\nPort Configuration The Kura protocol adapter can be configured to listen for connections on\n a secure port only (default) or an insecure port only or both a secure and an insecure port (dual port configuration) The Kura protocol adapter will fail to start if none of the ports is configured properly.\nSecure Port Only The protocol adapter needs to be configured with a private key and certificate in order to open a TLS secured port.\nThere are two alternative ways for doing so:\n either setting the HONO_KURA_KEY_STORE_PATH and the HONO_KURA_KEY_STORE_PASSWORD variables in order to load the key \u0026amp; certificate from a password protected key store, or setting the HONO_KURA_KEY_PATH and HONO_KURA_CERT_PATH variables in order to load the key and certificate from two separate PEM files in PKCS8 format. When starting up, the protocol adapter will bind a TLS secured socket to the default secure MQTT port 8883. The port number can also be set explicitly using the HONO_KURA_PORT variable.\nThe HONO_KURA_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. Setting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nInsecure Port Only The secure port will mostly be required for production scenarios. However, it might be desirable to expose a non-TLS secured port instead, e.g. for testing purposes. In any case, the non-secure port needs to be explicitly enabled either by\n explicitly setting HONO_KURA_INSECURE_PORT to a valid port number, or by implicitly configuring the default MQTT port (1883) by simply setting HONO_KURA_INSECURE_PORT_ENABLED to true. The protocol adapter issues a warning on the console if HONO_KURA_INSECURE_PORT is set to the default secure MQTT port (8883).\nThe HONO_KURA_INSECURE_PORT_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. This variable might be used to e.g. expose the non-TLS secured port on a local interface only, thus providing easy access from within the local network, while still requiring encrypted communication when accessed from the outside over public network infrastructure.\nSetting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nDual Port The protocol adapter may be configured to open both a secure and a non-secure port at the same time simply by configuring both ports as described above. For this to work, both ports must be configured to use different port numbers, otherwise startup will fail.\nEphemeral Ports Both the secure as well as the insecure port numbers may be explicitly set to 0. The protocol adapter will then use arbitrary (unused) port numbers determined by the operating system during startup.\nAMQP 1.0 Messaging Network Connection Configuration The adapter requires a connection to the AMQP 1.0 Messaging Network in order to forward telemetry data and events received from devices to downstream consumers.\nThe connection to the messaging network is configured according to Hono Client Configuration with HONO_MESSAGING being used as ${PREFIX}. Since there are no responses being received, the properties for configuring response caching can be ignored.\nTenant Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Tenant API in order to retrieve information for a tenant.\nThe connection to the Tenant Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_TENANT and the additional values for response caching apply.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Registration Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Registration API in order to retrieve registration status assertions for connected devices.\nThe connection to the Device Registration Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_REGISTRATION.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nCredentials Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Credentials API in order to retrieve credentials stored for devices that needs to be authenticated. During connection establishment, the adapter uses the Credentials API to retrieve the credentials on record for the device and matches that with the credentials provided by a device.\nThe connection to the Credentials Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_CREDENTIALS.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Connection Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Connection API in order to determine the gateway that a device is connected via to a protocol adapter. This information is required in order to forward commands issued by applications to the protocol adapter instance that the gateway is connected to.\nThe connection to the Device Connection service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_DEVICE_CONNECTION.\nResponses from the Device Connection service are never cached, so the properties for configuring the cache are ignored.\nResource Limits Checker Configuration The adapter can use metrics collected by a Prometheus server to enforce certain limits set at the tenant level like the overall number of connected devices allowed per tenant.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the checker.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_PLAN_PROMETHEUS_BASED_HOST\n--hono.plan.prometheusBased.host no none The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks. HONO_PLAN_PROMETHEUS_BASED_PORT\n--hono.plan.prometheusBased.port no 9090 The port of the Prometheus server to retrieve metrics data from. HONO_PLAN_PROMETHEUS_BASED_CACHE_MIN_SIZE\n--hono.plan.prometheusBased.cacheMinSize no 20 The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants. HONO_PLAN_PROMETHEUS_BASED_CACHE_MAX_SIZE\n--hono.plan.prometheusBased.cacheMaxSize no 1000 The maximum size of the cache to store the metrics data retrieved from the Prometheus server. HONO_PLAN_PROMETHEUS_BASED_CACHE_TIMEOUT\n--hono.plan.prometheusBased.cacheTimeout no 600 The number of seconds after which the cached metrics data should be considered invalid. Metrics Configuration See Monitoring \u0026amp; Tracing Admin Guide for details on how to configure the reporting of metrics.\n"
+ "content": "The Kura protocol adapter exposes an MQTT topic hierarchy allowing Eclipse Kura\u0026trade; based gateways to publish control and data messages to Eclipse Hono\u0026trade;\u0026rsquo;s Telemetry and Event endpoints.\nThe adapter is implemented as a Spring Boot application. It can be run either directly from the command line or by means of starting the corresponding Docker image created from it.\nService Configuration In addition to the following options, this component supports the options described in Common Configuration.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the MQTT adapter.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_APP_MAX_INSTANCES\n--hono.app.maxInstances no #CPU cores The number of verticle instances to deploy. If not set, one verticle per processor core is deployed. HONO_KURA_AUTHENTICATION_REQUIRED\n--hono.kura.authenticationRequired no true If set to true the protocol adapter requires devices to authenticate when connecting to the adapter. The credentials provided by the device are verified using the configured Credentials Service. Devices that have failed to authenticate are not allowed to publish any data. HONO_KURA_BIND_ADDRESS\n--hono.kura.bindAddress no 127.0.0.1 The IP address of the network interface that the secure port should be bound to.\nSee Port Configuration below for details. HONO_KURA_CERT_PATH\n--hono.kura.certPath no - The absolute path to the PEM file containing the certificate that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_KURA_KEY_PATH.\nAlternatively, the HONO_KURA_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_KURA_CONTROL_PREFIX\n--hono.kura.controlPrefix no $EDC The topic.control-prefix to use for determining if a message published by a Kura gateway is a control message. All messages published to a topic that does not start with this prefix are considered data messages. HONO_KURA_CTRL_MSG_CONTENT_TYPE\n--hono.kura.ctrlMsgContentType no application/vnd.eclipse.kura-control The content type to set on AMQP messages created from Kura control messages. HONO_KURA_DATA_MSG_CONTENT_TYPE\n--hono.kura.dataMsgContentType no application/vnd.eclipse.kura-data The content type to set on AMQP messages created from Kura data messages. HONO_KURA_DEFAULTS_ENABLED\n--hono.kura.defaultsEnabled no true If set to true the protocol adapter uses default values registered for a device to augment messages published by the device with missing information like a content type. In particular, the protocol adapter adds default values registered for the device as (application) properties with the same name to the AMQP 1.0 messages it sends downstream to the AMQP Messaging Network. HONO_KURA_INSECURE_PORT\n--hono.kura.insecurePort no - The insecure port the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_KURA_INSECURE_PORT_BIND_ADDRESS\n--hono.kura.insecurePortBindAddress no 127.0.0.1 The IP address of the network interface that the insecure port should be bound to.\nSee Port Configuration below for details. HONO_KURA_INSECURE_PORT_ENABLED\n--hono.kura.insecurePortEnabled no false If set to true the protocol adapter will open an insecure port (not secured by TLS) using either the port number set via HONO_KURA_INSECURE_PORT or the default MQTT port number (1883) if not set explicitly.\nSee Port Configuration below for details. HONO_KURA_KEY_PATH\n--hono.kura.keyPath no - The absolute path to the (PKCS8) PEM file containing the private key that the protocol adapter should use for authenticating to clients. This option must be used in conjunction with HONO_KURA_CERT_PATH. Alternatively, the HONO_KURA_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_KURA_KEY_STORE_PASSWORD\n--hono.kura.keyStorePassword no - The password required to read the contents of the key store. HONO_KURA_KEY_STORE_PATH\n--hono.kura.keyStorePath no - The absolute path to the Java key store containing the private key and certificate that the protocol adapter should use for authenticating to clients. Either this option or the HONO_KURA_KEY_PATH and HONO_KURA_CERT_PATH options need to be set in order to enable TLS secured connections with clients. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. HONO_KURA_MAX_PAYLOAD_SIZE\n--hono.kura.maxPayloadSize no 2048 The maximum allowed size of an incoming MQTT message\u0026rsquo;s payload in bytes. When a client sends a message with a larger payload, the message is discarded and the connection to the client gets closed. HONO_KURA_NATIVE_TLS_REQUIRED\n--hono.kura.nativeTlsRequired no false The server will probe for OpenSLL on startup if a secure port is configured. By default, the server will fall back to the JVM\u0026rsquo;s default SSL engine if not available. However, if set to true, the server will fail to start at all in this case. HONO_KURA_PORT\n--hono.kura.port no 8883 The secure port that the protocol adapter should listen on.\nSee Port Configuration below for details. HONO_KURA_SECURE_PROTOCOLS\n--hono.kura.secureProtocols no TLSv1.2 A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the vert.x documentation for a list of supported protocol names. HONO_KURA_TENANT_IDLE_TIMEOUT\n--hono.kura.tenantIdleTimeout no 0ms The duration after which the protocol adapter removes local state of the tenant (e.g. open AMQP links) with an amount and a unit, e.g. 2h for 2 hours. See the Spring Boot documentation for an explanation of the format. The value 0ms disables the timeout. The variables only need to be set if the default values do not match your environment.\nPort Configuration The Kura protocol adapter can be configured to listen for connections on\n a secure port only (default) or an insecure port only or both a secure and an insecure port (dual port configuration) The Kura protocol adapter will fail to start if none of the ports is configured properly.\nSecure Port Only The protocol adapter needs to be configured with a private key and certificate in order to open a TLS secured port.\nThere are two alternative ways for doing so:\n either setting the HONO_KURA_KEY_STORE_PATH and the HONO_KURA_KEY_STORE_PASSWORD variables in order to load the key \u0026amp; certificate from a password protected key store, or setting the HONO_KURA_KEY_PATH and HONO_KURA_CERT_PATH variables in order to load the key and certificate from two separate PEM files in PKCS8 format. When starting up, the protocol adapter will bind a TLS secured socket to the default secure MQTT port 8883. The port number can also be set explicitly using the HONO_KURA_PORT variable.\nThe HONO_KURA_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. Setting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nInsecure Port Only The secure port will mostly be required for production scenarios. However, it might be desirable to expose a non-TLS secured port instead, e.g. for testing purposes. In any case, the non-secure port needs to be explicitly enabled either by\n explicitly setting HONO_KURA_INSECURE_PORT to a valid port number, or by implicitly configuring the default MQTT port (1883) by simply setting HONO_KURA_INSECURE_PORT_ENABLED to true. The protocol adapter issues a warning on the console if HONO_KURA_INSECURE_PORT is set to the default secure MQTT port (8883).\nThe HONO_KURA_INSECURE_PORT_BIND_ADDRESS variable can be used to specify the network interface that the port should be exposed on. By default the port is bound to the loopback device only, i.e. the port will only be accessible from the local host. This variable might be used to e.g. expose the non-TLS secured port on a local interface only, thus providing easy access from within the local network, while still requiring encrypted communication when accessed from the outside over public network infrastructure.\nSetting this variable to 0.0.0.0 will let the port being bound to all network interfaces (be careful not to expose the port unintentionally to the outside world).\nDual Port The protocol adapter may be configured to open both a secure and a non-secure port at the same time simply by configuring both ports as described above. For this to work, both ports must be configured to use different port numbers, otherwise startup will fail.\nEphemeral Ports Both the secure as well as the insecure port numbers may be explicitly set to 0. The protocol adapter will then use arbitrary (unused) port numbers determined by the operating system during startup.\nAMQP 1.0 Messaging Network Connection Configuration The adapter requires a connection to the AMQP 1.0 Messaging Network in order to forward telemetry data and events received from devices to downstream consumers.\nThe connection to the messaging network is configured according to Hono Client Configuration with HONO_MESSAGING being used as ${PREFIX}. Since there are no responses being received, the properties for configuring response caching can be ignored.\nTenant Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Tenant API in order to retrieve information for a tenant.\nThe connection to the Tenant Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_TENANT and the additional values for response caching apply.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Registration Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Registration API in order to retrieve registration status assertions for connected devices.\nThe connection to the Device Registration Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_REGISTRATION.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nCredentials Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Credentials API in order to retrieve credentials stored for devices that needs to be authenticated. During connection establishment, the adapter uses the Credentials API to retrieve the credentials on record for the device and matches that with the credentials provided by a device.\nThe connection to the Credentials Service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_CREDENTIALS.\nThe adapter caches the responses from the service according to the cache directive included in the response. If the response doesn\u0026rsquo;t contain a cache directive no data will be cached.\nDevice Connection Service Connection Configuration The adapter requires a connection to an implementation of Hono\u0026rsquo;s Device Connection API in order to determine the gateway that a device is connected via to a protocol adapter. This information is required in order to forward commands issued by applications to the protocol adapter instance that the gateway is connected to.\nThe connection to the Device Connection service is configured according to Hono Client Configuration where the ${PREFIX} is set to HONO_DEVICE_CONNECTION.\nResponses from the Device Connection service are never cached, so the properties for configuring the cache are ignored.\nResource Limits Checker Configuration The adapter can use metrics collected by a Prometheus server to enforce certain limits set at the tenant level like the overall number of connected devices allowed per tenant.\nThe following table provides an overview of the configuration variables and corresponding command line options for configuring the checker.\n Environment Variable\nCommand Line Option Mandatory Default Value Description HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_HOST\n--hono.resourceLimits.prometheusBased.host no none The host name or IP address of the Prometheus server to retrieve the metrics data from. This property needs to be set in order to enable the Prometheus based checks. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_PORT\n--hono.resourceLimits.prometheusBased.port no 9090 The port of the Prometheus server to retrieve metrics data from. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MIN_SIZE\n--hono.resourceLimits.prometheusBased.cacheMinSize no 20 The minimum size of the cache to store the metrics data retrieved from the Prometheus server. The cache is used for storing the current amount of data exchanged with devices of tenants. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_MAX_SIZE\n--hono.resourceLimits.prometheusBased.cacheMaxSize no 1000 The maximum size of the cache to store the metrics data retrieved from the Prometheus server. HONO_RESOURCE_LIMITS_PROMETHEUS_BASED_CACHE_TIMEOUT\n--hono.resourceLimits.prometheusBased.cacheTimeout no 600 The number of seconds after which the cached metrics data should be considered invalid. Metrics Configuration See Monitoring \u0026amp; Tracing Admin Guide for details on how to configure the reporting of metrics.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/admin-guide/hono-client-configuration/",
"title": "Hono Client Configuration",
"tags": [],
"description": "",
- "content": "The org.eclipse.hono.client.HonoClient factory can be used to create specific clients for accessing services implementing one or more of Hono\u0026rsquo;s APIs.\nThe factory uses environment variables and/or command line options to configure the connection to the service and the caching of responses to service invocations. All variables used for configuring a particular Hono Client factory instance share a common prefix. This way, multiple sets of variables can be used to configure multiple factories for connecting to different service endpoints without interfering with each other. For example, the set of variables for configuring the client factory for the Device Registration service may use the common prefix HONO_REGISTRATION whereas the set for configuring the factory for the Credentials service may use HONO_CREDENTIALS.\nConnection Properties The following table provides an overview of the configuration variables and corresponding command line options for configuring the AMQP connection to the service. Note that the variables map to the properties of class org.eclipse.hono.config.ClientConfigProperties which can be used to programmatically configure a client.\nThe variable names contain ${PREFIX} as a placeholder for the particular common prefix being used. The ${prefix} placeholder used in the command line option name is the same as ${PREFIX}, using all lower case characters and . instead of _ as the delimiter, e.g. the variable prefix HONO_CREDENTIALS corresponds to the command line option prefix hono.credentials).\n Environment Variable\nCommand Line Option Mandatory Default Value Description ${PREFIX}_AMQP_HOSTNAME\n--${prefix}.amqpHostname no - The name to use as the hostname in the client\u0026rsquo;s AMQP open frame during connection establishment. This variable can be used to indicate the virtual host to connect to on the server. ${PREFIX}_CERT_PATH\n--${prefix}.certPath no - The absolute path to the PEM file containing the certificate that the client should use for authenticating to the server. This variable must be used in conjunction with ${PREFIX}_KEY_PATH.\nAlternatively, the ${PREFIX}_KEY_STORE_PATH variable can be used to configure a key store containing both the key as well as the certificate. ${PREFIX}_CONNECT_TIMEOUT\n--${prefix}.connectTimeout no 5000 The maximum amount of time (milliseconds) that the client should wait for the AMQP connection to be opened. This includes the time for TCP/TLS connection establishment, SASL handshake and exchange of the AMQP open frame. This property can be used to tune the time period to wait according to the network latency involved with the connection between the client and the service. ${PREFIX}_CREDENTIALS_PATH\n--${prefix}.credentialsPath no - The absolute path to a properties file that contains a username and a password property to use for authenticating to the service.\nThis variable is an alternative to using ${PREFIX}_USERNAME and ${PREFIX}_PASSWORD which has the advantage of not needing to expose the secret (password) in the client process\u0026rsquo; environment. ${PREFIX}_FLOW_LATENCY\n--${prefix}.flowLatency no 20 The maximum amount of time (milliseconds) that the client should wait for credits after a link to the service has been established. ${PREFIX}_HOST\n--${prefix}.host no localhost The IP address or name of the host to connect to. NB: This needs to be set to an address that can be resolved within the network the adapter runs on. When running as a Docker container, use Docker\u0026rsquo;s --network command line option to attach the local container to the Docker network that the service is running on. ${PREFIX}_HOSTNAME_VERIFICATION_REQUIRED\n--${prefix}.hostnameVerificationRequired no true A flag indicating whether the value of the ${PREFIX}_HOST variable must match the distinguished name or any of the alternative names asserted by the server\u0026rsquo;s certificate when connecting using TLS. ${PREFIX}_IDLE_TIMEOUT\n--${prefix}.idleTimeout no 16000 Sets the amount of time in milliseconds after which a connection will be closed when no frames have been received from the remote peer. This property is also used to configure a heartbeat mechanism, checking that the connection is still alive. The corresponding heartbeat interval will be set to idleTimeout/2 ms. ${PREFIX}_INACTIVE_LINK_TIMEOUT\n--${prefix}.inactiveLinkTimeout no 0ms Sets duration after which an AMQP sender link will be closed when no message has been sent on it with an amount and an unit, e.g. 2h for 2 hours. See the Spring Boot documentation for an explanation of the format. Links will not be closed automatically if the value is 0ms. ${PREFIX}_INITIAL_CREDITS\n--${prefix}.initialCredits no 200 The number of credits that a consuming client will initially issue to the service (sender) after link creation. This value effectively limits the number of messages that can be in flight unsettled. ${PREFIX}_KEY_PATH\n--${prefix}.keyPath no - The absolute path to the (PKCS8) PEM file containing the private key that the client should use for authenticating to the server. Note that the private key is not protected by a password. You should therefore make sure that the key file can only be read by the user that the client process is running under. This variable must be used in conjunction with ${PREFIX}_CERT_PATH. Alternatively, the ${PREFIX}_KEY_STORE_PATH variable can be used to configure a key store containing both the key as well as the certificate. ${PREFIX}_KEY_STORE_PASSWORD\n--${prefix}.keyStorePassword no - The password required to read the contents of the key store. ${PREFIX}_KEY_STORE_PATH\n--${prefix}.keyStorePath no - The absolute path to the Java key store containing the private key and certificate that the client should use for authenticating to the server. Either this variable or the ${PREFIX}_KEY_PATH and ${PREFIX}_CERT_PATH variables need to be set in order to enable SASL External based authentication to the server. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. ${PREFIX}_LINK_ESTABLISMENT_TIMEOUT\n--${prefix}.linkEstablishmentTimeout no 1000 The maximum amount of time (milliseconds) that the client should wait for the service\u0026rsquo;s attach frame during link establishment. This property can be used to tune the time period to wait according to the network latency involved with the communication link between the client and the service. ${PREFIX}_NAME\n--${prefix}.name no - The name to use as the container-id in the client\u0026rsquo;s AMQP open frame during connection establishment. ${PREFIX}_PORT\n--${prefix}.port no 5671 The port that the service is listening on. ${PREFIX}_USERNAME\n--${prefix}.username no - The username to use for authenticating to the service. This property (and the corresponding password) needs to be set in order to enable SASL Plain based authentication to the service. ${PREFIX}_PASSWORD\n--${prefix}.password no - The password to use for authenticating to the service. ${PREFIX}_SEND_MESSAGE_TIMEOUT\n--${prefix}.sendMessageTimeout no 1000 The maximum number of milliseconds to wait for a delivery update after an event or command message was sent before the send operation is failed. Setting this value to a higher value increases the chance of successful service invocation in situations where network latency is high. ${PREFIX}_RECONNECT_ATTEMPTS\n--${prefix}.reconnectAttempts no -1 The number of attempts (in addition to the original connection attempt) that the client should make in order to establish an AMQP connection with the peer before giving up. The default value of this property is -1 which means that the client will try forever. ${PREFIX}_RECONNECT_DELAY_INCREMENT\n--${prefix}.reconnectDelayIncrement no 100 The factor (milliseconds) used in the exponential backoff algorithm for determining the delay before trying to re-establish an AMQP connection with the peer. The delay after an initial, failed connection attempt will be the value of the ${PREFIX}_RECONNECT_MIN_DELAY variable. Each subsequent connection attempt will use a random delay between the minimum delay and the value determined by exponentially increasing the delay by the ${PREFIX}_RECONNECT_DELAY_INCREMENT factor. The overall limit of the delay time is defined by the ${PREFIX}_RECONNECT_MAX_DELAY variable. ${PREFIX}_RECONNECT_MAX_DELAY\n--${prefix}.reconnectMaxDelay no 7000 The maximum number of milliseconds to wait before trying to re-establish an AMQP connection with the peer. ${PREFIX}_RECONNECT_MIN_DELAY\n--${prefix}.reconnectMinDelay no 0 The minimum number of milliseconds to wait before trying to re-establish an AMQP connection with the peer. ${PREFIX}_REQUEST_TIMEOUT\n--${prefix}.requestTimeout no 200 The maximum number of milliseconds to wait for a response before a service invocation is failed. Setting this value to a higher value increases the chance of successful service invocation in situations where network latency is high. ${PREFIX}_SECURE_PROTOCOLS\n--${prefix}.secureProtocols no TLSv1.2 A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the vert.x documentation for a list of supported protocol names. ${PREFIX}_TLS_ENABLED\n--${prefix}.tlsEnabled no false If set to true the connection to the peer will be encrypted using TLS and the peer\u0026rsquo;s identity will be verified using the JVM\u0026rsquo;s configured standard trust store.\nThis variable only needs to be set to enable TLS explicitly if no specific trust store is configured using the ${PREFIX}_TRUST_STORE_PATH variable. ${PREFIX}_TRUST_STORE_PATH\n--${prefix}.trustStorePath no - The absolute path to the Java key store containing the CA certificates the adapter uses for authenticating the service. This property must be set if the service has been configured to support TLS. The key store format can be either JKS, PKCS12 or PEM indicated by a .jks, .p12 or .pem file suffix respectively. ${PREFIX}_TRUST_STORE_PASSWORD\n--${prefix}.trustStorePassword no - The password required to read the contents of the trust store. Response Caching The clients created by a Hono client factory support the caching of responses received in response to service invocations. Caching can greatly improve performance by preventing costly invocations of remote service operations. However, it usually only makes sense for resources that do not change too frequently. The Hono client follows the approach to caching used in HTTP 1.1. In particular, it supports cache directives that a service includes in the response messages it sends back to the Hono client.\nIn order to enable caching, the org.eclipse.hono.client.impl.HonoClientImpl factory class needs to be configured with a cache manager using the setCacheManager method. Any specific client created by the factory will then cache responses to service invocations based on the following rules:\n If the response contains a no-cache directive, the response is not cached at all. Otherwise, if the response contains a max-age directive, the response is cached for the number of seconds specified by the directive. Otherwise, if the response message does not contain any of the above directives and the response\u0026rsquo;s status code is one of the codes defined in RFC 2616, Section 13.4 Response Cacheability, the response is put to the cache using the default timeout defined by the ${PREFIX}_RESPONSE_CACHE_DEFAULT_TIMEOUT variable as the maximum age. The following table provides an overview of the configuration variables and corresponding command line options for configuring the Hono client\u0026rsquo;s caching behavior.\n Environment Variable\nCommand Line Option Mandatory Default Value Description ${PREFIX}_RESPONSE_CACHE_MIN_SIZE\n--${prefix}.responseCacheMinSize no 20 The minimum number of responses that can be cached. ${PREFIX}_RESPONSE_CACHE_MAX_SIZE\n--${prefix}.responseCacheMaxSize no 1000 The maximum number of responses that can be cached. It is up to the particular cache implementation, how to deal with new cache entries once this limit has been reached. ${PREFIX}_RESPONSE_CACHE_DEFAULT_TIMEOUT\n--${prefix}.responseCacheDefaultTimeout no 600 The default number of seconds after which cached responses should be considered invalid. Using TLS The client can be configured to use TLS for\n authenticating the server during connection establishment and (optionally) authenticating to the server using a client certificate (if the server supports this) In order to authenticate the server by means of the server\u0026rsquo;s certificate, the client needs to be configured with a trust anchor containing the certificate authorities that the client trusts. The trust anchor can be configured explicitly by means of the ${PREFIX}_TRUST_STORE_PATH and ${PREFIX}_TRUST_STORE_PASSWORD variables. This is most useful in cases where the server\u0026rsquo;s certificate has not been signed by one of the public root CAs that are contained in the JRE\u0026rsquo;s standard trust store. However, if the server does use a certificate signed by such a public CA, then it is sufficient to set the ${PREFIX}_TLS_ENABLED variable to true in order for the client to support TLS when connecting to the server.\nThe client can also be configured to authenticate to the server by means of an X.509 client certificate if the server is configured to support this. The ${PREFIX}_CERT_PATH and ${PREFIX}_KEY_PATH variables can be used to set the paths to PEM files containing the certificate and private key. Alternatively, the ${PREFIX}_KEY_STORE_PATH and ${PREFIX}_KEY_STORE_PASSWORD variables can be used to set the path and password of a key store which contains both the certificate as well as the private key.\nThe client supports TLS 1.2 only by default for negotiating TLS sessions with servers. Additional protocols can be enabled by setting the ${PREFIX}_SECURE_PROTOCOLS variable to a comma separated list of protocol names as defined in the vert.x documentation. However, great care should be taken when enabling older protocols because most of them are vulnerable to attacks.\n"
+ "content": "The org.eclipse.hono.client.HonoClient factory can be used to create specific clients for accessing services implementing one or more of Hono\u0026rsquo;s APIs.\nThe factory uses environment variables and/or command line options to configure the connection to the service and the caching of responses to service invocations. All variables used for configuring a particular Hono Client factory instance share a common prefix. This way, multiple sets of variables can be used to configure multiple factories for connecting to different service endpoints without interfering with each other. For example, the set of variables for configuring the client factory for the Device Registration service may use the common prefix HONO_REGISTRATION whereas the set for configuring the factory for the Credentials service may use HONO_CREDENTIALS.\nConnection Properties The following table provides an overview of the configuration variables and corresponding command line options for configuring the AMQP connection to the service. Note that the variables map to the properties of class org.eclipse.hono.config.ClientConfigProperties which can be used to programmatically configure a client.\nThe variable names contain ${PREFIX} as a placeholder for the particular common prefix being used. The ${prefix} placeholder used in the command line option name is the same as ${PREFIX}, using all lower case characters and . instead of _ as the delimiter, e.g. the variable prefix HONO_CREDENTIALS corresponds to the command line option prefix hono.credentials).\n Environment Variable\nCommand Line Option Mandatory Default Value Description ${PREFIX}_AMQP_HOSTNAME\n--${prefix}.amqpHostname no - The name to use as the hostname in the client\u0026rsquo;s AMQP open frame during connection establishment. This variable can be used to indicate the virtual host to connect to on the server. ${PREFIX}_CERT_PATH\n--${prefix}.certPath no - The absolute path to the PEM file containing the certificate that the client should use for authenticating to the server. This variable must be used in conjunction with ${PREFIX}_KEY_PATH.\nAlternatively, the ${PREFIX}_KEY_STORE_PATH variable can be used to configure a key store containing both the key as well as the certificate. ${PREFIX}_CONNECT_TIMEOUT\n--${prefix}.connectTimeout no 5000 The maximum amount of time (milliseconds) that the client should wait for the AMQP connection to be opened. This includes the time for TCP/TLS connection establishment, SASL handshake and exchange of the AMQP open frame. This property can be used to tune the time period to wait according to the network latency involved with the connection between the client and the service. ${PREFIX}_CREDENTIALS_PATH\n--${prefix}.credentialsPath no - The absolute path to a properties file that contains a username and a password property to use for authenticating to the service.\nThis variable is an alternative to using ${PREFIX}_USERNAME and ${PREFIX}_PASSWORD which has the advantage of not needing to expose the secret (password) in the client process\u0026rsquo; environment. ${PREFIX}_FLOW_LATENCY\n--${prefix}.flowLatency no 20 The maximum amount of time (milliseconds) that the client should wait for credits after a link to the service has been established. ${PREFIX}_HOST\n--${prefix}.host no localhost The IP address or name of the host to connect to. NB This needs to be set to an address that can be resolved within the network the adapter runs on. When running as a Docker container, use Docker\u0026rsquo;s --network command line option to attach the local container to the Docker network that the service is running on. ${PREFIX}_HOSTNAME_VERIFICATION_REQUIRED\n--${prefix}.hostnameVerificationRequired no true A flag indicating whether the value of the ${PREFIX}_HOST variable must match the distinguished name or any of the alternative names asserted by the server\u0026rsquo;s certificate when connecting using TLS. ${PREFIX}_IDLE_TIMEOUT\n--${prefix}.idleTimeout no 16000 Sets the amount of time in milliseconds after which a connection will be closed when no frames have been received from the remote peer. This property is also used to configure a heartbeat mechanism, checking that the connection is still alive. The corresponding heartbeat interval will be set to idleTimeout/2 ms. ${PREFIX}_INITIAL_CREDITS\n--${prefix}.initialCredits no 200 The number of credits that a consuming client will initially issue to the service (sender) after link creation. This value effectively limits the number of messages that can be in flight unsettled. ${PREFIX}_KEY_PATH\n--${prefix}.keyPath no - The absolute path to the (PKCS8) PEM file containing the private key that the client should use for authenticating to the server. Note that the private key is not protected by a password. You should therefore make sure that the key file can only be read by the user that the client process is running under. This variable must be used in conjunction with ${PREFIX}_CERT_PATH. Alternatively, the ${PREFIX}_KEY_STORE_PATH variable can be used to configure a key store containing both the key as well as the certificate. ${PREFIX}_KEY_STORE_PASSWORD\n--${prefix}.keyStorePassword no - The password required to read the contents of the key store. ${PREFIX}_KEY_STORE_PATH\n--${prefix}.keyStorePath no - The absolute path to the Java key store containing the private key and certificate that the client should use for authenticating to the server. Either this variable or the ${PREFIX}_KEY_PATH and ${PREFIX}_CERT_PATH variables need to be set in order to enable SASL External based authentication to the server. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. ${PREFIX}_LINK_ESTABLISMENT_TIMEOUT\n--${prefix}.linkEstablishmentTimeout no 1000 The maximum amount of time (milliseconds) that the client should wait for the service\u0026rsquo;s attach frame during link establishment. This property can be used to tune the time period to wait according to the network latency involved with the communication link between the client and the service. ${PREFIX}_NAME\n--${prefix}.name no - The name to use as the container-id in the client\u0026rsquo;s AMQP open frame during connection establishment. ${PREFIX}_PORT\n--${prefix}.port no 5671 The port that the service is listening on. ${PREFIX}_USERNAME\n--${prefix}.username no - The username to use for authenticating to the service. This property (and the corresponding password) needs to be set in order to enable SASL Plain based authentication to the service. ${PREFIX}_PASSWORD\n--${prefix}.password no - The password to use for authenticating to the service. ${PREFIX}_SEND_MESSAGE_TIMEOUT\n--${prefix}.sendMessageTimeout no 1000 The maximum number of milliseconds to wait for a delivery update after an event or command message was sent before the send operation is failed. Setting this value to a higher value increases the chance of successful service invocation in situations where network latency is high. ${PREFIX}_RECONNECT_ATTEMPTS\n--${prefix}.reconnectAttempts no -1 The number of attempts (in addition to the original connection attempt) that the client should make in order to establish an AMQP connection with the peer before giving up. The default value of this property is -1 which means that the client will try forever. ${PREFIX}_RECONNECT_DELAY_INCREMENT\n--${prefix}.reconnectDelayIncrement no 100 The factor (milliseconds) used in the exponential backoff algorithm for determining the delay before trying to re-establish an AMQP connection with the peer. The delay after an initial, failed connection attempt will be the value of the ${PREFIX}_RECONNECT_MIN_DELAY variable. Each subsequent connection attempt will use a random delay between the minimum delay and the value determined by exponentially increasing the delay by the ${PREFIX}_RECONNECT_DELAY_INCREMENT factor. The overall limit of the delay time is defined by the ${PREFIX}_RECONNECT_MAX_DELAY variable. ${PREFIX}_RECONNECT_MAX_DELAY\n--${prefix}.reconnectMaxDelay no 7000 The maximum number of milliseconds to wait before trying to re-establish an AMQP connection with the peer. ${PREFIX}_RECONNECT_MIN_DELAY\n--${prefix}.reconnectMinDelay no 0 The minimum number of milliseconds to wait before trying to re-establish an AMQP connection with the peer. ${PREFIX}_REQUEST_TIMEOUT\n--${prefix}.requestTimeout no 200 The maximum number of milliseconds to wait for a response before a service invocation is failed. Setting this value to a higher value increases the chance of successful service invocation in situations where network latency is high. ${PREFIX}_SECURE_PROTOCOLS\n--${prefix}.secureProtocols no TLSv1.2 A (comma separated) list of secure protocols that are supported when negotiating TLS sessions. Please refer to the vert.x documentation for a list of supported protocol names. ${PREFIX}_TLS_ENABLED\n--${prefix}.tlsEnabled no false If set to true the connection to the peer will be encrypted using TLS and the peer\u0026rsquo;s identity will be verified using the JVM\u0026rsquo;s configured standard trust store.\nThis variable only needs to be set to enable TLS explicitly if no specific trust store is configured using the ${PREFIX}_TRUST_STORE_PATH variable. ${PREFIX}_TRUST_STORE_PATH\n--${prefix}.trustStorePath no - The absolute path to the Java key store containing the CA certificates the adapter uses for authenticating the service. This property must be set if the service has been configured to support TLS. The key store format can be either JKS, PKCS12 or PEM indicated by a .jks, .p12 or .pem file suffix respectively. ${PREFIX}_TRUST_STORE_PASSWORD\n--${prefix}.trustStorePassword no - The password required to read the contents of the trust store. Response Caching The clients created by a Hono client factory support the caching of responses received in response to service invocations. Caching can greatly improve performance by preventing costly invocations of remote service operations. However, it usually only makes sense for resources that do not change too frequently. The Hono client follows the approach to caching used in HTTP 1.1. In particular, it supports cache directives that a service includes in the response messages it sends back to the Hono client.\nIn order to enable caching, the org.eclipse.hono.client.impl.HonoClientImpl factory class needs to be configured with a cache manager using the setCacheManager method. Any specific client created by the factory will then cache responses to service invocations based on the following rules:\n If the response contains a no-cache directive, the response is not cached at all. Otherwise, if the response contains a max-age directive, the response is cached for the number of seconds specified by the directive. Otherwise, if the response message does not contain any of the above directives and the response\u0026rsquo;s status code is one of the codes defined in RFC 2616, Section 13.4 Response Cacheability, the response is put to the cache using the default timeout defined by the ${PREFIX}_RESPONSE_CACHE_DEFAULT_TIMEOUT variable as the maximum age. The following table provides an overview of the configuration variables and corresponding command line options for configuring the Hono client\u0026rsquo;s caching behavior.\n Environment Variable\nCommand Line Option Mandatory Default Value Description ${PREFIX}_RESPONSE_CACHE_MIN_SIZE\n--${prefix}.responseCacheMinSize no 20 The minimum number of responses that can be cached. ${PREFIX}_RESPONSE_CACHE_MAX_SIZE\n--${prefix}.responseCacheMaxSize no 1000 The maximum number of responses that can be cached. It is up to the particular cache implementation, how to deal with new cache entries once this limit has been reached. ${PREFIX}_RESPONSE_CACHE_DEFAULT_TIMEOUT\n--${prefix}.responseCacheDefaultTimeout no 600 The default number of seconds after which cached responses should be considered invalid. Using TLS The client can be configured to use TLS for\n authenticating the server during connection establishment and (optionally) authenticating to the server using a client certificate (if the server supports this) In order to authenticate the server by means of the server\u0026rsquo;s certificate, the client needs to be configured with a trust anchor containing the certificate authorities that the client trusts. The trust anchor can be configured explicitly by means of the ${PREFIX}_TRUST_STORE_PATH and ${PREFIX}_TRUST_STORE_PASSWORD variables. This is most useful in cases where the server\u0026rsquo;s certificate has not been signed by one of the public root CAs that are contained in the JRE\u0026rsquo;s standard trust store. However, if the server does use a certificate signed by such a public CA, then it is sufficient to set the ${PREFIX}_TLS_ENABLED variable to true in order for the client to support TLS when connecting to the server.\nThe client can also be configured to authenticate to the server by means of an X.509 client certificate if the server is configured to support this. The ${PREFIX}_CERT_PATH and ${PREFIX}_KEY_PATH variables can be used to set the paths to PEM files containing the certificate and private key. Alternatively, the ${PREFIX}_KEY_STORE_PATH and ${PREFIX}_KEY_STORE_PASSWORD variables can be used to set the path and password of a key store which contains both the certificate as well as the private key.\nThe client supports TLS 1.2 only by default for negotiating TLS sessions with servers. Additional protocols can be enabled by setting the ${PREFIX}_SECURE_PROTOCOLS variable to a comma separated list of protocol names as defined in the vert.x documentation. However, great care should be taken when enabling older protocols because most of them are vulnerable to attacks.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/admin-guide/amqp-network-config/",
@@ -200,14 +200,14 @@
"title": "Monitoring & Tracing",
"tags": [],
"description": "",
- "content": "The individual components of an Eclipse Hono\u0026trade; installation need to work together in order to provide their functionality to devices and applications. Under normal circumstances these interactions work flawlessly. However, due to the nature of distributed systems, any one (or more) of the components may crash or become otherwise unavailable due to arbitrary reasons. This page describes how Hono supports operations teams by providing insights into the individual service components and their interactions with each other by means of reporting metrics and tracing the processing of individual messages through the system.\nWhen a device uploads telemetry data to the HTTP adapter, the adapter invokes operations on the Device Registration, Credentials and the Tenant services in order to authenticate and authorize the device before sending the telemetry data downstream to the AMQP 1.0 Messaging Network. The overall success of this process and the latency involved before the message reaches the consumer is determined by the individual interactions between the service components.\nMonitoring In a production environment, an operations team will usually want to keep track of some key performance indicators (KPI) which allow the team to determine the overall health of the system, e.g. memory and CPU consumption etc. Hono supports the tracking of such KPIs by means of metrics it can be configured to report. The metrics are usually collected in a time series database like InfluxDB or Prometheus and then visualized on a monitoring dash-board built using frameworks like Grafana. Such a dash-board can usually also be configured to send alarms when certain thresholds are exceeded.\nMetrics usually provide insights into the past and current status of an individual component. The values can be aggregated to provide a picture of the overall system\u0026rsquo;s status. As such, metrics provide a great way to monitor system health and, in particular, to anticipate resource shortages and use such knowledge to pro-actively prevent system failure.\nConfiguring a Metrics Back End Hono uses Micrometer for providing metrics. It is possible to drop in any Micrometer compatible back end. Hono also uses the Micrometer integration with Spring Boot and Vert.x.\nPlease refer to the Micrometer documentation for details regarding the configuration of a specific Micrometer back end. In most cases, you only need to add the back end specific jar files to the class path and add back end specific configuration to the application.yml file.\nThe Hono build supports configuration of a specific metrics back end by means of Maven profiles. The following build profiles are currently supported:\n metrics-prometheus – Enables the Prometheus backend. metrics-graphite – Enables the Graphite backend. metrics-influxdb – Enables the InfluxDB backend. Additionally to selecting a metrics back end, you may need to configure the back end using Spring configuration options. See the documentation mentioned above for more information.\nNote that none of the above profiles are active by default, i.e. you need to explicitly activate one of them when starting the build using Maven\u0026rsquo;s -p command line parameter.\nUsing Prometheus Most of the metrics back ends have data being pushed to from the components reporting the metrics. However, Prometheus is different in that it polls (or scrapes) all components periodically for new metrics data. For this to work, the Prometheus server needs to be configured with the IP addresses of the components to monitor. In the example deployment that comes with Hono, the Kubernetes pods that the Hono components are running in are marked by means of a label. The Prometheus server then periodically queries the Kubernetes API to determine a list of pods (and their IP addresses) that have the corresponding label. The components themselves need to expose a corresponding HTTP endpoint that the Prometheus server can connect to for scraping the meter data. All Hono components that report metrics can be configured to expose such an endpoint via their Health Check server which already exposes endpoints for determining the component\u0026rsquo;s readiness and liveness status.\nLegacy Metrics Support In addition to using standard Micrometer back ends, Hono also provides out of the box support for the pre-0.8 Graphite based format. This will configure the Graphite adapter to output metrics in the legacy format used by Hono versions before 0.8. Further configuration of the Graphite adapter can be made using the standard Spring Boot configuration of Micrometer. The legacy support can be enabled using the following configuration switch:\n Environment Variable\nCommand Line Option Mandatory Default Description HONO_METRICS_LEGACY\n--hono.metrics.legacy no false Enable legacy metrics using graphite. It is also necessary to enable the build profile for Graphite (metrics-graphite), as the legacy back end is based on the Graphite wire format. The profile will add the necessary dependencies to the build. If the dependencies are missing, the startup of the Hono components will fail.\nThe names and semantics of the individual metrics being reported by the components are described in the Legacy Metrics specification.\nHealth Check Server Configuration All of Hono\u0026rsquo;s service components and protocol adapters contain a Health Check server which can be configured to expose several HTTP endpoints for determining the component\u0026rsquo;s status. In particular, the server exposes a /readiness, a /liveness and an optional /prometheus URI endpoint.\nThe former two endpoints are supposed to be used by container orchestration platforms like Kubernetes to monitor the runtime status of the containers that it manages. These endpoints are always exposed when the health check server is started.\nThe /prometheus endpoint can be used by a Prometheus server to retrieve collected meter data from the component. It is only exposed if Prometheus has been configured as the metrics back end as described above.\nThe health check server can be configured by means of the following environment variables:\n Environment Variable\nCommand Line Option Default Value Description HONO_HEALTH_CHECK_BIND_ADDRESS\n--hono.healthCheck.bindAddress 127.0.0.1 The IP address of the network interface that the health check server\u0026rsquo;s secure port should be bound to. The server will only be started if this property is set to some other than the default value and corresponding key material has been configured using the HONO_HEALTH_CHECK_KEY_PATH and HONO_HEALTH_CHECK_CERT_PATH variables. HONO_HEALTH_CHECK_CERT_PATH\n--hono.healthCheck.certPath - The absolute path to the PEM file containing the certificate that the secure server should use for authenticating to clients. This option must be used in conjunction with HONO_HEALTH_CHECK_KEY_PATH.\nAlternatively, the HONO_HEALTH_CHECK_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_HEALTH_CHECK_INSECURE_PORT_BIND_ADDRESS\n--hono.healthCheck.insecurePortBindAddress 127.0.0.1 The IP address of the network interface that the health check server\u0026rsquo;s insecure port should be bound to. The server will only be started if this property is set to some other than the default value. HONO_HEALTH_CHECK_INSECURE_PORT\n--hono.healthCheck.insecurePort 8088 The port that the insecure server should listen on. HONO_HEALTH_CHECK_KEY_PATH\n--hono.healthCheck.keyPath - The absolute path to the (PKCS8) PEM file containing the private key that the secure server should use for authenticating to clients. This option must be used in conjunction with HONO_HEALTH_CHECK_CERT_PATH. Alternatively, the HONO_HEALTH_CHECK_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_HEALTH_CHECK_PORT\n--hono.healthCheck.port 8088 The port that the secure server should listen on. HONO_HEALTH_CHECK_KEY_STORE_PASSWORD\n--hono.healthCheck.keyStorePassword - The password required to read the contents of the key store. HONO_HEALTH_CHECK_KEY_STORE_PATH\n--hono.healthCheck.keyStorePath - The absolute path to the Java key store containing the private key and certificate that the secure server should use for authenticating to clients. Either this option or the HONO_HEALTH_CHECK_KEY_PATH and HONO_HEALTH_CHECK_CERT_PATH options need to be set in order to enable TLS secured connections with clients. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. The HONO_HEALTH_CHECK_KEY_STORE_PASSWORD variable can be used to set the password required for reading the key store. Failure to start The component/service will fail to start if neither the secure not the insecure server have been configured properly. Tracing In normal operation the vast majority of messages should be flowing through the system without any noteworthy delays or problems. In fact, that is the whole purpose of Hono. However, that doesn\u0026rsquo;t mean that nothing can go wrong. For example, when a tenant\u0026rsquo;s device administrator changes the credentials of a device in the Credentials service but has not yet updated the credentials on the device yet, then the device will start to fail in uploading any data to the protocol adapter it connects to. After a while, a back end application\u0026rsquo;s administrator might notice, that there hasn\u0026rsquo;t been any data being received from that particular device for quite some time. The application administrator therefore calls up the Hono operations team and complains about the data being lost somewhere.\nThe operations team will have a hard time determining what is happening, because it will need to figure out which components have been involved in the processing of the device and why the data hasn\u0026rsquo;t been processed as usual. The metrics alone usually do not help much here because metrics are usually not scoped to individual devices. The logs written by the individual components, on the other hand, might contain enough information to correlate individual entries in the log with each other and thus trace the processing of the message throughout the system. However, this is usually a very tedious (and error prone) process and the relevant information is often only logged at a level (e.g. DEBUG) that is not used in production (often INFO or above).\nIn order to address this problem, Hono\u0026rsquo;s service components are instrumented using OpenTracing. OpenTracing provides Vendor-neutral APIs and instrumentation for distributed tracing. The OpenTracing web page provides a list of supported tracer implementations from which users can choose in order to collect (and examine) the tracing information generated by Hono\u0026rsquo;s individual components.\nConfiguring a Tracer Hint: The description in this chapter applies to any compatible OpenTracing implementation. For an easier approach to configure usage of Jaeger tracing, see the next chapter.\nHono\u0026rsquo;s components use the OpenTracing Tracer Resolver mechanism to find and initialize a concrete OpenTracing implementation during startup of the component. The discovery mechanism is using Java\u0026rsquo;s ServiceLoader and as such relies on the required resources to be available on the class path.\nWhen starting up any of Hono\u0026rsquo;s Docker images as a container, the JVM will look for additional jar files to include in its class path in the container\u0026rsquo;s /opt/hono/extensions folder. Thus, using a specific implementation of OpenTracing is just a matter of configuring the container to mount a volume or binding a host folder at that location and putting the implementation\u0026rsquo;s jar files and resources into the corresponding volume or host folder.\n Note This also means that (currently) only Tracer implementations can be used with Hono that also implement the Tracer Resolver mechanism. Assuming that the HTTP adapter should be configured to use Jaeger tracing, the following steps are necessary:\n Download Jaeger\u0026rsquo;s Java Tracer Resolver implementation and its dependencies (see the hint at the end). Put the jars to a folder on the Docker host, e.g. /tmp/jaeger. Start the HTTP adapter Docker image mounting the host folder:\ndocker run --name hono-adapter-http-vertx \\ --mount type=bind,src=/tmp/jaeger,dst=/opt/hono/extensions,ro \\ ... \\ eclipse/hono-adapter-http-vertx Note: the command given above does not contain the environment variables and secrets that are required to configure the service properly. The environment variables for configuring the Jaeger client are also missing. Please refer to the Jaeger documentation for details.\nWhen the HTTP adapter starts up, it will look for a working implementation of the Tracer Resolver on its classpath and (if found) initialize and use it for publishing traces. The adapter\u0026rsquo;s log file will indicate the name of the Tracer implementation being used.\nUsing a Docker volume instead of a bind mount works the same way but requires the use of volume as the type of the --mount parameter. Please refer to the Docker reference documentation for details.\nHint: to resolve all dependencies for jaeger-tracerresolver in order to provide them to /opt/hono/extensions, you may want to rely on Maven\u0026rsquo;s dependency plugin. To obtain all jar files you can invoke the following command in a simple Maven project that contains only the dependency to jaeger-tracerresolver:\nmvn dependency:copy-dependencies All jar files can then be found in the directory target/dependency.\nConfiguring usage of Jaeger tracing (included in Docker images) In case Jaeger tracing shall be used, there is an alternative to putting the jar files in the container\u0026rsquo;s /opt/hono/extensions folder as described above. This is to have the Jaeger tracing jar files be included in the Hono Docker images by using the jaeger Maven profile when building Hono.\nFor example, building the HTTP adapter image with the Jaeger client included:\n# in directory: hono/adapters/http-vertx/ mvn clean install -Pbuild-docker-image,jaeger Note that when running the created docker image, the environment variables for configuring the Jaeger client still need to be set. Please refer to the Jaeger documentation for details.\nEnforcing the recording of traces for a tenant Typically, in production systems, the tracing components will be configured to not store all trace spans in the tracing backend, in order to reduce the performance impact. For debugging purposes it can however be beneficial to enforce the recording of certain traces. Hono allows this by providing a configuration option in the Tenant information with which all traces concerning the processing of telemetry, event and command messages for that specific tenant will be recorded. Furthermore, this enforced trace sampling can be restricted to only apply to messages sent in the context of a specific authentication identifier. Please refer to the description of the tracing object in the Tenant Information for details.\n"
+ "content": "The individual components of an Eclipse Hono\u0026trade; installation need to work together in order to provide their functionality to devices and applications. Under normal circumstances these interactions work flawlessly. However, due to the nature of distributed systems, any one (or more) of the components may crash or become otherwise unavailable due to arbitrary reasons. This page describes how Hono supports operations teams by providing insights into the individual service components and their interactions with each other by means of reporting metrics and tracing the processing of individual messages through the system.\nWhen a device uploads telemetry data to the HTTP adapter, the adapter invokes operations on the Device Registration, Credentials and the Tenant services in order to authenticate and authorize the device before sending the telemetry data downstream to the AMQP 1.0 Messaging Network. The overall success of this process and the latency involved before the message reaches the consumer is determined by the individual interactions between the service components.\nMonitoring In a production environment, an operations team will usually want to keep track of some key performance indicators (KPI) which allow the team to determine the overall health of the system, e.g. memory and CPU consumption etc. Hono supports the tracking of such KPIs by means of metrics it can be configured to report. The metrics are usually collected in a time series database like InfluxDB or Prometheus and then visualized on a monitoring dash-board built using frameworks like Grafana. Such a dash-board can usually also be configured to send alarms when certain thresholds are exceeded.\nMetrics usually provide insights into the past and current status of an individual component. The values can be aggregated to provide a picture of the overall system\u0026rsquo;s status. As such, metrics provide a great way to monitor system health and, in particular, to anticipate resource shortages and use such knowledge to pro-actively prevent system failure.\nConfiguring a Metrics Back End Hono uses Micrometer for providing metrics. It is possible to drop in any Micrometer compatible back end. Hono also uses the Micrometer integration with Spring Boot and Vert.x.\nPlease refer to the Micrometer documentation for details regarding the configuration of a specific Micrometer back end. In most cases, you only need to add the back end specific jar files to the class path and add back end specific configuration to the application.yml file.\nThe Hono build supports configuration of a specific metrics back end by means of Maven profiles. The following build profiles are currently supported:\n metrics-prometheus – Enables the Prometheus backend. metrics-graphite – Enables the Graphite backend. metrics-influxdb – Enables the InfluxDB backend. Additionally to selecting a metrics back end, you may need to configure the back end using Spring configuration options. See the documentation mentioned above for more information.\nNote that none of the above profiles are active by default, i.e. you need to explicitly activate one of them when starting the build using Maven\u0026rsquo;s -p command line parameter.\nUsing Prometheus Most of the metrics back ends have data being pushed to from the components reporting the metrics. However, Prometheus is different in that it polls (or scrapes) all components periodically for new metrics data. For this to work, the Prometheus server needs to be configured with the IP addresses of the components to monitor. In the example deployment that comes with Hono, the Prometheus server is configured with the names of the Kubernetes services corresponding to the Hono components that it should scrape. The components themselves need to expose a corresponding HTTP endpoint that the Prometheus server can connect to for scraping the meter data. All Hono components that report metrics can be configured to expose such an endpoint via their Health Check server which already exposes endpoints for determining the component\u0026rsquo;s readiness and liveness status.\nHealth Check Server Configuration All of Hono\u0026rsquo;s service components and protocol adapters contain a Health Check server which can be configured to expose several HTTP endpoints for determining the component\u0026rsquo;s status. In particular, the server exposes a /readiness, a /liveness and an optional /prometheus URI endpoint.\nThe former two endpoints are supposed to be used by container orchestration platforms like Kubernetes to monitor the runtime status of the containers that it manages. These endpoints are always exposed when the health check server is started.\nThe /prometheus endpoint can be used by a Prometheus server to retrieve collected meter data from the component. It is only exposed if Prometheus has been configured as the metrics back end as described above.\nThe health check server can be configured by means of the following environment variables:\n Environment Variable\nCommand Line Option Default Value Description HONO_HEALTH_CHECK_BIND_ADDRESS\n--hono.healthCheck.bindAddress 127.0.0.1 The IP address of the network interface that the health check server\u0026rsquo;s secure port should be bound to. The server will only be started if this property is set to some other than the default value and corresponding key material has been configured using the HONO_HEALTH_CHECK_KEY_PATH and HONO_HEALTH_CHECK_CERT_PATH variables. HONO_HEALTH_CHECK_CERT_PATH\n--hono.healthCheck.certPath - The absolute path to the PEM file containing the certificate that the secure server should use for authenticating to clients. This option must be used in conjunction with HONO_HEALTH_CHECK_KEY_PATH.\nAlternatively, the HONO_HEALTH_CHECK_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_HEALTH_CHECK_INSECURE_PORT_BIND_ADDRESS\n--hono.healthCheck.insecurePortBindAddress 127.0.0.1 The IP address of the network interface that the health check server\u0026rsquo;s insecure port should be bound to. The server will only be started if this property is set to some other than the default value. HONO_HEALTH_CHECK_INSECURE_PORT\n--hono.healthCheck.insecurePort 8088 The port that the insecure server should listen on. HONO_HEALTH_CHECK_KEY_PATH\n--hono.healthCheck.keyPath - The absolute path to the (PKCS8) PEM file containing the private key that the secure server should use for authenticating to clients. This option must be used in conjunction with HONO_HEALTH_CHECK_CERT_PATH. Alternatively, the HONO_HEALTH_CHECK_KEY_STORE_PATH option can be used to configure a key store containing both the key as well as the certificate. HONO_HEALTH_CHECK_PORT\n--hono.healthCheck.port 8088 The port that the secure server should listen on. HONO_HEALTH_CHECK_KEY_STORE_PASSWORD\n--hono.healthCheck.keyStorePassword - The password required to read the contents of the key store. HONO_HEALTH_CHECK_KEY_STORE_PATH\n--hono.healthCheck.keyStorePath - The absolute path to the Java key store containing the private key and certificate that the secure server should use for authenticating to clients. Either this option or the HONO_HEALTH_CHECK_KEY_PATH and HONO_HEALTH_CHECK_CERT_PATH options need to be set in order to enable TLS secured connections with clients. The key store format can be either JKS or PKCS12 indicated by a .jks or .p12 file suffix respectively. The HONO_HEALTH_CHECK_KEY_STORE_PASSWORD variable can be used to set the password required for reading the key store. Failure to start The component/service will fail to start if neither the secure not the insecure server have been configured properly. Tracing In normal operation the vast majority of messages should be flowing through the system without any noteworthy delays or problems. In fact, that is the whole purpose of Hono. However, that doesn\u0026rsquo;t mean that nothing can go wrong. For example, when a tenant\u0026rsquo;s device administrator changes the credentials of a device in the Credentials service but has not yet updated the credentials on the device yet, then the device will start to fail in uploading any data to the protocol adapter it connects to. After a while, a back end application\u0026rsquo;s administrator might notice, that there hasn\u0026rsquo;t been any data being received from that particular device for quite some time. The application administrator therefore calls up the Hono operations team and complains about the data being lost somewhere.\nThe operations team will have a hard time determining what is happening, because it will need to figure out which components have been involved in the processing of the device and why the data hasn\u0026rsquo;t been processed as usual. The metrics alone usually do not help much here because metrics are usually not scoped to individual devices. The logs written by the individual components, on the other hand, might contain enough information to correlate individual entries in the log with each other and thus trace the processing of the message throughout the system. However, this is usually a very tedious (and error prone) process and the relevant information is often only logged at a level (e.g. DEBUG) that is not used in production (often INFO or above).\nIn order to address this problem, Hono\u0026rsquo;s service components are instrumented using OpenTracing. OpenTracing provides Vendor-neutral APIs and instrumentation for distributed tracing. The OpenTracing web page provides a list of supported tracer implementations from which users can choose in order to collect (and examine) the tracing information generated by Hono\u0026rsquo;s individual components.\nConfiguring a Tracer Hint: The description in this chapter applies to any compatible OpenTracing implementation. For an easier approach to configure usage of Jaeger tracing, see the next chapter.\nHono\u0026rsquo;s components use the OpenTracing Tracer Resolver mechanism to find and initialize a concrete OpenTracing implementation during startup of the component. The discovery mechanism is using Java\u0026rsquo;s ServiceLoader and as such relies on the required resources to be available on the class path.\nWhen starting up any of Hono\u0026rsquo;s Docker images as a container, the JVM will look for additional jar files to include in its class path in the container\u0026rsquo;s /opt/hono/extensions folder. Thus, using a specific implementation of OpenTracing is just a matter of configuring the container to mount a volume or binding a host folder at that location and putting the implementation\u0026rsquo;s jar files and resources into the corresponding volume or host folder.\n Note This also means that (currently) only Tracer implementations can be used with Hono that also implement the Tracer Resolver mechanism. Assuming that the HTTP adapter should be configured to use Jaeger tracing, the following steps are necessary:\n Download Jaeger\u0026rsquo;s Java Tracer Resolver implementation and its dependencies (see the hint at the end). Put the jars to a folder on the Docker host, e.g. /tmp/jaeger. Start the HTTP adapter Docker image mounting the host folder:\ndocker run --name hono-adapter-http-vertx \\ --mount type=bind,src=/tmp/jaeger,dst=/opt/hono/extensions,ro \\ ... \\ eclipse/hono-adapter-http-vertx Note: the command given above does not contain the environment variables and secrets that are required to configure the service properly. The environment variables for configuring the Jaeger client are also missing. Please refer to the Jaeger documentation for details.\nWhen the HTTP adapter starts up, it will look for a working implementation of the Tracer Resolver on its classpath and (if found) initialize and use it for publishing traces. The adapter\u0026rsquo;s log file will indicate the name of the Tracer implementation being used.\nUsing a Docker volume instead of a bind mount works the same way but requires the use of volume as the type of the --mount parameter. Please refer to the Docker reference documentation for details.\nHint: to resolve all dependencies for jaeger-tracerresolver in order to provide them to /opt/hono/extensions, you may want to rely on Maven\u0026rsquo;s dependency plugin. To obtain all jar files you can invoke the following command in a simple Maven project that contains only the dependency to jaeger-tracerresolver:\nmvn dependency:copy-dependencies All jar files can then be found in the directory target/dependency.\nConfiguring usage of Jaeger tracing (included in Docker images) In case Jaeger tracing shall be used, there is an alternative to putting the jar files in the container\u0026rsquo;s /opt/hono/extensions folder as described above. This is to have the Jaeger tracing jar files be included in the Hono Docker images by using the jaeger Maven profile when building Hono.\nFor example, building the HTTP adapter image with the Jaeger client included:\n# in directory: hono/adapters/http-vertx/ mvn clean install -Pbuild-docker-image,jaeger Note that when running the created docker image, the environment variables for configuring the Jaeger client still need to be set. Please refer to the Jaeger documentation for details.\nEnforcing the recording of traces for a tenant Typically, in production systems, the tracing components will be configured to not store all trace spans in the tracing backend, in order to reduce the performance impact. For debugging purposes it can however be beneficial to enforce the recording of certain traces. Hono allows this by providing a configuration option in the Tenant information with which all traces concerning the processing of telemetry, event and command messages for that specific tenant will be recorded. Furthermore, this enforced trace sampling can be restricted to only apply to messages sent in the context of a specific authentication identifier. Please refer to the description of the tracing object in the Tenant Information for details.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/dev-guide/",
"title": "Developer Guide",
"tags": [],
"description": "",
- "content": " Developer Guide Learn how to integrate your custom components with Hono\u0026trade;.\n"
+ "content": " Developer Guide Learn how to build Eclipse Hono\u0026trade; and how to integrate your custom components with it.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/dev-guide/building_hono/",
@@ -221,7 +221,7 @@
"title": "Consuming Messages from Java",
"tags": [],
"description": "",
- "content": " To illustrate how Eclipse Hono\u0026trade; can be integrated with Java code, a simple application is provided that consumes telemetry and event data for devices belonging to the default tenant.\nIt also includes support for Command and Control:\nif indicated by a received downstream message that contains a ttd value (refer to Device notifications for details) it tries to send a command to the device. If the value of ttd indicates that the device stays connected for an unlimited time (ttd == -1), the application will periodically repeat to send a command until notified the device is disconnected again (ttd == 0).\nThis application shall serve as a blueprint to integrate your existing java source code with Hono. Its code is found in the example module in the package org.eclipse.hono.vertx.example.\nThe provided classes are kept as simple as possible (in the tradition of a classical \u0026ldquo;Hello World\u0026rdquo; implementation) while still covering the most relevant messaging patterns (downstream and upstream messages). For this purpose they make use of simple constant definitions and deal with exceptions as rarely as possible. You may want to change the level of detail that should be logged to the console by editing the contained resources/logback.xml file.\nPlease refer to the javadoc of the classes for details.\n Note Note that production ready code likely has to think more about error handling and logging than this simple blueprint. Configure the example For simplicity, all configurations are defined as Java constants inside the class HonoExampleConstants.\nIf you have Hono running in Docker under localhost, the example should work out of the box.\nSome configuration values can be overridden by providing them as property to the application.\nThis includes the host and the port of the AMQP network. In the standard setup of Hono they should be configured to the qdrouter from the Apache Qpid project. In production scenarios this might be a large setup of AMQP routers, brokers, etc.\nPlease refer to the class HonoExampleConstants to find out which part of the application can be configured by properties.\nRun the example The application waits for messages until you press any key or kill it.\nIt is started by\n# in directory: hono/example/ mvn exec:java -Dexec.mainClass=org.eclipse.hono.vertx.example.HonoExampleApplication or - if e.g. the host of the AMQP network should be changed -\nmvn exec:java -Dexec.mainClass=org.eclipse.hono.vertx.example.HonoExampleApplication -Dconsumer.host=192.168.99.100 Telemetry and Event messages Depending on the logger configuration, all received downstream messages are printed to the console.\nPlease note that consumers do not connect with Hono directly, but rather with an AMQP router network.\nCommand and Control By using a helper class provided by Hono, a callback in the application code is invoked when a downstream message was received that signals the device will stay connected to the protocol adapter for some time (see Device notifications for details).\nInside this callback an arbitrary simple command is sent down to the device (once or periodically) and the response is logged to the console.\nEncryption of communication For the encrypted communication with Hono, the necessary truststore is already installed and used by the Hono client.\nIf you want to integrate the code with your own software, please copy the provided truststore (hono/demo-certs/certs/trusted-certs.pem) from the Hono project to the resources directory of your project and adopt the code pointing to the file location.\n"
+ "content": " To illustrate how Eclipse Hono\u0026trade; can be integrated with Java code, a simple application is provided that consumes telemetry and event data for devices belonging to the default tenant.\nIt also includes support for Command and Control:\nif indicated by a received downstream message that contains a ttd value (refer to Device notifications for details) it tries to send a command to the device. If the value of ttd indicates that the device stays connected for an unlimited time (ttd == -1), the application will periodically repeat to send a command until notified the device is disconnected again (ttd == 0).\nThis application shall serve as a blueprint to integrate your existing java source code with Hono. Its code is found in the example module in the package org.eclipse.hono.vertx.example.\nThe provided classes are kept as simple as possible (in the tradition of a classical \u0026ldquo;Hello World\u0026rdquo; implementation) while still covering the most relevant messaging patterns (downstream and upstream messages). For this purpose they make use of simple constant definitions and deal with exceptions as rarely as possible. You may want to change the level of detail that should be logged to the console by editing the contained resources/logback.xml file.\nPlease refer to the javadoc of the classes for details.\n Note Note that production ready code likely has to think more about error handling and logging than this simple blueprint. Configure the example For simplicity, all configurations are defined as Java constants inside the class HonoExampleConstants.\nIf you have Hono running in Docker under localhost, the example should work out of the box.\nSome configuration values can be overridden by providing them as property to the application.\nThis includes the host and the port of the AMQP network. In the standard setup of Hono they should be configured to the qdrouter from the Apache Qpid project. In production scenarios this might be a large setup of AMQP routers, brokers, etc.\nPlease refer to the class HonoExampleConstants to find out which part of the application can be configured by properties.\nRun the example The application waits for messages until you press any key or kill it.\nIt is started by\n# in directory: hono/example/ mvn exec:java -Dexec.mainClass=org.eclipse.hono.vertx.example.HonoExampleApplication or \u0026mdash; if e.g. the host of the AMQP network should be changed \u0026mdash;\nmvn exec:java -Dexec.mainClass=org.eclipse.hono.vertx.example.HonoExampleApplication -Dconsumer.host=192.168.99.100 Telemetry and Event messages Depending on the logger configuration, all received downstream messages are printed to the console.\nPlease note that consumers do not connect with Hono directly, but rather with an AMQP router network.\nCommand and Control By using a helper class provided by Hono, a callback in the application code is invoked when a downstream message was received that signals the device will stay connected to the protocol adapter for some time (see Device notifications for details).\nInside this callback an arbitrary simple command is sent down to the device (once or periodically) and the response is logged to the console.\nEncryption of communication For the encrypted communication with Hono, the necessary truststore is already installed and used by the Hono client.\nIf you want to integrate the code with your own software, please copy the provided truststore (hono/demo-certs/certs/trusted-certs.pem) from the Hono project to the resources directory of your project and adopt the code pointing to the file location.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/dev-guide/custom_http_adapter/",
@@ -235,21 +235,21 @@
"title": "API",
"tags": [],
"description": "",
- "content": " API Documentation of the APIs defined by Hono\u0026trade;.\n"
+ "content": " API Documentation of the APIs defined by Eclipse Hono\u0026trade;.\nFor an overview of the available APIs, see the architecture documentation.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/api/telemetry/",
"title": "Telemetry API Specification",
"tags": [],
"description": "",
- "content": "The Telemetry API is used by Protocol Adapters to send telemetry data downstream. Business Applications and other consumers use the API to receive data published by devices belonging to a particular tenant.\nThe Telemetry API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using AMQP 1.0 in order to invoke operations of the API as described in the following sections. Throughout the remainder of this page we will simply use AMQP when referring to AMQP 1.0.\nSouthbound Operations The following operations can be used by Protocol Adapters to forward telemetry data received from devices to downstream consumers like Business Applications.\nForward Telemetry Data Preconditions\n Adapter has established an AMQP connection with the AMQP Messaging Network. Adapter has established an AMQP link in role sender with the AMQP Messaging Network using target address telemetry/${tenant_id} where ${tenant_id} is the ID of the tenant that the client wants to upload telemetry data for. The device for which the adapter wants to send telemetry data has been registered (see Device Registration API). The adapter indicates its preferred message delivery mode by means of the snd-settle-mode and rcv-settle-mode fields of its attach frame during link establishment.\n snd-settle-mode rcv-settle-mode Delivery semantics unsettled, mixed first Using unsettled for the snd-settle-mode allows for adapters to implement both AT LEAST ONCE or AT MOST ONCE delivery semantics, depending on whether the adapter waits for and considers the disposition frames it receives from the AMQP Messaging Network or not. This is the recommended mode for forwarding telemetry data. settled first Using settled for the snd-settle-mode allows for adapters to implement AT MOST ONCE delivery semantics only. This is the fastest mode of delivery but has the drawback of less reliable end-to-end flow control and potential loss of messages without notice. All other combinations are not supported by Hono and may result in the termination of the link or connection (depending on the configuration of the AMQP Messaging Network).\nMessage Flow\nAs indicated above, it is up to the discretion of the protocol adapter whether it wants to use AT LEAST ONCE or AT MOST ONCE delivery semantics.\nHono\u0026rsquo;s HTTP adapter allows devices to indicate, which delivery semantics they want to use when uploading telemetry data.\nThe following sequence diagram illustrates the flow of messages involved in the HTTP Adapter forwarding an unsettled telemetry data message to the downstream AMQP Messaging Network implementing AT MOST ONCE delivery semantics.\n Forward telemetry data flow (AT MOST ONCE) Device 4711 PUTs telemetry data to the HTTP Adapter HTTP Adapter transfers telemetry data to AMQP 1.0 Messaging Network. HTTP Adapter acknowledges the reception of the data to the Device. AMQP 1.0 Messaging Network acknowledges reception of the message which is ignored by the HTTP Adapter. Note In the example above the HTTP adapter does not wait for the outcome of the transfer of the message to the AMQP Messaging Network before sending back the HTTP response to the device. If the messaging network had sent a disposition frame with the rejected instead of the accepted outcome, the HTTP adapter would still have signaled a 202 status code back to the device. In this case the data would have been lost without the device noticing. The following sequence diagram illustrates the flow of messages involved in the HTTP Adapter forwarding an unsettled telemetry data message to the downstream AMQP Messaging Network implementing AT LEAST ONCE delivery semantics.\n Forward telemetry data flow (AT LEAST ONCE) Device 4711 PUTs telemetry data to the HTTP Adapter, indicating QoS Level 1. HTTP Adapter transfers telemetry data to AMQP 1.0 Messaging Network. AMQP 1.0 Messaging Network acknowledges reception of the message. HTTP Adapter acknowledges the reception of the data to the Device. When the AMQP Messaging Network fails to settle the transfer of a telemetry message or settles the transfer with any other outcome than accepted, the protocol adapter MUST NOT try to re-send such rejected messages but SHOULD indicate the failed transfer to the device if the transport protocol provides means to do so.\nMessage Format\nThe following table provides an overview of the properties a client needs to set on a Forward Telemetry Data message.\n Name Mandatory Location Type Description content-type yes properties symbol A content type indicating the type and characteristics of the data contained in the payload, e.g. text/plain; charset=\u0026quot;utf-8\u0026quot; for a text message or application/json etc. The value may be set to application/octet-stream if the message payload is to be considered opaque binary data. creation-time no properties timestamp The instant in time when the message has been created (see the AMQP 1.0 specification for details). This property is mandatory if ttd is set, otherwise it is optional. device_id yes application-properties string The identifier of the device that the data in the payload is originating from. ttd no application-properties int The time \u0026lsquo;til disconnect indicates the number of seconds that the device will remain connected to the protocol adapter. The value of this property must be interpreted relative to the message\u0026rsquo;s creation-time. A value of -1 is used to indicate that the device will remain connected until further notice, i.e. until another message indicates a ttd value of 0. In absence of this property, the connection status of the device is to be considered indeterminate. Backend Applications might use this information to determine a time window during which the device will be able to receive a command. The body of the message MUST consist of a single AMQP Data section containing the telemetry data. The format and encoding of the data MUST be indicated by the content-type and (optional) content-encoding properties of the message.\nAny additional properties set by the client in either the properties or application-properties sections are preserved by Hono, i.e. these properties will also be contained in the message delivered to consumers.\nNorthbound Operations Receive Telemetry Data Hono delivers messages containing telemetry data reported by a particular device in the same order that they have been received in (using the Upload Telemetry Data operation defined above). Hono MAY drop telemetry messages that it cannot deliver to any consumers. Reasons for this include that there are no consumers connected to Hono or the existing consumers are not able to process the messages from Hono fast enough.\nHono supports multiple non-competing Business Application consumers of telemetry data for a given tenant. Hono allows each Business Application to have multiple competing consumers for telemetry data for a given tenant to share the load of processing the messages.\nPreconditions\n Client has established an AMQP connection with Hono. Client has established an AMQP link in role receiver with Hono using source address telemetry/${tenant_id} where ${tenant_id} represents the ID of the tenant the client wants to retrieve telemetry data for. Hono supports both AT MOST ONCE as well as AT LEAST ONCE delivery of telemetry messages. However, clients SHOULD use AT LEAST ONCE delivery in order to support end-to-end flow control and therefore SHOULD set the snd-settle-mode field to unsettled and the rcv-settle-mode field to first in their attach frame during link establishment.\nA client MAY indicate to Hono during link establishment that it wants to distribute the telemetry messages received for a given tenant among multiple consumers by including a link property subscription-name whose value is shared by all other consumers of the tenant. Hono ensures that messages from a given device are delivered to the same consumer. Note that this also means that telemetry messages MAY not be evenly distributed among consumers, e.g. when only a single device sends data. NB This feature is not supported yet.\nIn addition a client MAY include a boolean link property ordering-required with value false during link establishment in order to indicate to Hono that it does not require messages being delivered strictly in order per device but instead allows for messages being distributed evenly among the consumers. NB This feature is not supported yet.\nMessage Flow\nThe following sequence diagram illustrates the flow of messages involved in a Business Application receiving a telemetry data message from Hono. The delivery mode used is AT LEAST ONCE.\n Receive Telemetry Data AMQP 1.0 Messaging Network delivers telemetry message to Business Application. Business Application acknowledges reception of message. Note The Business Application can only consume telemetry messages that have been uploaded to Hono after the Business Application has established the link with the AMQP 1.0 Messaging Network. This is because telemetry messages are not durable, i.e. they are not persisted in Hono in order to be forwarded at a later time. Message Format\nThe format of the messages containing the telemetry data is the same as for the Upload Telemetry Data operation.\n"
+ "content": "The Telemetry API is used by Protocol Adapters to send telemetry data downstream. Business Applications and other consumers use the API to receive data published by devices belonging to a particular tenant.\nThe Telemetry API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using AMQP 1.0 in order to invoke operations of the API as described in the following sections. Throughout the remainder of this page we will simply use AMQP when referring to AMQP 1.0.\nSouthbound Operations The following operations can be used by Protocol Adapters to forward telemetry data received from devices to downstream consumers like Business Applications.\nForward Telemetry Data Preconditions\n Adapter has established an AMQP connection with the AMQP Messaging Network. Adapter has established an AMQP link in role sender with the AMQP Messaging Network using target address telemetry/${tenant_id} where ${tenant_id} is the ID of the tenant that the client wants to upload telemetry data for. The device for which the adapter wants to send telemetry data has been registered (see Device Registration API). The adapter indicates its preferred message delivery mode by means of the snd-settle-mode and rcv-settle-mode fields of its attach frame during link establishment.\n snd-settle-mode rcv-settle-mode Delivery semantics unsettled, mixed first Using unsettled for the snd-settle-mode allows for adapters to implement both AT LEAST ONCE or AT MOST ONCE delivery semantics, depending on whether the adapter waits for and considers the disposition frames it receives from the AMQP Messaging Network or not. This is the recommended mode for forwarding telemetry data. settled first Using settled for the snd-settle-mode allows for adapters to implement AT MOST ONCE delivery semantics only. This is the fastest mode of delivery but has the drawback of less reliable end-to-end flow control and potential loss of messages without notice. All other combinations are not supported by Hono and may result in the termination of the link or connection (depending on the configuration of the AMQP Messaging Network).\nMessage Flow\nAs indicated above, it is up to the discretion of the protocol adapter whether it wants to use AT LEAST ONCE or AT MOST ONCE delivery semantics.\nHono\u0026rsquo;s HTTP adapter allows devices to indicate, which delivery semantics they want to use when uploading telemetry data. The HTTP adapter always forwards messages unsettled and either ignores the outcome of the message transfer (AT MOST ONCE) or waits for the downstream peer to accept the message (AT LEAST ONCE) before acknowledging the reception of the message to the device.\nThe following sequence diagram illustrates the flow of messages involved in the HTTP Adapter forwarding an unsettled telemetry data message to the downstream AMQP Messaging Network implementing AT MOST ONCE delivery semantics.\n Forward telemetry data flow (AT MOST ONCE) Device 4711 PUTs telemetry data to the HTTP Adapter HTTP Adapter transfers telemetry data to AMQP 1.0 Messaging Network. HTTP Adapter acknowledges the reception of the data to the Device. AMQP 1.0 Messaging Network acknowledges reception of the message which is ignored by the HTTP Adapter. Note In the example above the HTTP adapter does not wait for the outcome of the transfer of the message to the AMQP Messaging Network before sending back the HTTP response to the device. If the messaging network had sent a disposition frame with the rejected instead of the accepted outcome, the HTTP adapter would still have signaled a 202 status code back to the device. In this case the data would have been lost without the device noticing. The following sequence diagram illustrates the flow of messages involved in the HTTP Adapter forwarding an unsettled telemetry data message to the downstream AMQP Messaging Network implementing AT LEAST ONCE delivery semantics.\n Forward telemetry data flow (AT LEAST ONCE) Device 4711 PUTs telemetry data to the HTTP Adapter, indicating QoS Level 1. HTTP Adapter transfers telemetry data to AMQP 1.0 Messaging Network. AMQP 1.0 Messaging Network acknowledges reception of the message. HTTP Adapter acknowledges the reception of the data to the Device. When the AMQP Messaging Network fails to settle the transfer of a telemetry message or settles the transfer with any other outcome than accepted, the protocol adapter MUST NOT try to re-send such rejected messages but SHOULD indicate the failed transfer to the device if the transport protocol provides means to do so.\nMessage Format\nThe following table provides an overview of the properties a client needs to set on a Forward Telemetry Data message.\n Name Mandatory Location Type Description content-type yes properties symbol A content type indicating the type and characteristics of the data contained in the payload, e.g. text/plain; charset=\u0026quot;utf-8\u0026quot; for a text message or application/json etc. The value may be set to application/octet-stream if the message payload is to be considered opaque binary data. creation-time no properties timestamp The instant in time when the message has been created (see the AMQP 1.0 specification for details). This property is mandatory if ttd is set, otherwise it is optional. device_id yes application-properties string The identifier of the device that the data in the payload is originating from. ttd no application-properties int The time \u0026lsquo;til disconnect indicates the number of seconds that the device will remain connected to the protocol adapter. The value of this property must be interpreted relative to the message\u0026rsquo;s creation-time. A value of -1 is used to indicate that the device will remain connected until further notice, i.e. until another message indicates a ttd value of 0. In absence of this property, the connection status of the device is to be considered indeterminate. Backend Applications might use this information to determine a time window during which the device will be able to receive a command. The body of the message MUST consist of a single AMQP Data section containing the telemetry data. The format and encoding of the data MUST be indicated by the content-type and (optional) content-encoding properties of the message.\nAny additional properties set by the client in either the properties or application-properties sections are preserved by Hono, i.e. these properties will also be contained in the message delivered to consumers.\nNorthbound Operations Receive Telemetry Data Hono delivers messages containing telemetry data reported by a particular device in the same order that they have been received in (using the Forward Telemetry Data operation). Hono MAY drop telemetry messages that it cannot deliver to any consumers. Reasons for this include that there are no consumers connected to Hono or the existing consumers are not able to process the messages from Hono fast enough.\nHono supports multiple non-competing Business Application consumers of telemetry data for a given tenant. Hono allows each Business Application to have multiple competing consumers for telemetry data for a given tenant to share the load of processing the messages.\nPreconditions\n Client has established an AMQP connection with Hono. Client has established an AMQP link in role receiver with Hono using source address telemetry/${tenant_id} where ${tenant_id} represents the ID of the tenant the client wants to retrieve telemetry data for. Hono supports both AT MOST ONCE as well as AT LEAST ONCE delivery of telemetry messages. However, clients SHOULD use AT LEAST ONCE delivery in order to support end-to-end flow control and therefore SHOULD set the snd-settle-mode field to unsettled and the rcv-settle-mode field to first in their attach frame during link establishment.\nA client MAY indicate to Hono during link establishment that it wants to distribute the telemetry messages received for a given tenant among multiple consumers by including a link property subscription-name whose value is shared by all other consumers of the tenant. Hono ensures that messages from a given device are delivered to the same consumer. Note that this also means that telemetry messages MAY not be evenly distributed among consumers, e.g. when only a single device sends data. NB This feature is not supported yet.\nIn addition a client MAY include a boolean link property ordering-required with value false during link establishment in order to indicate to Hono that it does not require messages being delivered strictly in order per device but instead allows for messages being distributed evenly among the consumers. NB This feature is not supported yet.\nMessage Flow\nThe following sequence diagram illustrates the flow of messages involved in a Business Application receiving a telemetry data message from Hono. The delivery mode used is AT LEAST ONCE.\n Receive Telemetry Data AMQP 1.0 Messaging Network delivers telemetry message to Business Application. Business Application acknowledges reception of message. Note The Business Application can only consume telemetry messages that have been uploaded to Hono after the Business Application has established the link with the AMQP 1.0 Messaging Network. This is because telemetry messages are not durable, i.e. they are not persisted in Hono in order to be forwarded at a later time. Message Format\nThe format of the messages containing the telemetry data is the same as for the Forward Telemetry Data operation.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/api/event/",
"title": "Event API Specification",
"tags": [],
"description": "",
- "content": "The Event API is used by Protocol Adapters to send event messages downstream. Business Applications and other consumers use the API to receive messages published by devices belonging to a particular tenant.\nThe Event API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using AMQP 1.0 in order to invoke operations of the API as described in the following sections. Throughout the remainder of this page we will simply use AMQP when referring to AMQP 1.0.\nSouthbound Operations The following operations can be used by Protocol Adapters to forward event messages received from devices to downstream consumers like Business Applications.\nForward Event Preconditions\n Adapter has established an AMQP connection with the AMQP Messaging Network. Adapter has established an AMQP link in role sender with the AMQP Messaging Network using target address event/${tenant_id} where ${tenant_id} is the ID of the tenant that the client wants to upload event messages for. The device for which the adapter wants to send an event has been registered (see Device Registration API). Hono supports AT LEAST ONCE delivery of Event messages only. A client therefore MUST use unsettled for the snd-settle-mode and first for the rcv-settle-mode fields of its attach frame during link establishment. All other combinations are not supported by Hono and may result in the termination of the link or connection (depending on the configuration of the AMQP Messaging Network).\nThe AMQP messages used to forward events to the AMQP Messaging Network MUST have their durable property set to true. The AMQP Messaging Network is expected to write such messages to a persistent store before settling the transfer with the accepted outcome.\nMessage Flow\nThe following sequence diagram illustrates the flow of messages involved in the MQTT Adapter forwarding an event to the downstream AMQP Messaging Network.\n Forward event flow Device 4711 publishes an event using MQTT QoS 1. MQTT Adapter transfers data to AMQP 1.0 Messaging Network. AMQP 1.0 Messaging Network acknowledges reception of the message. MQTT Adapter acknowledges the message published by the device. When the AMQP Messaging Network fails to settle the transfer of an event message or settles the transfer with any other outcome than accepted, the protocol adapter MUST NOT try to re-send such rejected messages but MUST indicate the failed transfer to the device if the transport protocol provides means to do so.\nMessage Format\nSee Telemetry API for definition of message format.\nNorthbound Operations Receive Events Hono delivers messages containing events reported by a particular device in the same order that they have been received in (using the Forward Event operation defined above).\nHono supports multiple non-competing Business Application consumers of event messages for a given tenant. Hono allows each Business Application to have multiple competing consumers for event messages for a given tenant to share the load of processing the messages.\nPreconditions\n Client has established an AMQP connection with Hono. Client has established an AMQP link in role receiver with Hono using source address event/${tenant_id} where ${tenant_id} represents the ID of the tenant the client wants to retrieve event messages for. Hono supports AT LEAST ONCE delivery of Event messages only. A client therefore MUST use unsettled for the snd-settle-mode and first for the rcv-settle-mode fields of its attach frame during link establishment. All other combinations are not supported by Hono and result in the termination of the link.\nMessage Flow\nThe following sequence diagram illustrates the flow of messages involved in a Business Application receiving an event data message from Hono.\n Receive event data flow (success) AMQP 1.0 Messaging Network delivers event message to Business Application. Business Application acknowledges reception of message. Message Format\nSee Telemetry API for definition of message format.\nWell-known Event Message Types Hono defines several well-known event types which have specific semantics. Events of these types are identified by means of the AMQP message\u0026rsquo;s content-type.\nEmpty Notification An AMQP message containing this type of event does not have any payload so the body of the message MUST be empty.\nThe AMQP 1.0 properties an event sender needs to set for an empty notification event are defined in the Telemetry API.\nThe relevant properties are listed again in the following table:\n Name Mandatory Location Type Description content-type yes properties symbol MUST be set to application/vnd.eclipse-hono-empty-notification ttd no application-properties int The time \u0026lsquo;til disconnect as described in the Telemetry API. NB: An empty notification can be used to indicate to a Business Application that a device is currently ready to receive an upstream message by setting the ttd property. Backend Applications may use this information to determine the time window during which the device will be able to receive a command.\nConnection Event Protocol Adapters may send this type of event to indicate that a connection with a device has been established or has ended. Note that such events can only be sent for authenticated devices, though, because an event is always scoped to a tenant and the tenant of a device is established as part of the authentication process.\nThe AMQP message for a connection event MUST contain the following properties in addition to the standard event properties:\n Name Mandatory Location Type Description content-type yes properties symbol Must be set to application/vnd.eclipse-hono-dc-notification+json device_id yes application-properties string The ID of the authenticated device Each connection event\u0026rsquo;s payload MUST contain a UTF-8 encoded string representation of a single JSON object with the following fields:\n Name Mandatory Type Description cause yes string The cause of the connection event. MUST be set to either connected or disconnected. remote-id yes string An identifier of the device that is the subject of this event, e.g. an IP address:port, client id etc. The format and semantics of this identifier is specific to the protocol adapter and the transport protocol it supports. source yes string The type name of the protocol adapter reporting the event, e.g. hono-mqtt. data no object An arbitrary JSON object which may contain additional information about the occurrence of the event. The example below might be used by the MQTT adapter to indicate that a connection with a device using client identifier mqtt-client-id-1 has been established:\n{ \u0026quot;cause\u0026quot;: \u0026quot;connected\u0026quot;, \u0026quot;remote-id\u0026quot;: \u0026quot;mqtt-client-id-1\u0026quot;, \u0026quot;source\u0026quot;: \u0026quot;hono-mqtt\u0026quot;, \u0026quot;data\u0026quot;: { \u0026quot;foo\u0026quot;: \u0026quot;bar\u0026quot; } } "
+ "content": "The Event API is used by Protocol Adapters to send event messages downstream. Business Applications and other consumers use the API to receive messages published by devices belonging to a particular tenant.\nThe Event API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using AMQP 1.0 in order to invoke operations of the API as described in the following sections. Throughout the remainder of this page we will simply use AMQP when referring to AMQP 1.0.\nSouthbound Operations The following operations can be used by Protocol Adapters to forward event messages received from devices to downstream consumers like Business Applications.\nForward Event Preconditions\n Adapter has established an AMQP connection with the AMQP Messaging Network. Adapter has established an AMQP link in role sender with the AMQP Messaging Network using target address event/${tenant_id} where ${tenant_id} is the ID of the tenant that the client wants to upload event messages for. The device for which the adapter wants to send an event has been registered (see Device Registration API). Hono supports AT LEAST ONCE delivery of Event messages only. A client therefore MUST use unsettled for the snd-settle-mode and first for the rcv-settle-mode fields of its attach frame during link establishment. All other combinations are not supported by Hono and may result in the termination of the link or connection (depending on the configuration of the AMQP Messaging Network).\nThe AMQP messages used to forward events to the AMQP Messaging Network MUST have their durable property set to true. The AMQP Messaging Network is expected to write such messages to a persistent store before settling the transfer with the accepted outcome.\nMessage Flow\nThe following sequence diagram illustrates the flow of messages involved in the MQTT Adapter forwarding an event to the downstream AMQP Messaging Network.\n Forward event flow Device 4711 publishes an event using MQTT QoS 1. MQTT Adapter transfers data to AMQP 1.0 Messaging Network. AMQP 1.0 Messaging Network acknowledges reception of the message. MQTT Adapter acknowledges the reception of the message to the Device. When the AMQP Messaging Network fails to settle the transfer of an event message or settles the transfer with any other outcome than accepted, the protocol adapter MUST NOT try to re-send such rejected messages but MUST indicate the failed transfer to the device if the transport protocol provides means to do so.\nMessage Format\nSee Telemetry API for definition of message format.\nNorthbound Operations Receive Events Hono delivers messages containing events reported by a particular device in the same order that they have been received in (using the Forward Event operation).\nHono supports multiple non-competing Business Application consumers of event messages for a given tenant. Hono allows each Business Application to have multiple competing consumers for event messages for a given tenant to share the load of processing the messages.\nPreconditions\n Client has established an AMQP connection with Hono. Client has established an AMQP link in role receiver with Hono using source address event/${tenant_id} where ${tenant_id} represents the ID of the tenant the client wants to retrieve event messages for. Hono supports AT LEAST ONCE delivery of Event messages only. A client therefore MUST use unsettled for the snd-settle-mode and first for the rcv-settle-mode fields of its attach frame during link establishment. All other combinations are not supported by Hono and result in the termination of the link.\nMessage Flow\nThe following sequence diagram illustrates the flow of messages involved in a Business Application receiving an event message from Hono.\n Receive event data flow (success) AMQP 1.0 Messaging Network delivers event message to Business Application. Business Application acknowledges reception of message. Message Format\nSee Telemetry API for definition of message format.\nWell-known Event Message Types Hono defines several well-known event types which have specific semantics. Events of these types are identified by means of the AMQP message\u0026rsquo;s content-type.\nEmpty Notification An AMQP message containing this type of event does not have any payload so the body of the message MUST be empty.\nThe AMQP 1.0 properties an event sender needs to set for an empty notification event are defined in the Telemetry API.\nThe relevant properties are listed again in the following table:\n Name Mandatory Location Type Description content-type yes properties symbol MUST be set to application/vnd.eclipse-hono-empty-notification ttd no application-properties int The time \u0026lsquo;til disconnect as described in the Telemetry API. NB An empty notification can be used to indicate to a Business Application that a device is currently ready to receive an upstream message by setting the ttd property. Backend Applications may use this information to determine the time window during which the device will be able to receive a command.\nConnection Event Protocol Adapters may send this type of event to indicate that a connection with a device has been established or has ended. Note that such events can only be sent for authenticated devices, though, because an event is always scoped to a tenant and the tenant of a device is established as part of the authentication process.\nThe AMQP message for a connection event MUST contain the following properties in addition to the standard event properties:\n Name Mandatory Location Type Description content-type yes properties symbol Must be set to application/vnd.eclipse-hono-dc-notification+json device_id yes application-properties string The ID of the authenticated device Each connection event\u0026rsquo;s payload MUST contain a UTF-8 encoded string representation of a single JSON object with the following fields:\n Name Mandatory Type Description cause yes string The cause of the connection event. MUST be set to either connected or disconnected. remote-id yes string An identifier of the device that is the subject of this event, e.g. an IP address:port, client id etc. The format and semantics of this identifier is specific to the protocol adapter and the transport protocol it supports. source yes string The type name of the protocol adapter reporting the event, e.g. hono-mqtt. data no object An arbitrary JSON object which may contain additional information about the occurrence of the event. The example below might be used by the MQTT adapter to indicate that a connection with a device using client identifier mqtt-client-id-1 has been established:\n{ \u0026quot;cause\u0026quot;: \u0026quot;connected\u0026quot;, \u0026quot;remote-id\u0026quot;: \u0026quot;mqtt-client-id-1\u0026quot;, \u0026quot;source\u0026quot;: \u0026quot;hono-mqtt\u0026quot;, \u0026quot;data\u0026quot;: { \u0026quot;foo\u0026quot;: \u0026quot;bar\u0026quot; } } "
},
{
"uri": "https://www.eclipse.org/hono/docs/api/command-and-control/",
@@ -263,7 +263,7 @@
"title": "Tenant API Specification",
"tags": [],
"description": "",
- "content": "The Tenant API is used by Hono\u0026rsquo;s protocol adapters to retrieve information that affects all devices belonging to a particular tenant. A tenant is a logical entity, which groups together a set of devices. The information registered for a tenant is used for example to determine if devices belonging to the tenant are allowed to connect to a certain protocol adapter or if devices are required to authenticate.\nThis document describes the Tenant API\u0026rsquo;s operations and the payload data format used by them. Please refer to Multi Tenancy for details regarding the way Hono supports multiple tenants.\nThe Tenant API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using an AMQP 1.0 client in order to invoke operations of the API as described in the following sections.\n\nPreconditions for invoking the Tenant API Client has established an AMQP connection with the Tenant service. Client has established an AMQP link in role sender on the connection using target address tenant. This link is used by the client to send request messages to the Tenant service. Client has established an AMQP link in role receiver on the connection using source address tenant/${reply-to} where reply-to may be any arbitrary string chosen by the client. This link is used by the client to receive responses to the requests it has sent to the Tenant service. This link\u0026rsquo;s source address is also referred to as the reply-to address for the request messages. Client connecting to Tenant service Get Tenant Information Clients use this operation to retrieve information about a tenant.\nMessage Flow\nThe following sequence diagram illustrates the flow of messages involved in a Client retrieving tenant information.\n Client retrieving tenant information Request Message Format\nThe following table provides an overview of the properties a client needs to set on a message to get tenant information:\n Name Mandatory Location AMQP Type Description correlation-id no properties message-id MAY contain an ID used to correlate a response message to the original request. If set, it is used as the correlation-id property in the response, otherwise the value of the message-id property is used. Either this or the message-id property MUST be set. message-id no properties string MAY contain an identifier that uniquely identifies the message at the sender side. Either this or the correlation-id property MUST be set. reply-to yes properties string MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client\u0026rsquo;s receive link (see Preconditions). subject yes properties string MUST be set to get. The body of the request message MUST consist of a single Data section containing a UTF-8 encoded string representation of a single JSON object.\nThe JSON object MUST contain exactly one of the following search criteria properties:\n Name Mandatory JSON Type Description subject-dn no string The subject DN of the trusted certificate authority\u0026rsquo;s public key in the format defined by RFC 2253. tenant-id no string The identifier of the tenant to get. The following request payload may be used to look up the tenant with identifier ACME Corporation:\n{ \u0026quot;tenant-id\u0026quot;: \u0026quot;ACME Corporation\u0026quot; } The following request payload may be used to look up the tenant for which a trusted certificate authority with subject DN O=ACME Corporation, CN=devices has been configured:\n{ \u0026quot;subject-dn\u0026quot;: \u0026quot;CN=devices,O=ACME Corporation\u0026quot; } Response Message Format\nThe following table provides an overview of the properties contained in a response message to a get tenant information request:\n Name Mandatory Location AMQP Type Description correlation-id yes properties message-id Contains the message-id (or the correlation-id, if specified) of the request message that this message is the response to. content-type no properties string MUST be set to application/json if the invocation of the operation was successful and the body of the response message contains payload as described below. status yes application-properties int Contains the status code indicating the outcome of the operation. Concrete values and their semantics are defined for each particular operation. cache_control no application-properties string Contains an RFC 2616 compliant cache directive. The directive contained in the property MUST be obeyed by clients that are caching responses. The response message\u0026rsquo;s status property may contain the following codes:\n Code Description 200 OK, The response message body contains the requested tenant information. 400 Bad Request, the request message did not contain all mandatory properties. 403 Forbidden, the client is not authorized to retrieve information for the given tenant. 404 Not Found, there is no tenant matching the given search criteria. For status codes indicating an error (codes in the 400 - 499 range) the message body MAY contain a detailed description of the error that occurred. In this case, the response message\u0026rsquo;s content-type property SHOULD be set accordingly.\nOtherwise the response message contains the information for the requested tenant as described in the following sections.\n\nTenant Information Format Tenant information is carried in a single Data section of the response message as a UTF-8 encoded string representation of a single JSON object. It is an error to include payload that is not of this type.\nThe table below provides an overview of the standard members defined for the JSON response object:\n Name Mandatory JSON Type Description adapters no array A list of configuration options valid for certain adapters only. The format of a configuration option is described here Adapter Configuration Format. NB If the element is provided then the list MUST NOT be empty. NB Only a single entry per type is allowed. If multiple entries for the same type are present it is handled as an error. NB If the element is omitted then all adapters are enabled in their default configuration. defaults no object Arbitrary default properties for devices belonging to the tenant. The properties can be used by protocol adapters to augment downstream messages with missing information, e.g. setting a default content type or time-to-live. enabled yes boolean If set to false the tenant is currently disabled. Protocol adapters MUST NOT allow devices of a disabled tenant to connect and MUST NOT accept data published by such devices. minimum-message-size no number The minimum message size in bytes. If it is set then the payload size of the telemetry, event and command messages are calculated in accordance with the configured value and then reported to the metrics. See Metrics for more details. resource-limits no object Any resource limits that should be enforced for the tenant, e.g. the maximum number of concurrent connections and the maximum data volume for a given period. Refer to Resource Limits Configuration Format for details. tenant-id yes string The ID of the tenant. tracing no object A set of options regarding the tracing of messages for the tenant. See Tracing Format for a definition of the content model of the object. trusted-ca no object The trusted certificate authority to use for validating certificates presented by devices of the tenant for authentication purposes. See Trusted Certificate Authority Format for a definition of the content model of the object. The JSON object MAY contain an arbitrary number of additional members with arbitrary names which can be of a scalar or a complex type. This allows for future well-known additions and also allows to add further information which might be relevant to a custom adapter only.\nExamples\nThe JSON structure below contains example information for tenant TEST_TENANT. Note that the structure contains some custom properties at both the root level (customer) as well as the adapter configuration level (deployment) and also defines a default TTL for downstream messages.\n{ \u0026quot;tenant-id\u0026quot; : \u0026quot;TEST_TENANT\u0026quot;, \u0026quot;defaults\u0026quot;: { \u0026quot;ttl\u0026quot;: 30 }, \u0026quot;enabled\u0026quot; : true, \u0026quot;customer\u0026quot;: \u0026quot;ACME Inc.\u0026quot;, \u0026quot;resource-limits\u0026quot;: { \u0026quot;max-connections\u0026quot;: 100000, \u0026quot;data-volume\u0026quot;: { \u0026quot;max-bytes\u0026quot;: 2147483648, \u0026quot;period-in-days\u0026quot;: 30, \u0026quot;effective-since\u0026quot;: \u0026quot;2019-04-27\u0026quot; } }, \u0026quot;adapters\u0026quot; : [ { \u0026quot;type\u0026quot; : \u0026quot;hono-mqtt\u0026quot;, \u0026quot;enabled\u0026quot; : true, \u0026quot;device-authentication-required\u0026quot; : true }, { \u0026quot;type\u0026quot; : \u0026quot;hono-http\u0026quot;, \u0026quot;enabled\u0026quot; : true, \u0026quot;device-authentication-required\u0026quot; : true, \u0026quot;deployment\u0026quot;: { \u0026quot;maxInstances\u0026quot;: 4 } } ] } Tracing Format The table below provides an overview of the members defined for the tracing JSON object:\n Name Mandatory Type Default Value Description sampling-mode no string default Defines in how far OpenTracing spans created when processing messages for this tenant shall be recorded (sampled) by the tracing system. The value default lets the default sampling mechanism be used. The value all marks the spans related to this tenant so that they should all be sampled. The value none marks the spans as not to be sampled. The mode defined here may be overridden for a particular auth-id by means of the sampling-mode-per-auth-id property. sampling-mode-per-auth-id no object Defines in how far OpenTracing spans created when processing messages for this tenant and a particular auth-id shall be recorded (sampled) by the tracing system. The child properties have the auth-id as name. A child property value of default lets the default sampling mechanism be used. The child property value all marks the spans related to this tenant and the auth-id so that they should all be sampled. The child property value none marks the spans as not to be sampled. The mode defined for a particular auth-id has precedence over the value defined by the sampling-mode property. Trusted CA Format The table below provides an overview of the members defined for the trusted-ca JSON object:\n Name Mandatory Type Default Value Description subject-dn yes string The subject DN of the trusted root certificate in the format defined by RFC 2253. cert no string The Base64 encoded binary DER encoding of the trusted root X.509 certificate. public-key no string The Base64 encoded binary DER encoding of the trusted root certificate\u0026rsquo;s public key. algorithm no string RSA The name of the public key algorithm. Supported values are RSA and EC. This property is ignored if the cert property is used to store a certificate. The subject-dn MUST be unique among all registered tenants. Either the cert or the public-key MUST be set. Adapter Configuration Format The table below contains the properties which are used to configure a Hono protocol adapter:\n Name Mandatory JSON Type Default Value Description type yes string - The type of the adapter which this configuration belongs to. enabled no boolean false If set to false the tenant is not allowed to receive / send data utilizing the given adapter. device-authentication-required no boolean true If set to false, devices are not required to authenticate with the adapter before sending / receiving data. Protocol adapters SHOULD use the configuration properties set for a tenant when interacting with devices of that tenant, e.g. in order to make authorization decisions etc.\nThe JSON object MAY contain an arbitrary number of additional members with arbitrary names of either scalar or complex type. This allows for future well-known additions and also allows to add further information which might be relevant to a custom adapter only.\nResource Limits Configuration Format The table below contains the properties which are used to configure a tenant\u0026rsquo;s resource limits:\n Name Mandatory JSON Type Default Value Description max-connections no number -1 The maximum number of concurrent connections allowed from devices of this tenant. The default value -1 indicates that no limit is set. data-volume no object - The maximum data volume allowed for the given tenant. Refer to Data Volume Configuration Format for details. Protocol adapters SHOULD use the max-connections property to determine if a device\u0026rsquo;s connection request should be accepted or rejected.\nThe JSON object MAY contain an arbitrary number of additional members with arbitrary names of either scalar or complex type. This allows for future well-known additions and also allows to add further information which might be relevant to a custom adapter only.\nData Volume Configuration Format The table below contains the properties which are used to configure a tenant\u0026rsquo;s data volume limit:\n Name Mandatory JSON Type Default Value Description max-bytes no number -1 The maximum number of bytes allowed for the tenant for each accounting period. MUST be an integer. A negative value indicates that no limit is set. period-in-days no number 30 The length of an accounting period, i.e. the number of days over which the data usage is to be limited. MUST be a positive integer. effective-since yes string - The point in time at which the current settings became effective, i.e. the start of the first accounting period based on these settings. The value MUST be an ISO 8601 compliant combined date and time representation in extended format. Protocol adapters SHOULD use this information to determine if a message originating from or destined to a device should be accepted for processing.\nDelivery States used by the Tenant API A Tenant service implementation uses the following AMQP message delivery states when receiving request messages from clients:\n Delivery State Description ACCEPTED Indicates that the request message has been received and accepted for processing. REJECTED Indicates that the request message has been received but cannot be processed. The disposition frame\u0026rsquo;s error field contains information regarding the reason why. Clients should not try to re-send the request using the same message properties and payload in this case. "
+ "content": "The Tenant API is used by Hono\u0026rsquo;s protocol adapters to retrieve information that affects all devices belonging to a particular tenant. A tenant is a logical entity, which groups together a set of devices. The information registered for a tenant is used for example to determine if devices belonging to the tenant are allowed to connect to a certain protocol adapter or if devices are required to authenticate.\nThis document describes the Tenant API\u0026rsquo;s operations and the payload data format used by them. Please refer to Multi Tenancy for details regarding the way Hono supports multiple tenants.\nThe Tenant API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using an AMQP 1.0 client in order to invoke operations of the API as described in the following sections.\n\nPreconditions for invoking the Tenant API Client has established an AMQP connection with the Tenant service. Client has established an AMQP link in role sender on the connection using target address tenant. This link is used by the client to send request messages to the Tenant service. Client has established an AMQP link in role receiver on the connection using source address tenant/${reply-to} where reply-to may be any arbitrary string chosen by the client. This link is used by the client to receive responses to the requests it has sent to the Tenant service. This link\u0026rsquo;s source address is also referred to as the reply-to address for the request messages. Client connecting to Tenant service Get Tenant Information Clients use this operation to retrieve information about a tenant.\nMessage Flow\nThe following sequence diagram illustrates the flow of messages involved in a Client retrieving tenant information.\n Client retrieving tenant information Request Message Format\nThe following table provides an overview of the properties a client needs to set on a message to get tenant information:\n Name Mandatory Location AMQP Type Description correlation-id no properties message-id MAY contain an ID used to correlate a response message to the original request. If set, it is used as the correlation-id property in the response, otherwise the value of the message-id property is used. Either this or the message-id property MUST be set. message-id no properties string MAY contain an identifier that uniquely identifies the message at the sender side. Either this or the correlation-id property MUST be set. reply-to yes properties string MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client\u0026rsquo;s receive link (see Preconditions). subject yes properties string MUST be set to get. The body of the request message MUST consist of a single Data section containing a UTF-8 encoded string representation of a single JSON object.\nThe JSON object MUST contain exactly one of the following search criteria properties:\n Name Mandatory JSON Type Description subject-dn no string The subject DN of the trusted certificate authority\u0026rsquo;s public key in the format defined by RFC 2253. tenant-id no string The identifier of the tenant to get. The following request payload may be used to look up the tenant with identifier ACME Corporation:\n{ \u0026quot;tenant-id\u0026quot;: \u0026quot;ACME Corporation\u0026quot; } The following request payload may be used to look up the tenant for which a trusted certificate authority with subject DN O=ACME Corporation, CN=devices has been configured:\n{ \u0026quot;subject-dn\u0026quot;: \u0026quot;CN=devices,O=ACME Corporation\u0026quot; } Response Message Format\nThe following table provides an overview of the properties contained in a response message to a get tenant information request:\n Name Mandatory Location AMQP Type Description correlation-id yes properties message-id Contains the message-id (or the correlation-id, if specified) of the request message that this message is the response to. content-type no properties string MUST be set to application/json if the invocation of the operation was successful and the body of the response message contains payload as described below. status yes application-properties int Contains the status code indicating the outcome of the operation. Concrete values and their semantics are defined for each particular operation. cache_control no application-properties string Contains an RFC 2616 compliant cache directive. The directive contained in the property MUST be obeyed by clients that are caching responses. The response message\u0026rsquo;s status property may contain the following codes:\n Code Description 200 OK, The response message body contains the requested tenant information. 400 Bad Request, the request message did not contain all mandatory properties. 403 Forbidden, the client is not authorized to retrieve information for the given tenant. 404 Not Found, there is no tenant matching the given search criteria. For status codes indicating an error (codes in the 400 - 499 range) the message body MAY contain a detailed description of the error that occurred. In this case, the response message\u0026rsquo;s content-type property SHOULD be set accordingly.\nOtherwise the response message contains the information for the requested tenant as described in the following sections.\n\nTenant Information Format Tenant information is carried in a single Data section of the response message as a UTF-8 encoded string representation of a single JSON object. It is an error to include payload that is not of this type.\nThe table below provides an overview of the standard members defined for the JSON response object:\n Name Mandatory JSON Type Description adapters no array A list of configuration options valid for certain adapters only. The format of a configuration option is described here Adapter Configuration Format. NB If the element is provided then the list MUST NOT be empty. NB Only a single entry per type is allowed. If multiple entries for the same type are present it is handled as an error. NB If the element is omitted then all adapters are enabled in their default configuration. defaults no object Arbitrary default properties for devices belonging to the tenant. The properties can be used by protocol adapters to augment downstream messages with missing information, e.g. setting a default content type or time-to-live. enabled yes boolean If set to false the tenant is currently disabled. Protocol adapters MUST NOT allow devices of a disabled tenant to connect and MUST NOT accept data published by such devices. minimum-message-size no number The minimum message size in bytes. If it is set then the payload size of the telemetry, event and command messages are calculated in accordance with the configured value and then reported to the metrics. See Metrics for more details. resource-limits no object Any resource limits that should be enforced for the tenant, e.g. the maximum number of concurrent connections and the maximum data volume for a given period. Refer to Resource Limits Configuration Format for details. tenant-id yes string The ID of the tenant. tracing no object A set of options regarding the tracing of messages for the tenant. See Tracing Format for a definition of the content model of the object. trusted-ca no array The list of trusted certificate authorities to use for validating certificates presented by devices of the tenant for authentication purposes. See Trusted Certificate Authority Format for a definition of the content model of the objects contained in the array. NB If the element is provided then the list MUST NOT be empty. The JSON object MAY contain an arbitrary number of additional members with arbitrary names which can be of a scalar or a complex type. This allows for future well-known additions and also allows to add further information which might be relevant to a custom adapter only.\nExamples\nThe JSON structure below contains example information for tenant TEST_TENANT. Note that the structure contains some custom properties at both the root level (customer) as well as the adapter configuration level (deployment) and also defines a default TTL for downstream messages.\n{ \u0026quot;tenant-id\u0026quot;: \u0026quot;TEST_TENANT\u0026quot;, \u0026quot;defaults\u0026quot;: { \u0026quot;ttl\u0026quot;: 30 }, \u0026quot;enabled\u0026quot;: true, \u0026quot;customer\u0026quot;: \u0026quot;ACME Inc.\u0026quot;, \u0026quot;resource-limits\u0026quot;: { \u0026quot;max-connections\u0026quot;: 100000, \u0026quot;data-volume\u0026quot;: { \u0026quot;max-bytes\u0026quot;: 2147483648, \u0026quot;period\u0026quot;: { \u0026quot;mode\u0026quot;: \u0026quot;days\u0026quot;, \u0026quot;no-of-days\u0026quot;: 30 }, \u0026quot;effective-since\u0026quot;: \u0026quot;2019-07-27T14:30:00Z\u0026quot; } }, \u0026quot;adapters\u0026quot;: [ { \u0026quot;type\u0026quot;: \u0026quot;hono-mqtt\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;device-authentication-required\u0026quot;: true }, { \u0026quot;type\u0026quot;: \u0026quot;hono-http\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;device-authentication-required\u0026quot;: true, \u0026quot;deployment\u0026quot;: { \u0026quot;maxInstances\u0026quot;: 4 } } ] } Tracing Format The table below provides an overview of the members defined for the tracing JSON object:\n Name Mandatory Type Default Value Description sampling-mode no string default Defines in how far OpenTracing spans created when processing messages for this tenant shall be recorded (sampled) by the tracing system. The value default lets the default sampling mechanism be used. The value all marks the spans related to this tenant so that they should all be sampled. The value none marks the spans as not to be sampled. The mode defined here may be overridden for a particular auth-id by means of the sampling-mode-per-auth-id property. sampling-mode-per-auth-id no object Defines in how far OpenTracing spans created when processing messages for this tenant and a particular auth-id shall be recorded (sampled) by the tracing system. The child properties have the auth-id as name. A child property value of default lets the default sampling mechanism be used. The child property value all marks the spans related to this tenant and the auth-id so that they should all be sampled. The child property value none marks the spans as not to be sampled. The mode defined for a particular auth-id has precedence over the value defined by the sampling-mode property. Trusted CA Format The table below provides an overview of the members of a JSON object representing a trusted CA:\n Name Mandatory Type Default Value Description subject-dn yes string - The subject DN of the trusted root certificate in the format defined by RFC 2253. public-key yes string - The Base64 encoded binary DER encoding of the trusted root certificate\u0026rsquo;s public key. algorithm no string RSA The name of the public key algorithm. Supported values are RSA and EC. NB CAs of the same tenant MAY share the same subject DN, e.g. allowing for the definition of overlapping validity periods. However, CAs of different tenants MUST NOT share the same subject DN in order to allow for the unique look up of a tenant by the subject DN of one of its trusted CAs.\nExamples\nBelow is an example payload for a response to a get request for tenant TEST_TENANT. The tenant is configured with two trusted certificate authorities, each using a different public key algorithm.\n{ \u0026quot;tenant-id\u0026quot; : \u0026quot;TEST_TENANT\u0026quot;, \u0026quot;enabled\u0026quot; : true, \u0026quot;trusted-ca\u0026quot;: [{ \u0026quot;subject-dn\u0026quot;: \u0026quot;CN=ca,OU=Hono,O=Eclipse\u0026quot;, \u0026quot;public-key\u0026quot;: \u0026quot;PublicKey==\u0026quot;, \u0026quot;algorithm\u0026quot;: \u0026quot;RSA\u0026quot; }, { \u0026quot;subject-dn\u0026quot;: \u0026quot;CN=ca,OU=Hono,O=ACME Inc.\u0026quot;, \u0026quot;public-key\u0026quot;: \u0026quot;ECKey==\u0026quot;, \u0026quot;algorithm\u0026quot;: \u0026quot;EC\u0026quot; }] } Adapter Configuration Format The table below contains the properties which are used to configure a Hono protocol adapter:\n Name Mandatory JSON Type Default Value Description type yes string - The type of the adapter which this configuration belongs to. enabled no boolean false If set to false the tenant is not allowed to receive / send data utilizing the given adapter. device-authentication-required no boolean true If set to false, devices are not required to authenticate with the adapter before sending / receiving data. Protocol adapters SHOULD use the configuration properties set for a tenant when interacting with devices of that tenant, e.g. in order to make authorization decisions etc.\nThe JSON object MAY contain an arbitrary number of additional members with arbitrary names of either scalar or complex type. This allows for future well-known additions and also allows to add further information which might be relevant to a custom adapter only.\nResource Limits Configuration Format The table below contains the properties which are used to configure a tenant\u0026rsquo;s resource limits:\n Name Mandatory JSON Type Default Value Description max-connections no number -1 The maximum number of concurrent connections allowed from devices of this tenant. The default value -1 indicates that no limit is set. max-ttl no number -1 The maximum time-to-live (in seconds) to use for events published by devices of this tenant. Any default TTL value specified at either the tenant or device level will be limited to the max value specified here. If this property is set to a value greater than -1 and no default TTL is specified for a device, the max value will be used for events published by the device. A value of -1 (the default) indicates that no limit is set. Note that this property contains the TTL in seconds whereas the AMQP 1.0 specification defines a message\u0026rsquo;s ttl header to use milliseconds. data-volume no object - The maximum data volume allowed for the given tenant. Refer to Data Volume Configuration Format for details. Protocol adapters SHOULD use the max-connections property to determine if a device\u0026rsquo;s connection request should be accepted or rejected.\nProtocol adapters SHOULD use the max-ttl property to determine the effective time-to-live for events published by devices as follows:\n If a non-default max-ttl is set for the tenant, use that value as the effective ttl, otherwise set effective ttl to -1. If the event published by the device contains a ttl header and effective ttl is not -1 and the ttl value (in seconds) provided by the device is smaller than the effective ttl, use the device provided ttl value as the new effective ttl. does not contain a ttl header but a default ttl value is configured for the device (with the device level taking precedence over the tenant level) and effective ttl is not -1 and the default value is smaller than the effective ttl, use the default ttl value as the new effective ttl. If effective ttl is not -1, set the downstream event message\u0026rsquo;s ttl header to its value (in milliseconds). The JSON object MAY contain an arbitrary number of additional members with arbitrary names of either scalar or complex type. This allows for future well-known additions and also allows to add further information which might be relevant to a custom adapter only.\nData Volume Configuration Format The table below contains the properties which are used to configure a tenant\u0026rsquo;s data volume limit:\n Name Mandatory JSON Type Default Value Description effective-since yes string - The point in time at which the current settings became effective, i.e. the start of the first accounting period based on these settings. The value MUST be an ISO 8601 compliant combined date and time representation in extended format. max-bytes no number -1 The maximum number of bytes allowed for the tenant for each accounting period. MUST be an integer. A negative value indicates that no limit is set. period no object - The mode and length of an accounting period, i.e. the data usage can limited based on the defined number of days or on a monthly basis. Protocol adapters SHOULD use this information to determine if a message originating from or destined to a device should be accepted for processing.\nData Volume Period Configuration Format The table below contains the properties which are used to configure a tenant\u0026rsquo;s data volume period:\n Name Mandatory JSON Type Default Value Description mode yes string - The mode of the data usage calculation. The default implementation supports two modes namely days and monthly. no-of-days no number - When the mode is set as days, then this value represents the length of an accounting period , i.e. the number of days over which the data usage is to be limited. MUST be a positive integer. Delivery States used by the Tenant API A Tenant service implementation uses the following AMQP message delivery states when receiving request messages from clients:\n Delivery State Description ACCEPTED Indicates that the request message has been received and accepted for processing. REJECTED Indicates that the request message has been received but cannot be processed. The disposition frame\u0026rsquo;s error field contains information regarding the reason why. Clients should not try to re-send the request using the same message properties and payload in this case. "
},
{
"uri": "https://www.eclipse.org/hono/docs/api/device-connection/",
@@ -277,14 +277,14 @@
"title": "Device Registration API Specification",
"tags": [],
"description": "",
- "content": "The Device Registration API is used by Hono\u0026rsquo;s protocol adapters to get information about devices connecting to the adapters.\nThe Device Registration API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using an AMQP 1.0 client in order to invoke operations of the API as described in the following sections.\n\nPreconditions for invoking the Device Registration API Client has established an AMQP connection with the Device Registration service. Client has established an AMQP link in role sender on the connection using target address registration/${tenant_id}. This link is used by the client to send request messages to the Device Registration service. Client has established an AMQP link in role receiver on the connection using source address registration/${tenant_id}/${reply-to} where reply-to may be any arbitrary string chosen by the client. This link is used by the client to receive responses to the requests it has sent to the Device Registration service. This link\u0026rsquo;s source address is also referred to as the reply-to address for the request messages. Client connecting to Device Registration service Assert Device Registration Clients use this command to verify that a device is registered for a particular tenant and is enabled.\nMessage Flow\nThe following sequence diagram illustrates the flow of messages involved in a Client asserting a device\u0026rsquo;s registration status.\n Client asserting a device\u0026#39;s registration status Request Message Format\nThe following table provides an overview of the properties a client needs to set on a message to assert a device\u0026rsquo;s registration status:\n Name Mandatory Location AMQP Type Description correlation-id no properties message-id MAY contain an ID used to correlate a response message to the original request. If set, it is used as the correlation-id property in the response, otherwise the value of the message-id property is used. Either this or the message-id property MUST be set. device_id yes application-properties string MUST contain the ID of the device that is subject to the operation. gateway_id no application-properties string The identifier of the gateway that wants to get an assertion on behalf of another device (given in the device_id property).\nAn implementation SHOULD verify that the gateway exists, is enabled and is authorized to get an assertion for, and thus send data on behalf of, the device. message-id no properties string MAY contain an identifier that uniquely identifies the message at the sender side. Either this or the correlation-id property MUST be set. reply-to yes properties string MUST contain the source address that the client wants to received response messages from. This address MUST be the same as the source address used for establishing the client\u0026rsquo;s receive link (see Preconditions). subject yes properties string MUST be set to assert. The body of the message SHOULD be empty and will be ignored if it is not.\nResponse Message Format\nThe following table provides an overview of the properties contained in a response message to an assert request:\n Name Mandatory Location AMQP Type Description correlation-id yes properties message-id Contains the message-id (or the correlation-id, if specified) of the request message that this message is the response to. content-type no properties string MUST be set to application/json if the invocation of the operation was successful and the body of the response message contains payload as described below. status yes application-properties int Contains the status code indicating the outcome of the operation. Concrete values and their semantics are defined below. cache_control no application-properties string Contains an RFC 2616 compliant cache directive. The directive contained in the property MUST be obeyed by clients that are caching responses. In case of a successful invocation of the operation, the body of the response message consists of a single Data section containing a UTF-8 encoded string representation of a single JSON object having the following properties:\n Name Mandatory JSON Type Description device-id yes string The ID of the device that is subject of the assertion. via no array The IDs (JSON strings) of gateways which may act on behalf of the device. This property MUST be set if any gateways are registered for the device. If the assertion request contained a gateway_id property and the response\u0026rsquo;s status property has value 200 (indicating a successful assertion) then the array MUST at least contain the gateway ID from the request. defaults no object Default values to be used by protocol adapters for augmenting messages from devices with missing information like a content type. It is up to the discretion of a protocol adapter if and how to use the given default values when processing messages published by the device. Below is an example for a payload of a response to an assert request for device 4711 which also includes a default content-type:\n{ \u0026quot;device-id\u0026quot; : \u0026quot;4711\u0026quot;, \u0026quot;via\u0026quot;: [\u0026quot;4712\u0026quot;], \u0026quot;defaults\u0026quot;: { \u0026quot;content-type\u0026quot;: \u0026quot;application/vnd.acme+json\u0026quot; } } The response message\u0026rsquo;s status property may contain the following codes:\n Code Description 200 OK, the device is registered for the given tenant and is enabled. The response message body contains the asserted device\u0026rsquo;s registration status. 400 Bad Request, the request message did not contain all mandatory properties. 403 Forbidden, the gateway with the given gateway id either does not exist, is not enabled or is not authorized to get an assertion for the device with the given device id. 404 Not Found, there is no device registered with the given device id within the given tenant id or the device is not enabled. For status codes indicating an error (codes in the 400 - 499 range) the message body MAY contain a detailed description of the error that occurred. In this case, the response message\u0026rsquo;s content-type property SHOULD be set accordingly.\nDelivery States The Device Registration service uses the following AMQP message delivery states when receiving request messages from clients:\n Delivery State Description ACCEPTED Indicates that the request message has been received and accepted for processing. REJECTED Indicates that the request message has been received but cannot be processed. The disposition frame\u0026rsquo;s error field contains information regarding the reason why. Clients should not try to re-send the request using the same message properties in this case. "
+ "content": "The Device Registration API is used by Hono\u0026rsquo;s protocol adapters to get information about devices connecting to the adapters.\nThe Device Registration API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using an AMQP 1.0 client in order to invoke operations of the API as described in the following sections.\n\nPreconditions for invoking the Device Registration API Client has established an AMQP connection with the Device Registration service. Client has established an AMQP link in role sender on the connection using target address registration/${tenant_id}. This link is used by the client to send request messages to the Device Registration service. Client has established an AMQP link in role receiver on the connection using source address registration/${tenant_id}/${reply-to} where reply-to may be any arbitrary string chosen by the client. This link is used by the client to receive responses to the requests it has sent to the Device Registration service. This link\u0026rsquo;s source address is also referred to as the reply-to address for the request messages. Client connecting to Device Registration service Assert Device Registration Clients use this command to verify that a device is registered for a particular tenant and is enabled.\nMessage Flow\nThe following sequence diagram illustrates the flow of messages involved in a Client asserting a device\u0026rsquo;s registration status.\n Client asserting a device\u0026#39;s registration status Request Message Format\nThe following table provides an overview of the properties a client needs to set on a message to assert a device\u0026rsquo;s registration status:\n Name Mandatory Location AMQP Type Description correlation-id no properties message-id MAY contain an ID used to correlate a response message to the original request. If set, it is used as the correlation-id property in the response, otherwise the value of the message-id property is used. Either this or the message-id property MUST be set. device_id yes application-properties string MUST contain the ID of the device that is subject to the operation. gateway_id no application-properties string The identifier of the gateway that wants to get an assertion on behalf of another device (given in the device_id property).\nAn implementation SHOULD verify that the gateway exists, is enabled and is authorized to get an assertion for, and thus send data on behalf of, the device. message-id no properties string MAY contain an identifier that uniquely identifies the message at the sender side. Either this or the correlation-id property MUST be set. reply-to yes properties string MUST contain the source address that the client wants to received response messages from. This address MUST be the same as the source address used for establishing the client\u0026rsquo;s receive link (see Preconditions). subject yes properties string MUST be set to assert. The body of the message SHOULD be empty and will be ignored if it is not.\nResponse Message Format\nThe following table provides an overview of the properties contained in a response message to an assert request:\n Name Mandatory Location AMQP Type Description correlation-id yes properties message-id Contains the message-id (or the correlation-id, if specified) of the request message that this message is the response to. content-type no properties string MUST be set to application/json if the invocation of the operation was successful and the body of the response message contains payload as described below. status yes application-properties int Contains the status code indicating the outcome of the operation. Concrete values and their semantics are defined below. cache_control no application-properties string Contains an RFC 2616 compliant cache directive. The directive contained in the property MUST be obeyed by clients that are caching responses. In case of a successful invocation of the operation, the body of the response message consists of a single Data section containing a UTF-8 encoded string representation of a single JSON object having the following properties:\n Name Mandatory JSON Type Description device-id yes string The ID of the device that is subject of the assertion. via no array The IDs (JSON strings) of gateways which may act on behalf of the device. This property MUST be set if any gateways are registered for the device. If the assertion request contained a gateway_id property and the response\u0026rsquo;s status property has value 200 (indicating a successful assertion) then the array MUST at least contain the gateway ID from the request. defaults no object Default values to be used by protocol adapters for augmenting messages from devices with missing information like a content type. It is up to the discretion of a protocol adapter if and how to use the given default values when processing messages published by the device. Below is an example for a payload of a response to an assert request for device 4711 which also includes a default content-type:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;via\u0026quot;: [\u0026quot;4712\u0026quot;], \u0026quot;defaults\u0026quot;: { \u0026quot;content-type\u0026quot;: \u0026quot;application/vnd.acme+json\u0026quot; } } The response message\u0026rsquo;s status property may contain the following codes:\n Code Description 200 OK, the device is registered for the given tenant and is enabled. The response message body contains the asserted device\u0026rsquo;s registration status. 400 Bad Request, the request message did not contain all mandatory properties. 403 Forbidden, the gateway with the given gateway id either does not exist, is not enabled or is not authorized to get an assertion for the device with the given device id. 404 Not Found, there is no device registered with the given device id within the given tenant id or the device is not enabled. For status codes indicating an error (codes in the 400 - 499 range) the message body MAY contain a detailed description of the error that occurred. In this case, the response message\u0026rsquo;s content-type property SHOULD be set accordingly.\nDelivery States The Device Registration service uses the following AMQP message delivery states when receiving request messages from clients:\n Delivery State Description ACCEPTED Indicates that the request message has been received and accepted for processing. REJECTED Indicates that the request message has been received but cannot be processed. The disposition frame\u0026rsquo;s error field contains information regarding the reason why. Clients should not try to re-send the request using the same message properties in this case. "
},
{
"uri": "https://www.eclipse.org/hono/docs/api/credentials/",
"title": "Credentials API Specification",
"tags": [],
"description": "",
- "content": "The Credentials API is used by Protocol Adapters to retrieve credentials used to authenticate Devices connecting to the adapter. In particular, the API supports the look up shared secrets which are often used by IoT devices by means of username/password based authentication schemes.\nCredentials are of a certain type which indicates which authentication mechanism the credentials can be used with. Each set of credentials also contains an authentication identity which is the identity claimed by the device during authentication. This authentication identity is usually different from the device-id the device has been registered under. A device may have multiple sets of credentials, using arbitrary authentication identities.\nThe Credentials API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using an AMQP 1.0 client in order to invoke operations of the API as described in the following sections.\n\nPreconditions for invoking the Credentials API Client has established an AMQP connection with the Credentials service. Client has established an AMQP link in role sender on the connection using target address credentials/${tenant_id}. This link is used by the client to send commands to the Credentials service. Client has established an AMQP link in role receiver on the connection using source address credentials/${tenant_id}/${reply-to} where reply-to may be any arbitrary string chosen by the client. This link is used by the client to receive responses to the requests it has sent to the Credentials service. This link\u0026rsquo;s source address is also referred to as the reply-to address for the request messages. Client connecting to Credentials service Get Credentials Protocol adapters use this command to look up credentials of a particular type for a device identity.\nMessage Flow\n Client looking up credentials for a device Request Message Format\nThe following table provides an overview of the properties a client needs to set on an get credentials message.\n Name Mandatory Location AMQP Type Description correlation-id no properties message-id MAY contain an ID used to correlate a response message to the original request. If set, it is used as the correlation-id property in the response, otherwise the value of the message-id property is used. Either this or the message-id property MUST be set. message-id no properties string MAY contain an identifier that uniquely identifies the message at the sender side. Either this or the correlation-id property MUST be set. reply-to yes properties string MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client\u0026rsquo;s receive link (see Preconditions). subject yes properties string MUST contain the value get. The body of the request MUST consist of a single Data section containing a UTF-8 encoded string representation of a single JSON object having the following members:\n Name Mandatory JSON Type Description type yes string The type of credentials to look up. Potential values include (but are not limited to) psk, x509-cert, hashed-password etc. auth-id yes string The authentication identifier to look up credentials for. Additionally, the body MAY contain arbitrary properties that service implementations can use to determine a device\u0026rsquo;s identity.\nThe following request payload may be used to look up the hashed password for a device with the authentication identifier sensor1:\n{ \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot; } Response Message Format\nA response to a get credentials request contains the following properties:\n Name Mandatory Location AMQP Type Description correlation-id yes properties message-id Contains the message-id (or the correlation-id, if specified) of the request message that this message is the response to. content-type no properties string MUST be set to application/json if the invocation of the operation was successful and the body of the response message contains payload as described below. status yes application-properties int Contains the status code indicating the outcome of the operation. Concrete values and their semantics are defined below. cache_control no application-properties string Contains an RFC 2616 compliant cache directive. The directive contained in the property MUST be obeyed by clients that are caching responses. The response message payload MUST contain credential information as defined in Credentials Format if the status is 200.\nThe response message\u0026rsquo;s status property may contain the following codes:\n Code Description 200 OK, the payload contains the credentials for the authentication identifier. 400 Bad Request, the request message did not contain all mandatory properties. 404 Not Found, there are no credentials registered matching the criteria. For status codes indicating an error (codes in the 400 - 499 range) the message body MAY contain a detailed description of the error that occurred. In this case, the response message\u0026rsquo;s content-type property SHOULD be set accordingly.\nDelivery States The Credentials service uses the following AMQP message delivery states when receiving request messages from clients:\n Delivery State Description ACCEPTED Indicates that the request message has been received and accepted for processing. REJECTED Indicates that the request message has been received but cannot be processed. The disposition frame\u0026rsquo;s error field contains information regarding the reason why. Clients should not try to re-send the request using the same message properties in this case. Credentials Format Credential data is carried in the body of an AMQP message as part of a single Data section. The message\u0026rsquo;s content-type property must be set to application/json.\nThe credential data is contained in the Data section as a UTF-8 encoded string representation of a single JSON object. It is an error to include payload that is not of this type.\nThe table below provides an overview of the standard members defined for the JSON object:\n Name Mandatory JSON Type Default Value Description device-id yes string The ID of the device to which the credentials belong. type yes string The credential type name. The value may be arbitrarily chosen by clients but SHOULD reflect the particular type of authentication mechanism the credentials are to be used with. Possible values include (but are not limited to) psk, x509-cert, hashed-password etc. auth-id yes string The identity that the device should be authenticated as. enabled no boolean true If set to false the credentials are not supposed to be used to authenticate devices any longer. This may e.g. be used to disable a particular mechanism for authenticating the device. NB It is the responsibility of the protocol adapter to make use of this information. secrets yes array A list of secrets scoped to a particular time period. See Secrets Format for details. NB This array must contain at least one element - an empty array is considered an error. For each set of credentials the combination of auth-id and type MUST be unique within a tenant.\nThe device registry may choose to not return information which is not suitable for authentication a device. This includes for example the enabled property. If set to false, then the device registry may choose to treat this request as if no credentials would be found. For secrets for example, this could mean that the device registry does not return secrets which are not valid at the current point in time.\nNB Care needs to be taken that the value for the authentication identifier is compliant with the authentication mechanism(s) it is supposed to be used with. For example, when using standard HTTP Basic authentication, the username part of the Basic Authorization header value (which corresponds to the auth-id) MUST not contain any colon (:) characters, because the colon character is used as the separator between username and password. Similar constraints may exist for other authentication mechanisms, so the authentication identifier needs to be chosen with the anticipated mechanism(s) being used in mind. Otherwise, devices may fail to authenticate with protocol adapters, even if the credentials provided by the device match the credentials registered for the device. In general, using only characters from the [a-zA-Z0-9_-] range for the authentication identifier should be compatible with most mechanisms.\nSecrets Format Each set of credentials may contain arbitrary secrets scoped to a particular validity period during which the secrets may be used for authenticating a device. The validity periods MAY overlap in order to support the process of changing a secret on a device that itself doesn\u0026rsquo;t support the definition of multiple secrets for gapless authentication across adjacent validity periods.\nThe table below contains the properties used to define the validity period of a single secret:\n Name Mandatory JSON Type Default Value Description not-before no string null The point in time from which on the secret may be used to authenticate devices. If not null, the value MUST be an ISO 8601 compliant combined date and time representation in extended format. NB It is up to the discretion of the protocol adapter to make use of this information. not-after no string null The point in time until which the secret may be used to authenticate devices. If not null, the value MUST be an ISO 8601 compliant combined date and time representation in extended format. NB It is up to the discretion of the protocol adapter to make use of this information. Examples Below is an example for a payload containing a hashed password for device 4711 with auth-id sensor1 using SHA512 as the hashing function with a 4 byte salt (Base64 encoding of 0x32AEF017). Note that the payload does not contain a not-before property, thus it may be used immediately up until X-mas eve 2017.\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [{ \u0026quot;not-after\u0026quot;: \u0026quot;2017-12-24T19:00:00+0100\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot;, \u0026quot;salt\u0026quot;: \u0026quot;Mq7wFw==\u0026quot;, \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot; }] } The next example contains two pre-shared keys with overlapping validity periods for device myDevice with PSK identity little-sensor2.\n{ \u0026quot;device-id\u0026quot;: \u0026quot;myDevice\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;little-sensor2\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [{ \u0026quot;not-after\u0026quot;: \u0026quot;2017-07-01T00:00:00+0100\u0026quot;, \u0026quot;key\u0026quot;: \u0026quot;cGFzc3dvcmRfb2xk\u0026quot; },{ \u0026quot;not-before\u0026quot;: \u0026quot;2017-06-29T00:00:00+0100\u0026quot;, \u0026quot;key\u0026quot;: \u0026quot;cGFzc3dvcmRfbmV3\u0026quot; }] } Credential Verification Protocol Adapters are responsible for authenticating devices when they connect. The Credentials API provides the Get Credentials operation to support Protocol Adapters in doing so as illustrated below:\nThe following sequence diagram illustrates the flow of messages involved in a Protocol Adapter authenticating a device. This is shown for the MQTT Protocol Adapter as example how a device authenticates with a username and a hashed-password. The mechanism can be transferred to other protocols in a similar manner.\n MQTT Adapter authenticates device using the Credentials service Protocol adapters MUST comply with the following rules when verifying credentials presented by a device:\n Credentials that have their enabled property set to false MUST NOT be used for authentication. Adapters MUST only consider secrets for authentication which\n have their not-before property set to either null or the current or a past point in time and have their not-after property set to either null or the current or a future point in time. Standard Credential Types The following sections define some standard credential types and their properties. Applications are encouraged to make use of these types. However, the types are not enforced anywhere in Hono and clients may of course add application specific properties to the credential types.\nCommon Properties All credential types used with Hono MUST contain device-id, type, auth-id, enabled and secrets properties as defined in Credentials Format.\nHashed Password A credential type for storing a (hashed) password for a device.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;pwd-hash\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot;, \u0026quot;salt\u0026quot;: \u0026quot;Mq7wFw==\u0026quot;, \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot; }] } Name Mandatory JSON Type Default Description type yes string The credential type name, always hashed-password. auth-id yes string The identity that the device should be authenticated as. pwd-hash yes string The password hash (see table below for details). salt no string The Base64 encoding of the salt used in the password hash (see table below for details). hash-function no string sha-256 The name of the hash function used to create the password hash. The hash functions supported by Hono are described in the table below. NB It is strongly recommended to use salted password hashes only. Furthermore, the salt should be unique per user and password, so no lookup table or rainbow table attacks can be used to crack the salt-hashed password. Whenever a password is updated for a user, the salt should change as well.\nNB The example above does not contain any of the not-before, not-after and enabled properties, thus the credentials can be used at any time according to the rules defined in Credential Verification.\nThe table below describes the hash functions supported by Hono and how they map to the secret structure.\n Name Salt Usage Salt Location Password Hash Format sha-256 optional salt field The Base64 encoding of the bytes resulting from applying the sha-256 hash function to the byte array consisting of the salt bytes (if a salt is used) and the UTF-8 encoding of the clear text password. sha-512 optional salt field The Base64 encoding of the bytes resulting from applying the sha-512 hash function to the byte array consisting of the salt bytes (if a salt is used) and the UTF-8 encoding of the clear text password. bcrypt mandatory pwd-hash value The output of applying the Bcrypt hash function to the clear text password. The salt is contained in the password hash.\nNB Hono (currently) uses Spring Security for matching clear text passwords against Bcrypt hashes. However, this library only supports hashes containing the $2a$ prefix (see https://github.com/fpirsch/twin-bcrypt#about-prefixes) so Hono will fail to verify any passwords for which the corresponding Bcrypt hashes returned by the Credentials service contain e.g. the $2y$ prefix. Pre-Shared Key A credential type for storing a Pre-shared Key as used in TLS handshakes.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;little-sensor2\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;key\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot; }] } Name Mandatory JSON Type Description type yes string The credential type name, always psk. auth-id yes string The PSK identity. key yes string The Base64 encoded bytes representing the shared (secret) key. NB The example above does not contain any of the not-before, not-after and enabled properties, thus the credentials can be used at any time according to the rules defined in Credential Verification.\nX.509 Certificate A credential type for storing the RFC 2253 formatted subject DN of a client certificate that is used to authenticate the device as part of a TLS handshake.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;x509-cert\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;CN=device-1,O=ACME Corporation\u0026quot;, \u0026quot;secrets\u0026quot;: [{}] } Name Mandatory JSON Type Description type yes string The credential type name, always x509-cert. auth-id yes string The subject DN of the client certificate in the format defined by RFC 2253. NB The example above does not contain any of the not-before, not-after and enabled properties. The not-before and not-after properties should be omitted if the validity period is the same as the period indicated by the client certificate\u0026rsquo;s corresponding properties. It is still necessary to provide a (empty) JSON object in the secrets array, though.\n"
+ "content": "The Credentials API is used by Protocol Adapters to retrieve credentials used to authenticate Devices connecting to the adapter. In particular, the API supports to look up shared secrets which are often used by IoT devices by means of username/password based authentication schemes.\nCredentials are of a certain type which indicates which authentication mechanism the credentials can be used with. Each set of credentials also contains an authentication identity which is the identity claimed by the device during authentication. This authentication identity is usually different from the device-id the device has been registered under. A device may have multiple sets of credentials, using arbitrary authentication identities.\nThe Credentials API is defined by means of AMQP 1.0 message exchanges, i.e. a client needs to connect to Hono using an AMQP 1.0 client in order to invoke operations of the API as described in the following sections.\n\nPreconditions for invoking the Credentials API Client has established an AMQP connection with the Credentials service. Client has established an AMQP link in role sender on the connection using target address credentials/${tenant_id}. This link is used by the client to send commands to the Credentials service. Client has established an AMQP link in role receiver on the connection using source address credentials/${tenant_id}/${reply-to} where reply-to may be any arbitrary string chosen by the client. This link is used by the client to receive responses to the requests it has sent to the Credentials service. This link\u0026rsquo;s source address is also referred to as the reply-to address for the request messages. Client connecting to Credentials service Get Credentials Protocol adapters use this command to look up credentials of a particular type for a device identity.\nMessage Flow\n Client looking up credentials for a device Request Message Format\nThe following table provides an overview of the properties a client needs to set on an get credentials message.\n Name Mandatory Location AMQP Type Description correlation-id no properties message-id MAY contain an ID used to correlate a response message to the original request. If set, it is used as the correlation-id property in the response, otherwise the value of the message-id property is used. Either this or the message-id property MUST be set. message-id no properties string MAY contain an identifier that uniquely identifies the message at the sender side. Either this or the correlation-id property MUST be set. reply-to yes properties string MUST contain the source address that the client wants to receive response messages from. This address MUST be the same as the source address used for establishing the client\u0026rsquo;s receive link (see Preconditions). subject yes properties string MUST contain the value get. The body of the request MUST consist of a single Data section containing a UTF-8 encoded string representation of a single JSON object having the following members:\n Name Mandatory JSON Type Description type yes string The type of credentials to look up. Potential values include (but are not limited to) psk, x509-cert, hashed-password etc. auth-id yes string The authentication identifier to look up credentials for. Additionally, the body MAY contain arbitrary properties that service implementations can use to determine a device\u0026rsquo;s identity.\nThe following request payload may be used to look up the hashed password for a device with the authentication identifier sensor1:\n{ \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot; } Response Message Format\nA response to a get credentials request contains the following properties:\n Name Mandatory Location AMQP Type Description correlation-id yes properties message-id Contains the message-id (or the correlation-id, if specified) of the request message that this message is the response to. content-type no properties string MUST be set to application/json if the invocation of the operation was successful and the body of the response message contains payload as described below. status yes application-properties int Contains the status code indicating the outcome of the operation. Concrete values and their semantics are defined below. cache_control no application-properties string Contains an RFC 2616 compliant cache directive. The directive contained in the property MUST be obeyed by clients that are caching responses. The response message payload MUST contain credential information as defined in Credentials Format if the status is 200.\nThe response message\u0026rsquo;s status property may contain the following codes:\n Code Description 200 OK, the payload contains the credentials for the authentication identifier. 400 Bad Request, the request message did not contain all mandatory properties. 404 Not Found, there are no credentials registered matching the criteria. For status codes indicating an error (codes in the 400 - 499 range) the message body MAY contain a detailed description of the error that occurred. In this case, the response message\u0026rsquo;s content-type property SHOULD be set accordingly.\nDelivery States The Credentials service uses the following AMQP message delivery states when receiving request messages from clients:\n Delivery State Description ACCEPTED Indicates that the request message has been received and accepted for processing. REJECTED Indicates that the request message has been received but cannot be processed. The disposition frame\u0026rsquo;s error field contains information regarding the reason why. Clients should not try to re-send the request using the same message properties in this case. Credentials Format Credential data is carried in the body of an AMQP message as part of a single Data section. The message\u0026rsquo;s content-type property must be set to application/json.\nThe credential data is contained in the Data section as a UTF-8 encoded string representation of a single JSON object. It is an error to include payload that is not of this type.\nThe table below provides an overview of the standard members defined for the JSON object:\n Name Mandatory JSON Type Default Value Description device-id yes string The ID of the device to which the credentials belong. type yes string The credential type name. The value may be arbitrarily chosen by clients but SHOULD reflect the particular type of authentication mechanism the credentials are to be used with. Possible values include (but are not limited to) psk, x509-cert, hashed-password etc. auth-id yes string The identity that the device should be authenticated as. enabled no boolean true If set to false the credentials are not supposed to be used to authenticate devices any longer. This may e.g. be used to disable a particular mechanism for authenticating the device. NB It is the responsibility of the protocol adapter to make use of this information. secrets yes array A list of secrets scoped to a particular time period. See Secrets Format for details. NB This array must contain at least one element - an empty array is considered an error. For each set of credentials the combination of auth-id and type MUST be unique within a tenant.\nThe device registry may choose to not return information which is not suitable for authentication a device. This includes for example the enabled property. If set to false, then the device registry may choose to treat this request as if no credentials would be found. For secrets for example, this could mean that the device registry does not return secrets which are not valid at the current point in time.\nNB Care needs to be taken that the value for the authentication identifier is compliant with the authentication mechanism(s) it is supposed to be used with. For example, when using standard HTTP Basic authentication, the username part of the Basic Authorization header value (which corresponds to the auth-id) MUST not contain any colon (:) characters, because the colon character is used as the separator between username and password. Similar constraints may exist for other authentication mechanisms, so the authentication identifier needs to be chosen with the anticipated mechanism(s) being used in mind. Otherwise, devices may fail to authenticate with protocol adapters, even if the credentials provided by the device match the credentials registered for the device. In general, using only characters from the [a-zA-Z0-9_-] range for the authentication identifier should be compatible with most mechanisms.\nSecrets Format Each set of credentials may contain arbitrary secrets scoped to a particular validity period during which the secrets may be used for authenticating a device. The validity periods MAY overlap in order to support the process of changing a secret on a device that itself doesn\u0026rsquo;t support the definition of multiple secrets for gapless authentication across adjacent validity periods.\nThe table below contains the properties used to define the validity period of a single secret:\n Name Mandatory JSON Type Default Value Description not-before no string null The point in time from which on the secret may be used to authenticate devices. If not null, the value MUST be an ISO 8601 compliant combined date and time representation in extended format. NB It is up to the discretion of the protocol adapter to make use of this information. not-after no string null The point in time until which the secret may be used to authenticate devices. If not null, the value MUST be an ISO 8601 compliant combined date and time representation in extended format. NB It is up to the discretion of the protocol adapter to make use of this information. Examples Below is an example for a payload containing a hashed password for device 4711 with auth-id sensor1 using SHA512 as the hashing function with a 4 byte salt (Base64 encoding of 0x32AEF017). Note that the payload does not contain a not-before property, thus it may be used immediately up until X-mas eve 2017.\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [{ \u0026quot;not-after\u0026quot;: \u0026quot;2017-12-24T19:00:00+0100\u0026quot;, \u0026quot;pwd-hash\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot;, \u0026quot;salt\u0026quot;: \u0026quot;Mq7wFw==\u0026quot;, \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot; }] } The next example contains two pre-shared keys with overlapping validity periods for device myDevice with PSK identity little-sensor2.\n{ \u0026quot;device-id\u0026quot;: \u0026quot;myDevice\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;little-sensor2\u0026quot;, \u0026quot;enabled\u0026quot;: true, \u0026quot;secrets\u0026quot;: [{ \u0026quot;not-after\u0026quot;: \u0026quot;2017-07-01T00:00:00+0100\u0026quot;, \u0026quot;key\u0026quot;: \u0026quot;cGFzc3dvcmRfb2xk\u0026quot; },{ \u0026quot;not-before\u0026quot;: \u0026quot;2017-06-29T00:00:00+0100\u0026quot;, \u0026quot;key\u0026quot;: \u0026quot;cGFzc3dvcmRfbmV3\u0026quot; }] } Credential Verification Protocol Adapters are responsible for authenticating devices when they connect. The Credentials API provides the Get Credentials operation to support Protocol Adapters in doing so as illustrated below:\nThe following sequence diagram illustrates the flow of messages involved in a Protocol Adapter authenticating a device. This is shown for the MQTT Protocol Adapter as example how a device authenticates with a username and a hashed-password. The mechanism can be transferred to other protocols in a similar manner.\n MQTT Adapter authenticates device using the Credentials service Protocol adapters MUST comply with the following rules when verifying credentials presented by a device:\n Credentials that have their enabled property set to false MUST NOT be used for authentication. Adapters MUST only consider secrets for authentication which\n have their not-before property set to either null or the current or a past point in time and have their not-after property set to either null or the current or a future point in time. Standard Credential Types The following sections define some standard credential types and their properties. Applications are encouraged to make use of these types. However, the types are not enforced anywhere in Hono and clients may of course add application specific properties to the credential types.\nCommon Properties All credential types used with Hono MUST contain device-id, type, auth-id, enabled and secrets properties as defined in Credentials Format.\nHashed Password A credential type for storing a (hashed) password for a device.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;hashed-password\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;sensor1\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;pwd-hash\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot;, \u0026quot;salt\u0026quot;: \u0026quot;Mq7wFw==\u0026quot;, \u0026quot;hash-function\u0026quot;: \u0026quot;sha-512\u0026quot; }] } Name Mandatory JSON Type Default Description type yes string The credential type name, always hashed-password. auth-id yes string The identity that the device should be authenticated as. pwd-hash yes string The password hash (see table below for details). salt no string The Base64 encoding of the salt used in the password hash (see table below for details). hash-function no string sha-256 The name of the hash function used to create the password hash. The hash functions supported by Hono are described in the table below. NB It is strongly recommended to use salted password hashes only. Furthermore, the salt should be unique per user and password, so no lookup table or rainbow table attacks can be used to crack the salt-hashed password. Whenever a password is updated for a user, the salt should change as well.\nNB The example above does not contain any of the not-before, not-after and enabled properties, thus the credentials can be used at any time according to the rules defined in Credential Verification.\nThe table below describes the hash functions supported by Hono and how they map to the secret structure.\n Name Salt Usage Salt Location Password Hash Format sha-256 optional salt field The Base64 encoding of the bytes resulting from applying the sha-256 hash function to the byte array consisting of the salt bytes (if a salt is used) and the UTF-8 encoding of the clear text password. sha-512 optional salt field The Base64 encoding of the bytes resulting from applying the sha-512 hash function to the byte array consisting of the salt bytes (if a salt is used) and the UTF-8 encoding of the clear text password. bcrypt mandatory pwd-hash value The output of applying the Bcrypt hash function to the clear text password. The salt is contained in the password hash.\nNB Hono (currently) uses Spring Security for matching clear text passwords against Bcrypt hashes. However, this library only supports hashes containing the $2a$ prefix (see https://github.com/fpirsch/twin-bcrypt#about-prefixes) so Hono will fail to verify any passwords for which the corresponding Bcrypt hashes returned by the Credentials service contain e.g. the $2y$ prefix. Pre-Shared Key A credential type for storing a Pre-shared Key as used in TLS handshakes.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;psk\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;little-sensor2\u0026quot;, \u0026quot;secrets\u0026quot;: [{ \u0026quot;key\u0026quot;: \u0026quot;AQIDBAUGBwg=\u0026quot; }] } Name Mandatory JSON Type Description type yes string The credential type name, always psk. auth-id yes string The PSK identity. key yes string The Base64 encoded bytes representing the shared (secret) key. NB The example above does not contain any of the not-before, not-after and enabled properties, thus the credentials can be used at any time according to the rules defined in Credential Verification.\nX.509 Certificate A credential type for storing the RFC 2253 formatted subject DN of a client certificate that is used to authenticate the device as part of a TLS handshake.\nExample:\n{ \u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;, \u0026quot;type\u0026quot;: \u0026quot;x509-cert\u0026quot;, \u0026quot;auth-id\u0026quot;: \u0026quot;CN=device-1,O=ACME Corporation\u0026quot;, \u0026quot;secrets\u0026quot;: [{}] } Name Mandatory JSON Type Description type yes string The credential type name, always x509-cert. auth-id yes string The subject DN of the client certificate in the format defined by RFC 2253. NB The example above does not contain any of the not-before, not-after and enabled properties. The not-before and not-after properties should be omitted if the validity period is the same as the period indicated by the client certificate\u0026rsquo;s corresponding properties. It is still necessary to provide a (empty) JSON object in the secrets array, though.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/api/authentication/",
@@ -305,49 +305,49 @@
"title": "Metrics",
"tags": [],
"description": "",
- "content": "Eclipse Hono\u0026trade;\u0026rsquo;s components report several metrics which may be used to gain some insight into the running system. For instance, the HTTP adapter reports the number of successfully processed telemetry messages. Some of these metrics are considered part of Hono\u0026rsquo;s external interface. This section describes the semantics and format of the metrics, how they can be retrieved and how to interpret actual values.\nReported Metrics Hono uses Micrometer in combination with Spring Boot to internally collect metrics. Those metrics can be exported to different back ends. Please refer to Configuring Metrics for details.\nThe example deployment by default uses Prometheus as the metrics back end.\nWhen deploying to Kubernetes/OpenShift, the metrics reported by Hono may contain environment specific tags (like the pod name) which are added by the Prometheus scraper. However, those tags are not part of the Hono metrics definition.\nHono applications may report other metrics in addition to the ones defined here. In particular, all components report metrics regarding the JVM\u0026rsquo;s internal state, e.g. memory consumption and garbage collection status. Those metrics are not considered part of Hono\u0026rsquo;s official metrics definition. However, all those metrics will still contain tags as described below.\nCommon Metrics Tags for common metrics are:\n Tag Value Description host string The name of the host that the component reporting the metric is running on component-type adapter, service The type of component reporting the metric component-name string The name of the component reporting the metric. The names of Hono\u0026rsquo;s standard components are as follows:\n Component component-name Auth Server hono-auth Device Registry hono-registry AMQP adapter hono-amqp CoAP adapter hono-coap HTTP adapter hono-http Kura adapter hono-kura-mqtt MQTT adapter hono-mqtt Protocol Adapter Metrics Additional tags for protocol adapters are:\n Name Value Description direction one-way, request, response The direction in which a Command \u0026amp; Control message is being sent:\none-way indicates a command sent to a device for which the sending application doesn\u0026rsquo;t expect to receive a response.\nrequest indicates a command request message sent to a device.\nresponse indicates a command response received from a device. qos 0, 1, unknown The quality of service used for a telemetry or event message.\n0 indicates at most once,\n1 indicates at least once and\nnone indicates unknown delivery semantics. status forwarded, unprocessable, undeliverable The processing status of a message.\nforwarded indicates that the message has been forwarded to a downstream consumer\nunprocessable indicates that the message has not been processed not forwarded, e.g. because the message was malformed\nundeliverable indicates that the message could not be forwarded, e.g. because there is no downstream consumer or due to an infrastructure problem tenant string The identifier of the tenant that the metric is being reported for ttd command, expired, none A status indicating the outcome of processing a TTD value contained in a message received from a device.\ncommand indicates that a command for the device has been included in the response to the device\u0026rsquo;s request for uploading the message.\nexpired indicates that a response without a command has been sent to the device.\nnone indicates that either no TTD value has been specified by the device or that the protocol adapter does not support it. type telemetry, event The type of (downstream) message that the metric is being reported for. Metrics provided by the protocol adapters are:\n Metric Type Tags Description hono.commands.received Timer host, component-type, component-name, tenant, type, status, direction The time it took to process a message conveying a command or a response to a command. hono.commands.payload DistributionSummary host, component-type, component-name, tenant, type, status, direction The number of bytes conveyed in the payload of a command message. hono.connections.authenticated Gauge host, component-type, component-name, tenant Current number of connected, authenticated devices. NB This metric is only supported by protocol adapters that maintain connection state with authenticated devices. In particular, the HTTP adapter does not support this metric. hono.connections.unauthenticated Gauge host, component-type, component-name Current number of connected, unauthenticated devices. NB This metric is only supported by protocol adapters that maintain connection state with authenticated devices. In particular, the HTTP adapter does not support this metric. hono.messages.received Timer host, component-type, component-name, tenant, type, status, qos, ttd The time it took to process a message conveying telemetry data or an event. hono.messages.payload DistributionSummary host, component-type, component-name, tenant, type, status The number of bytes conveyed in the payload of a telemetry or event message. Minimum Message Size If a minimum message size is configured for a tenant, then the payload size of the telemetry, event and command messages are calculated in accordance with the configured value and then reported to the metrics by the AMQP, HTTP and MQTT protocol adapters. If minimum message size is not configured for a tenant then the actual message payload size is reported.\nAssume that the minimum message size for a tenant is configured as 4096 bytes (4KB). The payload size of an incoming message with size 1KB is calculated as 4KB by the protocol adapters and reported to the metrics system. For an incoming message of size 10KB, it is reported as 12KB.\nService Metrics Hono\u0026rsquo;s service components do not report any metrics at the moment.\nLegacy Metrics Deprecated This metrics configuration is still supported in Hono, but is considered deprecated and will be removed in a future version of Hono.\nThe legacy metrics support needs to be enabled explicitly. See Legacy support for more information.\n Enabling the legacy support sets up internal support for exporting the metrics in the pre-0.8 format, using the Graphite Micrometer backend, but with a custom (legacy) naming scheme. It still is possible to use the InfluxDB Micrometer backend as well, however this will export metrics in the new format, and not on the legacy format.\nSome users have started to build custom dash boards on top of the names of the metrics and associated tags that end up in the example InfluxDB. Hono will try to support such users by allowing future versions of Hono to be configured to report metrics to InfluxDB resulting in the same database structure as created by InfluxDB\u0026rsquo;s Graphite Input.\nNB This does not necessarily mean that future versions of Hono will always support metrics being reported using the Graphite wire format. It only means that there will be a way to transmit metrics to InfluxDB resulting in the same database structure.\nTags The InfluxDB configuration file used for the example deployment contains templates for extracting the following tags from metric names transmitted via the Graphite reporter.\n Tag Description host The name of the host that the component reporting the metric is running on. type The type of message that the metric is being reported for (either telemetry or event) tenant The name of the tenant that the metric is being reported for. protocol The transport protocol that has been used to send the message for which the metric is being reported (http or mqtt). The following sections describe which of these tags are extracted for which metrics specifically.\nCommon Metrics The following table contains metrics that are collected for all protocol adapters (if applicable to the underlying transport protocol).\n Metric Tags Description counter.hono.connections.authenticated.count host, tenant, protocol Current number of connections with authenticated devices. NB This metric is only supported by protocol adapters that maintain connection state with authenticated devices. In particular, the HTTP adapter does not support this metric. counter.hono.connections.unauthenticated.count host, protocol Current number of connections with unauthenticated devices. NB This metric is only supported by protocol adapters that maintain connection state with unauthenticated devices. In particular, the HTTP adapter does not support this metric. meter.hono.commands.device.delivered.count host, tenant, protocol Commands delivered to devices. Total count since application start. meter.hono.commands.device.delivered.m1_rate host, tenant, protocol Commands delivered to devices. One minute, exponentially weighted, moving average. meter.hono.commands.device.delivered.m5_rate host, tenant, protocol Commands delivered to devices. Five minute, exponentially weighted, moving average. meter.hono.commands.device.delivered.m15_rate host, tenant, protocol Commands delivered to devices. Fifteen minute, exponentially weighted, moving average. meter.hono.commands.device.delivered.mean_rate host, tenant, protocol Commands delivered to devices. Mean rate of messages since application start. meter.hono.commands.response.delivered.count host, tenant, protocol Command responses delivered to applications. Total count since application startup. meter.hono.commands.response.delivered.m1_rate host, tenant, protocol Command responses delivered to applications. One minute, exponentially weighted, moving average. meter.hono.commands.response.delivered.m5_rate host, tenant, protocol Command responses delivered to applications. Five minute, exponentially weighted, moving average. meter.hono.commands.response.delivered.m15_rate host, tenant, protocol Command responses delivered to applications. Fifteen minute, exponentially weighted, moving average. meter.hono.commands.response.delivered.mean_rate host, tenant, protocol Command responses delivered to applications. Mean rate of messages since the application start. meter.hono.commands.ttd.expired.count host, tenant, protocol Messages containing a TTD that expired with no pending command(s). Total count since application startup. meter.hono.commands.ttd.expired.m1_rate host, tenant, protocol Messages containing a TTD that expired with no pending command(s). One minute, exponentially weighted, moving average. meter.hono.commands.ttd.expired.m5_rate host, tenant, protocol Messages containing a TTD that expired with no pending command(s). Five minute, exponentially weighted, moving average. meter.hono.commands.ttd.expired.m15_rate host, tenant, protocol Messages containing a TTD that expired with no pending command(s). Fifteen minute, exponentially weighted, moving average. meter.hono.commands.ttd.expired.mean_rate host, tenant, protocol Messages containing a TTD that expired with no pending command(s). Mean rate of messages since the application start. HTTP Metrics The following table contains metrics that are collected specifically for the HTTP protocol adapter.\n Metric Tags Description counter.hono.http.messages.undeliverable.count host, tenant, type Messages which could not be processed by the HTTP protocol adapter. Total count since application startup. meter.hono.http.messages.processed.count host, tenant, type Messages processed by the HTTP protocol adapter. Total count since application startup. meter.hono.http.messages.processed.m1_rate host, tenant, type Messages processed by the HTTP protocol adapter. One minute, exponentially weighted, moving average. meter.hono.http.messages.processed.m5_rate host, tenant, type Messages processed by the HTTP protocol adapter. Five minute, exponentially weighted, moving average. meter.hono.http.messages.processed.m15_rate host, tenant, type Messages processed by the HTTP protocol adapter. Fifteen minute, exponentially weighted, moving average. meter.hono.http.messages.processed.mean_rate host, tenant, type Messages processed by the HTTP protocol adapter. Mean rate of messages since the application start. MQTT Metrics The following table contains metrics that are collected specifically for the MQTT protocol adapter.\n Metric Tags Description counter.hono.mqtt.messages.undeliverable.count host, tenant, type Messages which could not be processed by the MQTT protocol adapter- Total count since application startup. meter.hono.mqtt.messages.processed.count host, tenant, type Messages processed by the MQTT protocol adapter. Total count since application startup. meter.hono.mqtt.messages.processed.m1_rate host, tenant, type Messages processed by the MQTT protocol adapter. One minute, exponentially weighted, moving average. meter.hono.mqtt.messages.processed.m5_rate host, tenant, type Messages processed by the MQTT protocol adapter. Five minute, exponentially weighted, moving average. meter.hono.mqtt.messages.processed.m15_rate host, tenant, type Messages processed by the MQTT protocol adapter. Fifteen minute, exponentially weighted, moving average. meter.hono.mqtt.messages.processed.mean_rate host, tenant, type Messages processed by the MQTT protocol adapter. Mean rate of messages since the application start. "
+ "content": "Eclipse Hono\u0026trade;\u0026rsquo;s components report several metrics which may be used to gain some insight into the running system. For instance, the HTTP adapter reports the number of successfully processed telemetry messages. Some of these metrics are considered part of Hono\u0026rsquo;s external interface. This section describes the semantics and format of the metrics, how they can be retrieved and how to interpret actual values.\nReported Metrics Hono uses Micrometer in combination with Spring Boot to internally collect metrics. Those metrics can be exported to different back ends. Please refer to Configuring Metrics for details.\nThe example deployment by default uses Prometheus as the metrics back end.\nWhen deploying to Kubernetes/OpenShift, the metrics reported by Hono may contain environment specific tags (like the pod name) which are added by the Prometheus scraper. However, those tags are not part of the Hono metrics definition.\nHono applications may report other metrics in addition to the ones defined here. In particular, all components report metrics regarding the JVM\u0026rsquo;s internal state, e.g. memory consumption and garbage collection status. Those metrics are not considered part of Hono\u0026rsquo;s official metrics definition. However, all those metrics will still contain tags as described below.\nCommon Metrics Tags for common metrics are:\n Tag Value Description host string The name of the host that the component reporting the metric is running on component-type adapter, service The type of component reporting the metric component-name string The name of the component reporting the metric. The names of Hono\u0026rsquo;s standard components are as follows:\n Component component-name Auth Server hono-auth Device Registry hono-registry AMQP adapter hono-amqp CoAP adapter hono-coap HTTP adapter hono-http Kura adapter hono-kura-mqtt MQTT adapter hono-mqtt Protocol Adapter Metrics Additional tags for protocol adapters are:\n Name Value Description direction one-way, request, response The direction in which a Command \u0026amp; Control message is being sent:\none-way indicates a command sent to a device for which the sending application doesn\u0026rsquo;t expect to receive a response.\nrequest indicates a command request message sent to a device.\nresponse indicates a command response received from a device. qos 0, 1, unknown The quality of service used for a telemetry or event message.\n0 indicates at most once,\n1 indicates at least once and\nnone indicates unknown delivery semantics. status forwarded, unprocessable, undeliverable The processing status of a message.\nforwarded indicates that the message has been forwarded to a downstream consumer\nunprocessable indicates that the message has not been processed not forwarded, e.g. because the message was malformed\nundeliverable indicates that the message could not be forwarded, e.g. because there is no downstream consumer or due to an infrastructure problem tenant string The identifier of the tenant that the metric is being reported for ttd command, expired, none A status indicating the outcome of processing a TTD value contained in a message received from a device.\ncommand indicates that a command for the device has been included in the response to the device\u0026rsquo;s request for uploading the message.\nexpired indicates that a response without a command has been sent to the device.\nnone indicates that either no TTD value has been specified by the device or that the protocol adapter does not support it. type telemetry, event The type of (downstream) message that the metric is being reported for. Metrics provided by the protocol adapters are:\n Metric Type Tags Description hono.commands.received Timer host, component-type, component-name, tenant, type, status, direction The time it took to process a message conveying a command or a response to a command. hono.commands.payload DistributionSummary host, component-type, component-name, tenant, type, status, direction The number of bytes conveyed in the payload of a command message. hono.connections.authenticated Gauge host, component-type, component-name, tenant Current number of connected, authenticated devices. NB This metric is only supported by protocol adapters that maintain connection state with authenticated devices. In particular, the HTTP adapter does not support this metric. hono.connections.unauthenticated Gauge host, component-type, component-name Current number of connected, unauthenticated devices. NB This metric is only supported by protocol adapters that maintain connection state with authenticated devices. In particular, the HTTP adapter does not support this metric. hono.messages.received Timer host, component-type, component-name, tenant, type, status, qos, ttd The time it took to process a message conveying telemetry data or an event. hono.messages.payload DistributionSummary host, component-type, component-name, tenant, type, status The number of bytes conveyed in the payload of a telemetry or event message. Minimum Message Size If a minimum message size is configured for a tenant, then the payload size of the telemetry, event and command messages are calculated in accordance with the configured value and then reported to the metrics by the AMQP, HTTP and MQTT protocol adapters. If minimum message size is not configured for a tenant then the actual message payload size is reported.\nAssume that the minimum message size for a tenant is configured as 4096 bytes (4KB). The payload size of an incoming message with size 1KB is calculated as 4KB by the protocol adapters and reported to the metrics system. For an incoming message of size 10KB, it is reported as 12KB.\nService Metrics Hono\u0026rsquo;s service components do not report any metrics at the moment.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/deployment/",
"title": "Deployment",
"tags": [],
"description": "",
- "content": " Deployment Learn how to deploy Hono\u0026trade; to different container orchestration platforms.\n"
+ "content": " Deployment Learn how to deploy Eclipse Hono\u0026trade; to various container orchestration platforms.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/deployment/helm-based-deployment/",
"title": "Helm based Deployment",
"tags": [],
"description": "",
- "content": "Eclipse Hono\u0026trade;\u0026rsquo;s components are provided as container images which can be run on arbitrary container orchestration platforms. This page describes the steps necessary to deploy Hono to a Kubernetes cluster using the Helm package manager.\n Note The example configuration that comes with Hono and which is used in this guide is supposed to be used for evaluation and development purposes only. Prerequisites Kubernetes Cluster The most basic requirement is, of course, a Kubernetes cluster to deploy to. The Kubernetes setup guide describes options available for setting up a cluster.\nHelm Helm is a tool for managing (complex) Kubernetes applications. In this guide it is used to deploy Hono to the cluster. Helm\u0026rsquo;s installation instructions provide more details.\nKubectl The kubectl tool is used to manage a Kubernetes cluster from the command line. In this guide it is used to retrieve information about Hono\u0026rsquo;s service endpoints from the cluster. The installation guide provides instructions for setting up kubectl locally.\nHono Helm Chart The Helm chart is contained in the Hono archive that is available from Hono\u0026rsquo;s download page. After the archive has been extracted, the chart can be found in the eclipse-hono-$VERSION/deploy/helm/eclipse-hono folder.\nHono Command Line Client The Hono command line client is available from the download page. The command line client requires a Java 11 runtime environment to run.\nDeploying Hono The recommended way of deploying Hono is by means of using Helm\u0026rsquo;s Tiller service running on the Kubernetes cluster:\n# in directory: eclipse-hono-$VERSION/deploy/helm helm install --dep-up --name hono --namespace hono eclipse-hono/ This will create namespace hono in the cluster and install all the components to that namespace. The name of the Helm release will be hono.\nThe status of the deployment can be checked using any of the following commands:\nhelm list helm status hono helm get hono Deploying Hono using kubectl In cases where installation of Helm\u0026rsquo;s Tiller service into the cluster is not an option, the Kubernetes resource descriptors created by Helm can be deployed manually using the kubectl command line tool.\nThe following commands generate the resource descriptors:\n# in directory: eclipse-hono-$VERSION/deploy/ helm dep update helm/ helm template --name hono --namespace hono --output-dir . helm/ This will create an eclipse-hono folder containing all the resource descriptors which can then be deployed to the cluster using kubectl:\n# in directory: eclipse-hono-$VERSION/deploy/ kubectl create namespace hono kubectl config set-context $(kubectl config current-context) --namespace=hono find . -path \u0026quot;./eclipse-hono/*\u0026quot; -name crd*.yaml -exec kubectl apply -f {} \\; kubectl apply -f ./eclipse-hono -R Verifying the Installation Once deployment has completed, Hono\u0026rsquo;s external API endpoints are exposed via corresponding Kubernetes Services. The following command lists all services and their endpoints (replace hono with the namespace that you have deployed to):\nkubectl get service -n hono NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) hono-adapter-amqp-vertx LoadBalancer 10.109.123.153 10.109.123.153 5672:32672/TCP,5671:32671/TCP hono-adapter-amqp-vertx-headless ClusterIP None \u0026lt;none\u0026gt; \u0026lt;none\u0026gt; hono-adapter-http-vertx LoadBalancer 10.99.180.137 10.99.180.137 8080:30080/TCP,8443:30443/TCP hono-adapter-http-vertx-headless ClusterIP None \u0026lt;none\u0026gt; \u0026lt;none\u0026gt; hono-adapter-mqtt-vertx LoadBalancer 10.102.204.69 10.102.204.69 1883:31883/TCP,8883:30883/TCP hono-adapter-mqtt-vertx-headless ClusterIP None \u0026lt;none\u0026gt; \u0026lt;none\u0026gt; hono-artemis ClusterIP 10.97.31.154 \u0026lt;none\u0026gt; 5671/TCP hono-dispatch-router ClusterIP 10.98.111.236 \u0026lt;none\u0026gt; 5673/TCP hono-dispatch-router-ext LoadBalancer 10.109.220.100 10.109.220.100 15671:30671/TCP,15672:30672/TCP hono-grafana ClusterIP 10.110.61.181 \u0026lt;none\u0026gt; 3000/TCP hono-prometheus-server ClusterIP 10.96.70.135 \u0026lt;none\u0026gt; 9090/TCP hono-service-auth ClusterIP 10.109.97.44 \u0026lt;none\u0026gt; 5671/TCP hono-service-auth-headless ClusterIP None \u0026lt;none\u0026gt; \u0026lt;none\u0026gt; hono-service-device-registry ClusterIP 10.105.190.233 \u0026lt;none\u0026gt; 5671/TCP hono-service-device-registry-ext LoadBalancer 10.101.42.99 10.101.42.99 28080:31080/TCP,28443:31443/TCP hono-service-device-registry-headless ClusterIP None \u0026lt;none\u0026gt; \u0026lt;none\u0026gt; The listing above has been retrieved from a Minikube cluster that emulates a load balancer via the minikube tunnel command (refer to the Minikube Networking docs for details). The service endpoints can be accessed at the EXTERNAL-IP addresses and corresponding PORT(S), e.g. 8080 for the HTTP adapter (hono-adapter-http-vertx) and 28080 for the device registry (hono-service-device-registry).\nThe following command assigns the IP address of the device registry service to the REGISTRY_IP environment variable so that they can easily be used from the command line:\nexport REGISTRY_IP=$(kubectl get service hono-service-device-registry-ext --output='jsonpath={.status.loadBalancer.ingress[0].ip}' -n hono) The following command can then be used to check for the existence of the DEFAULT_TENANT which is created as part of the installation:\ncurl -sIX GET http://$REGISTRY_IP:28080/v1/tenants/DEFAULT_TENANT HTTP/1.1 200 OK etag: 89d40d26-5956-4cc6-b978-b15fda5d1823 content-type: application/json; charset=utf-8 content-length: 260 \nAccessing the Grafana Dashboard Hono comes with an example Grafana dashboard which provides some insight into the messages flowing through the protocol adapters. The following command needs to be run first in order to forward the Grafana service\u0026rsquo;s endpoint to the local host:\nkubectl port-forward service/hono-grafana 3000 -n hono Then the dashboard can be opened by pointing a browser to http://localhost:3000 using credentials admin:admin.\nUndeploying Hono A Hono instance that has been deployed using Helm\u0026rsquo;s Tiller service can be undeployed by running\nhelm delete --purge hono A Hono instance that has been deployed manually using the resource files can be undeployed by running\n# in directory: eclipse-hono-$VERSION/deploy/ kubectl delete -f ./eclipse-hono -R Deploying custom Container Images The sections above describe how Hono\u0026rsquo;s pre-built container images can be deployed using Helm. In some cases it might be desirable to build Hono from source, e.g. in order to use a different metrics back end or to use Jaeger tracing. In these cases, the Helm templates contained in the source tree can be used instead of the Helm chart from the download page.\nThe container images created as part of the build process need to be made available to the Kubernetes cluster that Hono should be deployed to. This usually requires the images to be pushed to a (private) container registry that the cluster has pull access to. Please refer to the documentation of the employed Kubernetes service provider for details regarding the setup and configuration of a private container registry.\nDeploying via a private Registry The first step is getting the source code of Hono. Please refer to Building from Source for details. Once the source code has been retrieved, the build process can be started using the following command:\n# in base directory of Hono working tree: mvn clean install -Pbuild-docker-image,metrics-prometheus After the build process has finished, the custom container images need to be pushed to the registry so that the Kubernetes cluster can pull them from there during deployment. Assuming that the images should be tagged with 1.0-CUSTOM and the container registry name is my.registry.io, the following command can be used to tag the locally built images and push them to the registry:\n# in base directory of Hono working tree: ./push_hono_images.sh 1.0-CUSTOM my.registry.io Note You may need to log in to the (private) container registry before pushing the images. Once the images have been pushed, the deployment can be done using Helm:\n# in Hono working tree directory: hono/deploy helm install --dep-up --name hono --namespace hono --set deviceRegistry.imageName=my.registry.io/eclipse/hono-service-device-registry:1.0-CUSTOM,authServer.imageName=my.registry.io/eclipse/hono-service-auth:1.0-CUSTOM,deviceConnectionService.imageName=my.registry.io/eclipse/hono-service-device-connection:1.0-CUSTOM,adapters.amqp.imageName=my.registry.io/eclipse/hono-adapter-amqp-vertx:1.0-CUSTOM,adapters.mqtt.imageName=my.registry.io/eclipse/hono-adapter-mqtt-vertx:1.0-CUSTOM,adapters.http.imageName=my.registry.io/eclipse/hono-adapter-http-vertx:1.0-CUSTOM target/deploy/helm/eclipse-hono/ Deploying to Minikube When using Minikube as the deployment target, things are a little easier. Minikube comes with an embedded Docker daemon which can be used to build the container images instead of using a local Docker daemon, thus eliminating the need to push the images to a registry altogether. In order to use Minikube\u0026rsquo;s Docker daemon, the following command needs to be run:\neval $(minikube docker-env) This will set the Docker environment variables to point to Minikube\u0026rsquo;s Docker daemon which can then be used for building the container images and storing them locally in the Minikube VM.\nIn any case the build process can be started using the following command:\n# in base directory of Hono working tree: mvn clean install -Pbuild-docker-image,metrics-prometheus The newly built images can then be deployed using Helm:\n# in Hono working tree directory: hono/deploy helm install --dep-up --name hono --namespace hono target/deploy/helm/eclipse-hono/ Using the Device Connection Service Hono\u0026rsquo;s example Device Registry component contains a simple in-memory implementation of the Device Connection API. This example implementation is used by default when the example registry is deployed.\nHono also contains a production ready, data grid based implementation of the Device Connection API which can be deployed and used instead of the example implementation. The component can be deployed by means of setting the deviceConnectionService.enabled property to true when running Helm:\n# in directory: eclipse-hono-$VERSION/deploy/ helm install --dep-up --name hono --namespace hono --set deviceConnectionService.enabled=true helm/eclipse-hono/ This will deploy the Device Connection service and configure all protocol adapters to use it instead of the example Device Registry implementation. However, the service requires a connection to a data grid in order to store the device connection data. The Helm chart supports deployment of a simple data grid which can be used for experimenting by means of setting the dataGridDeployExample property to true when running Helm:\n# in directory: eclipse-hono-$VERSION/deploy/ helm install --dep-up --name hono --namespace hono --set deviceConnectionService.enabled=true --set dataGridDeployExample=true helm/eclipse-hono/ This will deploy the data grid and configure the Device Connection service to use it for storing the connection data.\nThe Device Connection service can also be configured to connect to an already existing data grid. Please refer to the admin guide for details regarding the corresponding configuration properties.\nUsing Jaeger Tracing Hono\u0026rsquo;s components are instrumented using OpenTracing to allow tracking of the distributed processing of messages flowing through the system. The Hono chart can be configured to report tracing information to the Jaeger tracing system. The Spans reported by the components can then be viewed in a web browser.\nIn order for Hono\u0026rsquo;s components to use the Jaeger client for reporting tracing information, the container images need to be built with the jaeger Maven profile. Please refer to Monitoring \u0026amp; Tracing for details.\nThe chart can be configured to deploy and use an example Jaeger back end by means of setting the jaegerBackendDeployExample property to true when running Helm:\n# in Hono working tree directory: hono/deploy helm install --dep-up --name hono --namespace hono --set jaegerBackendDeployExample=true target/deploy/helm/eclipse-hono/ This will create a Jaeger back end instance suitable for testing purposes and will configure all deployed Hono components to use the Jaeger back end.\nThe following command can then be used to return the IP address with which the Jaeger UI can be accessed in a browser (ensure minikube tunnel is running when using minikube):\nkubectl get service hono-jaeger-query --output='jsonpath={.status.loadBalancer.ingress[0].ip}' -n hono If no example Jaeger back end should be deployed but instead an existing Jaeger installation should be used, the chart\u0026rsquo;s jaegerAgentConf property can be set to environment variables which are passed in to the Jaeger Agent that is deployed with each of Hono\u0026rsquo;s components.\n# in Hono working tree directory: hono/deploy helm install --dep-up --name hono --namespace hono --set jaegerAgentConf.REPORTER_TYPE=tchannel --set jaegerAgentConf.REPORTER_TCHANNEL_HOST_PORT=my-jaeger-collector:14267 target/deploy/helm/eclipse-hono/ Deploying optional Adapters The Helm chart supports deployment of additional protocol adapters which are still considered experimental or have been deprecated. The following table provides an overview of the corresponding configuration properties that need to be set on deployment.\n Property Default Description adapters.kura.enabled false Indicates if the deprecated Kura protocol adapter should be deployed. The following command will deploy the Kura adapter along with Hono\u0026rsquo;s standard adapters:\n# in directory: eclipse-hono-$VERSION/deploy/ helm install --dep-up --name hono --namespace hono --set adapters.kura.enabled=true helm/eclipse-hono/ "
+ "content": "Eclipse Hono\u0026trade;\u0026rsquo;s components are provided as container images which can be run on arbitrary container orchestration platforms. This page describes the steps necessary to deploy Hono to a Kubernetes cluster using the Helm package manager.\n Note The example configuration that comes with Hono and which is used in this guide is supposed to be used for evaluation and development purposes only. Prerequisites Kubernetes Cluster The most basic requirement is, of course, a Kubernetes cluster to deploy to. The Kubernetes setup guide describes options available for setting up a cluster.\n Supported Kubernetes Versions Hono should run on any version of Kubernetes starting with 1.13.6. However, it has been tested with several specific versions only. The most recent version known to work is 1.15.4 so if you experience any issues with running Hono on another version, please try to deploy to 1.15.4 before raising an issue. Helm Helm is a tool for managing (complex) Kubernetes applications. In this guide it is used to deploy Hono to the cluster. Helm\u0026rsquo;s installation instructions provide more details.\nKubectl The kubectl tool is used to manage a Kubernetes cluster from the command line. In this guide it is used to retrieve information about Hono\u0026rsquo;s service endpoints from the cluster. The installation guide provides instructions for setting up kubectl locally.\nHono Helm Chart The Helm chart is contained in the Hono archive that is available from Hono\u0026rsquo;s download page. After the archive has been extracted, the chart can be found in the eclipse-hono-$VERSION/eclipse-hono folder.\nHono Command Line Client The Hono command line client is available from the download page. The command line client requires a Java 11 runtime environment to run.\nDeploying Hono The recommended way of deploying Hono is by means of using Helm\u0026rsquo;s Tiller service running on the Kubernetes cluster:\n# in directory: eclipse-hono-$VERSION helm install --dep-up --name hono --namespace hono eclipse-hono/ This will create namespace hono in the cluster and install all the components to that namespace. The name of the Helm release will be hono.\nThe status of the deployment can be checked using any of the following commands:\nhelm list helm status hono helm get hono Kubernetes 1.16 Hono can not be deployed to Kubernetes 1.16 using Helm because current versions (\u0026lt; 2.15) of Helm don\u0026rsquo;t support installation of the Tiller component to Kubernetes 1.16. Until that problem is fixed in Helm, the workaround is to either deploy to an earlier version of Kubernetes or deploy using the kubectl command as described in the next section. Deploying Hono using kubectl In cases where installation of Helm\u0026rsquo;s Tiller service into the cluster is not an option, the Kubernetes resource descriptors created by Helm can be deployed manually using the kubectl command line tool.\nThe following commands generate the resource descriptors:\n# in directory: eclipse-hono-$VERSION mkdir resources helm dep update eclipse-hono/ helm template --name hono --namespace hono --output-dir resources eclipse-hono/ Kubernetes 1.16 Hono can currently only be deployed to Kubernetes 1.16 if Prometheus and Grafana are disabled. This is due to a bug in the Prometheus Helm chart which is used to deploy Prometheus as part of Hono\u0026rsquo; example deployment. Until the bug is fixed, the workaround is to disable deployment of Prometheus and Grafana by setting the following configuration properties when creating the resource descriptors:\n# in directory: eclipse-hono-$VERSION helm template --name hono --namespace hono --set prometheus.createInstance=false --set grafana.enabled=false --output-dir resources eclipse-hono/ This will create a resources/eclipse-hono folder containing all the resource descriptors which can then be deployed to the cluster using kubectl:\n# in directory: eclipse-hono-$VERSION kubectl create namespace hono kubectl config set-context $(kubectl config current-context) --namespace=hono kubectl apply -f ./resources -R Verifying the Installation Once deployment has completed, Hono\u0026rsquo;s external API endpoints are exposed via corresponding Kubernetes Services. The following command lists all services and their endpoints (replace hono with the namespace that you have deployed to):\nkubectl get service -n hono NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) hono-adapter-amqp-vertx LoadBalancer 10.109.123.153 10.109.123.153 5672:32672/TCP,5671:32671/TCP hono-adapter-amqp-vertx-headless ClusterIP None \u0026lt;none\u0026gt; \u0026lt;none\u0026gt; hono-adapter-http-vertx LoadBalancer 10.99.180.137 10.99.180.137 8080:30080/TCP,8443:30443/TCP hono-adapter-http-vertx-headless ClusterIP None \u0026lt;none\u0026gt; \u0026lt;none\u0026gt; hono-adapter-mqtt-vertx LoadBalancer 10.102.204.69 10.102.204.69 1883:31883/TCP,8883:30883/TCP hono-adapter-mqtt-vertx-headless ClusterIP None \u0026lt;none\u0026gt; \u0026lt;none\u0026gt; hono-artemis ClusterIP 10.97.31.154 \u0026lt;none\u0026gt; 5671/TCP hono-dispatch-router ClusterIP 10.98.111.236 \u0026lt;none\u0026gt; 5673/TCP hono-dispatch-router-ext LoadBalancer 10.109.220.100 10.109.220.100 15671:30671/TCP,15672:30672/TCP hono-grafana ClusterIP 10.110.61.181 \u0026lt;none\u0026gt; 3000/TCP hono-prometheus-server ClusterIP 10.96.70.135 \u0026lt;none\u0026gt; 9090/TCP hono-service-auth ClusterIP 10.109.97.44 \u0026lt;none\u0026gt; 5671/TCP hono-service-auth-headless ClusterIP None \u0026lt;none\u0026gt; \u0026lt;none\u0026gt; hono-service-device-registry ClusterIP 10.105.190.233 \u0026lt;none\u0026gt; 5671/TCP hono-service-device-registry-ext LoadBalancer 10.101.42.99 10.101.42.99 28080:31080/TCP,28443:31443/TCP hono-service-device-registry-headless ClusterIP None \u0026lt;none\u0026gt; \u0026lt;none\u0026gt; The listing above has been retrieved from a Minikube cluster that emulates a load balancer via the minikube tunnel command (refer to the Minikube docs for details). The service endpoints can be accessed at the EXTERNAL-IP addresses and corresponding PORT(S), e.g. 8080 for the HTTP adapter (hono-adapter-http-vertx) and 28080 for the device registry (hono-service-device-registry).\nThe following command assigns the IP address of the device registry service to the REGISTRY_IP environment variable so that they can easily be used from the command line:\nexport REGISTRY_IP=$(kubectl get service hono-service-device-registry-ext --output='jsonpath={.status.loadBalancer.ingress[0].ip}' -n hono) The following command can then be used to check for the existence of the DEFAULT_TENANT which is created as part of the installation:\ncurl -sIX GET http://$REGISTRY_IP:28080/v1/tenants/DEFAULT_TENANT HTTP/1.1 200 OK etag: 89d40d26-5956-4cc6-b978-b15fda5d1823 content-type: application/json; charset=utf-8 content-length: 260 \nAccessing the Grafana Dashboard Hono comes with an example Grafana dashboard which provides some insight into the messages flowing through the protocol adapters. The following command needs to be run first in order to forward the Grafana service\u0026rsquo;s endpoint to the local host:\nkubectl port-forward service/hono-grafana 3000 -n hono Then the dashboard can be opened by pointing your browser to http://localhost:3000 using credentials admin:admin.\nUndeploying Hono A Hono instance that has been deployed using Helm\u0026rsquo;s Tiller service can be undeployed by running\nhelm delete --purge hono A Hono instance that has been deployed manually using the resource files can be undeployed by running\n# in directory: eclipse-hono-$VERSION kubectl delete -f ./resources -R Using a production grade AMQP Messaging Network and Device Registry The Helm chart by default deploys the example Device Registry that comes with Hono. The example registry provides implementations of the Tenant, Device Registration, Credentials and Device Connection APIs which can be used for example/demo purposes.\nThe chart also deploys an example AMQP Messaging Network consisting of a single Apache Qpid Dispatch Router and a single Apache ActiveMQ Artemis broker.\nThe protocol adapters are configured to connect to the example messaging network and registry by default.\nIn a production environment, though, usage of the example registry and messaging network is strongly discouraged and more sophisticated (custom) implementations of the service APIs should be used.\nThe Helm chart supports configuration of the protocol adapters to connect to other service implementations than the example registry and messaging network as described in the following sections.\nIntegrating with an existing AMQP Messaging Network The Helm chart can be configured to use an existing AMQP Messaging Network implementation instead of the example implementation. In order to do so, the protocol adapters need to be configured with information about the AMQP Messaging Network\u0026rsquo;s endpoint address and connection parameters.\nThe easiest way to set these properties is by means of putting them into a YAML file with content like this:\n# do not deploy example AMQP Messaging Network amqpMessagingNetworkExample: enabled: false adapters: # mount (existing) Kubernetes secret which contains # credentials for connecting to AMQP network extraSecretMounts: - amqpNetwork: secretName: \u0026quot;my-secret\u0026quot; mountPath: \u0026quot;/etc/custom\u0026quot; # provide connection params # assuming that \u0026quot;my-secret\u0026quot; contains an \u0026quot;amqp-credenials.properties\u0026quot; file amqpMessagingNetworkSpec: host: my-custom.amqp-network.org port: 5672 credentialsPath: \u0026quot;/etc/custom/amqp-credentials.properties\u0026quot; commandAndControlSpec: host: my-custom.amqp-network.org port: 5672 credentialsPath: \u0026quot;/etc/custom/amqp-credentials.properties\u0026quot; Both the amqpMessagingNetworkSpec and the commandAndControlSpec need to contain Hono client configuration properties as described in the client admin guide. Make sure to adapt/add properties as required by the AMQP Messaging Network.\nNote that my-secret is expected to already exist in the namespace that Hono gets deployed to, i.e. the Helm chart will not create this secret.\nAssuming that the file is named customAmqpNetwork.yaml, the values can then be passed in to the helm install command as follows:\n# in directory: eclipse-hono-$VERSION helm install --dep-up --name hono --namespace hono -f customAmqpNetwork.yaml eclipse-hono/ Integrating with a custom Device Registry The Helm chart can be configured to use existing implementations of the Tenant, Device Registration, Credentials and Device Connection APIs instead of the example device registry. In order to do so, the protocol adapters need to be configured with information about the service endpoints and connection parameters.\nThe easiest way to set these properties is by means of putting them into a YAML file with the following content:\n# do not deploy example Device Registry deviceRegistryExample: enabled: false adapters: # mount (existing) Kubernetes secret which contains # credentials for connecting to services extraSecretMounts: - customRegistry: secretName: \u0026quot;my-secret\u0026quot; mountPath: \u0026quot;/etc/custom\u0026quot; # provide connection params # assuming that \u0026quot;my-secret\u0026quot; contains credentials files tenantSpec: host: my-custom.registry.org port: 5672 credentialsPath: \u0026quot;/etc/custom/tenant-service-credentials.properties\u0026quot; deviceRegistrationSpec: host: my-custom.registry.org port: 5672 credentialsPath: \u0026quot;/etc/custom/registration-service-credentials.properties\u0026quot; credentialsSpec: host: my-custom.registry.org port: 5672 credentialsPath: \u0026quot;/etc/custom/credentials-service-credentials.properties\u0026quot; deviceConnectionSpec: host: my-custom.registry.org port: 5672 credentialsPath: \u0026quot;/etc/custom/device-connection-service-credentials.properties\u0026quot; All of the specs need to contain Hono client configuration properties as described in the client admin guide. Make sure to adapt/add properties as required by the custom service implementations. The information contained in the specs will then be used by all protocol adapters that get deployed. As a consequence, it is not possible to use credentials for the services which are specific to the individual protocol adapters.\nNote that my-secret is expected to already exist in the namespace that Hono gets deployed to, i.e. the Helm chart will not create this secret.\nAssuming that the file is named customRegistry.yaml, the values can then be passed in to the helm install command as follows:\n# in directory: eclipse-hono-$VERSION helm install --dep-up --name hono --namespace hono -f customRegistry.yaml eclipse-hono/ Using the Device Connection Service Hono\u0026rsquo;s example Device Registry component contains a simple in-memory implementation of the Device Connection API. This example implementation is used by default when the example registry is deployed.\nHono also contains a production ready, data grid based implementation of the Device Connection API which can be deployed and used instead of the example implementation. The component can be deployed by means of setting the deviceConnectionService.enabled property to true when running Helm:\n# in directory: eclipse-hono-$VERSION helm install --dep-up --name hono --namespace hono --set deviceConnectionService.enabled=true eclipse-hono/ This will deploy the Device Connection service and configure all protocol adapters to use it instead of the example Device Registry implementation. However, the service requires a connection to a data grid in order to store the device connection data. The Helm chart supports deployment of a simple data grid which can be used for experimenting by means of setting the dataGridDeployExample property to true when running Helm:\n# in directory: eclipse-hono-$VERSION helm install --dep-up --name hono --namespace hono --set deviceConnectionService.enabled=true --set dataGridExample.enabled=true eclipse-hono/ This will deploy the data grid and configure the Device Connection service to use it for storing the connection data.\nThe Device Connection service can also be configured to connect to an already existing data grid. Please refer to the admin guide for details regarding the corresponding configuration properties.\nDeploying optional Adapters The Helm chart supports deployment of additional protocol adapters which are still considered experimental or have been deprecated. The following table provides an overview of the corresponding configuration properties that need to be set on deployment.\n Property Default Description adapters.lora.enabled false Indicates if the (experimental) LoRa WAN protocol adapter should be deployed. adapters.kura.enabled false Indicates if the deprecated Kura protocol adapter should be deployed. The following command will deploy the LoRa adapter along with Hono\u0026rsquo;s standard adapters:\n# in directory: eclipse-hono-$VERSION helm install --dep-up --name hono --namespace hono --set adapters.lora.enabled=true eclipse-hono/ Deploying custom Container Images The sections above describe how Hono\u0026rsquo;s pre-built container images can be deployed using Helm. In some cases it might be desirable to build Hono from source, e.g. in order to use a different metrics back end or to use Jaeger tracing. In these cases, the Helm templates contained in the source tree can be used instead of the Helm chart from the download page.\nThe container images created as part of the build process need to be made available to the Kubernetes cluster that Hono should be deployed to. This usually requires the images to be pushed to a (private) container registry that the cluster has pull access to. Please refer to the documentation of the employed Kubernetes service provider for details regarding the setup and configuration of a private container registry.\nDeploying via a private Registry The first step is getting the source code of Hono. Please refer to Building from Source for details. Once the source code has been retrieved, the build process can be started using the following command:\n# in base directory of Hono working tree: mvn clean install -Pbuild-docker-image,metrics-prometheus After the build process has finished, the custom container images need to be pushed to the registry so that the Kubernetes cluster can pull them from there during deployment. Assuming that the images should be tagged with 1.0-CUSTOM and the container registry name is my.registry.io, the following command can be used to tag the locally built images and push them to the registry:\n# in base directory of Hono working tree: ./push_hono_images.sh 1.0-CUSTOM my.registry.io Note You may need to log in to the (private) container registry before pushing the images. Once the images have been pushed, the deployment can be done using Helm:\n# in Hono working tree directory: hono/deploy helm install --dep-up --name hono --namespace hono --set deviceRegistry.imageName=my.registry.io/eclipse/hono-service-device-registry:1.0-CUSTOM,authServer.imageName=my.registry.io/eclipse/hono-service-auth:1.0-CUSTOM,deviceConnectionService.imageName=my.registry.io/eclipse/hono-service-device-connection:1.0-CUSTOM,adapters.amqp.imageName=my.registry.io/eclipse/hono-adapter-amqp-vertx:1.0-CUSTOM,adapters.mqtt.imageName=my.registry.io/eclipse/hono-adapter-mqtt-vertx:1.0-CUSTOM,adapters.http.imageName=my.registry.io/eclipse/hono-adapter-http-vertx:1.0-CUSTOM target/deploy/helm/eclipse-hono/ Deploying to Minikube When using Minikube as the deployment target, things are a little easier. Minikube comes with an embedded Docker daemon which can be used to build the container images instead of using a local Docker daemon, thus eliminating the need to push the images to a registry altogether. In order to use Minikube\u0026rsquo;s Docker daemon, the following command needs to be run:\neval $(minikube docker-env) This will set the Docker environment variables to point to Minikube\u0026rsquo;s Docker daemon which can then be used for building the container images and storing them locally in the Minikube VM.\nIn any case the build process can be started using the following command:\n# in base directory of Hono working tree: mvn clean install -Pbuild-docker-image,metrics-prometheus The newly built images can then be deployed using Helm:\n# in Hono working tree directory: hono/deploy helm install --dep-up --name hono --namespace hono target/deploy/helm/eclipse-hono/ Deploying to Azure Kubernetes Service (AKS) The following chapter describes how to use Azure Kubernetes Service (AKS) as a deployment target that has been set up as described in the Setting up a Kubernetes Cluster guide.\nFirst we build the docker images and push them into the ACR. Note that if you define a custom image tag you have to provide the helm with the image tags as described in the chapters above.\n# Resource group where the ACR is deployed. acr_resourcegroupname={YOUR_ACR_RG} # Name of your ACR. acr_registry_name={YOUR_ACR_NAME} # Full name of the ACR. acr_login_server=$acr_registry_name.azurecr.io # Authenticate your docker daemon with the ACR. az acr login --name $ACR_NAME # Build images. cd hono mvn install -Pbuild-docker-image -Ddocker.registry=$acr_login_server # Push images to ACR. ./push_hono_images.sh 1.0.0-SNAPSHOT $acr_login_server Now we can retrieve settings from the deployment for the following steps:\n# Resource group of the AKS deployment resourcegroup_name=hono aks_cluster_name=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.aksClusterName.value -o tsv` http_ip_address=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.httpPublicIPAddress.value -o tsv` amqp_ip_address=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.amqpPublicIPAddress.value -o tsv` mqtt_ip_address=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.mqttPublicIPAddress.value -o tsv` registry_ip_address=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.registryPublicIPAddress.value -o tsv` network_ip_address=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.networkPublicIPAddress.value -o tsv` Note: add the following lines in case you opted for the Azure Service Bus variant:\nservice_bus_namespace=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.serviceBusNamespaceName.value -o tsv` service_bus_key_name=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.serviceBusKeyName.value -o tsv` service_bus_key=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.serviceBusKey.value -o tsv` Next we prepare the k8s environment:\nk8s_namespace=honons kubectl create namespace $k8s_namespace Finally install Hono. Leveraging the managed-premium-retain storage in combination with deviceRegistry.resetFiles=false parameter is optional but ensures that Device registry storage will retain future update deployments.\n# in Hono working tree directory: hono/deploy helm install target/deploy/helm/eclipse-hono/ \\ --dep-up \\ --name hono \\ --namespace $k8s_namespace \\ --set adapters.mqtt.svc.annotations.\u0026quot;service\\.beta\\.kubernetes\\.io/azure-load-balancer-resource-group\u0026quot;=$resourcegroup_name \\ --set adapters.http.svc.annotations.\u0026quot;service\\.beta\\.kubernetes\\.io/azure-load-balancer-resource-group\u0026quot;=$resourcegroup_name \\ --set adapters.amqp.svc.annotations.\u0026quot;service\\.beta\\.kubernetes\\.io/azure-load-balancer-resource-group\u0026quot;=$resourcegroup_name \\ --set deviceRegistryExample.svc.annotations.\u0026quot;service\\.beta\\.kubernetes\\.io/azure-load-balancer-resource-group\u0026quot;=$resourcegroup_name \\ --set amqpMessagingNetworkExample.dispatchRouter.svc.annotations.\u0026quot;service\\.beta\\.kubernetes\\.io/azure-load-balancer-resource-group\u0026quot;=$resourcegroup_name \\ --set deviceRegistryExample.storageClass=managed-premium-retain \\ --set deviceRegistryExample.resetFiles=false \\ --set adapters.mqtt.svc.loadBalancerIP=$mqtt_ip_address \\ --set adapters.http.svc.loadBalancerIP=$http_ip_address \\ --set adapters.amqp.svc.loadBalancerIP=$amqp_ip_address \\ --set deviceRegistryExample.svc.loadBalancerIP=$registry_ip_address \\ --set amqpMessagingNetworkExample.dispatchRouter.svc.loadBalancerIP=$network_ip_address Note: add the following lines in case you opted for the Azure Service Bus variant:\n# Router update required to work together with Azure Service Bus --set amqpMessagingNetworkExample.dispatchRouter.imageName=quay.io/enmasse/qdrouterd-base:1.8.0 \\ --set amqpMessagingNetworkExample.broker.type=servicebus \\ --set amqpMessagingNetworkExample.broker.servicebus.saslUsername=$service_bus_key_name \\ --set amqpMessagingNetworkExample.broker.servicebus.saslPassword=$service_bus_key \\ --set amqpMessagingNetworkExample.broker.servicebus.host=$service_bus_namespace.servicebus.windows.net \\ Have fun with Hono on Microsoft Azure!\nNext steps:\nYou can follow the steps as described in the getting started tutorial with the following differences:\nCompared to a plain k8s deployment Azure provides us DNS names with static IPs for the Hono endpoints. To retrieve them:\nHTTP_ADAPTER_IP=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.httpPublicIPFQDN.value -o tsv` AMQP_ADAPTER_IP=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.amqpPublicIPFQDN.value -o tsv` MQTT_ADAPTER_IP=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.mqttPublicIPFQDN.value -o tsv` REGISTRY_IP=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.registryPublicIPFQDN.value -o tsv` AMQP_NETWORK_IP=`az group deployment show --name HonoBasicInfrastructure --resource-group $resourcegroup_name --query properties.outputs.networkPublicIPFQDN.value -o tsv` As Azure Service Bus does not support auto creation of queues you have to create a queue per tenant (ID), e.g. after you have created your tenant run:\naz servicebus queue create --resource-group $resourcegroup_name \\ --namespace-name $service_bus_namespace \\ --name $MY_TENANT Using Jaeger Tracing Hono\u0026rsquo;s components are instrumented using OpenTracing to allow tracking of the distributed processing of messages flowing through the system. The Hono chart can be configured to report tracing information to the Jaeger tracing system. The Spans reported by the components can then be viewed in a web browser.\nIn order for Hono\u0026rsquo;s components to use the Jaeger client for reporting tracing information, the container images need to be built with the jaeger Maven profile. Please refer to Monitoring \u0026amp; Tracing for details. The newly built images also need to be made available to the target Kubernetes cluster as described in the two previous sections.\nThe chart can be configured to deploy and use an example Jaeger back end by means of setting the jaegerBackendDeployExample property to true when running Helm:\n# in Hono working tree directory: hono/deploy helm install --dep-up --name hono --namespace hono --set jaegerBackendExample.enabled=true target/deploy/helm/eclipse-hono/ This will create a Jaeger back end instance suitable for testing purposes and will configure all deployed Hono components to use the Jaeger back end.\nThe following command can then be used to return the IP address with which the Jaeger UI can be accessed in a browser (ensure minikube tunnel is running when using minikube):\nkubectl get service hono-jaeger-query --output='jsonpath={.status.loadBalancer.ingress[0].ip}' -n hono If no example Jaeger back end should be deployed but instead an existing Jaeger installation should be used, the chart\u0026rsquo;s jaegerAgentConf property can be set to environment variables which are passed in to the Jaeger Agent that is deployed with each of Hono\u0026rsquo;s components.\n# in Hono working tree directory: hono/deploy helm install --dep-up --name hono --namespace hono --set jaegerAgentConf.REPORTER_TYPE=tchannel --set jaegerAgentConf.REPORTER_TCHANNEL_HOST_PORT=my-jaeger-collector:14267 target/deploy/helm/eclipse-hono/ "
},
{
"uri": "https://www.eclipse.org/hono/docs/deployment/openshift/",
"title": "OpenShift / OKD",
"tags": [],
"description": "",
- "content": "This guide describes how Eclipse Hono™ can be deployed on OpenShift with EnMasse, using the source-to-image (S2I) way. Using this approach, it is possible to customize and refresh the base images where Hono runs in. It also uses a more complex, multi-project setup and separates EnMasse and Grafana from the core Hono project.\n Use for demos only While this deployment model is closer to a production-ready deployment it still is missing some important aspects, so please do use this only as a base for your setup or as a demo setup. The following topics are currently not covered by this example deployment:\n Integration between EnMasse and Hono authentication Use your own versions of the device registry and authorization service These are all subjects to current and future developments in this area. This document will be updated accordingly with the progress.\n Prerequisites In order to work through this example deployment you will need the OpenShift client tools installed. Please align the version of the client tools with the version of your OpenShift cluster. This guide was tested with OpenShift 3.11.0. It might work with older or newer versions as well, but that is untested.\nAssumptions This tutorial makes the following assumptions about your environment, if those assumptions are not true in your specific environment you will need to adapt the following instructions:\n The admin URL of your OpenShift cluster is: https://my-cluster:8443 The name of your OpenShift user is developer All scripts and paths are relative to the folder deploy/src/main/deploy/openshift Some parts of this tutorial may need cluster admin privileges. When cluster admin privileges are required, the tutorial will indicate this by the command oc login -u admin. It will indicate the end of a section requiring cluster admin privileges by the command oc login -u developer. Note: Those command may be different on your installation. They only act as an example.\nLinux like environment The deployment guide assumes that you have a Linux like environment with things like bash, curl, git, … Mac OS X 10.13+ works as well, Windows with some kind of Unix tooling should also be possible.\nOpenShift Origin client tools The client tools can be downloaded from the OpenShift Origin project repository. Simply download the archive, unpack it and drop it into a directory where it can be found by the local PATH lookup.\nMinishift This tutorial is targeted towards running Hono on a production-ready OpenShift cluster. However it still is possible and useful to run the same setup on a local test cluster with \u0026ldquo;minishift\u0026rdquo;.\nMinishift is a tool that helps you run OpenShift locally by running a single-node OpenShift cluster inside a VM. Follow this guide for installing and having Minishift up and running.\nThe default resource limits for Minishift however are to small, so please ensure that you are running Minishift with the following settings:\nminishift start --cpus 4 --memory 16GB --disk-size 40GB Resource limits Once you created your Minishift cluster instance with minishift start the resource arguments (like --cpus) are ignored in future calls to minishift start as the virtual machine has already been created. You will need to destroy the instance using minishift delete before it will accept the new resource limits. When using minishift you can find your cluster URL by executing the following command:\nminishift console --url Some of the operations may require cluster admin privileges. For minishift an admin user can be created by executing the following commands, having a running minishift instance:\nminishift addons apply admin-user This will create a user named admin, with a password of admin, that has cluster admin privileges.\nOperator Lifecycle Manager A simple way to install additional operators in your cluster is via the Operator Lifecycle Manager (aka OLM). It can be enabled in OpenShift 3.11+ by setting openshift_enable_olm=true in the Ansible inventory file.\nFor Minishift, it can be enabled by execute the following commands as cluster admin:\ngit clone https://github.com/operator-framework/operator-lifecycle-manager cd operator-lifecycle-manager oc login -u admin oc new-project operator-lifecycle-manager oc create -f deploy/okd/manifests/latest/ oc login -u developer See also: https://github.com/operator-framework/operator-lifecycle-manager/blob/master/Documentation/install/install.md\nThis guide will use OLM in order to install the optional Prometheus Operator, which enables the aggregation of metrics from different Hono components.\nPersistent volumes You will need two persistent volumes for this deployment. The default required volumes are:\n Name Size Purpose hono-pv 128 Mi Storing device registry information grafana-pv 1 Gi Grafana configuration database In the folder admin/storage you will find a set of sub folders containing YAML files for setting up the persistent volumes (PVs). As there are multiple storage providers available you need to choose only one and must modify it to match your OpenShift setup (see the following subsections).\nIt may also be possible that your cluster supports automatic provisioning of storage, in this case you don\u0026rsquo;t need to create PVs explicitly.\nThe PVs can be created by executing the following command with a user that has cluster wide privileges:\noc create -f admin/storage/\u0026lt;type\u0026gt;/grafana-pv.yml oc create -f admin/storage/\u0026lt;type\u0026gt;/hono-pv.yml Minishift When you are running minishift, then you have automatic provisioning for PVs available. There is no need to create any PVs manually.\nLocal In the admin/storage/local folder you will find YAML files for setting up local storage volumes. Those volumes will be kept available when pods are restarted, but are only available on he local disk of a node. So pods can only run on this single node and not be migrated throughout a cluster.\nIf you have a single node cluster anyway, it might still be an easy option.\nYou will need to change the field .spec.hostPath.path to point to an existing directory which grants all access to \u0026ldquo;other\u0026rdquo; (chmod a+rwx .).\nThe storage capacity will only be used for matching PVs with PVCs and is not being enforced with this storage type.\nNFS The folder admin/storage/nfs contains a set of YAML files for setting up NFS based PVs. For this to work you will need a running NFS server and set up proper exports. It is possible to re-use the NFS server of your OpenShift installation if you already have one.\nYou will need to change the following fields:\n .spec.nfs.server – Hostname of the NFS server .spec.nfs.path – The name of the exported path Don\u0026#39;t use in production Applications running of top of NFS may have issues with things like file locking behavior, …. So it isn\u0026rsquo;t recommended to use NFS without proper testing and ensuring that it works the way you expect it. If you accept the risk of corrupted data, it might still be a simple setup for testing a multi-node setup. Also see: https://docs.openshift.org/latest/install_config/persistent_storage/persistent_storage_nfs.html\nAbility to create new projects The following guide requires three projects in the OpenShift cluster. It still is possible to modify the deployment to deploy to a single project, however this guide focuses on a setup having multiple projects.\nIf you don\u0026rsquo;t have permissions to create new projects yourself, then you will need to request three projects. The guide expects the projects names to be:\n enmasse – Hosting the EnMasse components. hono – For running Eclipse Hono. grafana – For running an instance of Grafana. Primarily for showing Hono dashboards. Those projects must be allowed to perform internal communication.\nIf projects will be created for you, then you can ignore the calls to oc new-project in the following sections.\nCertificates Certificates are a difficult topic, as every components brings in its own concept about how certificates are handled. This deployment guide tries to align everything with OpenShifts capabilities of managing certificates. That means that internal communication tries to use cluster generated certificates, signed by the cluster CA. And externally it tries to re-use the OpenShift router certificates, which are provided during the installation of OpenShift. One exception to that are the AMQP and MQTT protocols. As those currently cannot be re-encrypted.\nIf you deploy OpenShift without proper certificates, then you will automatically have self-signed certificates. In this case it is required to disable e.g. hostname validation later on. This deployment guide assumes that you have proper certificates set up, and will try to assist if that is not the case.\n Let\u0026#39;s encrypt As Let\u0026rsquo;s encrypt now supports wildcard certificates, having proper certificates may only be a few commands away for you. In general, curl commands require the parameter --insecure in order to work with self-signed certificates.\n Mac OS X 10.13\u0026#43; The curl binary on Mac OS X before 10.13 suffers from an issue with TLS SNI. Also see: https://github.com/curl/curl/issues/1533\nAs the use of SNI is required for Kubernetes/OpenShift, when it comes to routing requests to services, it is not possible to use the provided version of curl on Mac OS X before 10.13.\nYou can install a working curl version using in those Mac OS X released with the following commands:\nbrew install curl --with-openssl Or upgrade your existing installation using:\nbrew reinstall curl --with-openssl Or use proper certificates.\n Clone the Hono repository In order to have access to some of the requires scripts and resource of this deployment guide, you will need to clone the Hono repository to your local machine. You can do this with the following command:\ngit clone https://github.com/eclipse/hono.git Or if you want to check out a specific branch (e.g. 0.9.x):\ngit clone -b 0.9.x https://github.com/eclipse/hono.git Different branches This deployment description is based on the master branch of Hono. However this branch is also the current development and may be unstable at times.\nIf you experience any problems, it is recommended to switch to a release branch (e.g. 0.9.x) instead of using the default master branch. However this documentation is only published from the master branch, so there may be inconsistencies between the repository content and the documentation. In this case you can read through index.md file, checked out from the branch you cloned. The file is located in the directory hono-site/content/deployment/openshift.\n Setting up EnMasse This section describes how to install EnMasse, the messaging layer which Hono is based on.\nStart by downloading and unpacking EnMasse:\ncurl -LO https://github.com/EnMasseProject/enmasse/releases/download/0.25.0/enmasse-0.25.0.tgz tar xzf enmasse-0.25.0.tgz Other versions Other versions of EnMasse might work as well, but are untested by this deployment guide. Unless you explicitly want to try out a different version, it is recommended to use to the version documented in this tutorial. First switch to a user with cluster admin privileges, e.g.:\noc login -u admin Then create a new project:\noc new-project enmasse-infra --display-name='EnMasse' And perform the deployment:\noc apply -f enmasse-0.25.0/install/bundles/enmasse-with-standard-authservice Wait for the admin console to completely start up. You can check this with the following command:\noc get deploy/api-server deploy/keycloak Verify that the \u0026ldquo;AVAILABLE\u0026rdquo; column shows \u0026ldquo;1\u0026rdquo;:\nNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE api-server 1 1 1 1 1m keycloak 1 1 1 1 1m Finally switch back to your normal application user:\noc login -u developer Setting up Hono Start by creating a new project using:\noc new-project hono --display-name='Eclipse Hono™' Then create the EnMasse address space to use:\noc create -f hono-address-space.yml Before proceeding to the next step, ensure that the address space has been created and is ready. Executing the following command should contain Is Ready: true in the status section:\noc describe addressspace/default You can also quickly check for isReady with a JSON path query:\noc get addressspace/default -o jsonpath='{.status.isReady}' Then process and execute the main Hono template in order to deploy the Hono services:\noc process -f hono-template.yml | oc create -f - OpenShift templates allow to use parameters which can customize provided templates. If you want to specify template parameters from the command line use the following syntax:\noc process -f hono-template.yml \\ -p GIT_REPOSITORY=https://github.com/your/hono.git \\ -p GIT_BRANCH=0.9.x| oc create -f - Align branches By default the Hono template uses the master branch for deploying Hono. As this branch might be unstable this may not be what you are looking for, but it also is the default branch of the Hono Git repository where you checked out the deployment template.\nIt is recommended that when you execute the guide from an alternate branch (e.g. 0.9.x) that you also pass the same branch as GIT_BRANCH to the template.\n And register the template for creating new Hono tenants. This only registers the template, but does not create a new tenant yet:\noc create -f hono-tenant-template.yml Next you will need to create a tenant, execute the following command to create the default tenant:\noc process hono-tenant HONO_TENANT_NAME=DEFAULT_TENANT RESOURCE_NAME=defaulttenant CONSUMER_USER_NAME=consumer CONSUMER_USER_PASSWORD=\u0026quot;$(echo -n verysecret | base64)\u0026quot;| oc create -f - Creating tenants Creating a new tenant using the template currently only creates the necessary resources in EnMasse for the tenant. It does not create the tenant in the Hono device registry. Enabling metrics The default OpenShift deployment of Hono does support the use of Prometheus as a metrics backend. However it is still required to deploy an instance of Prometheus and Grafana to your installation in order to actually gather and visualize the metrics.\nAdding Prometheus support This section will explain how to set up Prometheus via the OLM and the Prometheus Operator. This is only an example, it is possible to install Prometheus in different ways. Or skip the installation of Prometheus, if you want to use a different metrics backend.\nRun the following commands to register the prometheus operator and create a new instance:\noc project hono oc create -f ../resource-descriptors/prometheus/operator.yml oc create -f ../resource-descriptors/prometheus/instance.yml Setting up Grafana Start by creating a new project using:\noc new-project grafana --display-name='Grafana Dashboard' Create the config resources:\noc create configmap grafana-provisioning-dashboards --from-file=../../config/grafana/provisioning/dashboards oc create configmap grafana-dashboard-defs --from-file=../../config/grafana/dashboard-definitions oc label configmap grafana-provisioning-dashboards app=hono-metrics oc label configmap grafana-dashboard-defs app=hono-metrics Then deploy the Grafana instance using:\noc process -f grafana-template.yml \\ -p ADMIN_PASSWORD=admin | oc create -f - OpenShift templates allow to use parameters which can customize provided templates. If you want to specify template parameters from the command line use the following syntax:\noc process -f grafana-template.yml \\ -p ADMIN_PASSWORD=admin \\ -p HONO_NAMESPACE=hono \\ -p GIT_REPOSITORY=https://github.com/your/hono.git \\ -p GIT_BRANCH=0.9.x| oc create -f - Configuring the installation The default installation of Hono can be tweaked in a few ways. The following sub-sections describe a few aspects that can be modified.\nConfigure maximum number of devices per tenant The default settings for the example Hono device registry limit the number of devices to 100 per tenant. If this is not enough for your setup you can change the setting by executing the following command, which will increase the number to 10.000 devices per tenant:\noc set env -n hono dc/hono-service-device-registry HONO_REGISTRY_SVC_MAX_DEVICES_PER_TENANT=10000 Adding Jaeger support By default Hono has the capability to work with OpenTracing, and it also provides a build profile for enabling the \u0026ldquo;Jaeger\u0026rdquo; implementation of OpenTracing.\nThere are a few manual steps required to modify the default Hono deployment for OpenShift in order to enable this profile.\nEnable the build profile The Hono profile needs to be enabled, to include the Jaeger components in the S2I builds.\nModify the Hono templates to add the jaeger profile in the builds. e.g.:\nname: fabric8-s2i-java-custom:2.3 env: - name: MAVEN_ARGS_APPEND - value: -B -pl org.eclipse.hono:hono-adapter-mqtt-vertx --also-make -Pnetty-tcnative + value: -B -pl org.eclipse.hono:hono-adapter-mqtt-vertx --also-make -Pnetty-tcnative -Pjaeger - name: ARTIFACT_DIR value: adapters/mqtt-vertx/target - name: ARTIFACT_COPY_ARGS Be sure to trigger new builds if you already built the container images before.\nAdd the Jaeger agent sidecar In order to add capture output from the Jaeger client and forward it to the main Jaeger application, a Jaeger agent is required. This will be deployed alongside each Hono service, as a dedicated container, but in the same pod (aka sidecar).\nThis requires a new image stream:\nkind: ImageStream apiVersion: v1 metadata: name: jaeger-agent spec: lookupPolicy: local: false tags: - name: \u0026quot;latest\u0026quot; from: kind: DockerImage name: docker.io/jaegertracing/jaeger-agent:latest importPolicy: scheduled: true referencePolicy: type: Source Then you need to modify the deployment configuration for each Hono service that should use the Jaeger agent:\n- kind: DeploymentConfig apiVersion: v1 metadata: name: hono-adapter-mqtt-vertx labels: app: hono-adapter deploymentconfig: hono-adapter-mqtt-vertx spec: replicas: 1 selector: app: hono-adapter deploymentconfig: hono-adapter-mqtt-vertx strategy: type: Rolling rollingParams: timeoutSeconds: 3600 triggers: - type: ConfigChange - type: ImageChange imageChangeParams: automatic: true containerNames: - eclipsehono-hono-adapter-mqtt-vertx from: kind: ImageStreamTag name: hono-adapter-mqtt-vertx:latest + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - jaeger-agent + from: + kind: ImageStreamTag + name: jaeger-agent:latest template: metadata: labels: app: hono-adapter deploymentconfig: hono-adapter-mqtt-vertx spec: containers: - name: eclipsehono-hono-adapter-mqtt-vertx image: hono-adapter-mqtt-vertx imagePullPolicy: Always env: - name: SPRING_CONFIG_LOCATION value: file:///etc/config/ - name: SPRING_PROFILES_ACTIVE value: - name: LOGGING_CONFIG value: file:///etc/config/logback-spring.xml - name: KUBERNETES_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: HONO_MESSAGING_HOST valueFrom: configMapKeyRef: name: hono-configuration key: downstream.host - name: HONO_MESSAGING_PORT valueFrom: configMapKeyRef: name: hono-configuration key: downstream.port - name: HONO_COMMAND_HOST valueFrom: configMapKeyRef: name: hono-configuration key: downstream.host - name: HONO_COMMAND_PORT valueFrom: configMapKeyRef: name: hono-configuration key: downstream.port - name: HONO_REGISTRATION_HOST value: hono-service-device-registry.$(KUBERNETES_NAMESPACE).svc - name: HONO_CREDENTIALS_HOST value: hono-service-device-registry.$(KUBERNETES_NAMESPACE).svc - name: HONO_TENANT_HOST value: hono-service-device-registry.$(KUBERNETES_NAMESPACE).svc - name: MANAGEMENT_METRICS_EXPORT_GRAPHITE_HOST value: influxdb.$(KUBERNETES_NAMESPACE).svc - name: AB_JOLOKIA_USER value: jolokia - name: AB_JOLOKIA_PASSWORD_RANDOM value: \u0026quot;false\u0026quot; - name: AB_JOLOKIA_PASSWORD valueFrom: secretKeyRef: name: hono-secrets key: jolokia.password readinessProbe: httpGet: path: /readiness port: 8088 scheme: HTTPS initialDelaySeconds: 10 livenessProbe: httpGet: path: /liveness port: 8088 scheme: HTTPS initialDelaySeconds: 180 resources: limits: memory: 512Mi ports: - containerPort: 8778 name: jolokia - containerPort: 8088 name: radan-http protocol: TCP - containerPort: 8883 name: secure-mqtt protocol: TCP - containerPort: 1883 name: mqtt protocol: TCP securityContext: privileged: false volumeMounts: - mountPath: /etc/config name: conf - mountPath: /etc/secrets name: secrets readOnly: true - mountPath: /etc/tls name: tls readOnly: true + - image: jaeger-agent + name: jaeger-agent + ports: + - containerPort: 5775 + protocol: UDP + - containerPort: 5778 + - containerPort: 6831 + protocol: UDP + - containerPort: 6832 + protocol: UDP + command: + - \u0026quot;/go/bin/agent-linux\u0026quot; + - \u0026quot;--collector.host-port=jaeger-collector.jaeger.svc:14267\u0026quot; + env: + - name: JAEGER_SERVICE_NAME + value: hono-adapter-mqtt volumes: - name: conf configMap: name: hono-adapter-mqtt-vertx-config - name: secrets secret: secretName: hono-mqtt-secrets - name: tls secret: secretName: hono-adapter-mqtt-vertx-tls The important parts are only the modifications, which add a new image stream trigger, and also add the additional agent container to the deployment. This example assumes that the Jaeger collector will be available at the hostname jaeger-collector.jaeger.svc. This will be true if you follow the next section on deploying a development-only Jaeger cluster. Should you deploy Jaeger differently, then this hostname and/or port may be different.\nDeploy Jaeger Setting up a full Jaeger cluster is a complicated task. However there is a good tutorial at the Jaeger repository at: https://github.com/jaegertracing/jaeger-openshift\nA simple deployment, for testing purposes only, can be performed by running the development setup template of Jaeger for OpenShift:\noc new-project jaeger oc process -f https://raw.githubusercontent.com/jaegertracing/jaeger-openshift/master/all-in-one/jaeger-all-in-one-template.yml | oc create -f - Please be aware of the official note in the documentation:\n This template uses an in-memory storage with a limited functionality for local testing and development. Do not use this template in production environments.\n Using the installation All following examples make use of the running Hono instance. They pretty much follow the other examples. Please note that, compared to the more simple OpenShift deployment, in this case we need to take care of different project names when looking up route host names via oc get. You can use the command line argument -n \u0026lt;project\u0026gt; to specify the project name without changing the default selected project.\nAll examples in the following sub-sections assume that you are located in the cli directory.\nExtract certificates In order to connect the external consumer to Enmasse, we need to extract the certificate which messaging endpoint of EnMasse uses. This allows to validate the connection to the endpoint and encrypt the communication using TLS.\nThe following command extracts the certificate of the endpoint (not the key):\noc -n hono get addressspace default -o jsonpath={.status.endpointStatuses[?(@.name==\\'messaging\\')].cert} | base64 -d \u0026gt; target/config/hono-demo-certs-jar/tls.crt This will retrieve the certificate, decode the base64 encoded string and store it in the file target/config/hono-demo-certs-jar/tls.crt. Although the file is a \u0026ldquo;demo cert\u0026rdquo; as the path might indicate, it still is stored in the same location in order to align the with the other example commands of the Hono documentation.\nRunning consumer As described in the Getting Started guide, data produced by devices is usually consumed by downstream applications which connect directly to the router network service. You can start the client from the cli folder as follows:\nmvn spring-boot:run -Dspring-boot.run.arguments=--hono.client.host=$(oc -n hono get addressspace default -o jsonpath={.status.endpointStatuses[?(@.name==\\'messaging\\')].externalHost}),--hono.client.port=443,--hono.client.username=consumer,--hono.client.password=verysecret,--hono.client.trustStorePath=target/config/hono-demo-certs-jar/tls.crt Register device In order to upload telemetry data to Hono, the device needs to be registered with the system. You can register the device using the Device Registry by running the following command (i.e. for a device with ID 4711):\ncurl -X POST -i -H 'Content-Type: application/json' -d '{\u0026quot;device-id\u0026quot;: \u0026quot;4711\u0026quot;}' https://$(oc get -n hono route hono-service-device-registry-https --template='{{.spec.host}}')/registration/DEFAULT_TENANT Uploading Telemetry with HTTP After having the device registered, uploading telemetry is just a simple HTTP POST command to the HTTP Adapter:\ncurl -X POST -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'Content-Type: application/json' --data-binary '{\u0026quot;temp\u0026quot;: 5}' https://$(oc -n hono get route hono-adapter-http-vertx-sec --template='{{.spec.host}}')/telemetry "
+ "content": "In Hono version 1.0 we dropped the OpenShift specific deployment using the source-to-image (S2I) model, in favor of the Helm charts and the Eclipse IoT Packages project.\nYou can still deploy to OpenShift and OKD, using the Helm charts. And you can also use routes to expose services. Deploying using S2I is also still possible, however the Hono project simply no longer provides out-of-the box scripts for doing so.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/deployment/create-kubernetes-cluster/",
"title": "Setting up a Kubernetes Cluster",
"tags": [],
"description": "",
- "content": "This guide describes how to set up a Kubernetes cluster which can be used to run Eclipse Hono.\nHono can be deployed to any Kubernetes cluster running version 1.11 or newer. This includes OpenShift (Origin) which is built on top of Kubernetes.\nThe Kubernetes web site provides instructions for setting up a (local) cluster on bare metal and/or virtual infrastructure from scratch or for provisioning a managed Kubernetes cluster from one of the popular cloud providers.\n\nSetting up a local Development Environment The easiest option is to set up a single-node cluster running on a local VM using the Minikube project. This kind of setup is sufficient for evaluation and development purposes. Please refer to Kubernetes\u0026rsquo; Minikube setup guide for instructions on how to set up a cluster locally.\nThe recommended settings for a Minikube VM used for running Hono\u0026rsquo;s example setup are as follows:\n cpus: 2 memory: 8192 (MB) The command to start the VM will look something like this:\nminikube start --cpus 2 --memory 8192 After the Minikube VM has started successfully, the minikube tunnel command should be run in order to support Hono\u0026rsquo;s services being deployed using the LoadBalancer type. Please refer to the Minikube Networking docs for details.\n Supported Kubernetes Versions Minikube will use the most recent Kubernetes version that was available when it has been compiled by default. Hono should run on any version of Kubernetes starting with 1.13.6. However, it has been tested with several specific versions only so if you experience any issues with running Hono on a more recent version, please try to deploy to 1.13.6 before raising an issue. You can use Minikube\u0026rsquo;s --kubernetes-version command line switch to set a particular version. Setting up a Production Environment Setting up a multi-node Kubernetes cluster is a more advanced topic. Please follow the corresponding links provided in the Kubernetes documentation.\nSetting up a Cluster using Azure Kubernetes Service The following sections provide step-by-step instructions for setting up a Kubernetes cluster on Microsoft Azure that can be used to run Hono.\nPrepare Environment At this step we expect you have clean Ubuntu VM or PC (tested on Ubuntu 18.04.2 LTS (GNU/Linux 4.18.0-1013-azure x86_64))\nInstall azure cli sudo apt-get update sudo apt-get install curl apt-transport-https lsb-release gpg curl -sL https://packages.microsoft.com/keys/microsoft.asc | \\ gpg --dearmor | \\ sudo tee /etc/apt/trusted.gpg.d/microsoft.asc.gpg \u0026gt; /dev/null AZ_REPO=$(lsb_release -cs) echo \u0026quot;deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main\u0026quot; | \\ sudo tee /etc/apt/sources.list.d/azure-cli.list sudo apt-get update sudo apt-get install azure-cli Install Kubectl The kubectl tool is used to manage a Kubernetes cluster from the command line. Follow the installation guide in order to set up kubectl on your local machine.\nLog in to Azure Type\naz login and follow instructions on screen.\nA result of successful log in will be a JSON output with subscription details. Run the following command, using the subscription id from the JSON structure:\naz account set -s \u0026quot;{YOUR SUBSCRIPTION ID}\u0026quot; Before we continue, let\u0026rsquo;s setup some variables, that will be used to create resources on Azure:\n# Name of your Resource Group, where all services will be deployed AKS_RESOURCE_GROUP={YOUR-RG-NAME} # Name of your AKS cluster AKS_CLUSTER_NAME={YOUR-AKS-NAME} # Name of your private container registry (should match ^[a-zA-Z0-9]*$) ACR_NAME={YOUR-ACR-NAME} Create Resource Group for Hono Deployment az group create --name $AKS_RESOURCE_GROUP --location westeurope Create private Container Registry on Azure az acr create --resource-group $AKS_RESOURCE_GROUP --name $ACR_NAME --sku Basic The full name of the private container registry will be $ACR_NAME.azurecr.io. This name needs to be used with the docker push command when pushing container images to the registry.\nLog in to Container Registry sudo az acr login --name $ACR_NAME Create Azure Kubernetes Service Cluster Now it\u0026rsquo;s time to create the AKS cluster.\nCreate Service Principal az ad sp create-for-rbac --skip-assignment If successful, appId and password will be displayed.\nCreate Cluster # It is recommended to use kubernetes 1.12.5 or higher # To list available versions run: # az aks get-versions --location westeurope --output table az aks create --name $AKS_CLUSTER_NAME --resource-group $AKS_RESOURCE_GROUP --node-count 3 --generate-ssh-keys --service-principal \u0026quot;{appId}\u0026quot; --client-secret \u0026quot;{password}\u0026quot; --enable-addons monitoring --kubernetes-version 1.13.5 Set Cluster as current Context for kubectl az aks get-credentials --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME Create ClusterRoleBinding for Kubernetes dashboard # By default, AKS is deployed with RBAC enabled. Refer to this doc: https://docs.microsoft.com/en-us/azure/aks/kubernetes-dashboard kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard Deploy Helm\u0026rsquo;s Tiller Service kubectl create serviceaccount --namespace kube-system tiller kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller helm init --service-account tiller Grant AKS Cluster access to Container Registry # Get the id of the service principal configured for AKS CLIENT_ID=$(az aks show --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query \u0026quot;servicePrincipalProfile.clientId\u0026quot; --output tsv) # Get the ACR registry resource id ACR_ID=$(az acr show --name $ACR_NAME --resource-group $AKS_RESOURCE_GROUP --query \u0026quot;id\u0026quot; --output tsv) # Create role assignment az role assignment create --assignee $CLIENT_ID --role acrpull --scope $ACR_ID (Optional) Create retain StorageClass for the Device Registry With the reclaim policy retain AKS ensures that your storage persists even through Hono redeployments.\nCreate a file managed-premium-retain.yaml with the following content.\nkind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: managed-premium-retain provisioner: kubernetes.io/azure-disk reclaimPolicy: Retain parameters: storageaccounttype: Premium_LRS kind: Managed Now apply to your AKS cluster:\nkubectl apply -f managed-premium-retain.yaml Note: in your helm deployment later you have to set the value deviceRegistry.storageClass=managed-premium-retain.\nMonitoring You can monitor your cluster using Azure Monitor Insights.\nNavigate to https://portal.azure.com -\u0026gt; your resource group -\u0026gt; your kubernetes cluster\nOn an overview tab you fill find an information about your cluster (status, location, version, etc.). Also, here you will find a \u0026ldquo;Monitor Containers\u0026rdquo; link. Navigate to \u0026ldquo;Monitor Containers\u0026rdquo; and explore metrics and statuses of your Cluster, Nodes, Controllers and Containers.\nAnother option is to use the kubernetes dashboard. To do this, run:\naz aks browse --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME This will create a port forward for Kubernetes\u0026rsquo; dashboard on your local port 8001. Open http://127.0.0.1:8001 in your browser and select Namespace hono, check status of your services, pods, etc.\nCleaning up Use the following command to delete all created resources (incl. the Kubernetes cluster and the private container registry) once they are no longer needed:\naz group delete --name $AKS_RESOURCE_GROUP --yes --no-wait Links Azure CLI Azure Kubernetes Service Azure Container Registry "
+ "content": "This guide describes how to set up a Kubernetes cluster which can be used to run Eclipse Hono\u0026trade;.\nHono can be deployed to any Kubernetes cluster running version 1.11 or newer. This includes OpenShift (Origin) which is built on top of Kubernetes.\nThe Kubernetes web site provides instructions for setting up a (local) cluster on bare metal and/or virtual infrastructure from scratch or for provisioning a managed Kubernetes cluster from one of the popular cloud providers.\n\nSetting up a local Development Environment The easiest option is to set up a single-node cluster running on a local VM using the Minikube project. This kind of setup is sufficient for evaluation and development purposes. Please refer to Minikube\u0026rsquo;s getting started guide for instructions on how to set up a cluster locally.\nThe recommended settings for a Minikube VM used for running Hono\u0026rsquo;s example setup are as follows:\n cpus: 2 memory: 8192 (MB) The command to start the VM will look something like this:\nminikube start --cpus 2 --memory 8192 After the Minikube VM has started successfully, the minikube tunnel command should be run in order to support Hono\u0026rsquo;s services being deployed using the LoadBalancer type. Please refer to the Minikube Loadbalancer docs for details.\n Setting Kubernetes Version Minikube will use the most recent Kubernetes version that was available when it has been compiled by default. Hono should run on any version of Kubernetes starting with 1.13.6. However, it has been tested with several specific versions only. The most recent version known to work is 1.15.4 so if you experience any issues with running Hono on another version, please try to deploy to 1.15.4 before raising an issue. You can use Minikube\u0026rsquo;s --kubernetes-version command line switch to set a particular version. Setting up a Production Environment Setting up a multi-node Kubernetes cluster is a more advanced topic. Please follow the corresponding links provided in the Kubernetes documentation.\nSetting up an Environment on Microsoft Azure This chapter describes how Hono can be deployed on Microsoft Azure. It includes:\n Azure Resource Manager (ARM) templates for an automated infrastructure deployment. Hono deployment into Azure Kubernetes Service (AKS). Push Hono docker images to an Azure Container Registry (ACR). Optional Azure Service Bus as broker for the Hono AMQP 1.0 Messaging Network instead of a self hosted ActiveMQ Artemis. Virtual Network (VNet) service endpoints ensure protected communication between AKS and Azure Service Bus. Use for demos only This deployment model is not meant for productive use but rather for evaluation as well as demonstration purposes or as a baseline to evolve a production grade Application architecture out of it which includes Hono. Prerequisites An Azure subscription. Azure CLI installed to setup the infrastructure. kubectl and helm installed to deploy Hono into Azure Kubernetes Service (AKS). Setup As described here we will create an explicit service principal. Later we add roles to this principal to access the Azure Container Registry (ACR).\n# Resource group where the ACR is deployed. acr_resourcegroupname={YOUR_ACR_RG} # Name of your ACR. acr_registry_name={YOUR_ACR_NAME} # Full name of the ACR. acr_login_server=$acr_registry_name.azurecr.io # Create service principal service_principal=`az ad sp create-for-rbac --name http://honoServicePrincipal --skip-assignment --output tsv` app_id_principal=`echo $service_principal|cut -f1 -d ' '` password_principal=`echo $service_principal|cut -f4 -d ' '` object_id_principal=`az ad sp show --id $app_id_principal --query objectId --output tsv` acr_id_access_registry=`az acr show --resource-group $acr_resourcegroupname --name $acr_registry_name --query \u0026quot;id\u0026quot; --output tsv` Note: it might take a few seconds until the principal is available for the next steps.\naz role assignment create --assignee $app_id_principal --scope $acr_id_access_registry --role Reader resourcegroup_name=hono az group create --name $resourcegroup_name --location \u0026quot;westeurope\u0026quot; With the next command we will use the provided Azure Resource Manager (ARM) templates to setup the AKS cluster. This might take a while.\nunique_solution_prefix=myprefix cd deploy/src/main/deploy/azure/ az group deployment create --name HonoBasicInfrastructure --resource-group $resourcegroup_name --template-file arm/honoInfrastructureDeployment.json --parameters uniqueSolutionPrefix=$unique_solution_prefix servicePrincipalObjectId=$object_id_principal servicePrincipalClientId=$app_id_principal servicePrincipalClientSecret=$password_principal Note: add the following parameter in case you want to opt for the Azure Service Bus as broker in the Hono AMQP 1.0 Messaging Network instead of deploying a (self-hosted) ActiveMQ Artemis into AKS: serviceBus=true\nAfter the deployment is complete you can set your cluster in kubectl.\naz aks get-credentials --resource-group $resourcegroup_name --name $aks_cluster_name Next deploy helm on to the AKS cluster as well create retain storage for the device registry. It will take a moment until tiller is booted up.\nkubectl apply -f helm-rbac.yaml helm init --service-account tiller kubectl apply -f managed-premium-retain.yaml Now wait until the Azure deployment is complete and then continue with the Helm deployment of Hono itself.\nMonitoring You can monitor your cluster using Azure Monitor for containers.\nNavigate to https://portal.azure.com -\u0026gt; your resource group -\u0026gt; your kubernetes cluster\nOn an overview tab you fill find an information about your cluster (status, location, version, etc.). Also, here you will find a \u0026ldquo;Monitor Containers\u0026rdquo; link. Navigate to \u0026ldquo;Monitor Containers\u0026rdquo; and explore metrics and statuses of your Cluster, Nodes, Controllers and Containers.\nCleaning up Use the following command to delete all created resources once they are no longer needed:\naz group delete --name $resourcegroup_name --yes --no-wait "
},
{
"uri": "https://www.eclipse.org/hono/docs/deployment/resource-limitation/",
"title": "Limiting Resource Usage",
"tags": [],
"description": "",
- "content": "Deploying Eclipse Hono\u0026trade; to a container orchestration platform is easy thanks to the provided Docker images. This page provides some guidance for configuring the resource consumption of these containers in order to make sure that they get enough memory and CPU to run properly, but to also make sure that individual containers do not use up all the resources causing other containers to starve.\nDocker itself provides means to limit a container\u0026rsquo;s consumption of memory and CPU resources by means of command line options that can be set when starting up a container. Both Kubernetes and OpenShift leverage this mechanism when defining resource limits of a pod. Please refer to the corresponding documentation of Docker, Kubernetes and OpenShift for details regarding the particular syntax to be used.\nJava\u0026rsquo;s View of the World Hono\u0026rsquo;s service components are implemented in Java. When the corresponding Docker container for such a service is started, the only process being run inside the container is therefore a Java virtual machine (JVM). On startup, the JVM tries to determine the amount of memory and the number of CPU cores that it can use to execute workloads. By default the JVM queries the operating system for the corresponding parameters and adjusts its runtime parameters accordingly, e.g. it will by default limit the size of its heap memory to a quarter of the total memory available in order to leave enough memory for other processes running on the same system.\nThis is a reasonable approach when running on bare metal or a VM where other processes are expected to be running on the same machine, thus competing for the same computing resources. However, containers are usually configured to run a single process only so that it makes more sense to dedicate almost all of the available resources to running that process, leaving the (small) rest for the operating system itself.\nAs described above, a Docker container can easily be configured with a limit for memory and CPU resources that it may use during runtime. These limits are set and enforced using Linux CGroups. When a Java VM is run inside of such a Docker container which has been configured with a memory limit, then the result of the JVM\u0026rsquo;s attempt to determine the available resources during startup will not reflect the memory limit imposed on the container. That is because the JVM by default does not consider the CGroup limit but instead queries the operating system for the overall amount of memory available. The same is true for the way that the JVM determines the number of available CPU cores.\nAs described above, a Docker container can easily be configured with a limit for memory and CPU resources that it may use during runtime. These limits are set and enforced using Linux CGroups. When a pre version 9 Java VM is run inside of such a Docker container which has been configured with a memory limit, then the result of the JVM\u0026rsquo;s attempt to determine the available resources during startup will not reflect the memory limit imposed on the container. That is because the JVM by default does not consider the CGroup limit but instead queries the operating system for the overall amount of memory available. The same is true for the way that the JVM determines the number of available CPU cores. Starting with version 9 Java correctly determines the amount of memory and CPUs available when running in a container.\nLimiting a Container\u0026rsquo;s Memory Consumption Java 8 OpenJDK 8 has introduced the experimental -XX:+UseCGroupMemoryLimitForHeap option to make the JVM consider CGroup limits when determining the amount of available memory. Using this option, it is possible to explicitly configure a Java 8 VM\u0026rsquo;s memory consumption within the boundaries of the container\u0026rsquo;s (limited) resources. However, the JVM will still only allocate a quarter of the (limited) amount of memory, thus leaving a lot of the memory available to the container unused.\nEither of the following JVM options can be used in Java 8 in order to change this behavior:\n -XX:MaxRAMFraction can be used to set the fraction of total memory that may be allocated for the heap. The default value is 4 (meaning that up to a quarter of the memory will be allocated), so in order to increase the amount of memory, the value can be set to 2 (using up to 50% of the memory) or 1 (using up to 100% of the memory). Setting the option to 1 is strongly discouraged because it would leave no memory left for the JVM\u0026rsquo;s other memory areas nor any additional processes run by the operating system. -Xmx can be used to explicitly set the maximum amount of memory used for the heap. As a rule of thumb, setting this value to 60-70% of the container\u0026rsquo;s (limited) amount of memory should usually work. Based on the application\u0026rsquo;s memory usage characteristics, increasing the value to 80 or even 90% might also work. Java 9 and later Starting with Java 9, the JVM will correctly determine the total memory and number of CPUs available when running inside of a container. All of the Docker images provided by Hono run with OpenJDK 11 by default, thus ensuring that the JVM considers any memory limits configured for the container when configuring its heap during startup. However, the default algorithm will still only allocate a quarter of the (limited) amount of memory, thus leaving a lot of memory available to the container unused.\nThe following JVM options can be used in Java 9 and later in order to change this behavior:\n -XX:MinRAMPercentage, -XX:MaxRAMPercentage and -XX:InitialRAMPercentage can be used to set the (minimum, maximum and initial) percentage of total memory that may be allocated for the heap. A value of 70-80% should work if no other processes are running in the same container. Kubernetes In Kubernetes (and OpenShift) the resource limits for a pod, and thus the container(s) that are part of the pod, can be configured in the corresponding PodSpec. The following example from the HTTP adapter\u0026rsquo;s Kubernetes Deployment resource descriptor illustrates the mechanism:\napiVersion: apps/v1beta1 kind: Deployment metadata: name: hono-adapter-http-vertx spec: template: metadata: labels: app: hono-adapter-http-vertx version: \u0026quot;${project.version}\u0026quot; group: ${project.groupId} spec: containers: - image: eclipse/hono-adapter-http-vertx:${project.version} name: eclipse-hono-adapter-http-vertx resources: limits: memory: \u0026quot;256Mi\u0026quot; ports: - containerPort: 8080 protocol: TCP env: - name: SPRING_CONFIG_LOCATION value: file:///etc/hono/ - name: SPRING_PROFILES_ACTIVE value: dev - name: LOGGING_CONFIG value: classpath:logback-spring.xml - name: _JAVA_OPTIONS value: \u0026quot;-XX:MinRAMPercentage=80 -XX:MaxRAMPercentage=80\u0026quot; volumeMounts: - mountPath: /etc/hono name: conf readOnly: true volumes: - name: conf secret: secretName: hono-adapter-http-vertx-conf The resources property defines the overall limit of 256 MB of memory that the pod may use. The _JAVA_OPTIONS environment variable is again used to configure the JVM to use 80% of the total memory for its heap.\nLimiting the Number of Device Connections Hono supports limiting the overall number of simultaneously connected devices per tenant. Please refer to the connections limit concept for more information. The limit needs to be configured at the tenant level using the resource-limits configuration property. Please refer to the Tenant API for configuration details.\nLimiting the Number of Messages Hono supports limiting the number of messages that devices of a tenant can publish to Hono during a given time interval. Please refer to the messages limit concept for more information. The limit needs to be configured at the tenant level using the resource-limits configuration property. Please refer to the Tenant API for configuration details.\n"
+ "content": "Deploying Eclipse Hono\u0026trade; to a container orchestration platform is easy thanks to the provided Docker images. This page provides some guidance for configuring the resource consumption of these containers in order to make sure that they get enough memory and CPU to run properly, but to also make sure that individual containers do not use up all the resources causing other containers to starve.\nDocker itself provides means to limit a container\u0026rsquo;s consumption of memory and CPU resources by means of command line options that can be set when starting up a container. Both Kubernetes and OpenShift leverage this mechanism when defining resource limits of a pod. Please refer to the corresponding documentation of Docker, Kubernetes and OpenShift for details regarding the particular syntax to be used.\nJava\u0026rsquo;s View of the World Hono\u0026rsquo;s service components are implemented in Java. When the corresponding Docker container for such a service is started, the only process being run inside the container is therefore a Java virtual machine (JVM). On startup, the JVM tries to determine the amount of memory and the number of CPU cores that it can use to execute workloads. By default the JVM queries the operating system for the corresponding parameters and adjusts its runtime parameters accordingly, e.g. it will by default limit the size of its heap memory to a quarter of the total memory available in order to leave enough memory for other processes running on the same system.\nThis is a reasonable approach when running on bare metal or a VM where other processes are expected to be running on the same machine, thus competing for the same computing resources. However, containers are usually configured to run a single process only so that it makes more sense to dedicate almost all of the available resources to running that process, leaving the (small) rest for the operating system itself.\nAs described above, a Docker container can easily be configured with a limit for memory and CPU resources that it may use during runtime. These limits are set and enforced using Linux CGroups.\nLimiting a Component\u0026rsquo;s Memory Consumption Starting with Java 9, the JVM will correctly determine the total memory and number of CPUs available when running inside of a container. All of the Docker images provided by Hono run with OpenJDK 11 by default, thus ensuring that the JVM considers any memory limits configured for the container when configuring its heap during startup. However, the default algorithm will still only allocate a quarter of the (limited) amount of memory, thus leaving a lot of memory available to the container unused.\nThe following JVM options can be used in Java 9 and later in order to change this behavior:\n -XX:MinRAMPercentage, -XX:MaxRAMPercentage and -XX:InitialRAMPercentage can be used to set the (minimum, maximum and initial) percentage of total memory that may be allocated for the heap. A value of 70-80% should work if no other processes are running in the same container. Kubernetes In Kubernetes (and OpenShift) the resource limits for a pod, and thus the container(s) that are part of the pod, can be configured in the corresponding PodSpec. The following example from the HTTP adapter\u0026rsquo;s Kubernetes Deployment resource descriptor illustrates the mechanism:\napiVersion: apps/v1beta1 kind: Deployment metadata: name: hono-adapter-http-vertx spec: template: metadata: labels: app: hono-adapter-http-vertx version: \u0026quot;${project.version}\u0026quot; group: ${project.groupId} spec: containers: - image: eclipse/hono-adapter-http-vertx:${project.version} name: eclipse-hono-adapter-http-vertx resources: limits: memory: \u0026quot;256Mi\u0026quot; ports: - containerPort: 8080 protocol: TCP env: - name: SPRING_CONFIG_LOCATION value: file:///etc/hono/ - name: SPRING_PROFILES_ACTIVE value: dev - name: LOGGING_CONFIG value: classpath:logback-spring.xml - name: _JAVA_OPTIONS value: \u0026quot;-XX:MinRAMPercentage=80 -XX:MaxRAMPercentage=80\u0026quot; volumeMounts: - mountPath: /etc/hono name: conf readOnly: true volumes: - name: conf secret: secretName: hono-adapter-http-vertx-conf The resources property defines the overall limit of 256 MB of memory that the pod may use. The _JAVA_OPTIONS environment variable is again used to configure the JVM to use 80% of the total memory for its heap.\nLimiting the Number of Device Connections Hono supports limiting the overall number of simultaneously connected devices per tenant. Please refer to the connections limit concept for more information. The limit needs to be configured at the tenant level using the resource-limits configuration property. Please refer to the Tenant API for configuration details.\nLimiting the Data Volume Hono supports limiting the amount of data that devices of a tenant can publish to Hono during a given time interval. Please refer to the messages limit concept for more information. The limit needs to be configured at the tenant level using the resource-limits configuration property. Please refer to the Tenant API for configuration details.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/architecture/",
"title": "Architecture",
"tags": [],
"description": "",
- "content": " Architecture Get an overview over Hono\u0026rsquo;s architecture.\n"
+ "content": " Architecture Get an overview of the architecture of Eclipse Hono\u0026trade;.\n"
},
{
"uri": "https://www.eclipse.org/hono/docs/architecture/component-view/",
diff --git a/docs/index.xml b/docs/index.xml
index dcc380d..9d550ad 100644
--- a/docs/index.xml
+++ b/docs/index.xml
@@ -342,7 +342,7 @@
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.eclipse.org/hono/docs/api/credentials/</guid>
- <description><p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports the look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p></description>
+ <description><p>The <em>Credentials API</em> is used by <em>Protocol Adapters</em> to retrieve credentials used to authenticate <em>Devices</em> connecting to the adapter. In particular, the API supports to look up <em>shared secrets</em> which are often used by IoT devices by means of <em>username/password</em> based authentication schemes.</p></description>
</item>
<item>
@@ -392,11 +392,8 @@
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.eclipse.org/hono/docs/deployment/openshift/</guid>
- <description><p>This guide describes how Eclipse Hono™ can be deployed on OpenShift with
-EnMasse, using the source-to-image (S2I) way. Using this approach, it is possible
-to customize and refresh the base images where Hono runs in. It also uses
-a more complex, multi-project setup and separates EnMasse and Grafana from
-the core Hono project.</p></description>
+ <description>In Hono version 1.0 we dropped the OpenShift specific deployment using the source-to-image (S2I) model, in favor of the Helm charts and the Eclipse IoT Packages project.
+You can still deploy to OpenShift and OKD, using the Helm charts. And you can also use routes to expose services. Deploying using S2I is also still possible, however the Hono project simply no longer provides out-of-the box scripts for doing so.</description>
</item>
<item>
@@ -405,7 +402,7 @@
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.eclipse.org/hono/docs/deployment/create-kubernetes-cluster/</guid>
- <description><p>This guide describes how to set up a Kubernetes cluster which can be used to run Eclipse Hono.</p></description>
+ <description><p>This guide describes how to set up a Kubernetes cluster which can be used to run Eclipse Hono&trade;.</p></description>
</item>
<item>
diff --git a/docs/tags/index.html b/docs/tags/index.html
index 7b1c5e2..ede8154 100644
--- a/docs/tags/index.html
+++ b/docs/tags/index.html
@@ -21,19 +21,19 @@
<title>Tags :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/tags/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/tags/" selected>stable (1.0)</option>
@@ -2186,20 +2186,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/user-guide/amqp-adapter/index.html b/docs/user-guide/amqp-adapter/index.html
index 64c3052..bcffbcf 100644
--- a/docs/user-guide/amqp-adapter/index.html
+++ b/docs/user-guide/amqp-adapter/index.html
@@ -21,19 +21,19 @@
<title>AMQP Adapter :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/amqp-adapter/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/amqp-adapter/" selected>stable (1.0)</option>
@@ -1336,6 +1336,7 @@
</ul></li>
<li><a href="#connection-limits">Connection Limits</a></li>
<li><a href="#message-limits">Message Limits</a></li>
+<li><a href="#connection-event">Connection Event</a></li>
<li><a href="#link-establishment">Link Establishment</a></li>
<li><a href="#error-handling">Error Handling</a></li>
<li><a href="#amqp-command-line-client">AMQP Command-line Client</a></li>
@@ -1353,7 +1354,10 @@
<li><a href="#sending-a-response-to-a-command">Sending a Response to a Command</a></li>
<li><a href="#examples">Examples</a></li>
</ul></li>
-<li><a href="#downstream-meta-data">Downstream Meta Data</a></li>
+<li><a href="#downstream-meta-data">Downstream Meta Data</a>
+<ul>
+<li><a href="#event-message-time-to-live">Event Message Time-to-live</a></li>
+</ul></li>
<li><a href="#tenant-specific-configuration">Tenant specific Configuration</a></li>
</ul></li>
</ul>
@@ -1383,13 +1387,13 @@
<p>In this guide, we will give examples for publishing telemetry and events for <em>authenticated</em> (using SASL PLAIN) and <em>unauthenticated</em> clients.</p>
-<p>NB: The AMQP adapter can be configured to <em>allow</em> unauthenticated devices to connect by setting configuration variable <code>HONO_AMQP_AUTHENTICATION_REQUIRED</code> to <code>false</code>.</p>
+<p><strong>NB</strong> The AMQP adapter can be configured to <em>allow</em> unauthenticated devices to connect by setting configuration variable <code>HONO_AMQP_AUTHENTICATION_REQUIRED</code> to <code>false</code>.</p>
<h3 id="sasl-plain-authentication">SASL PLAIN Authentication</h3>
<p>The AMQP adapter supports authenticating clients using a <em>username</em> and <em>password</em>. This means that clients need to provide a <em>username</em> and a <em>password</em> when connecting to the AMQP adapter. If the adapter is configured for multi-tenancy (i.e <code>HONO_AMQP_SINGLE_TENANT</code> is set to <code>false</code>), then the <em>username</em> must match the pattern [<em>auth-id@tenant</em>], e.g. <code>sensor1@DEFAULT_TENANT</code>. Otherwise the <code>DEFAULT_TENANT</code> is assumed and the tenant-id can be omitted from the username.</p>
-<p>The adapter verifies the credentials provided by the client against the credentials that the <a href="#credentials-service-connection-configuration">Credentials Service</a> has on record for the device. If the credentials match, then authentication is successful and the client device can proceed to publish messages to Hono.</p>
+<p>The adapter verifies the credentials provided by the client against the credentials the <a href="/hono/docs/admin-guide/amqp-adapter-config/#credentials-service-connection-configuration">configured Credentials service</a> has on record for the client. If the credentials match, then authentication is successful and the client device can proceed to publish messages to Hono.</p>
<p>The examples below refer to devices <code>4711</code> and <code>gw-1</code> of tenant <code>DEFAULT_TENANT</code> using <em>auth-ids</em> <code>sensor1</code> and <code>gw1</code> and corresponding passwords. The example deployment as described in the <a href="/hono/docs/deployment/">Deployment Guides</a> comes pre-configured with the corresponding entities in its device registry component.</p>
@@ -1407,7 +1411,7 @@
<li>Finally, adapter authenticates the client certificate using Hono’s credentials API. In this step, the adapter uses the client certificate’s <em>Subject DN</em> (as authentication identifier) and <code>x509-cert</code> (for the credentials type) in order to determine the device ID.</li>
</ul>
-<p>NB: The AMQP adapter needs to be configured for TLS in order to support this mechanism.</p>
+<p><strong>NB</strong> The AMQP adapter needs to be configured for TLS in order to support this mechanism.</p>
<h2 id="connection-limits">Connection Limits</h2>
@@ -1417,9 +1421,16 @@
<p>Before accepting any telemetry or event or command messages, the AMQP adapter verifies that the configured <a href="/hono/docs/concepts/resource-limits/">message limit</a> is not exceeded. The incoming message is discarded if the limit is exceeded.</p>
+<h2 id="connection-event">Connection Event</h2>
+
+<p>The AMQP Adapter can send a <a href="/hono/docs/api/event/#connection-event">Connection Event</a> once the connection with a device has been successfully established or ended. Note that this requires the <a href="/hono/docs/admin-guide/mqtt-adapter-config/#service-configuration"><code>HONO_CONNECTION_EVENTS_PRODUCER</code></a> configuration property to be explicitly set to <code>events</code>.</p>
+
<h2 id="link-establishment">Link Establishment</h2>
-<p>Clients can publish all types of messages to the AMQP adapter via a single <em>anonymous</em> sender link. Using <em>AT MOST ONCE</em> delivery semantics, the client will not wait for the message to be accepted and settled by the downstream consumer. However, with <em>AT LEAST ONCE</em>, the client sends the message and waits for the message to be delivered to and accepted by the downstream consumer. If the message cannot be delivered due to a failure, the client will be notified.</p>
+<p>The AMQP adapter supports the <a href="http://docs.oasis-open.org/amqp/anonterm/v1.0/anonterm-v1.0.html">Anonymous Terminus for Message Routing</a> specification
+and requires clients to create a single sender link using the <code>null</code> target address for publishing all types of messages to the AMQP adapter.</p>
+
+<p>Using <em>AT MOST ONCE</em> delivery semantics, the client will not wait for the message to be accepted and settled by the downstream consumer. However, with <em>AT LEAST ONCE</em>, the client sends the message and waits for the message to be delivered to and accepted by the downstream consumer. If the message cannot be delivered due to a failure, the client will be notified.</p>
<p>The client indicates its preferred message delivery mode by means of the <em>snd-settle-mode</em> and <em>rcv-settle-mode</em> fields of its <em>attach</em> frame during link establishment. Clients should use <code>mixed</code> as the <em>snd-settle-mode</em> and <code>first</code> as the <em>rcv-settle-mode</em> in order to be able to use the same link for sending all types of messages using different delivery semantics as described in the following sections.</p>
@@ -1451,7 +1462,7 @@
<p>To run the client to send a telemetry message to Hono, open a terminal and execute the following:</p>
-<pre><code># in directory: hono/cli/target/
+<pre><code class="language-sh"># in directory: hono/cli/target/
java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret
Accepted{}
@@ -1494,7 +1505,7 @@
<h2 id="publish-telemetry-data-authenticated-device">Publish Telemetry Data (authenticated Device)</h2>
-<p>The AMQP adapter supports publishing of telemetry data to Hono’s Telemetry API. Telemetry messages can be published using either <em>AT LEAS ONCE</em> or *AT MOST ONCE delivery semantics.</p>
+<p>The AMQP adapter supports publishing of telemetry data to Hono’s Telemetry API. Telemetry messages can be published using either <em>AT LEAST ONCE</em> or <em>AT MOST ONCE</em> delivery semantics.</p>
<ul>
<li>Message Address: <code>telemetry</code> or <code>t</code>
@@ -1536,7 +1547,7 @@
<p>Publish some JSON data for device <code>4711</code>:</p>
-<pre><code># in directory: hono/cli/target/
+<pre><code class="language-sh"># in directory: hono/cli/target/
java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret
</code></pre>
@@ -1544,7 +1555,7 @@
<p>Publish some JSON data for device <code>4711</code> using a client certificate for authentication:</p>
-<pre><code># in directory: hono/cli/target/
+<pre><code class="language-sh"># in directory: hono/cli/target/
java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.port=5671 --hono.client.certPath=config/hono-demo-certs-jar/device-4711-cert.pem --hono.client.keyPath=config/hono-demo-certs-jar/device-4711-key.pem --hono.client.trustStorePath=config/hono-demo-certs-jar/trusted-certs.pem --hono.client.hostnameVerificationRequired=false
</code></pre>
@@ -1586,7 +1597,7 @@
<p>Publish some JSON data for device <code>4711</code>:</p>
-<pre><code># in directory: hono/cli/target/
+<pre><code class="language-sh"># in directory: hono/cli/target/
java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --message.address=t/DEFAULT_TENANT/4711
</code></pre>
@@ -1596,9 +1607,9 @@
<p><strong>Examples</strong></p>
-<p>A Gateway connecting to the adapter using <code>gw@DEFAULT_TENANT</code> as username and <code>gw-secret</code> as password and then publishing some JSON data for device <code>4711</code>:</p>
+<p>A gateway connecting to the adapter using <code>gw@DEFAULT_TENANT</code> as username and <code>gw-secret</code> as password and then publishing some JSON data for device <code>4711</code>:</p>
-<pre><code># in directory: hono/cli/target/
+<pre><code class="language-sh"># in directory: hono/cli/target/
java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=gw@DEFAULT_TENANT --hono.client.password=gw-secret --message.address=t/DEFAULT_TENANT/4711
</code></pre>
@@ -1646,7 +1657,7 @@
<p>Upload a JSON string for device <code>4711</code>:</p>
-<pre><code># in directory: hono/cli/target/
+<pre><code class="language-sh"># in directory: hono/cli/target/
java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret --message.address=event --message.payload='{"alarm": 1}'
</code></pre>
@@ -1688,7 +1699,7 @@
<p>Publish some JSON data for device <code>4711</code>:</p>
-<pre><code># in directory: hono/cli/target/
+<pre><code class="language-sh"># in directory: hono/cli/target/
java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --message.address=e/DEFAULT_TENANT/4711 --message.payload='{"alarm": 1}'
</code></pre>
@@ -1696,9 +1707,9 @@
<p><strong>Examples</strong></p>
-<p>A Gateway connecting to the adapter using <code>gw@DEFAULT_TENANT</code> as username and <code>gw-secret</code> as password and then publishing some JSON data for device <code>4711</code>:</p>
+<p>A gateway connecting to the adapter using <code>gw@DEFAULT_TENANT</code> as username and <code>gw-secret</code> as password and then publishing some JSON data for device <code>4711</code>:</p>
-<pre><code># in directory: hono/cli/target/
+<pre><code class="language-sh"># in directory: hono/cli/target/
java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-send --hono.client.username=gw@DEFAULT_TENANT --hono.client.password=gw-secret --message.address=e/DEFAULT_TENANT/4711
</code></pre>
@@ -1720,7 +1731,9 @@
<ul>
<li><code>command</code> (authenticated device)</li>
+<li><code>command</code> (authenticated gateway receiving commands for all devices it acts on behalf of)</li>
<li><code>command/${tenant}/${device-id}</code> (unauthenticated device)</li>
+<li><code>command/${tenant}/${device-id}</code> (authenticated gateway receiving commands for a specific device it acts on behalf of)</li>
</ul>
<div class="alert alert-notice">
@@ -1768,9 +1781,23 @@
<td align="left"><em>string</em></td>
<td align="left">This property will be empty for <em>one-way</em> commands, otherwise it will contain the identifier used to correlate the response with the command request.</td>
</tr>
+
+<tr>
+<td align="left"><em>device_id</em></td>
+<td align="center">no</td>
+<td align="left"><em>application-properties</em></td>
+<td align="left"><em>string</em></td>
+<td align="left">This property will only be set if an authenticated gateway has connected to the adapter. It will contain the id of the device (connected to the gateway) that the command is targeted at.</td>
+</tr>
</tbody>
</table>
+<p>Authenticated gateways will receive commands for devices which do not connect to a protocol adapter directly but instead are connected to the gateway. Corresponding devices have to be configured so that they can be used with a gateway. See <a href="/hono/docs/admin-guide/device-registry-config/#configuring-gateway-devices">Configuring Gateway Devices</a> for details.</p>
+
+<p>If a device is configured in such a way that there can be <em>one</em> gateway, acting on behalf of the device, a command sent to this device will by default be directed to that gateway.</p>
+
+<p>If a device is configured to be used with <em>multiple</em> gateways, the particular gateway that last acted on behalf of the device will be the target that commands for that device will be routed to. The mapping of device and gateway last used by the device is updated whenever a device sends a telemetry, event or command response message via the gateway. This means that for a device configured to be used via multiple gateways to receive commands, the device first has to send at least one telemetry or event message to establish which gateway to use for receiving commands for that device.</p>
+
<h3 id="sending-a-response-to-a-command">Sending a Response to a Command</h3>
<p>A device only needs to respond to commands that contain a <em>reply-to</em> address and a <em>correlation-id</em>. However, if the application expects a response, then devices must publish a response back to the application. Devices may use the same anonymous sender link for this purpose that they also use for sending telemetry data and events.</p>
@@ -1823,21 +1850,16 @@
<p>Start the AMQP adapter client, as follows:</p>
-<pre><code># in directory: hono/cli/target/
+<pre><code class="language-sh"># in directory: hono/cli/target/
java -jar hono-cli-*-exec.jar --spring.profiles.active=amqp-command --hono.client.username=sensor1@DEFAULT_TENANT --hono.client.password=hono-secret
-Device is now ready to receive commands (Press Ctrl + c to terminate)
</code></pre>
-<p>After successfully starting the client, a message indicating that the device is ready to receive commands will be printed to standard output. The device is now waiting to receive commands from applications. To send a command to the device, open a new terminal shell and start the command application, as shown below:</p>
+<p>After successfully starting the client, a message indicating that the device is ready to receive commands will be printed to standard output. The device is now waiting to receive commands from applications.</p>
-<pre><code># in directory: hono/cli/
+<p>To send a command to the device, open a new terminal shell and start the command application, as shown below:</p>
+
+<pre><code class="language-sh"># in directory: hono/cli/
java -jar target/hono-cli-*-exec.jar --hono.client.host=localhost --hono.client.username=consumer@HONO --hono.client.password=verysecret --spring.profiles.active=command,ssl
->>>>>>>>> Enter name of command for device [DEFAULT_TENANT:4711] (prefix with 'ow:' to send one-way command):
-setBrightness
->>>>>>>>> Enter command payload:
-some-payload
->>>>>>>>> Enter content type:
-text/plain
</code></pre>
<div class="alert alert-notice">
@@ -1848,10 +1870,18 @@
<p>Once the command application starts successfully, enter a command name, payload and content-type of the command to send to the device.</p>
-<p>After sending the command, the device (i.e AMQP command client) will print out the command name and payload that it receives and automatically sends a command response to the application.</p>
+<pre><code class="language-plaintext">>>>>>>>>> Enter name of command for device [DEFAULT_TENANT:4711] (prefix with 'ow:' to send one-way command):
+setBrightness
+>>>>>>>>> Enter command payload:
+some-payload
+>>>>>>>>> Enter content type:
+text/plain
+</code></pre>
-<pre><code>$ Received Command Message : [Command name: setBrightness, Command payload: some-payload]
-$ Command response sent [outcome: Accepted{}]
+<p>After sending the command, the device (i.e. AMQP command client) will print out the command name and payload that it receives and automatically sends a command response to the application.</p>
+
+<pre><code class="language-plaintext">Received Command Message : [Command name: setBrightness, Command payload: some-payload]
+Command response sent [outcome: Accepted{}]
</code></pre>
<h2 id="downstream-meta-data">Downstream Meta Data</h2>
@@ -1888,7 +1918,7 @@
</tbody>
</table>
-<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/api/tenant/#payload-format">tenant</a> or the <a href="/hono/docs/api/device-registration/#payload-format">device level</a>. The values of the default properties are determined as follows:</p>
+<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/api/tenant/#tenant-information-format">tenant</a> or the <a href="/hono/docs/api/device-registration/#assert-device-registration">device level</a>. The values of the default properties are determined as follows:</p>
<ol>
<li>If the message already contains a non-empty property of the same name, the value if unchanged.</li>
@@ -1898,6 +1928,15 @@
<p>Note that of the standard AMQP 1.0 message properties only the <em>content-type</em> and <em>ttl</em> can be set this way to a default value.</p>
+<h3 id="event-message-time-to-live">Event Message Time-to-live</h3>
+
+<p>Events published by devices will usually be persisted by the AMQP Messaging Network in order to support deferred delivery to downstream consumers.
+In most cases the AMQP Messaging Network can be configured with a maximum <em>time-to-live</em> to apply to the events so that the events will be removed
+from the persistent store if no consumer has attached to receive the event before the message expires.</p>
+
+<p>In order to support environments where the AMQP Messaging Network cannot be configured accordingly, the protocol adapter supports setting a
+downstream event message’s <em>ttl</em> property based on the default <em>ttl</em> and <em>max-ttl</em> values configured for a tenant/device as described in the <a href="/hono/docs/api/tenant/#resource-limits-configuration-format">Tenant API</a>.</p>
+
<h2 id="tenant-specific-configuration">Tenant specific Configuration</h2>
<p>The adapter uses the <a href="/hono/docs/api/tenant/#get-tenant-information">Tenant API</a> to retrieve <em>tenant specific configuration</em> for adapter type <code>hono-amqp</code>.
@@ -2796,20 +2835,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/user-guide/device-registry/index.html b/docs/user-guide/device-registry/index.html
index 9a967e3..8b38f50 100644
--- a/docs/user-guide/device-registry/index.html
+++ b/docs/user-guide/device-registry/index.html
@@ -21,19 +21,19 @@
<title>Device Registry :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/device-registry/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/device-registry/" selected>stable (1.0)</option>
@@ -1424,7 +1424,7 @@
<p>Add a tenant that has all adapters set to enabled:</p>
-<pre><code>curl -i -X POST -H 'Content-Type: application/json' http://localhost:28080/v1/tenants/tenantAllAdapters
+<pre><code class="language-sh">curl -i -X POST -H 'Content-Type: application/json' http://localhost:28080/v1/tenants/tenantAllAdapters
HTTP/1.1 201 Created
ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4
@@ -1436,10 +1436,10 @@
<p>Add a tenant that can only use the MQTT adapter:</p>
-<pre><code>curl -i -X POST -H 'Content-Type: application/json' --data-binary '{
- "adapters" : [ {
- "type" : "hono-mqtt",
- "enabled" : true
+<pre><code class="language-sh">curl -i -X POST -H 'Content-Type: application/json' --data-binary '{
+ "adapters": [ {
+ "type": "hono-mqtt",
+ "enabled": true
} ]
}' http://localhost:28080/v1/tenants/tenantMqttAdapter
@@ -1468,17 +1468,17 @@
<p>The following command retrieves the details for the tenant <code>tenantMqttAdapter</code>:</p>
-<pre><code>curl -i http://localhost:28080/v1/tenants/tenantMqttAdapter
+<pre><code class="language-sh">curl -i http://localhost:28080/v1/tenants/tenantMqttAdapter
HTTP/1.1 200 OK
ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4
Content-Type: application/json; charset=utf-8
{
- "enabled" : true,
- "adapters" : [ {
- "type" : "hono-mqtt",
- "enabled" : true
+ "enabled": true,
+ "adapters": [ {
+ "type": "hono-mqtt",
+ "enabled": true
} ]
}
</code></pre>
@@ -1513,10 +1513,10 @@
<p>The following command disables the MQTT adapter for devices that belong to the tenant <code>tenantMqttAdapter</code>:</p>
-<pre><code>curl -i -X PUT -H 'Content-Type: application/json' --data-binary '{
- "adapters" : [ {
- "type" : "hono-mqtt",
- "enabled" : true
+<pre><code class="language-sh">curl -i -X PUT -H 'Content-Type: application/json' --data-binary '{
+ "adapters": [ {
+ "type": "hono-mqtt",
+ "enabled": true
} ]
}' http://localhost:28080/v1/tenants/tenantMqttAdapter
@@ -1540,7 +1540,7 @@
<p><strong>Example</strong></p>
-<pre><code>curl -i -X DELETE http://localhost:28080/v1/tenants/tenantMqttAdapter
+<pre><code class="language-sh">curl -i -X DELETE http://localhost:28080/v1/tenants/tenantMqttAdapter
HTTP/1.1 204 No Content
Content-Length: 0
@@ -1579,7 +1579,7 @@
<p>The following command registers a device with ID <code>4711</code> for tenant <code>DEFAULT_TENANT</code></p>
-<pre><code>curl -i -X POST -H 'Content-Type: application/json' --data-binary '{
+<pre><code class="language-sh">curl -i -X POST -H 'Content-Type: application/json' --data-binary '{
"ext": {
"ep": "IMEI4711"
}
@@ -1589,7 +1589,7 @@
<p>The response will contain a <code>Location</code> header containing the resource path created for the device. In this example it will look
like this:</p>
-<pre><code>HTTP/1.1 201 Created
+<pre><code class="language-sh">HTTP/1.1 201 Created
Location: /v1/devices/DEFAULT_TENANT/4711
ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4
Content-Type: application/json; charset=utf-8
@@ -1614,7 +1614,7 @@
<p>The following command retrieves registration data for device <code>4711</code>:</p>
-<pre><code>curl -i http://localhost:28080/v1/devices/DEFAULT_TENANT/4711
+<pre><code class="language-sh">curl -i http://localhost:28080/v1/devices/DEFAULT_TENANT/4711
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
@@ -1654,7 +1654,7 @@
<p><strong>Example</strong></p>
-<pre><code>curl -i -X PUT -H 'Content-Type: application/json' --data-binary '{
+<pre><code class="language-sh">curl -i -X PUT -H 'Content-Type: application/json' --data-binary '{
"ext": {
"ep": "IMEI4711",
"psk-id": "psk4711"
@@ -1680,7 +1680,7 @@
<p><strong>Example</strong></p>
-<pre><code>curl -i -X DELETE http://localhost:28080/v1/devices/DEFAULT_TENANT/4711
+<pre><code class="language-sh">curl -i -X DELETE http://localhost:28080/v1/devices/DEFAULT_TENANT/4711
HTTP/1.1 204 No Content
Content-Length: 0
@@ -1723,21 +1723,21 @@
<p>The following command adds some <code>hashed-password</code> credentials from a given plain text password for device <code>4710</code> using authentication identifier <code>sensor10</code>:</p>
-<pre><code>curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[{
+<pre><code class="language-sh">curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[{
"type": "hashed-password",
"auth-id": "sensor10",
"secrets": [{
"pwd-plain": "mylittlesecret"
}]
}]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710
-
+
HTTP/1.1 204 No Content
ETag: becc93d7-ab0f-48ec-ad26-debdf339cbf4x
</code></pre>
<p>This uses a convenient option which lets the Device Registry do the hashing of the password. The following command retrieves the credentials that are stored by the Device Registry as a result of the command above:</p>
-<pre><code>curl -i http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710
+<pre><code class="language-sh">curl -i http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
@@ -1758,12 +1758,12 @@
<p>The following commands add some <code>hashed-password</code> credentials for device <code>4720</code> using authentication identifier <code>sensor20</code>:</p>
-<pre><code>PWD_HASH=$(echo -n "mylittlesecret" | openssl dgst -binary -sha512 | base64 -w 0)
+<pre><code class="language-sh">PWD_HASH=$(echo -n "mylittlesecret" | openssl dgst -binary -sha512 | base64 -w 0)
curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[{
"type": "hashed-password",
"auth-id": "sensor20",
"secrets": [{
- "hash-function" : "sha-512",
+ "hash-function": "sha-512",
"pwd-hash": "'$PWD_HASH'"
}]
}]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720
@@ -1774,13 +1774,13 @@
<p>The following command adds an expiration date to the <code>hashed-password</code> credentials for authentication identifier <code>sensor20</code>:</p>
-<pre><code>PWD_HASH=$(echo -n "mylittlesecret" | openssl dgst -binary -sha512 | base64 -w 0)
+<pre><code class="language-sh">PWD_HASH=$(echo -n "mylittlesecret" | openssl dgst -binary -sha512 | base64 -w 0)
curl -i -X PUT -H 'Content-Type: application/json' --data-binary '{
"device-id": "4720",
"type": "hashed-password",
"auth-id": "sensor20",
"secrets": [{
- "hash-function" : "sha-512",
+ "hash-function": "sha-512",
"pwd-hash": "'$PWD_HASH'",
"not-after": "2018-01-01T00:00:00+01:00"
}]
@@ -1793,13 +1793,13 @@
<p>Multiple credentials of different type can be registered for the same authentication identifier.
The following commands add <code>psk</code> credentials for the same device <code>4720</code> using authentication identifier <code>sensor20</code>:</p>
-<pre><code>SHARED_KEY=$(echo -n "TheSharedKey" | base64 -w 0)
+<pre><code class="language-sh">SHARED_KEY=$(echo -n "TheSharedKey" | base64 -w 0)
curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[
{
"type": "hashed-password",
"auth-id": "sensor20",
"secrets": [{
- "hash-function" : "bcrypt",
+ "hash-function": "bcrypt",
"pwd-hash": "$2a$10$uc.qVDwXeDRE1DWa1sM9iOaY9wuevjfALGMtXmHKP.SJDEqg0q7M6"
}]
},
@@ -1808,7 +1808,7 @@
"type": "psk",
"auth-id": "sensor20",
"secrets": [{
- "key" : "'$SHARED_KEY'"
+ "key": "'$SHARED_KEY'"
}]
}]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720
@@ -1818,7 +1818,7 @@
<p>The following command deletes all credentials for device <code>4710</code>:</p>
-<pre><code>curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710
+<pre><code class="language-sh">curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[]' http://localhost:28080/v1/credentials/DEFAULT_TENANT/4710
HTTP/1.1 204 No Content
ETag: d383ba4d-1853-4d03-b322-b7ff5af05ae2
@@ -1841,7 +1841,7 @@
<p>The following command retrieves credentials for device <code>4720</code>:</p>
-<pre><code>curl -i http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720
+<pre><code class="language-sh">curl -i http://localhost:28080/v1/credentials/DEFAULT_TENANT/4720
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
@@ -2742,20 +2742,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/user-guide/http-adapter/index.html b/docs/user-guide/http-adapter/index.html
index de9dbfa..00a568e 100644
--- a/docs/user-guide/http-adapter/index.html
+++ b/docs/user-guide/http-adapter/index.html
@@ -21,19 +21,19 @@
<title>HTTP Adapter :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/http-adapter/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/http-adapter/" selected>stable (1.0)</option>
@@ -1349,7 +1349,10 @@
<li><a href="#sending-a-response-to-a-command-authenticated-device">Sending a Response to a Command (authenticated Device)</a></li>
<li><a href="#sending-a-response-to-a-command-unauthenticated-device">Sending a Response to a Command (unauthenticated Device)</a></li>
<li><a href="#sending-a-response-to-a-command-authenticated-gateway">Sending a Response to a Command (authenticated Gateway)</a></li>
-<li><a href="#downstream-meta-data">Downstream Meta Data</a></li>
+<li><a href="#downstream-meta-data">Downstream Meta Data</a>
+<ul>
+<li><a href="#event-message-time-to-live">Event Message Time-to-live</a></li>
+</ul></li>
<li><a href="#tenant-specific-configuration">Tenant specific Configuration</a></li>
</ul></li>
</ul>
@@ -1381,9 +1384,9 @@
<h3 id="client-certificate">Client Certificate</h3>
-<p>When a device uses a client certificate for authentication during the TLS handshake, the adapter tries to determine the tenant that the device belongs to, based on the <em>issuer DN</em> contained in the certificate. In order for the lookup to succeed, the tenant’s trust anchor needs to be configured by means of <a href="/hono/docs/api/tenant/#request-payload">registering the trusted certificate authority</a>. The device’s client certificate will then be validated using the registered trust anchor, thus implicitly establishing the tenant that the device belongs to. In a second step, the adapter then uses the Credentials API’s <em>get</em> operation with the client certificate’s <em>subject DN</em> as the <em>auth-id</em> and <code>x509-cert</code> as the <em>type</em> of secret as query parameters.</p>
+<p>When a device uses a client certificate for authentication during the TLS handshake, the adapter tries to determine the tenant that the device belongs to, based on the <em>issuer DN</em> contained in the certificate. In order for the lookup to succeed, the tenant’s trust anchor needs to be configured by means of <a href="/hono/docs/api/tenant/#tenant-information-format">registering the trusted certificate authority</a>. The device’s client certificate will then be validated using the registered trust anchor, thus implicitly establishing the tenant that the device belongs to. In a second step, the adapter then uses the Credentials API’s <em>get</em> operation with the client certificate’s <em>subject DN</em> as the <em>auth-id</em> and <code>x509-cert</code> as the <em>type</em> of secret as query parameters.</p>
-<p>NB: The HTTP adapter needs to be <a href="/hono/docs/admin-guide/secure_communication/#http-adapter">configured for TLS</a> in order to support this mechanism.</p>
+<p><strong>NB</strong> The HTTP adapter needs to be <a href="/hono/docs/admin-guide/secure_communication/#http-adapter">configured for TLS</a> in order to support this mechanism.</p>
<h3 id="http-basic-auth">HTTP Basic Auth</h3>
@@ -1422,6 +1425,7 @@
<li>(optional) <code>content-type</code>: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data.</li>
<li>(optional) <code>hono-command</code>: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device.</li>
<li>(optional) <code>hono-cmd-req-id</code>: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device.</li>
+<li>(optional) <code>hono-cmd-target-device</code>: The id of the device that shall execute the command. This header will only be present if the response contains a command to be executed by the device and if the response goes to a gateway that acts on behalf of the target device.</li>
</ul></li>
<li>Response Body:
@@ -1458,6 +1462,8 @@
<p>This is the preferred way for devices to publish telemetry data. It is available only if the protocol adapter is configured to require devices to authenticate (which is the default).</p>
+<p>If the <code>hono-ttd</code> header is set in order to receive a command and if the authenticated device is actually a gateway, the returned command will be the first command that the northbound application has sent to either the gateway itself or (if not using the legacy control endpoint) to <em>any</em> device that has last sent a telemetry or event message via this gateway.</p>
+
<p><strong>Examples</strong></p>
<p>Publish some JSON data for device <code>4711</code>:</p>
@@ -1470,7 +1476,7 @@
<p>Publish some JSON data for device <code>4711</code> using <em>at least once</em> QoS:</p>
-<pre><code class="language-sh">curl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' -H 'QoS-Level: 1' --data-binary '{"temp": 5}' http://localhost:8080/telemetry
+<pre><code class="language-sh">curl -i -u sensor1@DEFAULT_TENANT:hono-secret -H 'content-type: application/json' -H 'qos-level: 1' --data-binary '{"temp": 5}' http://localhost:8080/telemetry
HTTP/1.1 202 Accepted
content-length: 0
@@ -1486,7 +1492,7 @@
content-length: 23
{
- "brightness" : 87
+ "brightness": 87
}
</code></pre>
@@ -1499,7 +1505,7 @@
content-length: 0
</code></pre>
-<p><strong>NB</strong>: The example above assumes that the HTTP adapter is <a href="/hono/docs/admin-guide/secure_communication/#http-adapter">configured for TLS</a> and the secure port is used.</p>
+<p><strong>NB</strong> The example above assumes that the HTTP adapter is <a href="/hono/docs/admin-guide/secure_communication/#http-adapter">configured for TLS</a> and the secure port is used.</p>
<h2 id="publish-telemetry-data-unauthenticated-device">Publish Telemetry Data (unauthenticated Device)</h2>
@@ -1509,7 +1515,7 @@
<li>Request Headers:
<ul>
-<li>(required) <code>content-type</code>: The type of payload contained in the body.</li>
+<li>(required) <code>content-type</code>: The type of payload contained in the request body.</li>
<li>(optional) <code>hono-ttd</code>: The number of seconds the device will wait for the response.</li>
<li>(optional) <code>qos-level</code>: The QoS level for publishing telemetry messages. The adapter supports <em>at most once</em> (<code>0</code>) and <em>at least once</em> (<code>1</code>) QoS levels. The default value of <code>0</code> is assumed if this header is omitted.</li>
</ul></li>
@@ -1588,7 +1594,7 @@
content-length: 23
{
- "brightness" : 87
+ "brightness": 87
}
</code></pre>
@@ -1601,11 +1607,7 @@
<ul>
<li>(optional) <code>authorization</code>: The gateway’s <em>auth-id</em> and plain text password encoded according to the <a href="https://tools.ietf.org/html/rfc7617">Basic HTTP authentication scheme</a>. If not set, the adapter expects the gateway to present a client certificate as part of the TLS handshake during connection establishment.</li>
-</ul></li>
-<li>Request Headers:
-
-<ul>
-<li>(required) <code>content-type</code>: The type of payload contained in the body.</li>
+<li>(required) <code>content-type</code>: The type of payload contained in the request body.</li>
<li>(optional) <code>hono-ttd</code>: The number of seconds the device will wait for the response.</li>
<li>(optional) <code>qos-level</code>: The QoS level for publishing telemetry messages. The adapter supports <em>at most once</em> (<code>0</code>) and <em>at least once</em> (<code>1</code>) QoS levels. The default value of <code>0</code> is assumed if this header is omitted.</li>
</ul></li>
@@ -1620,6 +1622,7 @@
<li>(optional) <code>content-type</code>: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data.</li>
<li>(optional) <code>hono-command</code>: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device.</li>
<li>(optional) <code>hono-cmd-req-id</code>: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device.</li>
+<li>(optional) <code>hono-cmd-target-device</code>: The id of the device that shall execute the command. This header will only be present if the response contains a command to be executed by the device.</li>
</ul></li>
<li>Response Body:
@@ -1659,7 +1662,7 @@
<p>This resource can be used by <em>gateway</em> components to publish data <em>on behalf of</em> other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.</p>
-<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
+<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="/hono/docs/admin-guide/http-adapter-config/#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
<p><strong>Examples</strong></p>
@@ -1689,11 +1692,11 @@
content-length: 23
{
- "brightness" : 87
+ "brightness": 87
}
</code></pre>
-<p><strong>NB</strong>: The example above assumes that a gateway device has been registered with <code>hashed-password</code> credentials with <em>auth-id</em> <code>gw</code> and password <code>gw-secret</code> which is authorized to publish data <em>on behalf of</em> device <code>4712</code>.</p>
+<p><strong>NB</strong> The example above assumes that a gateway device has been registered with <code>hashed-password</code> credentials with <em>auth-id</em> <code>gw</code> and password <code>gw-secret</code> which is authorized to publish data <em>on behalf of</em> device <code>4712</code>.</p>
<h2 id="publish-an-event-authenticated-device">Publish an Event (authenticated Device)</h2>
@@ -1704,8 +1707,9 @@
<ul>
<li>(optional) <code>authorization</code>: The device’s <em>auth-id</em> and plain text password encoded according to the <a href="https://tools.ietf.org/html/rfc7617">Basic HTTP authentication scheme</a>. If not set, the adapter expects the device to present a client certificate as part of the TLS handshake during connection establishment.</li>
-<li>(required) <code>content-type</code>: The type of payload contained in the body.</li>
+<li>(required) <code>content-type</code>: The type of payload contained in the request body.</li>
<li>(optional) <code>hono-ttd</code>: The number of seconds the device will wait for the response.</li>
+<li>(optional) <code>hono-ttl</code>: The <em>time-to-live</em> in number of seconds for event messages.<br /></li>
</ul></li>
<li>Request Body:
@@ -1718,6 +1722,7 @@
<li>(optional) <code>content-type</code>: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data.</li>
<li>(optional) <code>hono-command</code>: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device.</li>
<li>(optional) <code>hono-cmd-req-id</code>: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device.</li>
+<li>(optional) <code>hono-cmd-target-device</code>: The id of the device that shall execute the command. This header will only be present if the response contains a command to be executed by the device and if the response goes to a gateway that acts on behalf of the target device.</li>
</ul></li>
<li>Response Body:
@@ -1728,7 +1733,7 @@
<li>Status Codes:
<ul>
-<li>200 (OK): The telemetry data has been accepted for processing. The response contains a command for the device to execute.</li>
+<li>200 (OK): The event has been accepted for processing. The response contains a command for the device to execute.</li>
<li>202 (Accepted): The event has been accepted for processing.</li>
<li>400 (Bad Request): The request cannot be processed. Possible reasons for this include:
@@ -1744,12 +1749,14 @@
</ul></li>
<li>404 (Not Found): The request cannot be processed because the device is disabled or does not exist.</li>
<li>429 (Too Many Requests): The request cannot be processed because the tenant’s message limit for the current period is exceeded.</li>
-<li>503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono.</li>
+<li>503 (Service Unavailable): The request cannot be processed because there is no consumer of events for the given tenant connected to Hono.</li>
</ul></li>
</ul>
<p>This is the preferred way for devices to publish events. It is available only if the protocol adapter is configured to require devices to authenticate (which is the default).</p>
+<p>If the <code>hono-ttd</code> header is set in order to receive a command and if the authenticated device is actually a gateway, the returned command will be the first command that the northbound application has sent to either the gateway itself or (if not using the legacy control endpoint) to <em>any</em> device that has last sent a telemetry or event message via this gateway.</p>
+
<p><strong>Example</strong></p>
<p>Publish some JSON data for device <code>4711</code>:</p>
@@ -1768,8 +1775,9 @@
<li>Request Headers:
<ul>
-<li>(required) <code>content-type</code>: The type of payload contained in the body.</li>
+<li>(required) <code>content-type</code>: The type of payload contained in the request body.</li>
<li>(optional) <code>hono-ttd</code>: The number of seconds the device will wait for the response.</li>
+<li>(optional) <code>hono-ttl</code>: The <em>time-to-live</em> in number of seconds for event messages.</li>
</ul></li>
<li>Request Body:
@@ -1808,7 +1816,7 @@
</ul></li>
<li>404 (Not Found): The request cannot be processed because the device is disabled or does not exist.</li>
<li>429 (Too Many Requests): The request cannot be processed because the tenant’s message limit for the current period is exceeded.</li>
-<li>503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono.</li>
+<li>503 (Service Unavailable): The request cannot be processed because there is no consumer of events for the given tenant connected to Hono.</li>
</ul></li>
</ul>
@@ -1833,8 +1841,9 @@
<ul>
<li>(optional) <code>authorization</code>: The gateway’s <em>auth-id</em> and plain text password encoded according to the <a href="https://tools.ietf.org/html/rfc7617">Basic HTTP authentication scheme</a>. If not set, the adapter expects the gateway to present a client certificate as part of the TLS handshake during connection establishment.</li>
-<li>(required) <code>content-type</code>: The type of payload contained in the body.</li>
+<li>(required) <code>content-type</code>: The type of payload contained in the request body.</li>
<li>(optional) <code>hono-ttd</code>: The number of seconds the device will wait for the response.</li>
+<li>(optional) <code>hono-ttl</code>: The <em>time-to-live</em> in number of seconds for event messages.</li>
</ul></li>
<li>Request Body:
@@ -1847,6 +1856,7 @@
<li>(optional) <code>content-type</code>: A media type describing the semantics and format of payload contained in the response body. This header will only be present if the response contains a command to be executed by the device which requires input data.</li>
<li>(optional) <code>hono-command</code>: The name of the command to execute. This header will only be present if the response contains a command to be executed by the device.</li>
<li>(optional) <code>hono-cmd-req-id</code>: An identifier that the device must include in its response to a command. This header will only be present if the response contains a command to be executed by the device.</li>
+<li>(optional) <code>hono-cmd-target-device</code>: The id of the device that shall execute the command. This header will only be present if the response contains a command to be executed by the device.</li>
</ul></li>
<li>Response Body:
@@ -1876,13 +1886,13 @@
</ul></li>
<li>404 (Not Found): The request cannot be processed because the device is disabled or does not exist.</li>
<li>429 (Too Many Requests): The request cannot be processed because the tenant’s message limit for the current period is exceeded.</li>
-<li>503 (Service Unavailable): The request cannot be processed because there is no consumer of telemetry data for the given tenant connected to Hono.</li>
+<li>503 (Service Unavailable): The request cannot be processed because there is no consumer of events for the given tenant connected to Hono.</li>
</ul></li>
</ul>
<p>This resource can be used by <em>gateway</em> components to publish data <em>on behalf of</em> other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.</p>
-<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
+<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="/hono/docs/admin-guide/http-adapter-config/#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
<p><strong>Examples</strong></p>
@@ -1894,7 +1904,7 @@
content-length: 0
</code></pre>
-<p><strong>NB</strong>: The example above assumes that a gateway device has been registered with <code>hashed-password</code> credentials with <em>auth-id</em> <code>gw</code> and password <code>gw-secret</code> which is authorized to publish data <em>on behalf of</em> device <code>4712</code>.</p>
+<p><strong>NB</strong> The example above assumes that a gateway device has been registered with <code>hashed-password</code> credentials with <em>auth-id</em> <code>gw</code> and password <code>gw-secret</code> which is authorized to publish data <em>on behalf of</em> device <code>4712</code>.</p>
<h2 id="specifying-the-time-a-device-will-wait-for-a-response">Specifying the Time a Device will wait for a Response</h2>
@@ -2084,7 +2094,7 @@
<p>This resource can be used by <em>gateway</em> components to send the response to a command <em>on behalf of</em> other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the URI are used to identify the device that the gateway publishes data for.</p>
-<p>The protocol adapter checks the gateway’s authority to send responses to a command on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
+<p>The protocol adapter checks the gateway’s authority to send responses to a command on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="/hono/docs/admin-guide/http-adapter-config/#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
<div class="alert alert-notice">
<h4 class="alert-heading"><i class="fas fa-info-circle"></i> Deprecation</h4>
@@ -2102,7 +2112,7 @@
content-length: 0
</code></pre>
-<p><strong>NB</strong>: The example above assumes that a gateway device has been registered with <code>hashed-password</code> credentials with <em>auth-id</em> <code>gw</code> and password <code>gw-secret</code> which is authorized to publish data <em>on behalf of</em> device <code>4712</code>.</p>
+<p><strong>NB</strong> The example above assumes that a gateway device has been registered with <code>hashed-password</code> credentials with <em>auth-id</em> <code>gw</code> and password <code>gw-secret</code> which is authorized to publish data <em>on behalf of</em> device <code>4712</code>.</p>
<h2 id="downstream-meta-data">Downstream Meta Data</h2>
@@ -2144,7 +2154,7 @@
</tbody>
</table>
-<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/api/tenant/#payload-format">tenant</a> or the <a href="/hono/docs/api/device-registration/#payload-format">device level</a>. The values of the default properties are determined as follows:</p>
+<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/api/tenant/#tenant-information-format">tenant</a> or the <a href="/hono/docs/api/device-registration/#assert-device-registration">device level</a>. The values of the default properties are determined as follows:</p>
<ol>
<li>If the message already contains a non-empty property of the same name, the value if unchanged.</li>
@@ -2154,6 +2164,16 @@
<p>Note that of the standard AMQP 1.0 message properties only the <em>content-type</em> and <em>ttl</em> can be set this way to a default value.</p>
+<h3 id="event-message-time-to-live">Event Message Time-to-live</h3>
+
+<p>Events published by devices will usually be persisted by the AMQP Messaging Network in order to support deferred delivery to downstream consumers.
+In most cases the AMQP Messaging Network can be configured with a maximum <em>time-to-live</em> to apply to the events so that the events will be removed
+from the persistent store if no consumer has attached to receive the event before the message expires.</p>
+
+<p>In order to support environments where the AMQP Messaging Network cannot be configured accordingly, the protocol adapter supports setting a
+downstream event message’s <em>ttl</em> property based on the <em>hono-ttl</em> property set as a header or a query parameter in the event requests by the devices.
+Also the default <em>ttl</em> and <em>max-ttl</em> values can be configured for a tenant/device as described in the <a href="/hono/docs/api/tenant/#resource-limits-configuration-format">Tenant API</a>.</p>
+
<h2 id="tenant-specific-configuration">Tenant specific Configuration</h2>
<p>The adapter uses the <a href="/hono/docs/api/tenant/#get-tenant-information">Tenant API</a> to retrieve <em>tenant specific configuration</em> for adapter type <code>hono-http</code>.
@@ -2181,7 +2201,7 @@
<td align="left"><em>max-ttd</em></td>
<td align="left"><em>integer</em></td>
<td align="left"><code>60</code></td>
-<td align="left">Defines a tenant specific upper limit for the <em>time until disconnect</em> property that devices may include in requests for uploading telemetry data or events. Please refer to the <a href="/hono/docs/concepts/command-and-control/">Command & Control concept page</a> for a discussion of this parameter’s purpose and usage.<br>If this property is not set for the <code>hono-http</code> adapter type, the adapter will try to read this property from the tenant level configuration.</td>
+<td align="left">Defines a tenant specific upper limit for the <em>time until disconnect</em> property that devices may include in requests for uploading telemetry data or events. Please refer to the <a href="/hono/docs/concepts/command-and-control/">Command & Control concept page</a> for a discussion of this parameter’s purpose and usage.<br>This property can be set for the <code>hono-http</code> adapter type as an <em>extension</em> property in the adapter section of the tenant configuration.<br>If it is not set, then the default value of <code>60</code> seconds is used.</td>
</tr>
</tbody>
</table>
@@ -3059,20 +3079,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/user-guide/index.html b/docs/user-guide/index.html
index 7af95fc..161acec 100644
--- a/docs/user-guide/index.html
+++ b/docs/user-guide/index.html
@@ -21,19 +21,19 @@
<title>User Guide :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275523"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275523"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/" selected>stable (1.0)</option>
@@ -1332,7 +1332,7 @@
<h1 id="user-guide">User Guide</h1>
-<p>Learn how to quickly send data with Hono™ from devices to business applications – as well as commands the other way round.</p>
+<p>Learn how Eclipse Hono™ enables you to quickly send data from devices to business applications and vice versa.</p>
<footer class=" footline" >
@@ -2205,20 +2205,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/user-guide/jmeter_load_tests/index.html b/docs/user-guide/jmeter_load_tests/index.html
index 648f75f..2e88747 100644
--- a/docs/user-guide/jmeter_load_tests/index.html
+++ b/docs/user-guide/jmeter_load_tests/index.html
@@ -21,19 +21,19 @@
<title>Load Tests with JMeter :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/jmeter_load_tests/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/jmeter_load_tests/" selected>stable (1.0)</option>
@@ -2256,20 +2256,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/user-guide/kura-adapter/index.html b/docs/user-guide/kura-adapter/index.html
index 7ac9594..8891430 100644
--- a/docs/user-guide/kura-adapter/index.html
+++ b/docs/user-guide/kura-adapter/index.html
@@ -21,19 +21,19 @@
<title>Kura Adapter :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/kura-adapter/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/kura-adapter/" selected>stable (1.0)</option>
@@ -1329,7 +1329,10 @@
<ul>
<li>
<ul>
-<li><a href="#downstream-meta-data">Downstream Meta Data</a></li>
+<li><a href="#downstream-meta-data">Downstream Meta Data</a>
+<ul>
+<li><a href="#event-message-time-to-live">Event Message Time-to-live</a></li>
+</ul></li>
<li><a href="#tenant-specific-configuration">Tenant specific Configuration</a></li>
</ul></li>
</ul>
@@ -1409,7 +1412,7 @@
</tbody>
</table>
-<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/api/tenant/#payload-format">tenant</a> or the <a href="/hono/docs/api/device-registration/#payload-format">device level</a>. The values of the default properties are determined as follows:</p>
+<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/api/tenant/#tenant-information-format">tenant</a> or the <a href="/hono/docs/api/device-registration/#assert-device-registration">device level</a>. The values of the default properties are determined as follows:</p>
<ol>
<li>If the message already contains a non-empty property of the same name, the value if unchanged.</li>
@@ -1419,6 +1422,15 @@
<p>Note that of the standard AMQP 1.0 message properties only the <em>content-type</em> and <em>ttl</em> can be set this way to a default value.</p>
+<h3 id="event-message-time-to-live">Event Message Time-to-live</h3>
+
+<p>Events published by devices will usually be persisted by the AMQP Messaging Network in order to support deferred delivery to downstream consumers.
+In most cases the AMQP Messaging Network can be configured with a maximum <em>time-to-live</em> to apply to the events so that the events will be removed
+from the persistent store if no consumer has attached to receive the event before the message expires.</p>
+
+<p>In order to support environments where the AMQP Messaging Network cannot be configured accordingly, the protocol adapter supports setting a
+downstream event message’s <em>ttl</em> property based on the default <em>ttl</em> and <em>max-ttl</em> values configured for a tenant/device as described in the <a href="/hono/docs/api/tenant/#resource-limits-configuration-format">Tenant API</a>.</p>
+
<h2 id="tenant-specific-configuration">Tenant specific Configuration</h2>
<p>The adapter uses the <a href="/hono/docs/api/tenant/#get-tenant-information">Tenant API</a> to retrieve <em>tenant specific configuration</em> for adapter type <code>hono-kura-mqtt</code>.
@@ -2317,20 +2329,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/user-guide/mqtt-adapter/index.html b/docs/user-guide/mqtt-adapter/index.html
index b5096bd..8304bd3 100644
--- a/docs/user-guide/mqtt-adapter/index.html
+++ b/docs/user-guide/mqtt-adapter/index.html
@@ -21,19 +21,19 @@
<title>MQTT Adapter :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275523" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361813" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361813" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275523" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361813" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275523"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361813"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361813"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361813"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361813"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/mqtt-adapter/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/mqtt-adapter/" selected>stable (1.0)</option>
@@ -1336,6 +1336,7 @@
</ul></li>
<li><a href="#connection-limits">Connection Limits</a></li>
<li><a href="#message-limits">Message Limits</a></li>
+<li><a href="#connection-event">Connection Event</a></li>
<li><a href="#publishing-telemetry-data">Publishing Telemetry Data</a></li>
<li><a href="#publish-telemetry-data-authenticated-device">Publish Telemetry Data (authenticated Device)</a></li>
<li><a href="#publish-telemetry-data-unauthenticated-device">Publish Telemetry Data (unauthenticated Device)</a></li>
@@ -1348,10 +1349,15 @@
<ul>
<li><a href="#receiving-commands-authenticated-device">Receiving Commands (authenticated Device)</a></li>
<li><a href="#receiving-commands-unauthenticated-device">Receiving Commands (unauthenticated Device)</a></li>
+<li><a href="#receiving-commands-authenticated-gateway">Receiving Commands (authenticated Gateway)</a></li>
<li><a href="#sending-a-response-to-a-command-authenticated-device">Sending a Response to a Command (authenticated Device)</a></li>
<li><a href="#sending-a-response-to-a-command-unauthenticated-device">Sending a Response to a Command (unauthenticated Device)</a></li>
+<li><a href="#sending-a-response-to-a-command-authenticated-gateway">Sending a Response to a Command (authenticated Gateway)</a></li>
</ul></li>
-<li><a href="#downstream-meta-data">Downstream Meta Data</a></li>
+<li><a href="#downstream-meta-data">Downstream Meta Data</a>
+<ul>
+<li><a href="#event-message-time-to-live">Event Message Time-to-live</a></li>
+</ul></li>
<li><a href="#tenant-specific-configuration">Tenant specific Configuration</a></li>
</ul></li>
</ul>
@@ -1393,7 +1399,7 @@
<h3 id="client-certificate">Client Certificate</h3>
-<p>When a device uses a client certificate for authentication during the TLS handshake, the adapter tries to determine the tenant that the device belongs to, based on the <em>issuer DN</em> contained in the certificate. In order for the lookup to succeed, the tenant’s trust anchor needs to be configured by means of registering the <a href="/hono/docs/api/tenant/#payload-format">trusted certificate authority</a>. The device’s client certificate will then be validated using the registered trust anchor, thus implicitly establishing the tenant that the device belongs to. In a second step, the adapter then uses the Credentials API’s <em>get</em> operation with the client certificate’s <em>subject DN</em> as the <em>auth-id</em> and <code>x509-cert</code> as the <em>type</em> of secret as query parameters.</p>
+<p>When a device uses a client certificate for authentication during the TLS handshake, the adapter tries to determine the tenant that the device belongs to, based on the <em>issuer DN</em> contained in the certificate. In order for the lookup to succeed, the tenant’s trust anchor needs to be configured by means of registering the <a href="/hono/docs/api/tenant/#tenant-information-format">trusted certificate authority</a>. The device’s client certificate will then be validated using the registered trust anchor, thus implicitly establishing the tenant that the device belongs to. In a second step, the adapter then uses the Credentials API’s <em>get</em> operation with the client certificate’s <em>subject DN</em> as the <em>auth-id</em> and <code>x509-cert</code> as the <em>type</em> of secret as query parameters.</p>
<p><strong>NB</strong> The adapter needs to be <a href="/hono/docs/admin-guide/secure_communication/#mqtt-adapter">configured for TLS</a> in order to support this mechanism.</p>
@@ -1413,6 +1419,10 @@
<p>Before accepting any telemetry or event or command messages, the MQTT adapter verifies that the configured <a href="/hono/docs/concepts/resource-limits/">message limit</a> is not exceeded. The incoming message is discarded if the limit is exceeded.</p>
+<h2 id="connection-event">Connection Event</h2>
+
+<p>The MQTT Adapter can send a <a href="/hono/docs/api/event/#connection-event">Connection Event</a> once the connection with a device has been successfully established or ended. Note that this requires the <a href="/hono/docs/admin-guide/mqtt-adapter-config/#service-configuration"><code>HONO_CONNECTION_EVENTS_PRODUCER</code></a> configuration property to be explicitly set to <code>events</code>.</p>
+
<h2 id="publishing-telemetry-data">Publishing Telemetry Data</h2>
<p>The MQTT adapter supports the publishing of telemetry data by means of MQTT <em>PUBLISH</em> packets using either QoS 0 or QoS 1.
@@ -1445,16 +1455,16 @@
<p>Publish some JSON data for device <code>4711</code>:</p>
-<pre><code>mosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t telemetry -m '{"temp": 5}'
+<pre><code class="language-sh">mosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t telemetry -m '{"temp": 5}'
</code></pre>
<p>Publish some JSON data for device <code>4711</code> using a client certificate for authentication:</p>
-<pre><code># in base directory of Hono repository:
+<pre><code class="language-sh"># in base directory of Hono repository:
mosquitto_pub -p 8883 -t telemetry -m '{"temp": 5}' --cert demo-certs/certs/device-4711-cert.pem --key demo-certs/certs/device-4711-key.pem --cafile demo-certs/certs/trusted-certs.pem
</code></pre>
-<p><strong>NB</strong>: The example above assumes that the MQTT adapter is <a href="/hono/docs/admin-guide/secure_communication/#mqtt-adapter">configured for TLS</a> and the secure port is used.</p>
+<p><strong>NB</strong> The example above assumes that the MQTT adapter is <a href="/hono/docs/admin-guide/secure_communication/#mqtt-adapter">configured for TLS</a> and the secure port is used.</p>
<h2 id="publish-telemetry-data-unauthenticated-device">Publish Telemetry Data (unauthenticated Device)</h2>
@@ -1475,7 +1485,7 @@
<p>Publish some JSON data for device <code>4711</code>:</p>
-<pre><code>mosquitto_pub -t telemetry/DEFAULT_TENANT/4711 -m '{"temp": 5}'
+<pre><code class="language-sh">mosquitto_pub -t telemetry/DEFAULT_TENANT/4711 -m '{"temp": 5}'
</code></pre>
<h2 id="publish-telemetry-data-authenticated-gateway">Publish Telemetry Data (authenticated Gateway)</h2>
@@ -1492,16 +1502,16 @@
<p>This topic can be used by <em>gateway</em> components to publish data <em>on behalf of</em> other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the topic name are used to identify the device that the gateway publishes data for.</p>
-<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
+<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="/hono/docs/admin-guide/mqtt-adapter-config/#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
<p><strong>Examples</strong></p>
<p>Publish some JSON data for device <code>4712</code> via gateway <code>gw-1</code>:</p>
-<pre><code>mosquitto_pub -u 'gw@DEFAULT_TENANT' -P gw-secret -t telemetry/DEFAULT_TENANT/4712 -m '{"temp": 5}'
+<pre><code class="language-sh">mosquitto_pub -u 'gw@DEFAULT_TENANT' -P gw-secret -t telemetry/DEFAULT_TENANT/4712 -m '{"temp": 5}'
</code></pre>
-<p><strong>NB</strong>: The example above assumes that a gateway device with ID <code>gw-1</code> has been registered with <code>hashed-password</code> credentials with <em>auth-id</em> <code>gw</code> and password <code>gw-secret</code>.</p>
+<p><strong>NB</strong> The example above assumes that a gateway device with ID <code>gw-1</code> has been registered with <code>hashed-password</code> credentials with <em>auth-id</em> <code>gw</code> and password <code>gw-secret</code>.</p>
<h2 id="publishing-events">Publishing Events</h2>
@@ -1517,6 +1527,10 @@
<p>The protocol adapter checks the configured <a href="/hono/docs/concepts/resource-limits/">message limit</a> before accepting any event messages. If the message limit is exceeded or the incoming event message cannot be processed, the connection to the client is closed.</p>
+<p>The devices can optionally indicate a <em>time-to-live</em> duration for event messages by setting the <em>hono-ttl</em> property explicitly in the <code>property-bag</code>. The <code>property-bag</code> is an optional collection of properties intended for the receiver of the message. A property bag is only allowed at the very end of a topic. It always starts with a <code>/?</code> character, followed by pairs of URL encoded property names and values that are separated by <code>&</code>. For example, a property bag containing two properties <em>seqNo</em> and <em>importance</em> looks like this: <code>/topic/name/?seqNo=10034&importance=high</code>.</p>
+
+<p>The MQTT adapter currently does not use any properties except <em>hono-ttl</em>.</p>
+
<h2 id="publish-an-event-authenticated-device">Publish an Event (authenticated Device)</h2>
<ul>
@@ -1535,7 +1549,12 @@
<p>Upload a JSON string for device <code>4711</code>:</p>
-<pre><code>mosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t event -q 1 -m '{"alarm": 1}'
+<pre><code class="language-sh">mosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t event -q 1 -m '{"alarm": 1}'
+</code></pre>
+
+<p>Upload a JSON string for device <code>4711</code> with <code>time-to-live</code> as 10 seconds:</p>
+
+<pre><code class="language-sh">mosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t event/?hono-ttl=10 -q 1 -m '{"alarm": 1}'
</code></pre>
<h2 id="publish-an-event-unauthenticated-device">Publish an Event (unauthenticated Device)</h2>
@@ -1557,7 +1576,12 @@
<p>Publish some JSON data for device <code>4711</code>:</p>
-<pre><code>mosquitto_pub -t event/DEFAULT_TENANT/4711 -q 1 -m '{"alarm": 1}'
+<pre><code class="language-sh">mosquitto_pub -t event/DEFAULT_TENANT/4711 -q 1 -m '{"alarm": 1}'
+</code></pre>
+
+<p>Publish some JSON data for device <code>4711</code> with <code>time-to-live</code> as 15 seconds:</p>
+
+<pre><code class="language-sh">mosquitto_pub -t event/DEFAULT_TENANT/4711/?hono-ttl=15 -q 1 -m '{"alarm": 1}'
</code></pre>
<h2 id="publish-an-event-authenticated-gateway">Publish an Event (authenticated Gateway)</h2>
@@ -1574,16 +1598,16 @@
<p>This topic can be used by <em>gateway</em> components to publish data <em>on behalf of</em> other devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. In this case the credentials provided by the gateway during connection establishment with the protocol adapter are used to authenticate the gateway whereas the parameters from the topic name are used to identify the device that the gateway publishes data for.</p>
-<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
+<p>The protocol adapter checks the gateway’s authority to publish data on behalf of the device implicitly by means of retrieving a <em>registration assertion</em> for the device from the <a href="/hono/docs/admin-guide/mqtt-adapter-config/#device-registration-service-connection-configuration">configured Device Registration service</a>.</p>
<p><strong>Examples</strong></p>
<p>Publish some JSON data for device <code>4712</code> via gateway <code>gw-1</code>:</p>
-<pre><code>mosquitto_pub -u 'gw@DEFAULT_TENANT' -P gw-secret -t event/DEFAULT_TENANT/4712 -q 1 -m '{"temp": 5}'
+<pre><code class="language-sh">mosquitto_pub -u 'gw@DEFAULT_TENANT' -P gw-secret -t event/DEFAULT_TENANT/4712 -q 1 -m '{"temp": 5}'
</code></pre>
-<p><strong>NB</strong>: The example above assumes that a gateway device with ID <code>gw-1</code> has been registered with <code>hashed-password</code> credentials with <em>auth-id</em> <code>gw</code> and password <code>gw-secret</code>.</p>
+<p><strong>NB</strong> The example above assumes that a gateway device with ID <code>gw-1</code> has been registered with <code>hashed-password</code> credentials with <em>auth-id</em> <code>gw</code> and password <code>gw-secret</code>.</p>
<h2 id="command-control">Command & Control</h2>
@@ -1606,117 +1630,167 @@
</ul>
<div class="alert alert-notice">
- <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Note</h4>
- <div>Previous versions of Hono used <code>control</code> instead of <code>command</code> as topic prefix. Using the <code>control</code> prefix is still supported but deprecated.</div>
+ <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Deprecation</h4>
+ <div>Previous versions of Hono required devices to use <code>control</code> instead of <code>command</code> as the topic prefix.
+The <code>control</code> prefix is deprecated. Devices MAY still use it until support for it will be removed in a future Hono version.</div>
</div>
<p>The following variables are used:</p>
<ul>
-<li><code>${command}</code> : is an arbitrary string that indicates the command to execute, e.g. <code>setBrightness</code>. The command is provided by the application that sends the command.</li>
-<li><code>${req-id}</code> (only for <em>Request/Response</em> commands) : denotes the unique identifier of the command execution request and is passed to the device as part of the name of the topic that the command is published to. The device needs to publish its response to the command to a topic which includes this identifier, thus allowing the adapter to correlate the response with the request.</li>
-<li><code>${status}</code> : is the HTTP status code indicating the outcome of executing the command. This status code is passed on to the application in the AMQP message’s <em>status</em> header.</li>
+<li><code>${command}</code> : An arbitrary string that indicates the command to execute, e.g. <code>setBrightness</code>. The command is provided by the application that sends the command.</li>
+<li><code>${req-id}</code> (only for <em>Request/Response</em> commands) : The unique identifier of the command execution request. The identifier is passed to the device as part of the name of the topic that the command is published to. The device needs to publish its response to the command to a topic which includes this identifier, thus allowing the adapter to correlate the response with the request.</li>
+<li><code>${status}</code> : The HTTP status code indicating the outcome of executing the command. This status code is passed on to the application in the AMQP message’s <em>status</em> application property.</li>
</ul>
-<p>The <code>property-bag</code> is an optional collection of properties intended for the receiver of the message. A property bag is only allowed at the very end of a topic. It always starts with a <code>?</code> character, followed by pairs of URL encoded property names and values that are separated by <code>&</code>. The following example shows a property bag that contains two properties <em>seqNo</em> and <em>importance</em>:</p>
-
-<pre><code>/topic/name/?seqNo=10034&importance="high"
-</code></pre>
-
-<p>The MQTT adapter currently does not require nor use any properties.</p>
-
<h3 id="receiving-commands-authenticated-device">Receiving Commands (authenticated Device)</h3>
-<p>An authenticated device MUST use the following topic filter to subscribe to commands:</p>
+<p>An authenticated device MUST use the topic filter <code>command///req/#</code> to subscribe to commands.</p>
-<ul>
-<li><code>command/+/+/req/#</code></li>
-</ul>
+<div class="alert alert-notice">
+ <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Deprecation</h4>
+ <div>Previous versions of Hono required authenticated devices to use <code>command/+/+/req/#</code> for subscribing to commands.
+This old topic filter is deprecated. Devices MAY still use it until support for it will be removed in a future Hono version.</div>
+</div>
+
<p><strong>Example</strong></p>
-<pre><code>mosquitto_sub -v -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t command/+/+/req/#
+<pre><code class="language-sh">mosquitto_sub -v -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t command///req/#
</code></pre>
-<p>The adapter will then publish commands for the device to topic:</p>
+<p>The adapter will then publish <em>Request/Response</em> commands for the device to topic <code>command///req/${req-id}/${command}</code> and <em>one-way</em> commands to topic <code>command///req//${command}</code>.</p>
-<ul>
-<li>for <em>Request/Response</em> commands: <code>command///req/${req-id}/${command}[/*][/property-bag]</code></li>
-<li>for <em>one-way</em> commands: <code>command///req//${command}[/*][/property-bag]</code></li>
-</ul>
+<p>For example, a request/response command with name <code>setBrightness</code> from an application might look like this:</p>
-<p><strong>Example</strong></p>
-
-<p>For example, if the <a href="/hono/docs/dev-guide/java_client_consumer/">HonoExampleApplication</a> was started, after the <code>ttd</code> event requested by the subscription of mosquitto_sub, it layers a command that arrives as follows:</p>
-
-<pre><code>command///q/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/setBrightness {
- "brightness" : 79
+<pre><code class="language-plaintext">command///q/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/setBrightness
+{
+ "brightness": 79
}
</code></pre>
-<p>If the command is a <em>one-way</em> command, it will arrive as follows:</p>
+<p>A corresponding <em>one-way</em> command might look like this:</p>
-<pre><code>command///q//setBrightness {
- "brightness" : 79
+<pre><code class="language-plaintext">command///q//setBrightness
+{
+ "brightness": 79
}
</code></pre>
+<p>Note that the topic in the latter case doesn’t contain a request identifier.</p>
+
<h3 id="receiving-commands-unauthenticated-device">Receiving Commands (unauthenticated Device)</h3>
-<p>An unauthenticated device MUST use the following topic filter to subscribe to commands:</p>
-
-<ul>
-<li><code>command/${tenant-id}/${device-id}/req/#</code></li>
-</ul>
+<p>An unauthenticated device MUST use the topic filter <code>command/${tenant-id}/${device-id}/req/#</code> to subscribe to commands.</p>
<p><strong>Example</strong></p>
-<pre><code>mosquitto_sub -v -t command/DEFAULT_TENANT/4711/req/#
+<pre><code class="language-sh">mosquitto_sub -v -t command/DEFAULT_TENANT/4711/req/#
</code></pre>
-<p>The adapter will then publish <em>Request/Response</em> commands for the device to topic:</p>
+<p>The adapter will then publish <em>Request/Response</em> commands for the device to topic <code>command/${tenant-id}/${device-id}/req/${req-id}/${command}</code> and <em>one-way</em> commands to topic <code>command/${tenant-id}/${device-id}/req//${command}</code>.</p>
-<ul>
-<li><code>command/${tenant-id}/${device-id}/req/${req-id}/${command}[/*][/property-bag]</code></li>
-</ul>
+<p>For example, a request/response command with name <code>setBrightness</code> from an application might look like this:</p>
-<p>and <em>one-way</em> commands to the topic:</p>
+<pre><code class="language-plaintext">command/DEFAULT_TENANT/4711/q/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/setBrightness
+{
+ "brightness": 79
+}
+</code></pre>
-<ul>
-<li><code>command/${tenant-id}/${device-id}/req//${command}[/*][/property-bag]</code></li>
-</ul>
+<p>A corresponding <em>one-way</em> command might look like this:</p>
-<p>(For an example of the incoming command see above at authenticated device)</p>
+<pre><code class="language-plaintext">command/DEFAULT_TENANT/4711/q//setBrightness
+{
+ "brightness": 79
+}
+</code></pre>
+
+<p>Note that the topic in the latter case doesn’t contain a request identifier.</p>
+
+<h3 id="receiving-commands-authenticated-gateway">Receiving Commands (authenticated Gateway)</h3>
+
+<p><em>Gateway</em> components can receive commands for devices which do not connect to a protocol adapter directly but instead are connected to the gateway, e.g. using some low-bandwidth radio based technology like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. Corresponding devices have to be configured so that they can be used with a gateway. See <a href="/hono/docs/admin-guide/device-registry-config/#configuring-gateway-devices">Configuring Gateway Devices</a> for details.</p>
+
+<p>If a device is configured in such a way that there can be <em>one</em> gateway, acting on behalf of the device, a command sent to this device will by default be directed to that gateway.</p>
+
+<p>If a device is configured to be used with <em>multiple</em> gateways, the particular gateway that last acted on behalf of the device will be the target that commands for that device will be routed to. The mapping of device and gateway last used by the device is updated whenever a device sends a telemetry, event or command response message via the gateway. This means that for a device configured to be used via multiple gateways to receive commands, the device first has to send at least one telemetry or event message to establish which gateway to use for receiving commands for that device.</p>
+
+<p>An authenticated gateway MUST use the topic filter <code>command//+/req/#</code> to subscribe to commands for all devices in whose behalf it acts.</p>
+
+<p>To subscribe only to commands for a specific device, an authenticated gateway MUST use the topic filter <code>command//${device-id}/req/#</code>.</p>
+
+<div class="alert alert-notice">
+ <h4 class="alert-heading"><i class="fas fa-info-circle"></i> Deprecation</h4>
+ <div>Previous versions of Hono required authenticated gateways to use <code>command/+/+/req/#</code> for subscribing to commands.
+This old topic filter is deprecated. Gateways MAY still use it until support for it will be removed in a future Hono version.</div>
+</div>
+
+
+<p><strong>Example</strong></p>
+
+<p>A subscription to commands for all devices that a gateway acts on behalf of looks like this:</p>
+
+<pre><code class="language-sh">mosquitto_sub -v -u 'gw@DEFAULT_TENANT' -P gw-secret -t command//+/req/#
+</code></pre>
+
+<p>A subscription to commands for a specific device can be done like this:</p>
+
+<pre><code class="language-sh">mosquitto_sub -v -u 'gw@DEFAULT_TENANT' -P gw-secret -t command//4711/req/#
+</code></pre>
+
+<p>The adapter will then publish <em>Request/Response</em> commands for devices, that the gateway has acted on behalf of, to topic <code>command//${device-id}/req/${req-id}/${command}</code> and <em>one-way</em> commands to topic <code>command//${device-id}/req//${command}</code>.</p>
+
+<p>For example, a request/response command for device <code>4711</code> with name <code>setBrightness</code> from an application might look like this:</p>
+
+<pre><code class="language-plaintext">command//4711/q/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/setBrightness
+{
+ "brightness": 79
+}
+</code></pre>
+
+<p>A corresponding <em>one-way</em> command might look like this:</p>
+
+<pre><code class="language-plaintext">command//4711/q//setBrightness
+{
+ "brightness": 79
+}
+</code></pre>
+
+<p>Note that the topic in the latter case doesn’t contain a request identifier.</p>
<h3 id="sending-a-response-to-a-command-authenticated-device">Sending a Response to a Command (authenticated Device)</h3>
-<p>An authenticated device MUST send the response to a previously received command to the following topic:</p>
-
-<ul>
-<li><code>command///res/${req-id}/${status}</code></li>
-</ul>
+<p>An authenticated device MUST send the response to a previously received command to the topic <code>command///res/${req-id}/${status}</code>.</p>
<p><strong>Example</strong></p>
<p>After a command has arrived as in the above example, you send a response using the arrived <code>${req-id}</code>:</p>
-<pre><code>mosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t command///res/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/200 -m '{"lumen": 200}'
+<pre><code class="language-sh">mosquitto_pub -u 'sensor1@DEFAULT_TENANT' -P hono-secret -t command///res/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/200 -m '{"lumen": 200}'
</code></pre>
<h3 id="sending-a-response-to-a-command-unauthenticated-device">Sending a Response to a Command (unauthenticated Device)</h3>
-<p>An unauthenticated device MUST send the response to a previously received command to the following topic:</p>
-
-<ul>
-<li><code>command/${tenant-id}/${device-id}/res/${req-id}/${status}</code></li>
-</ul>
+<p>An unauthenticated device MUST send the response to a previously received command to the topic <code>command/${tenant-id}/${device-id}/res/${req-id}/${status}</code>.</p>
<p><strong>Example</strong></p>
<p>After a command has arrived as in the above example, you send a response using the arrived <code>${req-id}</code>:</p>
-<pre><code>mosquitto_pub -t command/DEFAULT_TENANT/4711/res/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/200 -m '{"lumen": 200}'
+<pre><code class="language-sh">mosquitto_pub -t command/DEFAULT_TENANT/4711/res/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/200 -m '{"lumen": 200}'
+</code></pre>
+
+<h3 id="sending-a-response-to-a-command-authenticated-gateway">Sending a Response to a Command (authenticated Gateway)</h3>
+
+<p>An authenticated gateway MUST send a device’s response to a command it has received on behalf of the device to the topic <code>command//${device-id}/res/${req-id}/${status}</code>.</p>
+
+<p><strong>Example</strong></p>
+
+<p>After a command has arrived as in the above example, the response is sent using the <code>${req-id}</code> from the topic that the command had been published to:</p>
+
+<pre><code class="language-sh">mosquitto_pub -u 'gw@DEFAULT_TENANT' -P gw-secret -t command//4711/res/1010f8ab0b53-bd96-4d99-9d9c-56b868474a6a/200 -m '{"lumen": 200}'
</code></pre>
<h2 id="downstream-meta-data">Downstream Meta Data</h2>
@@ -1764,7 +1838,7 @@
</tbody>
</table>
-<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/api/tenant/#payload-format">tenant</a> or the <a href="/hono/docs/api/device-registration/#payload-format">device level</a>. The values of the default properties are determined as follows:</p>
+<p>The adapter also considers <em>defaults</em> registered for the device at either the <a href="/hono/docs/api/tenant/#tenant-information-format">tenant</a> or the <a href="/hono/docs/api/device-registration/#assert-device-registration">device level</a>. The values of the default properties are determined as follows:</p>
<ol>
<li>If the message already contains a non-empty property of the same name, the value if unchanged.</li>
@@ -1774,6 +1848,16 @@
<p>Note that of the standard AMQP 1.0 message properties only the <em>content-type</em> and <em>ttl</em> can be set this way to a default value.</p>
+<h3 id="event-message-time-to-live">Event Message Time-to-live</h3>
+
+<p>Events published by devices will usually be persisted by the AMQP Messaging Network in order to support deferred delivery to downstream consumers.
+In most cases the AMQP Messaging Network can be configured with a maximum <em>time-to-live</em> to apply to the events so that the events will be removed
+from the persistent store if no consumer has attached to receive the event before the message expires.</p>
+
+<p>In order to support environments where the AMQP Messaging Network cannot be configured accordingly, the MQTT protocol adapter supports setting a
+downstream event message’s <em>ttl</em> property based on the <em>hono-ttl</em> property set as <em>property-bag</em> at the end of the event topic.
+Also the default <em>ttl</em> and <em>max-ttl</em> values can be configured for a tenant/device as described in the <a href="/hono/docs/api/tenant/#resource-limits-configuration-format">Tenant API</a>.</p>
+
<h2 id="tenant-specific-configuration">Tenant specific Configuration</h2>
<p>The adapter uses the <a href="/hono/docs/api/tenant/#get-tenant-information">Tenant API</a> to retrieve <em>tenant specific configuration</em> for adapter type <code>hono-mqtt</code>.
@@ -2672,20 +2756,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/docs/user-guide/sigfox-adapter/index.html b/docs/user-guide/sigfox-adapter/index.html
index 501d912..405afaf 100644
--- a/docs/user-guide/sigfox-adapter/index.html
+++ b/docs/user-guide/sigfox-adapter/index.html
@@ -21,19 +21,19 @@
<title>Sigfox Adapter :: Eclipse Hono™</title>
- <link href="/hono/docs/css/nucleus.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/fontawesome-all.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hybrid.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/featherlight.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/perfect-scrollbar.min.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/auto-complete.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/theme.css?1571275524" rel="stylesheet">
- <link href="/hono/docs/css/hugo-theme.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/nucleus.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/fontawesome-all.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hybrid.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/featherlight.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/perfect-scrollbar.min.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/auto-complete.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/theme.css?1571361814" rel="stylesheet">
+ <link href="/hono/docs/css/hugo-theme.css?1571361814" rel="stylesheet">
- <link href="/hono/docs/css/theme-hono.css?1571275524" rel="stylesheet">
+ <link href="/hono/docs/css/theme-hono.css?1571361814" rel="stylesheet">
- <script src="/hono/docs/js/jquery-2.x.min.js?1571275524"></script>
+ <script src="/hono/docs/js/jquery-2.x.min.js?1571361814"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
@@ -83,14 +83,14 @@
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
-<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571275524"></script>
-<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1571361814"></script>
+<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1571361814"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
-<script type="text/javascript" src="/hono/docs/js/search.js?1571275524"></script>
+<script type="text/javascript" src="/hono/docs/js/search.js?1571361814"></script>
</div>
@@ -1201,7 +1201,7 @@
- <option id="stable" value="/hono/docs/user-guide/sigfox-adapter/" selected>stable (1.0-M7)</option>
+ <option id="stable" value="/hono/docs/user-guide/sigfox-adapter/" selected>stable (1.0)</option>
@@ -2374,20 +2374,20 @@
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
- <script src="/hono/docs/js/clipboard.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.min.js?1571275524"></script>
- <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571275524"></script>
- <script src="/hono/docs/js/jquery.sticky.js?1571275524"></script>
- <script src="/hono/docs/js/featherlight.min.js?1571275524"></script>
- <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571275524"></script>
- <script src="/hono/docs/js/highlight.pack.js?1571275524"></script>
+ <script src="/hono/docs/js/clipboard.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.min.js?1571361814"></script>
+ <script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1571361814"></script>
+ <script src="/hono/docs/js/jquery.sticky.js?1571361814"></script>
+ <script src="/hono/docs/js/featherlight.min.js?1571361814"></script>
+ <script src="/hono/docs/js/html5shiv-printshiv.min.js?1571361814"></script>
+ <script src="/hono/docs/js/highlight.pack.js?1571361814"></script>
<script>hljs.initHighlightingOnLoad();</script>
- <script src="/hono/docs/js/modernizr.custom.71422.js?1571275524"></script>
- <script src="/hono/docs/js/learn.js?1571275524"></script>
- <script src="/hono/docs/js/hugo-learn.js?1571275524"></script>
+ <script src="/hono/docs/js/modernizr.custom.71422.js?1571361814"></script>
+ <script src="/hono/docs/js/learn.js?1571361814"></script>
+ <script src="/hono/docs/js/hugo-learn.js?1571361814"></script>
- <link href="/hono/docs/mermaid/mermaid.css?1571275524" type="text/css" rel="stylesheet" />
- <script src="/hono/docs/mermaid/mermaid.js?1571275524"></script>
+ <link href="/hono/docs/mermaid/mermaid.css?1571361814" type="text/css" rel="stylesheet" />
+ <script src="/hono/docs/mermaid/mermaid.js?1571361814"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
diff --git a/downloads/index.html b/downloads/index.html
index aedcdff..1e82ba0 100644
--- a/downloads/index.html
+++ b/downloads/index.html
@@ -244,7 +244,7 @@
<a href="https://helm.sh">Helm package manager</a>.</p>
<ul>
-<li><a href="https://www.eclipse.org/downloads/download.php?file=/hono/eclipse-hono-1.0-M7-chart.tar.gz">Eclipse Hono 1.0-M7 Archive</a></li>
+<li><a href="https://www.eclipse.org/downloads/download.php?file=/hono/eclipse-hono-1.0.0-chart.tar.gz">Eclipse Hono 1.0.0 Archive</a></li>
</ul>
<p>Download and extract the archive and follow the <a href="https://www.eclipse.org/hono/docs/deployment/helm-based-deployment/
@@ -253,7 +253,7 @@
<p>A Java based command line client for consuming telemetry data and events from Hono is available for download as well:</p>
<ul>
-<li><a href="https://www.eclipse.org/downloads/download.php?file=/hono/hono-cli-1.0-M7-exec.jar">Eclipse Hono 1.0-M7 Command Line Client</a></li>
+<li><a href="https://www.eclipse.org/downloads/download.php?file=/hono/hono-cli-1.0.0-exec.jar">Eclipse Hono 1.0.0 Command Line Client</a></li>
</ul>
<p>The client requires a Java 11 runtime environment to run.</p>
@@ -272,15 +272,6 @@
<p>For a list of the changes in this release, take a look at the <a href="/hono/release-notes/">release notes</a>.</p>
-<h2 id="older-versions">Older versions</h2>
-
-<p>These versions are no longer supported and are listed here for reference purposes only.</p>
-
-<ul>
-<li><a href="https://www.eclipse.org/downloads/download.php?file=/hono/eclipse-hono-deploy-0.9.tar.gz">Eclipse Hono 0.9 Archive</a></li>
-<li><a href="https://www.eclipse.org/downloads/download.php?file=/hono/hono-cli-0.9-exec.jar">Eclipse Hono 0.9 Command Line Client</a></li>
-</ul>
-
</div>
</div>
@@ -333,15 +324,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/faq/index.html b/faq/index.html
index 79133f8..999ef64 100644
--- a/faq/index.html
+++ b/faq/index.html
@@ -314,15 +314,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/getting-started/index.html b/getting-started/index.html
index e788faa..c56d85f 100644
--- a/getting-started/index.html
+++ b/getting-started/index.html
@@ -293,7 +293,7 @@
export MQTT_ADAPTER_IP=hono.eclipse.org
</code></pre>
-<p>and then proceed to the <a href="#overview">Overview of Hono Components</a>.</p>
+<p>and then proceed to the <a href="#overview-of-hono-components">Overview of Hono Components</a>.</p>
<p>However, if the <code>curl</code> command yielded different output, you will need to set up Hono locally as described in the next section.</p>
@@ -303,7 +303,7 @@
For evaluation purposes a single node <em>Minikube</em> cluster is sufficient to deploy Hono to.</p>
<ol>
-<li>Please refer to the <a href="https://www.eclipse.org/hono/docs/deployment/create-kubernetes-cluster/#local-development
+<li>Please refer to the <a href="https://www.eclipse.org/hono/docs/deployment/create-kubernetes-cluster/#setting-up-a-local-development-environment
">installation instructions</a> for setting up a local Minikube cluster, then</li>
<li>follow the <a href="https://www.eclipse.org/hono/docs/deployment/helm-based-deployment/
">Deployment Guide</a> in order to install Hono to your local Minikube cluster.</li>
@@ -564,7 +564,7 @@
<ul>
<li>Continue with the next sections to learn how applications can send commands to devices by means of the <a href="https://www.eclipse.org/hono/docs/api/command-and-control/">Command & Control API</a>.</li>
-<li>Take a look at some of the metrics collected by Hono’s components by opening the Hono dashboard. On the Sandbox server the dashboard is available at <a href="https://hono.eclipse.org:3000">https://hono.eclipse.org:3000</a>. When running a local Minikube cluster, please refer to <a href="https://www.eclipse.org/hono/docs/deployment/helm-based-deployment/#dashboard">Opening the Dashboard</a> for instructions.</li>
+<li>Take a look at some of the metrics collected by Hono’s components by opening the Hono dashboard. On the Sandbox server the dashboard is available at <a href="https://hono.eclipse.org:3000">https://hono.eclipse.org:3000</a>. When running a local Minikube cluster, please refer to <a href="https://www.eclipse.org/hono/docs/deployment/helm-based-deployment/#accessing-the-grafana-dashboard">Opening the Dashboard</a> for instructions.</li>
<li>Check out the <a href="https://www.eclipse.org/hono/docs/user-guide/">User Guides</a> to explore more options for devices to connect to Hono using different transport protocols.</li>
<li>Learn more about the managing tenants, devices and credentials using the <a href="https://www.eclipse.org/hono/docs/user-guide/device-registry/">Device Registry’s HTTP API</a>.</li>
</ul>
@@ -722,15 +722,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/img/iot-logo.png b/img/iot-logo.png
new file mode 100644
index 0000000..ddea18e
--- /dev/null
+++ b/img/iot-logo.png
Binary files differ
diff --git a/index.html b/index.html
index 5b70bad..32d8875 100644
--- a/index.html
+++ b/index.html
@@ -351,6 +351,25 @@
+<section class="bar background-gray no-mb">
+ <div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <div class="heading text-center">
+ <h2>Who uses Eclipse Hono?</h2>
+ </div>
+
+ <p class="lead">
+
+ </p>
+
+ <div class="eclipsefdn-adopters">
+ </div>
+ </div>
+ </div>
+ </div>
+</section>
+
@@ -392,15 +411,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/index.xml b/index.xml
index c160311..19f61e8 100644
--- a/index.xml
+++ b/index.xml
@@ -27,7 +27,7 @@
<guid>https://www.eclipse.org/hono/downloads/</guid>
<description>Binaries Eclipse Hono&rsquo;s service components are provided by means of pre-built Docker images available from Docker Hub. These container images can be deployed to popular container orchestration platforms like Kubernetes and OpenShift.
The release archive contains all files necessary to deploy Hono to a Kubernetes cluster using the Helm package manager.
- Eclipse Hono 1.0-M7 Archive Download and extract the archive and follow the deployment guide.
+ Eclipse Hono 1.0.0 Archive Download and extract the archive and follow the deployment guide.
A Java based command line client for consuming telemetry data and events from Hono is available for download as well:</description>
</item>
@@ -94,7 +94,7 @@
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://www.eclipse.org/hono/release-notes/</guid>
- <description>1.0.0 (not yet released) New Features A tenant can now be configured with a max-ttl which is used as a upper boundary for default TTL values configured for devices/tenants. Please refer to the Tenant API for details. The AMQP, HTTP, MQTT and Kura protocol adapters consider this property when setting a TTL on downstream event messages. A protocol adapter can now be configured with a timeout for idle tenants.</description>
+ <description>1.0.0 New Features A tenant can now be configured with a max-ttl which is used as a upper boundary for default TTL values configured for devices/tenants. Please refer to the Tenant API for details. The AMQP, HTTP, MQTT and Kura protocol adapters consider this property when setting a TTL on downstream event messages. A protocol adapter can now be configured with a timeout for idle tenants. When there has been no communication between a protocol adapter instance and the devices of a tenant, the former one releases allocated resources of the tenant.</description>
</item>
<item>
diff --git a/release-notes/index.html b/release-notes/index.html
index 0a2fa44..e8b9fb3 100644
--- a/release-notes/index.html
+++ b/release-notes/index.html
@@ -234,7 +234,7 @@
<div>
-<h2 id="1-0-0-not-yet-released">1.0.0 (not yet released)</h2>
+<h2 id="1-0-0">1.0.0</h2>
<h3 id="new-features">New Features</h3>
@@ -963,423 +963,6 @@
X.509 certificate instead of a public key when defining a trusted CA.</li>
</ul>
-<h2 id="0-8">0.8</h2>
-
-<h3 id="new-features-10">New Features</h3>
-
-<ul>
-<li>The already specified new message exchange pattern - called <em>one-way commands</em> - is now available to <em>business applications</em>.
-Therefore the <code>CommandClient</code> class was extended by a method <code>sendOneWayCommand</code> that does not expect a response from the device.
-See the <code>HonoExampleApplicationBase</code> class for how to use this new command pattern.
-On the adapter side, this pattern is supported by the HTTP, MQTT and AMQP adapter so far.</li>
-</ul>
-
-<h3 id="fixes-enhancements-8">Fixes & Enhancements</h3>
-
-<ul>
-<li>The AMQP adapter has been instrumented using OpenTracing. It now collects traces when a device connects to the adapter,
-opens a link for uploading messages and for each message sent by the device. It also adds information to traces created
-for command messages to be sent to a device.</li>
-<li>The AMQP adapter command line client now uses property names that match those of the HonoClient.</li>
-<li>The Command client now has the provision to check the available credits before sending any commands using <code>getCredit()</code>.
-Also a handler can be set using <code>sendQueueDrainHandler(Handler<Void> handler)</code>, so that the client is notified when credits are replenished.</li>
-<li>The example application <code>HonoExampleApplication</code> can now be configured to only send <code>one-way commands</code> in response to
-downstream messages by setting the new system property <code>sendOneWayCommands</code>.</li>
-</ul>
-
-<h3 id="api-changes-9">API Changes</h3>
-
-<ul>
-<li>The <code>hono-client</code> module now contains all classes necessary to implement Command & Control in protocol adapters.
-Previously this has only been the case for the sending of a command, as it is typically done by an application, while
-the classes to receive commands, typically used by protocol adapters, were located in the <code>hono-service-base</code> module.
-Additionally, the package structure was reworked to allow for implementing protocol adapters that run in an OSGi
-environment, so several classes are not in the same package anymore.
-Custom protocol adapters thus may need to be slightly refactored to import the Command classes
-from their new packages - the functionality has not changed.
-The only exception to this is the <code>Device</code> class that was moved to <code>hono-core</code> with a specific
-subclass <code>DeviceUser</code>. This subclass is needed in code lines that implement the authentication as defined by the <code>vertx-auth-common</code>
-module, so for this class there might be some very few changes to the custom code necessary (the adapted standard protocol
-adapters may serve as a blue-print for this). You may want to refer to the method <code>getAuthenticatedDevice</code> in the
-<code>AbstractVertxBasedHttpProtocolAdapter</code> class as an example.</li>
-<li>The interface <code>ConnectionEventProducer</code> has been modified to support
-passing along a context object of type <code>ConnectionEventProducer.Context</code>
-which allows the producer implementation to re-use the pre-initialized
-Hono clients from the current protocol adapter instance, in the same threading
-context. The default implementation of the <em>connection events</em> still defaults
-to the logging producer.</li>
-<li>The <code>CommandConnection.getOrCreateCommandConsumer</code> method has been renamed to <code>createCommandConsumer</code>. The new name
-also reflects a change in the method’s semantics. The method will no longer return an already existing instance of a command
-consumer for a given device but will instead fail the returned future with a <code>org.eclipse.hono.client.ResourceConflictException</code>
-to indicate that a consumer for the given device is already in use. The original behavior allowed an implementation to return
-a consumer that was scoped to another message handler than the one passed into the method as an argument. However, client code
-had no chance to determine whether it got back a newly created instance or an existing one. This has been resolved with the
-new method semantics.</li>
-<li>The <code>CommandContext.flow()</code> method has been made private. Client code should instead use the newly introduced variants of the <code>accept(int)</code>,
-<code>release(int)</code> and <code>reject(ErrorCondition, int)</code> methods which all accept an integer indicating the number of credits to flow to the sender.
-These methods will also finish the OpenTracing span contained in the <code>CommandContext</code> implicitly.</li>
-</ul>
-
-<h3 id="deprecations-7">Deprecations</h3>
-
-<ul>
-<li>The Kura protocol adapter is being deprecated with 0.8. It will still be part
-of Hono 0.8, but may be removed in a future version. Starting with Kura 4.0
-and Hono 0.8, both projects can now be used together, without the need for
-a special version of the Hono MQTT protocol adapter.</li>
-<li>The <code>openshift</code> deployment is being deprecated with 0.8 and is planned to be
-removed in 0.9, in favor of the <code>openshift_s2i</code> deployment. While the
-<code>openshift</code> deployment still works, it hasn’t been updated for more recent
-OpenShift and EnMasse versions. The main focus now is on the <em>S2I</em> variant,
-which will become the default <em>OpenShift</em>” deployment in Hono 0.9.</li>
-<li>New variants of the <code>AbstractProtocolAdapterBase.sendConnectedTtdEvent</code>, <code>AbstractProtocolAdapterBase.sendDisconnectedTtdEvent</code>
-and <code>AbstractProtocolAdapterBase.sendTtdEvent</code>have been added which also accept an OpenTracing span as a parameter.
-The original variants have been deprecated.</li>
-</ul>
-
-<h2 id="0-8-m2">0.8-M2</h2>
-
-<h3 id="fixes-enhancements-9">Fixes & Enhancements</h3>
-
-<ul>
-<li>HonoClientImpl now waits a limited amount of time for the peer’s <em>attach</em> frame during link establishment before considering the attempt to have failed. The time-out value (default is 1000ms) can be configured using the <em>linkEstablishmentTimeout</em> property of <code>org.eclipse.hono.config.ClientConfigProperties</code>. See <a href="https://www.eclipse.org/hono/docs/admin-guide/hono-client-configuration/
-">Hono Client Configuration</a> for details.</li>
-<li>The example Device Registry service now supports limiting the number of iterations that are supported in BCrypt based hashed-password credentials. This way the processing time required for verifying credentials can be effectively limited. The <code>org.eclipse.hono.service.credentials.CompleteBaseCredentialsService</code> class defines a new method <code>getMaxBcryptIterations</code> which subclasses may override to provide a reasonable default value or determine the value based on a configuration property (as <code>FileBasedCredentialsService</code> of the demo Device Registry does).</li>
-<li>Hono now uses OpenJDK 11 as the JVM in the service Docker images. Because OpenJDK 11 has better support for detecting resource limits when running in a container, this also has an impact on the command line parameters passed to the JVM. See <a href="https://www.eclipse.org/hono/docs/deployment/resource-limitation/
-">Limiting Resource Usage</a> for details.</li>
-<li>Instead of Dropwizard Hono now uses Micrometer. Hono still allows to produce
-the same graphite wire format as Hono 0.7 supported. This can be enabled
-by the use of the configuration option <code>hono.metrics.legacy</code>. For the
-moment this value defaults to <code>true</code>. The plan is to disable the legacy
-format for the final 0.8 release, but still support the legacy format at least
-until one version after Hono 0.8.</li>
-</ul>
-
-<h3 id="api-changes-10">API Changes</h3>
-
-<ul>
-<li><code>org.eclipse.hono.util.CredentialsObject.fromHashedPassword</code> now requires a password hash instead of the clear text password to be passed in. Hash values for clear text password can be computed using <code>ClearTextPassword</code>’s <code>encode</code> and <code>encodeBCrypt</code> methods.</li>
-<li><code>org.eclipse.hono.util.CredentialsObject.isValid</code> has been renamed to <code>checkValidity</code>. The method also no longer returns a boolean but instead throws an <code>IllegalStateException</code> to indicate a failure.</li>
-</ul>
-
-<h2 id="0-8-m1-1">0.8-M1_1</h2>
-
-<p>Since 0.8-M1 missed an important artifact, the first 0.8 milestone is available as 0.8-M1_1.</p>
-
-<h3 id="new-features-11">New Features</h3>
-
-<ul>
-<li>A new message exchange pattern - called <em>one-way commands</em> - is fully specified for the <a href="https://www.eclipse.org/hono/docs/api/command-and-control/
-">Command & Control API</a>.
-Note that currently there is no implementation included, this is planned for the following milestone.</li>
-</ul>
-
-<h3 id="fixes-enhancements-10">Fixes & Enhancements</h3>
-
-<ul>
-<li>Hono-cli now supports Command & Control. Using command line, users can send commands to devices and receive command responses. See <a href="/hono/getting-started/#using-cli-command-line-interface-to-send-commands-and-receive-command-responses">Using CLI for Command & Control</a> for more information.</li>
-<li>The command client now enables the setting of application properties for command messages. This can be helpful if custom protocol adapters want to react to specifically annotated commands sent by an application. The standard protocol adapters of Hono do not further exploit these properties.</li>
-<li>The command consumer (typically used in protocol adapters) allows access to the application properties of command messages.</li>
-</ul>
-
-<h3 id="api-changes-11">API Changes</h3>
-
-<ul>
-<li>The <code>org.eclipse.hono.util.TenantObject</code>’s <em>getTrustAnchor</em> method now throws a <code>GeneralSecurityException</code> to indicate a problem with decoding/parsing the certificate or public key that is configured as the trusted CA for the tenant. This allows client code to get some insight into the reason for the failure to authenticate a device based on a client certificate.</li>
-<li>The <code>org.eclipse.hono.service.registration.RegistrationService</code> interface now describes only the mandatory operations of the API. The complete API is offered in <code>org.eclipse.hono.service.registration.CompleteRegistrationService</code>. These interfaces are implemented in <code>org.eclipse.hono.service.registration.BaseRegistrationService</code> and <code>org.eclipse.hono.service.registration.CompleteBaseRegistrationService</code> respectfully. Device Registries implementations can offer the mandatory only or the full API by extending the according base class.</li>
-<li>The <code>org.eclipse.hono.service.tenant.TenantService</code> interface now describes only the mandatory operations of the API. The complete API is offered in <code>org.eclipse.hono.service.tenant.CompleteTenantService</code>. These interfaces are implemented in <code>org.eclipse.hono.service.tenant.BaseTenantService</code> and <code>org.eclipse.hono.service.tenant.CompleteBaseTenantService</code> respectfully. Tenant services implementations can offer the mandatory only or the full API by extending the according base class.</li>
-<li>The <code>org.eclipse.hono.service.credentials.CredentialsService</code> interface now describes only the mandatory operations of the API. The complete API is offered in <code>org.eclipse.hono.service.credentials.CompleteCredentialsService</code>. These interfaces are implemented in <code>org.eclipse.hono.service.credentials.BaseCredentialsService</code> and <code>org.eclipse.hono.service.credentials.CompleteBaseCredentialsService</code> respectfully. Credentials services implementations can offer the mandatory only or the full API by extending the according base class.</li>
-<li>All messages containing JSON objects as payload are now encoded using <em>Data</em>
-sections and are required to have the content type <code>application/json</code>.
-This affects the Tenant, Credentials and Registry API. When evaluating Hono
-still accepts <em>AMQP Values</em> of type String or byte[]. But this behavior is
-deprecated and my be dropped in releases after 0.8.</li>
-</ul>
-
-<h2 id="0-7">0.7</h2>
-
-<h3 id="new-features-12">New Features</h3>
-
-<ul>
-<li>The MQTT protocol adapter now supports Command and Control. Please refer to <a href="https://www.eclipse.org/hono/docs/user-guide/mqtt-adapter/
-">MQTT adapter User Guide</a> for details.</li>
-<li>The Credentials API now explicitly defines <a href="https://de.wikipedia.org/wiki/Bcrypt">Bcrypt</a> as a supported hash function for <a href="https://www.eclipse.org/hono/docs/api/credentials/#hashed-password
-"><em>hashed-password</em> credentials</a>. The protocol adapters also support verification of username/password credentials against Bcrypt hashes.</li>
-<li>Hono’s HTTP and MQTT protocol adapters and HonoClient have been instrumented using <a href="http://opentracing.io">OpenTracing</a> in order to support tracing of the interactions between Hono components that are involved in the processing of messages as they flow through the system. The new <a href="https://www.eclipse.org/hono/docs/admin-guide/monitoring-tracing-config/
-">Monitoring & Tracing</a> admin guide has the details.</li>
-<li>Hono now contains an initial version of an AMQP protocol adapter which can be used to connect devices to Hono using the AMQP 1.0 protocol. The adapter currently exposes Telemetry and Event endpoints only. Support for Command & Control will be added in a future release. Please refer to the AMQP adapter’s <a href="https://www.eclipse.org/hono/docs/admin-guide/amqp-adapter-config/
-">Admin Guide</a> and <a href="https://www.eclipse.org/hono/docs/user-guide/amqp-adapter/
-">User Guide</a> for details regarding how to set up and use the new adapter.</li>
-</ul>
-
-<h3 id="fixes-enhancements-11">Fixes & Enhancements</h3>
-
-<ul>
-<li>Hono is now licensed under the <a href="https://www.eclipse.org/legal/epl-2.0/">Eclipse Public License 2.0</a>. Please refer to the Eclipse Foundation’s <a href="https://www.eclipse.org/legal/epl-2.0/faq.php">FAQ</a> for details regarding any implications this might have.</li>
-<li>Hono deployment scripts are now available under <code>deploy</code> folder. Deployment scripts which were previously available under <code>example</code> folder were moved to <code>deploy</code>.</li>
-<li>Hono-cli (Command Line Interface) is now available under folder <code>cli</code>. A command line argument <code>message.type</code> with value <code>telemetry</code>, <code>event</code> or <code>all</code> (default) tells the client what kind of messages to be received. See <a href="/hono/getting-started/#starting-a-consumer">Starting a Consumer</a> for more information.</li>
-<li>Added metrics to Command and Control for HTTP and MQTT protocol adapters. Now Hono-Dashboard also shows the metrics from Command and Control.</li>
-<li>Add a <em>dummy</em> implementation of the device registry services. This allows to
-do better scale testing as the file based device registry cannot be scaled up
-and thus is a bottleneck in the example setup. The device registry however has
-no real storage. So it still can be part of the test, but is no limiting
-factor anymore.</li>
-<li>The Hono Travis build now also builds for JDK 10 in addition to JDK 8.
-Hono is still intended to run on Java 8, but the JDK 10 build was enabled to
-be better prepared for Java 11.</li>
-<li>The example application in the <code>example</code> folder now supports Command and Control for all <code>ttd</code> values, including a
-value of <code>-1</code> that signals that a device stays connected for an unlimited time frame. In this case it sends a command
-every 15 seconds, which is helpful for testing this feature with MQTT devices. A <code>ttd</code> value of <code>0</code> stops this
-behaviour again (both automatically sent by the MQTT adapter for <code>subscribe</code> and <code>unsubscribe</code>, see
-<a href="https://www.eclipse.org/hono/docs/dev-guide/java_client_consumer/
-">Consuming Messages from Java</a> for details).</li>
-<li>The maximum value for the value of <code>ttd</code> that is allowed for requests to the HTTP adapter is now configurable per tenant.
-The default value is <code>60</code> seconds.
-Please refer to <a href="https://www.eclipse.org/hono/docs/user-guide/http-adapter/#tenant-specific-configuration
-">HTTP Adapter Tenant Configuration</a>.</li>
-</ul>
-
-<h3 id="api-changes-12">API Changes</h3>
-
-<ul>
-<li>Fix the <code>EventBusService</code> methods handling type safety to handle a
-mismatching type according to their documentation, returning <code>null</code>. This
-introduced a method signature change for <code>getTypesafeValueForField</code> and
-<code>removeTypesafeValueForField</code>. Also see PR <a href="https://github.com/eclipse/hono/pull/757">#757</a>.</li>
-</ul>
-
-<h2 id="0-7-m2">0.7-M2</h2>
-
-<h3 id="new-features-13">New Features</h3>
-
-<ul>
-<li>The Auth Server can now be used to authenticate clients connecting to the Apache Qpid Dispatch Router which is used in the example deployment. For this purpose the Auth Server is configured as a <em>remote auth server</em> implementing <a href="https://qpid.apache.org/releases/qpid-dispatch-1.1.0/man/qdrouterd.conf.html#_authserviceplugin">Dispatch Router’s <em>Auth Service Plugin</em> mechanism</a>. Using this mechanism it is now possible to manage all identities and authorities using the Auth Server’s configuration file.</li>
-<li>The HTTP protocol adapter now supports devices uploading a response to a command that has been sent to the device before. Please refer to the <a href="https://www.eclipse.org/hono/docs/user-guide/http-adapter/#sending-a-response-to-a-command-authenticated-device
-">HTTP adapter User Guide</a> for details.</li>
-<li>Hono’s service components can now be configured to use OpenSSL instead of the JVM’s default SSL engine. The <a href="https://www.eclipse.org/hono/docs/admin-guide/secure_communication/#using-openssl
-">admin guide</a> describes how to do this.</li>
-<li>In addition to number of successful MQTT and HTTP messages now also the
-payload size of the message body is being recorded in the metrics system.</li>
-</ul>
-
-<h3 id="fixes-enhancements-12">Fixes & Enhancements</h3>
-
-<ul>
-<li>The Device Registry’s AMQP endpoints can now be configured with the number of credits they should flow to clients connecting to the endpoints. The default value is 100. See <a href="https://www.eclipse.org/hono/docs/admin-guide/device-registry-config/#service-configuration
-">Device Registry admin guide</a> for details.</li>
-</ul>
-
-<h3 id="api-changes-13">API Changes</h3>
-
-<ul>
-<li>The Command & Control API has been changed to be less restrictive on the format of <em>reply-to</em> addresses. Response messages are no longer required to be scoped to a single device but may instead be scoped to a tenant. This allows for applications to implement a <em>generic</em> command response handler, thus allowing for easier fail-over between nodes.</li>
-</ul>
-
-<h2 id="0-7-m1">0.7-M1</h2>
-
-<h3 id="fixes-enhancements-13">Fixes & Enhancements</h3>
-
-<ul>
-<li><code>HonoClientImpl</code>’s strategy for attempting to establish a connection with a peer has been enhanced. The client’s <em>connect</em> methods by default will only try three times to establish a TCP connection with the peer before giving up. Based on the value of the new <em>reconnectAttempts</em> property of <code>ClientConfigProperties</code>, the client will then either re-try to connect to the peer (including a fresh DNS lookup of the peer’s host name) or fail the overall connection attempt. This way, the client will not get stuck in an endless loop if the peer’s IP address has changed or the peer has crashed while the client tries to connect to it.</li>
-<li>The Java Virtual Machines run by Docker images provided by Hono now consider resource limitations defined for a container on startup. See <a href="https://www.eclipse.org/hono/docs/deployment/resource-limitation/
-">Limiting Resource Usage</a> for details how this can e.g. be used to limit memory consumption. The example deployment already makes use of this mechanism.</li>
-</ul>
-
-<h2 id="0-6">0.6</h2>
-
-<h3 id="new-features-14">New Features</h3>
-
-<ul>
-<li>Protocol adapters, services and HonoClient now support TLS 1.2 only by default when using TLS to secure communication. However, additional protocols can be enabled by means of setting environment variables as described in the admin guides.</li>
-<li>The deployment examples for OpenShift got overhauled. The two provided
-examples are not both based on EnMasse and follow a similar architecture. The
-newly added <em>source-to-image</em>” based approach doesn’t require a local
-development setup but created new images directly in the OpenShift
-instance. It also makes more use of ConfigMaps and service key/cert management.</li>
-<li><strong>Tech preview</strong>: Protocol adapters do have the ability to send out connection events. Those
-events are best-effort events, indicating when a connection has been
-established and when it has been lost. There is a pluggable way of
-handling/creating those events, including two default implementations. A
-logger implementation, which simply logs to the logging system. And one
-implementation which sends out events to the <em>Hono Event API</em>.<br />
-<strong>Note</strong>: This feature is part of the Eclipse IoT integration effort and not
-yet considered a public API.</li>
-<li>The HTTP protocol adapter now supports authentication of devices based on X.509 client certificates. Each tenant can be configured with an individual trust anchor which the HTTP adapter will retrieve using the Tenant API when a device tries to authenticate with a certificate as part of a TLS handshake. The Credentials API now supports a <a href="https://www.eclipse.org/hono/docs/api/credentials/#x-509-certificate
-">new credentials type</a> for registering a mapping of the certificate’s <em>subject DN</em> to the device identifier. Please consult the <a href="https://www.eclipse.org/hono/docs/user-guide/http-adapter/#device-authentication
-">HTTP adapter User Guide</a> for details regarding usage.</li>
-<li>The HTTP adapter now supports uploading telemetry messages using QoS 1 (<code>AT_LEAST_ONCE</code>). Clients must set the <code>QoS-Level</code> request header if they want the HTTP adapter to upload telemetry messages using QoS 1.</li>
-<li>The concept and implementation of <em>Device notifications</em> were added. It enables devices to signal that they are ready to receive an upstream message by specifying a <code>time til disconnect</code> parameter with any downstream message. Please see <a href="https://www.eclipse.org/hono/docs/concepts/device-notifications/
-">Device notifications</a> for details.</li>
-<li><strong>Tech preview</strong>: <em>Command and Control</em> is now available for the HTTP protocol adapter (NB: currently without responses from the device to the application).
-It enables HTTP devices to signal how long they stay <em>connected</em> to the HTTP protocol adapter, resulting in a delayed response.
-The response then may contain a command sent by the application. Please refer to the <a href="https://www.eclipse.org/hono/getting-started/">Getting Started</a>
-guide and the Command & Control <a href="https://www.eclipse.org/hono/docs/concepts/command-and-control/
-">concept page</a> for details.<br />
-<strong>Note</strong>: This feature is available now as a first fully working version but is considered to possibly have some unknown issues that may not make it
-fully production ready yet.</li>
-</ul>
-
-<h3 id="fixes-enhancements-14">Fixes & Enhancements</h3>
-
-<ul>
-<li>Hono’s standard protocol adapters can now be connected directly to the AMQP Network, i.e. without going through Hono Messaging. For Hono’s standard adapters Hono Messaging does not provide any additional value because the devices’ registration status is already being validated by the protocol adapters. Omitting Hono Messaging should therefore reduce message processing latency for standard adapters. However, custom protocol adapters still need to be connected to Hono Messaging. The Getting started guide, the Sandbox and the deployment scripts have been changed accordingly. Note that it is still possible to connect all adapters to Hono Messaging, though.</li>
-</ul>
-
-<h3 id="api-changes-14">API Changes</h3>
-
-<ul>
-<li>The Tenant API’s <em>get Tenant Information</em> operation has been changed to expect search criteria in the request message’s payload instead of the application-properties. This change has been made in order to support other search criteria than just the tenant identifier. In particular, the <em>get Tenant Information</em> operation can now be used to find a tenant based on the subject DN of a trusted certificate authority that has been configured for the tenant. See <a href="https://www.eclipse.org/hono/docs/api/tenant/#get-tenant-information
-">get Tenant Information</a> for details.</li>
-
-<li><p>The result type of <code>org.eclipse.hono.util.MessageHelper.getPayload(Message msg)</code> has been changed from <code>String</code> to the more generic <code>io.vertx.core.buffer.Buffer</code> to be able to handle e.g. binary data.</p></li>
-
-<li><p>The default way how <code>HonoClient</code> instances are being created has changed.
-As the default implementation <code>HonoClientImpl</code> was located in an internal
-<code>impl</code> package, it wasn’t accessible when using OSGi as this was package wasn’t
-exported. The old constructor is still available. In combination with that the
-<code>ConnectionFactoryImpl</code> builder concept was removed as it didn’t add anything
-on top of the <code>ClientConfigProperties</code>. The <code>ConnectionBuilderImpl</code> class
-was also moved to an <code>impl</code> package to follow the pattern of
-<code>HonoClientImpl</code>. The two new methods to created instances are are:
-<code>org.eclipse.hono.connection.ConnectionFactory.newConnectionFactory(Vertx, ClientConfigProperties)</code>
-and
-<code>org.eclipse.hono.client.HonoClient.newClient(Vertx, ClientConfigProperties)</code>.</p></li>
-</ul>
-
-<h2 id="0-6-m2">0.6-M2</h2>
-
-<h3 id="api-changes-15">API Changes</h3>
-
-<ul>
-<li>The <code>HonoClient.isConnected()</code> method has been changed to return a <code>Future<Void></code> instead of <code>Future<Boolean></code>. The future will succeed if the client is connected and will fail otherwise. This change makes it easier to compose the check with other futures.</li>
-<li>The signatures of the (base) methods for processing requests of <code>org.eclipse.hono.service.credentials.BaseCredentialsService</code>, <code>org.eclipse.hono.service.registration.BaseRegistrationService</code> and <code>org.eclipse.hono.service.tenant.BaseTenantService</code> have changed to both accept and return an <code>org.eclipse.hono.util.EventBusMessage</code>. Subclasses overriding the corresponding methods will need to be adapted accordingly.</li>
-</ul>
-
-<h3 id="fixes-enhancements-15">Fixes & Enhancements</h3>
-
-<ul>
-<li>The <em>hono-client</em> and <em>hono-core</em> artifacts no longer depend on classes from the <em>Spring</em> framework which can help reducing the footprint of applications that want to use the Hono client but otherwise do not employ any Spring libraries.</li>
-<li>The Qpid Dispatch Router used in the example configuration has been updated to version 1.0.1.</li>
-<li>vert.x has been updated to version 3.5.1.</li>
-<li>The MQTT adapter now also supports shortened versions of the telemetry and event topic names. Devices may use just <code>t</code> instead of <code>telemetry</code> and <code>e</code> instead of <code>event</code>.</li>
-</ul>
-
-<h2 id="0-6-m1">0.6-M1</h2>
-
-<h3 id="new-features-15">New Features</h3>
-
-<ul>
-<li>The MQTT protocol adapter now supports publishing telemetry data using either QoS 0 or QoS 1. In case of QoS 1 the adapter will send an MQTT <em>PUBACK</em> to the device once the downstream peer has settled the message with the AMQP <em>accepted</em> outcome.</li>
-<li>Hono now specifies a <a href="https://www.eclipse.org/hono/docs/api/tenant/
-">Tenant API</a> and contains an exemplary implementation of this API.
-The purpose of the API is to make Hono aware of the tenants that are available in an installation. This comprises of:
-
-<ul>
-<li>a file-based version of the Tenant API service that implements all mandatory and optional operations</li>
-<li>the implementation of the AMQP 1.0 endpoint as part of the device registry component</li>
-<li>the AMQP 1.0 based implementation of the mandatory <strong>get</strong> operation of the API</li>
-<li>an HTTP endpoint to support CRUD operations for tenants (GET, POST, PUT, DELETE) for convenience</li>
-</ul></li>
-<li><code>org.eclipse.hono.client.impl.AbstractRequestResponseClient</code> now supports generic caching of responses to service invocations based on <em>cache directives</em>. See <a href="https://www.eclipse.org/hono/docs/admin-guide/hono-client-configuration/
-">Hono Client Configuration</a> for details.</li>
-<li>The protocol adapters now can be enabled/disabled <em>per tenant</em> using the <a href="https://www.eclipse.org/hono/docs/api/tenant/
-">Tenant API</a>. A protocol adapter that has been disabled for a tenant will reject telemetry messages and events published by any device that belongs to the particular tenant.</li>
-</ul>
-
-<h3 id="fixes-enhancements-16">Fixes & Enhancements</h3>
-
-<ul>
-<li>HonoClient now fails all futures it returns with instances of <code>org.eclipse.hono.client.ServiceInvocationException</code> if something goes wrong. Client code can inspect the exception’s <em>errorCode</em> property to get a better understanding of the reason for the failure.</li>
-</ul>
-
-<h2 id="0-5">0.5</h2>
-
-<h3 id="new-features-16">New Features</h3>
-
-<ul>
-<li>We have added a protocol adapter for allowing <a href="https://www.eclipse.org/kura">Eclipse Kura</a> gateways to publish <em>control</em> and <em>data</em> messages to Hono’s Telemetry and Event API. See <a href="https://www.eclipse.org/hono/docs/admin-guide/kura-adapter-config/
-">Kura Adapter</a> for details.</li>
-<li><code>RegistrationClientImpl</code> now supports caching of registration assertions received from a Device Registration service. The protocol adapters already make use of this feature so that they do not need to do a remote service invocation unless a cached assertion has expired. The protocol adapters support two new configuration variables to set the minimum and maximum cache size.</li>
-<li>Devices can now be configured to act as <em>gateways</em> and publish data <em>on behalf of</em> other devices that are not connected to a protocol adapter directly but to the gateway. This is useful for receiving data from devices using narrow band radio communication like <a href="https://www.sigfox.com">SigFox</a> or <a href="https://www.lora-alliance.org/">LoRa</a>. See <a href="https://www.eclipse.org/hono/docs/admin-guide/device-registry-config/#configuring-gateway-devices
-">Configuring Gateway Devices</a> for details.</li>
-</ul>
-
-<h3 id="fixes-enhancements-17">Fixes & Enhancements</h3>
-
-<ul>
-<li>See <a href="https://github.com/eclipse/hono/issues?utf8=%E2%9C%93&q=is%3Aissue%20milestone%3A0.5">Git Hub</a> for the list of issues addressed.</li>
-<li>The documentation of Hono’s individual components has been split up into information relevant for <em>using</em> the components (<em>User Guide</em>) and information relevant for <em>configuring</em> the components (<em>Admin Guide</em>).</li>
-</ul>
-
-<h3 id="configuration-changes">Configuration Changes</h3>
-
-<ul>
-<li>All Hono Docker images after 0.5-M10 now use <code>eclipse/</code> instead of <code>eclipsehono/</code> as the prefix in the image repository name.</li>
-<li>The default names of the files used by the Device Registry component for persisting data have changed:
-
-<ul>
-<li><code>/home/hono/registration/device-identities.json</code> has been changed to <code>/var/lib/hono/device-registry/device-identities.json</code></li>
-<li><code>/home/hono/registration/credentials.json</code> has been changed to <code>/var/lib/hono/device-registry/credentials.json</code></li>
-</ul></li>
-<li>The Device Registry used in the <em>Getting started</em> guide now by default persists data to a file system volume.</li>
-<li>The <em>REST Adapter</em> has been renamed to <em>HTTP Adapter</em> because it does not really comply with the common requirements for RESTful services. As part of this effort, the names of the HTTP adapter’s configuration variables have also been changed accordingly. See <a href="https://www.eclipse.org/hono/docs/admin-guide/http-adapter-config/#service-configuration
-">HTTP Adapter Configuration</a> for details.</li>
-<li>The Device Registry component’s <code>HONO_CREDENTIALS_SRV_CREDENTIALS_FILENAME</code> configuration variable has been shortened to just <code>HONO_CREDENTIALS_SVC_FILENAME</code> to match its counterpart for configuring the filename of the device registration service implementation.</li>
-</ul>
-
-<h3 id="api-changes-16">API Changes</h3>
-
-<ul>
-<li>The <a href="https://www.eclipse.org/hono/docs/api/telemetry/
-">Telemetry API</a> has been updated to recommend clients to use <em>AT LEAST ONCE</em> delivery semantics instead of <em>AT MOST ONCE</em>. This change has been made to better support end-to-end flow control between protocol adapters (devices) and downstream consumers. Note that this change has no impact on the <em>quality of service</em> that devices and consumers experience, i.e. telemetry data published by a device to a protocol adapter is still <em>not guaranteed</em> to be delivered to a downstream consumer even if the device has received an acknowledgement from the protocol adapter indicating that it has accepted the data (e.g. a 202 HTTP status code).</li>
-<li>The <code>org.eclipse.hono.client.HonoClient</code> interface has been changed:
-
-<ul>
-<li>All methods that had previously returned <code>HonoClient</code> have been changed to return <code>Future<HonoClient></code> instead. Returning the client instance had originally been intended to be useful for chaining commands. However, there was nothing much to chain because the effect of invoking the (asynchronous) operations is usually not immediately visible in the client, e.g. when invoking the <em>connect</em> method, the returned client will most likely not (yet) be connected.</li>
-<li>All methods that had previously accepted a <code>Handler<AsyncResult></code> have been changed to return a <code>Future</code> instead. This makes orchestration of these methods and their results using <code>Future.compose</code>, <code>Future.map</code> etc. much easier.</li>
-</ul></li>
-<li>The <code>org.eclipse.hono.client.MessageSender</code> interface has been changed:
-
-<ul>
-<li>All methods now return a <code>Future<ProtonDelivery></code> to indicate the outcome of the operation according to the sender specific delivery semantics.
-For a Telemetry client this means that the future will be succeeded immediately after the message has been sent, i.e. the client does not wait
-for a downstream container to accept the message.
-For an Event client this means that the future will be succeeded once the downstream container has settled and accepted the message.</li>
-<li>All operations accepting a disposition handler have been removed in order to relieve clients from the burden of (correctly) implementing the delivery semantics.</li>
-</ul></li>
-<li>The <code>org.eclipse.hono.client.RegistrationClient</code> interface has been changed:
-
-<ul>
-<li>All methods that had previously accepted a <code>Handler<AsyncResult></code> have been changed to return a <code>Future</code> instead. This makes orchestration of these methods and their results using <code>Future.compose</code>, <code>Future.map</code> etc. much easier.</li>
-</ul></li>
-<li>The <code>org.eclipse.hono.client.CredentialsClient</code> interface has been changed:
-
-<ul>
-<li>All methods that had previously accepted a <code>Handler<AsyncResult></code> have been changed to return a <code>Future</code> instead. This makes orchestration of these methods and their results using <code>Future.compose</code>, <code>Future.map</code> etc. much easier.</li>
-</ul></li>
-<li>The <a href="https://www.eclipse.org/hono/docs/api/device-registration/#assert-device-registration
-">assert Device Registration</a> operation of the Device Registration API has been extended with an optional <em>gateway_id</em> parameter which can be used to get a registration status assertion on behalf of another device. This is mainly intended to support use cases where devices do not connect to a protocol adapter directly but are connected to a <em>gateway</em> component which <em>acts on behalf of</em> its connected devices when publishing data to a protocol adapter.
-A corresponding <em>assertRegistration</em> operation has been added to the <code>org.eclipse.hono.client.RegistrationClient</code> and <code>org.eclipse.hono.service.registration.RegistrationService</code> interfaces which require both a device ID and a gateway ID being passed in as parameters.</li>
-</ul>
-
-<h2 id="0-5-m10">0.5-M10</h2>
-
-<h3 id="new-features-17">New Features</h3>
-
-<ul>
-<li>We have set up a <a href="https://www.eclipse.org/hono/sandbox/">Sandbox server</a> at <code>hono.eclipse.org</code> which can be used to connect devices and consumers for testing purposes without the need to run a Hono instance locally.</li>
-</ul>
-
-<h3 id="fixes-enhancements-18">Fixes & Enhancements</h3>
-
-<p>See <a href="https://github.com/eclipse/hono/issues?utf8=%E2%9C%93&q=is%3Aissue%20milestone%3A0.5-M10">Git Hub</a> for the list of issues addressed.</p>
-
-<h3 id="configuration-changes-1">Configuration Changes</h3>
-
-<ul>
-<li>The example <em>Dispatch Router</em> is configured to use balanced distribution of messages to consumers (vs. multicast before). For full AMQP flow control, this is the preferred option.</li>
-</ul>
-
</div>
</div>
@@ -1432,15 +1015,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/sandbox/index.html b/sandbox/index.html
index a3587cb..fd2523d 100644
--- a/sandbox/index.html
+++ b/sandbox/index.html
@@ -337,15 +337,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/tags/index.html b/tags/index.html
index 752a39a..643a388 100644
--- a/tags/index.html
+++ b/tags/index.html
@@ -316,15 +316,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>
diff --git a/thankyou/index.html b/thankyou/index.html
index 5eb2174..e0fa7d6 100644
--- a/thankyou/index.html
+++ b/thankyou/index.html
@@ -288,15 +288,15 @@
<div class="col-md-4 col-sm-6">
- <div>
- <div class="incubation">
- <a href="https://www.eclipse.org/projects/what-is-incubation.php" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_incubation_vertical_png-02.png" width="100%" />
+ <div class="eclipse-logos">
+ <div class="pull-left">
+ <a href="https://www.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg" id="logo-eclipse-foundation"/>
</a>
</div>
- <div class="eclipse-logo">
- <a href="https://www.eclipse.org" target="_blank">
- <img src="https://www.eclipse.org/hono/img/eclipse_foundation_logo_wo.svg"/>
+ <div class="pull-right">
+ <a href="https://iot.eclipse.org" target="_blank">
+ <img src="https://www.eclipse.org/hono/img/iot-logo.png"/>
</a>
</div>
</div>