| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <meta name="description" content=""> |
| <meta name="keywords" content="blogconnectivity, "> |
| <title> Connecting Eclipse Ditto to Eclipse Hono </title> |
| |
| <link rel="stylesheet" href="css/syntax.css"> |
| <link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous"> |
| <link rel="stylesheet" href="css/modern-business.css"> |
| <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" crossorigin="anonymous"> |
| <link rel="stylesheet" href="css/customstyles.css"> |
| <link rel="stylesheet" href="css/boxshadowproperties.css"> |
| <link rel="stylesheet" href="css/theme-ditto.css"> |
| <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700"> |
| |
| <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js" crossorigin="anonymous"></script> |
| <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script> |
| <script src="//cdnjs.cloudflare.com/ajax/libs/anchor-js/2.0.0/anchor.min.js" crossorigin="anonymous"></script> |
| <script src="js/toc.js"></script> |
| <script src="js/customscripts.js"></script> |
| |
| <script type="application/ld+json"> |
| { |
| "@context": "http://schema.org", |
| "@type": "Organization", |
| "url": "https://eclipse.org/ditto/", |
| "logo": "https://eclipse.org/ditto/images/ditto.svg" |
| } |
| </script> |
| |
| <link rel="icon" type="image/png" href="images/favicon-16x16.png" sizes="16x16"> |
| <link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32"> |
| <link rel="icon" type="image/png" href="images/favicon-96x96.png" sizes="96x96"> |
| |
| <link rel="alternate" type="application/rss+xml" title="Eclipse Ditto Blog" href="https://www.eclipse.org/ditto/feed.xml"> |
| |
| <!-- Eclipse Foundation cookie consent: --> |
| <link rel="stylesheet" type="text/css" href="//www.eclipse.org/eclipse.org-common/themes/solstice/public/stylesheets/vendor/cookieconsent/cookieconsent.min.css" /> |
| <script src="//www.eclipse.org/eclipse.org-common/themes/solstice/public/javascript/vendor/cookieconsent/default.min.js"></script> |
| |
| <script> |
| $(document).ready(function() { |
| $("#tg-sb-link").click(function() { |
| $("#tg-sb-sidebar").toggle(); |
| $("#tg-sb-content").toggleClass('col-md-9'); |
| $("#tg-sb-content").toggleClass('col-md-12'); |
| $("#tg-sb-icon").toggleClass('fa-toggle-on'); |
| $("#tg-sb-icon").toggleClass('fa-toggle-off'); |
| }); |
| }); |
| </script> |
| </head> |
| |
| |
| <script> |
| (function(w,d,s,l,i){ |
| w[l]=w[l]||[]; |
| w[l].push({'gtm.start': |
| new Date().getTime(),event:'gtm.js'}); |
| var f=d.getElementsByTagName(s)[0], |
| j=d.createElement(s), |
| dl=l!='dataLayer'?'&l='+l:''; |
| j.async=true; |
| j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl; |
| f.parentNode.insertBefore(j,f); |
| })(window,document,'script','dataLayer','GTM-5WLCZXC'); |
| </script> |
| |
| |
| |
| <body> |
| <!-- Navigation --> |
| <nav class="navbar navbar-inverse navbar-fixed-top"> |
| <div class="container topnavlinks"> |
| <div class="navbar-header"> |
| <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> |
| <span class="sr-only">Toggle navigation</span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| </button> |
| <a class="navbar-ditto-home" href="index.html"> <img src="images/ditto_allwhite_symbolonly.svg" class="ditto-navbar-symbol" alt="Home"> <img src="images/ditto_allwhite_textonly.svg" class="ditto-navbar-symbol-text" alt="Ditto"></a> |
| </div> |
| <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> |
| <ul class="nav navbar-nav navbar-right"> |
| <!-- toggle sidebar button --> |
| <!--<li><a id="tg-sb-link" href="#"><i id="tg-sb-icon" class="fa fa-toggle-on"></i> Nav</a></li>--> |
| <!-- entries without drop-downs appear here --> |
| |
| |
| |
| |
| |
| |
| |
| <li><a href="blog.html">Blog</a></li> |
| |
| |
| |
| <li><a href="intro-overview.html">Documentation</a></li> |
| |
| |
| |
| <li><a href="http-api-doc.html">HTTP API</a></li> |
| |
| |
| |
| <li><a href="sandbox.html">Sandbox</a></li> |
| |
| |
| |
| <li><a href="https://github.com/eclipse/ditto" target="_blank">GitHub</a></li> |
| |
| |
| |
| <li><a href="https://github.com/eclipse/ditto-examples" target="_blank">GitHub examples</a></li> |
| |
| |
| |
| <!-- entries with drop-downs appear here --> |
| <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.--> |
| |
| |
| <li class="dropdown"> |
| <a href="#" class="dropdown-toggle" data-toggle="dropdown">Links<b class="caret"></b></a> |
| <ul class="dropdown-menu"> |
| |
| |
| <li><a href="https://projects.eclipse.org/projects/iot.ditto" target="_blank">Eclipse Ditto Project</a></li> |
| |
| |
| |
| <li><a href="https://www.eclipse.org/forums/index.php/f/364/" target="_blank">Forum</a></li> |
| |
| |
| |
| <li><a href="https://ci.eclipse.org/ditto/" target="_blank">Jenkins</a></li> |
| |
| |
| |
| <li><a href="https://dev.eclipse.org/mhonarc/lists/ditto-dev/" target="_blank">Mailing list archives</a></li> |
| |
| |
| |
| <li><a href="https://gitter.im/eclipse/ditto" target="_blank">Gitter.im chat</a></li> |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <!--comment out this block if you want to hide search--> |
| <li> |
| <!--start search--> |
| <div id="search-demo-container"> |
| <input type="text" id="search-input" placeholder="search..."> |
| <ul id="results-container"></ul> |
| </div> |
| <script src="//cdnjs.cloudflare.com/ajax/libs/simple-jekyll-search/0.0.9/jekyll-search.js" type="text/javascript"></script> |
| <script type="text/javascript"> |
| SimpleJekyllSearch.init({ |
| searchInput: document.getElementById('search-input'), |
| resultsContainer: document.getElementById('results-container'), |
| dataSource: 'search.json', |
| searchResultTemplate: '<li><a href="{url}" title="Connecting Eclipse Ditto to Eclipse Hono">{title}</a></li>', |
| noResultsText: 'No results found.', |
| limit: 10, |
| fuzzy: true, |
| }) |
| </script> |
| <!--end search--> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <!-- /.container --> |
| </nav> |
| |
| <!-- Page Content --> |
| <div class="container"> |
| <div id="main"> |
| <!-- Content Row --> |
| <div class="row"> |
| |
| |
| |
| <!-- Content Column --> |
| <div class="col-md-12" id="tg-sb-content"> |
| <!-- Look the author details up from the site config. --> |
| |
| |
| <!-- Output author details if some exist. --> |
| <!-- Output author details if some exist. --> |
| <!----> |
| <!--<span>--> |
| <!--<!– Mugshot. –>--> |
| <!--<img src="https://www.gravatar.com/avatar/19a9fd49b6778aef898249fb4f11bd24?s=135" alt="A photo of Thomas Jäckle" />--> |
| |
| <!--<!– Personal Info. –>--> |
| <!--Written by <a href="https://github.com/thjaeckle" target="_blank">Thomas Jäckle</a>--> |
| <!--</span>--> |
| <!----> |
| |
| <article class="post" itemscope itemtype="http://schema.org/BlogPosting"> |
| |
| <header class="post-header"> |
| <h1 class="post-title" itemprop="name headline">Connecting Eclipse Ditto to Eclipse Hono</h1> |
| <p class="post-meta">Published by <img src="https://www.gravatar.com/avatar/19a9fd49b6778aef898249fb4f11bd24?s=135" alt="A photo of Thomas Jäckle" style="width:50px;border-radius:50%;display:inline-block;margin-right:5px;" /><span itemprop="author" itemscope itemtype="http://schema.org/Person"><span itemprop="name"><a href="https://github.com/thjaeckle" target="_blank">Thomas Jäckle</a> </span></span> on <time datetime="2018-05-02T00:00:00+00:00" itemprop="datePublished">May 2, 2018</time> - Tags: |
| |
| |
| |
| <a href="tag_blog.html">blog</a>, |
| |
| |
| |
| <a href="tag_connectivity.html">connectivity</a> |
| |
| |
| |
| |
| </p> |
| |
| |
| </header> |
| |
| <div class="post-content" itemprop="articleBody"> |
| |
| |
| |
| |
| |
| <!-- this handles the automatic toc. use ## for subheads to auto-generate the on-page minitoc. if you use html tags, you must supply an ID for the heading element in order for it to appear in the minitoc. --> |
| <script> |
| $( document ).ready(function() { |
| // Handler for .ready() called. |
| |
| $('#toc').toc({ minimumHeaders: 0, listType: 'ul', showSpeed: 0, headers: 'h2,h3,h4' }); |
| |
| /* this offset helps account for the space taken up by the floating toolbar. */ |
| $('#toc').on('click', 'a', function() { |
| var target = $(this.getAttribute('href')) |
| , scroll_target = target.offset().top |
| |
| $(window).scrollTop(scroll_target - 10); |
| return false |
| }) |
| |
| }); |
| </script> |
| |
| <div id="toc"></div> |
| |
| |
| |
| <div class="alert alert-danger" role="alert"><i class="fa fa-exclamation-circle"></i> <b>Warning:</b> This guide does no longer work with the latest (1.x) versions of Ditto + Hono. Please take a look and make use of the <a href="https://www.eclipse.org/packages/packages/cloud2edge/">Eclipse IoT Packages “cloud2edge” package</a> in order to setup and automatically connect Ditto + Hono.</div> |
| |
| <p>With the recently released Ditto milestone <a href="2018-04-26-milestone-announcement-030-M1.html">0.3.0-M1</a> the <code class="highlighter-rouge">connectivity</code> |
| to AMQP 1.0 endpoints can now be established in a durable and stable way (including failovers, etc.).</p> |
| |
| <p>That means Ditto now is ready to be connected to <a href="https://www.eclipse.org/hono/">Eclipse Hono’s</a> “northbound” API which |
| is provided via AMQP 1.0.<br /> |
| By doing so it is for example possible to receive Hono telemetry |
| messages (see heading “Northbound Operations”) which a device <code class="highlighter-rouge">demo-device</code> connected to the “southbound” of Hono sends |
| via HTTP or MQTT (the currently available protocol adapters of Hono) in Ditto.<br /> |
| When received, the payload can be translated into a format Ditto understands in order to update the |
| <a href="intro-digitaltwins.html">digital twin</a> of the <code class="highlighter-rouge">demo-device</code> device and provide API access to the twin, e.g. via <code class="highlighter-rouge">HTTP</code> |
| or <code class="highlighter-rouge">WebSocket</code>.</p> |
| |
| <p>This blog post walks through the steps required to connect Ditto and Hono by adding a connection between the Hono and |
| Ditto sandboxes at</p> |
| |
| <ul> |
| <li><a href="http://hono.eclipse.org">hono.eclipse.org</a></li> |
| <li><a href="https://ditto.eclipseprojects.io">ditto.eclipseprojects.io</a></li> |
| </ul> |
| |
| <h2 id="scenario">Scenario</h2> |
| |
| <p>The following graphic illustrates the scenario:</p> |
| |
| <figure><img class="docimage" src="images/blog/2018-05-02-ditto-hono-digital-twin.png" alt="Ditto-Hono digital twin" style="max-width: 469px" /><figcaption>Scenario for providing a digital twin in Ditto of a device connected via Hono</figcaption></figure> |
| |
| <p>Let’s assume for this tutorial that we have a device (e.g. containing a sensor) <code class="highlighter-rouge">demo-device</code> which is capable of |
| measuring temperature and humidity.</p> |
| |
| <p>This device sends the sensor telemetry data every 5 minutes via MQTT into the cloud in either of the following formats:</p> |
| |
| <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w"> |
| </span><span class="s2">"temp"</span><span class="p">:</span><span class="w"> </span><span class="mf">23.42</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"hum"</span><span class="p">:</span><span class="w"> </span><span class="mf">44.42</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span></code></pre></div></div> |
| |
| <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w"> |
| </span><span class="s2">"temp"</span><span class="p">:</span><span class="w"> </span><span class="mf">23.42</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span></code></pre></div></div> |
| |
| <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w"> |
| </span><span class="s2">"hum"</span><span class="p">:</span><span class="w"> </span><span class="mf">44.42</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span></code></pre></div></div> |
| |
| <p>We want to create a digital twin for this device in order to access the device’s sensor data as API via Eclipse Ditto.</p> |
| |
| <h2 id="steps-in-hono">Steps in Hono</h2> |
| |
| <p>The steps in order to get started with Eclipse Hono are documented in the |
| <a href="https://www.eclipse.org/hono/getting-started/">Hono getting started</a> and in a new |
| <a href="https://blog.bosch-si.com/developer/using-multi-tenancy-in-eclipse-hono/">Blog post about using multi-tenancy in Eclipse Hono</a>. |
| We show them very briefly here as well but in order to comprehend what and why we are doing what we do please consult |
| the Hono documentation.</p> |
| |
| <h3 id="create-a-tenant">Create a tenant</h3> |
| |
| <p>First of all, create a new Hono tenant (we chose the tenant name <code class="highlighter-rouge">org.eclipse.ditto</code>):</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{"tenant-id": "org.eclipse.ditto"}'</span> http://hono.eclipse.org:28080/tenant |
| </code></pre></div></div> |
| |
| <h3 id="register-a-device">Register a device</h3> |
| |
| <p>Register a new device in Hono (we chose the device-id <code class="highlighter-rouge">demo-device</code>):</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{"device-id": "demo-device"}'</span> http://hono.eclipse.org:28080/registration/org.eclipse.ditto |
| </code></pre></div></div> |
| |
| <h3 id="add-a-device-credential">Add a device credential</h3> |
| |
| <p>In order for the device being able to send telemetry it needs to authenticate. For that we will need to add a credential |
| for that device in Hono.</p> |
| |
| <p>We choose the <code class="highlighter-rouge">hashed-password</code> type:</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ PWD_HASH</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nt">-n</span> <span class="s1">'demo-device-password'</span> | openssl dgst <span class="nt">-binary</span> <span class="nt">-sha512</span> | base64 <span class="nt">-w</span> 0<span class="k">)</span> |
| <span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{ |
| "device-id": "demo-device", |
| "type": "hashed-password", |
| "auth-id": "demo-device-auth", |
| "secrets": [{ |
| "hash-function" : "sha-512", |
| "pwd-hash": "'</span><span class="nv">$PWD_HASH</span><span class="s1">'" |
| }] |
| }'</span> http://hono.eclipse.org:28080/credentials/org.eclipse.ditto |
| </code></pre></div></div> |
| |
| <h3 id="publish-data">Publish data</h3> |
| |
| <p>You are now able to publish <code class="highlighter-rouge">telemetry</code> (or also <code class="highlighter-rouge">event</code>) data via the Hono HTTP adapter:</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-u</span> demo-device-auth@org.eclipse.ditto:demo-device-password <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{"temp": 23.07}'</span> http://hono.eclipse.org:8080/telemetry |
| <span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-u</span> demo-device-auth@org.eclipse.ditto:demo-device-password <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{"hum": 45.85}'</span> http://hono.eclipse.org:8080/telemetry |
| </code></pre></div></div> |
| |
| <p>However as there is not yet a <code class="highlighter-rouge">consumer</code> listening for the messages, the Hono HTTP adapter will for example return an |
| error code <code class="highlighter-rouge">503 - Service unavailable</code> when publishing a <code class="highlighter-rouge">telemetry</code> message.</p> |
| |
| <p>Alternatively you can also publish telemetry data via MQTT:</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>mosquitto_pub <span class="nt">-u</span> <span class="s1">'demo-device-auth@org.eclipse.ditto'</span> <span class="nt">-P</span> demo-device-password <span class="nt">-t</span> telemetry <span class="nt">-m</span> <span class="s1">'{"temp": 23.07}'</span> |
| <span class="nv">$ </span>mosquitto_pub <span class="nt">-u</span> <span class="s1">'demo-device-auth@org.eclipse.ditto'</span> <span class="nt">-P</span> demo-device-password <span class="nt">-t</span> telemetry <span class="nt">-m</span> <span class="s1">'{"hum": 45.85}'</span> |
| </code></pre></div></div> |
| |
| <p>In the following steps we will register the missing <code class="highlighter-rouge">consumer</code> in Ditto by creating a connection to the Hono tenant |
| in Ditto’s connectivity.</p> |
| |
| <h2 id="steps-in-ditto">Steps in Ditto</h2> |
| |
| <p>We want to create a digital twin of the device connected to Eclipse Hono in order to access its latest reported state |
| via the Ditto <a href="httpapi-overview.html">HTTP API</a>, in order to be able to find it in a population of digital twins or |
| in order to be notified about changed via an API optimized for the web.</p> |
| |
| <h3 id="create-a-digital-twin">Create a digital twin</h3> |
| |
| <p>The first step is to create a skeleton for the digital twin by creating a Ditto <code class="highlighter-rouge">Thing</code>.<br /> |
| Notice that we authenticate with the sandbox user <code class="highlighter-rouge">demo5</code> - a default <a href="basic-policy.html">Policy</a> is implicitly |
| created so that only that user may read+write the created <code class="highlighter-rouge">Thing</code>.</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-X</span> PUT <span class="nt">-i</span> <span class="nt">-u</span> demo5:demo <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{ |
| "attributes": { |
| "location": "Germany" |
| }, |
| "features": { |
| "temperature": { |
| "properties": { |
| "value": null |
| } |
| }, |
| "humidity": { |
| "properties": { |
| "value": null |
| } |
| } |
| } |
| }'</span> https://ditto.eclipseprojects.io/api/2/things/org.eclipse.ditto:demo-device |
| </code></pre></div></div> |
| |
| <p>Make sure the digital twin was created:</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-i</span> <span class="nt">-u</span> demo5:demo https://ditto.eclipseprojects.io/api/2/things/org.eclipse.ditto:demo-device |
| </code></pre></div></div> |
| |
| <h3 id="create-a-connection-to-hono">Create a connection to Hono</h3> |
| |
| <p>Ditto recently added support for <a href="connectivity-manage-connections.html">managing connections</a> to foreign endpoints |
| (currently to AMQP 1.0 or to AMQP 0.9.1). As Hono provides an AMQP 1.0 endpoint, a connection can be added in Ditto |
| which connects to Hono and acts as a “northbound” <code class="highlighter-rouge">consumer</code>.</p> |
| |
| <p>The following configuration for the connection has to be applied:</p> |
| |
| <ul> |
| <li>AMQP 1.0 hostname: <code class="highlighter-rouge">hono.eclipse.org</code></li> |
| <li>AMQP 1.0 port: <code class="highlighter-rouge">15672</code></li> |
| <li>username: <code class="highlighter-rouge">consumer@HONO</code></li> |
| <li>password: <code class="highlighter-rouge">verysecret</code></li> |
| <li>sources: |
| <ul> |
| <li><code class="highlighter-rouge">telemetry/org.eclipse.ditto</code></li> |
| <li><code class="highlighter-rouge">event/org.eclipse.ditto</code></li> |
| </ul> |
| </li> |
| </ul> |
| |
| <h4 id="test-the-connection">Test the connection</h4> |
| |
| <p>Send the following “test connection” command via HTTP in order to test if the Ditto sandbox can connect to the Hono one.</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-u</span> devops:devopsPw1! <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{ |
| "targetActorSelection": "/system/sharding/connection", |
| "headers": { |
| "aggregate": false |
| }, |
| "piggybackCommand": { |
| "type": "connectivity.commands:testConnection", |
| "connection": { |
| "id": "hono-sandbox-connection-1", |
| "connectionType": "amqp-10", |
| "connectionStatus": "open", |
| "uri": "amqp://consumer%40HONO:verysecret@hono.eclipse.org:15672", |
| "failoverEnabled": true, |
| "sources": [{ |
| "addresses": [ |
| "telemetry/org.eclipse.ditto", |
| "event/org.eclipse.ditto" |
| ], |
| "authorizationContext": ["nginx:demo5"] |
| }] |
| } |
| } |
| }'</span> https://ditto.eclipseprojects.io/devops/piggyback/connectivity?timeout<span class="o">=</span>8s |
| </code></pre></div></div> |
| |
| <p>The result should be:</p> |
| |
| <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w"> |
| </span><span class="s2">"?"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"-1"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"connectivity.responses:testConnection"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"status"</span><span class="p">:</span><span class="w"> </span><span class="mi">200</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"connectionId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hono-sandbox-connection-1"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"testResult"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ditto-cluster=Success(successfully connected + initialized mapper)"</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span></code></pre></div></div> |
| |
| <p>Great, it looks like with the provided credentials we can connect to the Hono sandbox.</p> |
| |
| <h4 id="define-a-payload-mapping">Define a payload mapping</h4> |
| |
| <p>In the <a href="#scenario">scenario</a> we described the payloads our device sends via MQTT. As those JSON payloads are missing |
| some information required for Ditto to map it to a <a href="protocol-overview.html">Ditto Protocol</a> message Ditto uses for |
| updating the digital twin, we have to configure a <a href="connectivity-mapping.html">payload mapping</a> in order to add the |
| missing information.</p> |
| |
| <p>Whenever one of the 3 following messages arrives at Ditto’s <code class="highlighter-rouge">consumer</code>, a payload mapping should be performed:</p> |
| |
| <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w"> |
| </span><span class="s2">"temp"</span><span class="p">:</span><span class="w"> </span><span class="mf">23.42</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"hum"</span><span class="p">:</span><span class="w"> </span><span class="mf">44.42</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span></code></pre></div></div> |
| |
| <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w"> |
| </span><span class="s2">"temp"</span><span class="p">:</span><span class="w"> </span><span class="mf">23.42</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span></code></pre></div></div> |
| |
| <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w"> |
| </span><span class="s2">"hum"</span><span class="p">:</span><span class="w"> </span><span class="mf">44.42</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span></code></pre></div></div> |
| |
| <p>A JavaScript based mapping which exactly does this could look like this:</p> |
| |
| <div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">mapToDittoProtocolMsg</span><span class="p">(</span> |
| <span class="nx">headers</span><span class="p">,</span> |
| <span class="nx">textPayload</span><span class="p">,</span> |
| <span class="nx">bytePayload</span><span class="p">,</span> |
| <span class="nx">contentType</span> |
| <span class="p">)</span> <span class="p">{</span> |
| |
| <span class="k">if</span> <span class="p">(</span><span class="nx">contentType</span> <span class="o">!==</span> <span class="s2">"application/json"</span><span class="p">)</span> <span class="p">{</span> |
| <span class="k">return</span> <span class="kc">null</span><span class="p">;</span> <span class="c1">// only handle messages with content-type application/json</span> |
| <span class="p">}</span> |
| |
| <span class="kd">var</span> <span class="nx">jsonData</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">textPayload</span><span class="p">);</span> |
| <span class="kd">var</span> <span class="nx">temperature</span> <span class="o">=</span> <span class="nx">jsonData</span><span class="p">.</span><span class="nx">temp</span><span class="p">;</span> |
| <span class="kd">var</span> <span class="nx">humidity</span> <span class="o">=</span> <span class="nx">jsonData</span><span class="p">.</span><span class="nx">hum</span><span class="p">;</span> |
| |
| <span class="kd">var</span> <span class="nx">path</span><span class="p">;</span> |
| <span class="kd">var</span> <span class="nx">value</span><span class="p">;</span> |
| <span class="k">if</span> <span class="p">(</span><span class="nx">temperature</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&&</span> <span class="nx">humidity</span> <span class="o">!=</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span> |
| <span class="nx">path</span> <span class="o">=</span> <span class="s2">"/features"</span><span class="p">;</span> |
| <span class="nx">value</span> <span class="o">=</span> <span class="p">{</span> |
| <span class="na">temperature</span><span class="p">:</span> <span class="p">{</span> |
| <span class="na">properties</span><span class="p">:</span> <span class="p">{</span> |
| <span class="na">value</span><span class="p">:</span> <span class="nx">temperature</span> |
| <span class="p">}</span> |
| <span class="p">},</span> |
| <span class="na">humidity</span><span class="p">:</span> <span class="p">{</span> |
| <span class="na">properties</span><span class="p">:</span> <span class="p">{</span> |
| <span class="na">value</span><span class="p">:</span> <span class="nx">humidity</span> |
| <span class="p">}</span> |
| <span class="p">}</span> |
| <span class="p">};</span> |
| <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">temperature</span> <span class="o">!=</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span> |
| <span class="nx">path</span> <span class="o">=</span> <span class="s2">"/features/temperature/properties/value"</span><span class="p">;</span> |
| <span class="nx">value</span> <span class="o">=</span> <span class="nx">temperature</span><span class="p">;</span> |
| <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">humidity</span> <span class="o">!=</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span> |
| <span class="nx">path</span> <span class="o">=</span> <span class="s2">"/features/humidity/properties/value"</span><span class="p">;</span> |
| <span class="nx">value</span> <span class="o">=</span> <span class="nx">humidity</span><span class="p">;</span> |
| <span class="p">}</span> |
| |
| <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">path</span> <span class="o">||</span> <span class="o">!</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span> |
| <span class="k">return</span> <span class="kc">null</span><span class="p">;</span> |
| <span class="p">}</span> |
| |
| <span class="k">return</span> <span class="nx">Ditto</span><span class="p">.</span><span class="nx">buildDittoProtocolMsg</span><span class="p">(</span> |
| <span class="s2">"org.eclipse.ditto"</span><span class="p">,</span> <span class="c1">// the namespace we use</span> |
| <span class="nx">headers</span><span class="p">[</span><span class="s2">"device_id"</span><span class="p">],</span> <span class="c1">// Hono sets the authenticated device-id in this header</span> |
| <span class="s2">"things"</span><span class="p">,</span> <span class="c1">// it is a Thing entity we want to update</span> |
| <span class="s2">"twin"</span><span class="p">,</span> <span class="c1">// we want to update the twin</span> |
| <span class="s2">"commands"</span><span class="p">,</span> |
| <span class="s2">"modify"</span><span class="p">,</span> <span class="c1">// command = modify</span> |
| <span class="nx">path</span><span class="p">,</span> |
| <span class="nx">headers</span><span class="p">,</span> <span class="c1">// copy all headers as Ditto headers</span> |
| <span class="nx">value</span> |
| <span class="p">);</span> |
| <span class="p">}</span> |
| </code></pre></div></div> |
| |
| <p>In order to add this script to the connection we want to create, the newlines have to be replaced by <code class="highlighter-rouge">\n</code> so that |
| the script fits in a single line JSON string and the <code class="highlighter-rouge">"</code> characters have to be replaced with <code class="highlighter-rouge">\"</code>:</p> |
| |
| <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"function mapToDittoProtocolMsg(</span><span class="se">\n</span><span class="s2"> headers,</span><span class="se">\n</span><span class="s2"> textPayload,</span><span class="se">\n</span><span class="s2"> bytePayload,</span><span class="se">\n</span><span class="s2"> contentType</span><span class="se">\n</span><span class="s2">) {</span><span class="se">\n\n</span><span class="s2"> if (contentType !== </span><span class="se">\"</span><span class="s2">application/json</span><span class="se">\"</span><span class="s2">) {</span><span class="se">\n</span><span class="s2"> return null;</span><span class="se">\n</span><span class="s2"> }</span><span class="se">\n\n</span><span class="s2"> var jsonData = JSON.parse(textPayload);</span><span class="se">\n</span><span class="s2"> var temperature = jsonData.temp;</span><span class="se">\n</span><span class="s2"> var humidity = jsonData.hum;</span><span class="se">\n</span><span class="s2"> </span><span class="se">\n</span><span class="s2"> var path;</span><span class="se">\n</span><span class="s2"> var value;</span><span class="se">\n</span><span class="s2"> if (temperature != null && humidity != null) {</span><span class="se">\n</span><span class="s2"> path = </span><span class="se">\"</span><span class="s2">/features</span><span class="se">\"</span><span class="s2">;</span><span class="se">\n</span><span class="s2"> value = {</span><span class="se">\n</span><span class="s2"> temperature: {</span><span class="se">\n</span><span class="s2"> properties: {</span><span class="se">\n</span><span class="s2"> value: temperature</span><span class="se">\n</span><span class="s2"> }</span><span class="se">\n</span><span class="s2"> },</span><span class="se">\n</span><span class="s2"> humidity: {</span><span class="se">\n</span><span class="s2"> properties: {</span><span class="se">\n</span><span class="s2"> value: humidity</span><span class="se">\n</span><span class="s2"> }</span><span class="se">\n</span><span class="s2"> }</span><span class="se">\n</span><span class="s2"> };</span><span class="se">\n</span><span class="s2"> } else if (temperature != null) {</span><span class="se">\n</span><span class="s2"> path = </span><span class="se">\"</span><span class="s2">/features/temperature/properties/value</span><span class="se">\"</span><span class="s2">;</span><span class="se">\n</span><span class="s2"> value = temperature;</span><span class="se">\n</span><span class="s2"> } else if (humidity != null) {</span><span class="se">\n</span><span class="s2"> path = </span><span class="se">\"</span><span class="s2">/features/humidity/properties/value</span><span class="se">\"</span><span class="s2">;</span><span class="se">\n</span><span class="s2"> value = humidity;</span><span class="se">\n</span><span class="s2"> }</span><span class="se">\n</span><span class="s2"> </span><span class="se">\n</span><span class="s2"> if (!path || !value) {</span><span class="se">\n</span><span class="s2"> return null;</span><span class="se">\n</span><span class="s2"> }</span><span class="se">\n\n</span><span class="s2"> return Ditto.buildDittoProtocolMsg(</span><span class="se">\n</span><span class="s2"> </span><span class="se">\"</span><span class="s2">org.eclipse.ditto</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2"> headers[</span><span class="se">\"</span><span class="s2">device_id</span><span class="se">\"</span><span class="s2">],</span><span class="se">\n</span><span class="s2"> </span><span class="se">\"</span><span class="s2">things</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2"> </span><span class="se">\"</span><span class="s2">twin</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2"> </span><span class="se">\"</span><span class="s2">commands</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2"> </span><span class="se">\"</span><span class="s2">modify</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2"> path,</span><span class="se">\n</span><span class="s2"> headers,</span><span class="se">\n</span><span class="s2"> value</span><span class="se">\n</span><span class="s2"> );</span><span class="se">\n</span><span class="s2">}"</span><span class="w"> |
| </span></code></pre></div></div> |
| |
| <h4 id="create-the-connection">Create the connection</h4> |
| |
| <p>We use the payload of the previous “test connection” command and add the JavaScript mapping script from above in order |
| to specify the “create connection” command, which we will use to create the connection between Eclipse Hono and Ditto:</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-u</span> devops:devopsPw1! <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{ |
| "targetActorSelection": "/system/sharding/connection", |
| "headers": { |
| "aggregate": false |
| }, |
| "piggybackCommand": { |
| "type": "connectivity.commands:createConnection", |
| "connection": { |
| "id": "hono-sandbox-connection-1", |
| "connectionType": "amqp-10", |
| "connectionStatus": "open", |
| "uri": "amqp://consumer%40HONO:verysecret@hono.eclipse.org:15672", |
| "failoverEnabled": true, |
| "sources": [{ |
| "addresses": [ |
| "telemetry/org.eclipse.ditto", |
| "event/org.eclipse.ditto" |
| ], |
| "authorizationContext": ["nginx:demo5"] |
| }], |
| "mappingContext": { |
| "mappingEngine": "JavaScript", |
| "options": { |
| "incomingScript": "function mapToDittoProtocolMsg(\n headers,\n textPayload,\n bytePayload,\n contentType\n) {\n\n if (contentType !== \"application/json\") {\n return null;\n }\n\n var jsonData = JSON.parse(textPayload);\n var temperature = jsonData.temp;\n var humidity = jsonData.hum;\n \n var path;\n var value;\n if (temperature != null && humidity != null) {\n path = \"/features\";\n value = {\n temperature: {\n properties: {\n value: temperature\n }\n },\n humidity: {\n properties: {\n value: humidity\n }\n }\n };\n } else if (temperature != null) {\n path = \"/features/temperature/properties/value\";\n value = temperature;\n } else if (humidity != null) {\n path = \"/features/humidity/properties/value\";\n value = humidity;\n }\n \n if (!path || !value) {\n return null;\n }\n\n return Ditto.buildDittoProtocolMsg(\n \"org.eclipse.ditto\",\n headers[\"device_id\"],\n \"things\",\n \"twin\",\n \"commands\",\n \"modify\",\n path,\n headers,\n value\n );\n}" |
| } |
| } |
| } |
| } |
| }'</span> https://ditto.eclipseprojects.io/devops/piggyback/connectivity?timeout<span class="o">=</span>8s |
| </code></pre></div></div> |
| |
| <p>When establishing the connection + parsing the JavaScript worked, we get a success result as HTTP response again, |
| otherwise an error message would be returned.</p> |
| |
| <h4 id="retrieve-connection-metrics">Retrieve connection metrics</h4> |
| |
| <p>After the connection was created, we can use the following command in order to retrieve the current connection status |
| and some metrics about how many messages were consumed:</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-u</span> devops:devopsPw1! <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{ |
| "targetActorSelection": "/system/sharding/connection", |
| "headers": { |
| "aggregate": false |
| }, |
| "piggybackCommand": { |
| "type": "connectivity.commands:retrieveConnectionMetrics", |
| "connectionId": "hono-sandbox-connection-1" |
| } |
| }'</span> https://ditto.eclipseprojects.io/devops/piggyback/connectivity?timeout<span class="o">=</span>8s |
| </code></pre></div></div> |
| |
| <p>The result looks like this:</p> |
| |
| <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w"> |
| </span><span class="s2">"?"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"?"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"connectivity.responses:retrieveConnectionMetrics"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"status"</span><span class="p">:</span><span class="w"> </span><span class="mi">200</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"connectionId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hono-sandbox-connection-1"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"containsFailures"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"connectionMetrics"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"inbound"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"consumed"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2019-02-06T09:37:28.416Z"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"mapped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2019-02-06T09:37:28.422Z"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"dropped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"enforced"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2019-02-06T09:37:28.422Z"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"outbound"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"dispatched"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2019-02-06T09:37:28.439Z"</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"filtered"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"mapped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2019-02-06T09:37:28.443Z"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"dropped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"published"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"sourceMetrics"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"addressMetrics"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"event/org.eclipse.ditto"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"consumed"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"mapped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"dropped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"enforced"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"telemetry/org.eclipse.ditto"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"consumed"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2019-02-06T09:37:28.416Z"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"mapped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2019-02-06T09:37:28.422Z"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"dropped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"enforced"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2019-02-06T09:37:28.422Z"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"targetMetrics"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"addressMetrics"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"_responses"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"dispatched"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2019-02-06T09:37:28.439Z"</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"filtered"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"mapped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2019-02-06T09:37:28.443Z"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"dropped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"published"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"success"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"failure"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"PT1M"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT1H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"PT24H"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"lastMessageAt"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span></code></pre></div></div> |
| |
| <h2 id="test-the-integration">Test the integration</h2> |
| |
| <p>Whenever the device now sends telemetry in its own JSON format</p> |
| |
| <ul> |
| <li>the message count of the <a href="#retrieve-connection-metrics">connection metrics in Ditto</a> should be increased by one</li> |
| <li>the digital twin with the <code class="highlighter-rouge">Thing</code> ID <code class="highlighter-rouge">org.eclipse.ditto:demo-device</code> should receive the updated value which is also |
| reflected at the twin’s HTTP endpoint |
| <a href="https://demo5:demo@ditto.eclipseprojects.io/api/2/things/org.eclipse.ditto:demo-device">https://ditto.eclipseprojects.io/api/2/things/org.eclipse.ditto:demo-device</a></li> |
| </ul> |
| |
| <p>Verify that by simulate sending telemetry using the Hono HTTP adapter:</p> |
| |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-u</span> demo-device-auth@org.eclipse.ditto:demo-device-password <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{"temp": 14.51}'</span> http://hono.eclipse.org:8080/telemetry |
| <span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-u</span> demo-device-auth@org.eclipse.ditto:demo-device-password <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{"hum": 52.17}'</span> http://hono.eclipse.org:8080/telemetry |
| |
| <span class="nv">$ </span>curl <span class="nt">-X</span> POST <span class="nt">-i</span> <span class="nt">-u</span> demo-device-auth@org.eclipse.ditto:demo-device-password <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="nt">-d</span> <span class="s1">'{"temp": 23.07, "hum": 45.85}'</span> http://hono.eclipse.org:8080/telemetry |
| </code></pre></div></div> |
| |
| <p><br /> |
| <br /></p> |
| |
| <p>Try it out for yourself and give us (the Ditto and the Hono teams) feedback what you like or what could be improved.</p> |
| |
| <p><br /> |
| <br /></p> |
| <figure><img class="docimage" src="images/ditto.svg" alt="Ditto" style="max-width: 500px" /></figure> |
| |
| <p>–<br /> |
| The Eclipse Ditto team</p> |
| |
| </div> |
| |
| |
| |
| </article> |
| |
| <hr class="shaded"/> |
| |
| <footer> |
| <div class="row"> |
| <div class="col-lg-12 footer"> |
| <div class="logo"> |
| <a href="https://eclipse.org"><img src="images/eclipse_foundation_logo.svg" alt="Eclipse logo"/></a> |
| </div> |
| <p class="notice"> |
| ©2021 Eclipse Ditto. |
| Site last generated: Apr 6, 2021 <br /> |
| </p> |
| <div class="quickLinks"> |
| <a href="https://www.eclipse.org/legal/privacy.php" target="_blank"> |
| > Privacy Policy |
| </a> |
| <a href="https://www.eclipse.org/legal/termsofuse.php" target="_blank"> |
| > Terms of Use |
| </a> |
| <a href="https://www.eclipse.org/legal/copyright.php" target="_blank"> |
| > Copyright Agent |
| </a> |
| <a href="https://www.eclipse.org/legal" target="_blank"> |
| > Legal |
| </a> |
| <a href="https://www.eclipse.org/legal/epl-2.0/" target="_blank"> |
| > License |
| </a> |
| <a href="https://eclipse.org/security" target="_blank"> |
| > Report a Vulnerability |
| </a> |
| </div> |
| </div> |
| </div> |
| </footer> |
| |
| |
| </div> |
| <!-- /.row --> |
| </div> |
| <!-- /.container --> |
| </div> |
| <!-- /#main --> |
| </div> |
| |
| </body> |
| </html> |