Azure IoT Hub

Internet of Things (IoT) je bezesporu velký buzzword dnešního IT. Na druhou stranu tento fenomén velmi vážně berou i společnosti jako je Amazon a Microsoft. Obě tyto společnosti v nedávné době oznámily podporu IoT ve svých cloud službách. Článek se bude věnovat podpoře IoT na Microsoft Azure, která byla oznámena dříve než na Amazon, takže jsem měl víc času se s ní naučit. Na AWS IoT se teprve chystám, ale je si to dost podobné, takže informace, které se dozvíte v tomto článku, jsou pro obě služby podobné.

Problémy dnešního IoT

Nebudu zde podrobně rozebírat všechny problematické aspekty IoT a zaměřím se na dva – bezpečnost a správa koncových zařízení. Tyto dvě věci spolu bezprostředně souvisí a Azure IoT Hub je řeší.

  1. Každé zařízení musí být jednoznačně identifikovatelné.
  2. Pokud dojde ke kompromitaci zařízení, tak mu musí být znemožněna komunikace, bez nutnosti zařízení fyzicky navštívit.
  3. Musím mít nástroj na správu velkého počtu zařízení.
  4. Komunikace se zařízením musí být zabezpečená.

Azure IoT Hub ve zkratce

Azure IoT Hub umí vlastně jen spravovat zařízení, přiřazovat jim bezpečnostní klíče, přijímat odeslané informace ze zařízení a odesílat zprávy do zařízení. Zpracování informací ze zařízení a případné odeslání zprávy do zařízení pak řeší navazující služby jako je Stream Analitics nebo vaše vlastní aplikace. Pro komunikaci se zařízením je použit standardizovaný protokol AMQP 1.0 (ISO/IEC 19464) a pro zabezpečení přenosové vrstvy TLS. TLS nelze vypnout, takže ne každé zařízení, třeba 8-bit Arduino, zvládne komunikovat přímo s Azure IoT Hub, kvůli omezeným systémovým zdrojům. Pokud tomu tak je, musí zařízení komunikovat přes výkonnějšího prostředníka. Zabezpečení komunikace a správa koncových zařízení je pak na vás. Pokud si budete chtít některé věci, které zde popisuji, vyzkoušet, tak zkuste využít Azure Free Trial nebo Dreamspark pro studenty.

Součástí Azure IoT Hub je také celá řada SDK pro koncová zařízení. Nejvíc mě zaujalo SDK v „čistém“ C, které je použitelné i na procesorech ARM Cortex M4. Vyzkoušel jsem to na desce FRDM K64 s platformou mbed.

image1

Ze zařízení do databáze

Na ukázku si vytvoříme „Hello World!“ aplikaci. Zařízení načte teplotu a ta se uloží do databáze. Jako databázi použijeme Table Storage, ale lze využít i DocumentDB nebo SQL Database. Protože se nechci starat o server, který by data přebíral z IoT HuB (na pozadí je Event Hubs) a ty pak ukládal do databáze, tak jako prostředníka použiji službu Stream Analysis.

Všechny služby je třeba vytvořit v jednom regionu.

Vytvoření Table Storage

image2

Z nastavení budeme potřebovat jméno a přístupový klíč. 

image3

Nastavení IoT Hub

Pro testování si můžete zvolit cenový plán, který je zdarma a je omezen na 10 zařízení a 3000 zpráv za den.

image4

Z IoT Hub budeme pro navazující služby potřebovat název, klíč „iothubowner“ a „service“.

image5

Propojení IoT Hub a Table Storage

K propojení můžete využít vlastní aplikaci, která bude čekat na zprávy z Event Hub, který je provázaný z IoT Hub. Z mého pohledu je lepší využít službu Stream Analytics, kterou si můžete představit jako prostředníka, který přijímá data z nějakého zdroje (Inputs), může je upravit (Query) a výsledek předá (Outputs) dál.

image6

Input

Při vytváření vstupu nastavíte jako zdroj IoT Hub a použijete klíč service.

image7

Output

Dále přidáme výstup. U výstupu použijete nastavení z Table Storage. Data jsou ze zařízení odeslána typicky ve formátu JSON. Table Storage potřebuje Partion Key a Row Key. Tyto hodnoty propojíte s informací, kterou odeslalo ze zařízení.

{
 deviceId: 'stepanb-rpi-01',
 time: new Date().getTime(),
 temperature: 24
}

image8

Query

Propojení Inputs a Outputs zajišťuje Query. Query si představte jako filtr, který vezme data z jednoho nebo několika vstupů a informaci zpracuje a může ji zapsat na jeden nebo několik výstupů. Pro vytvoření se používá jazyk, který je velmi podobný SQL. Data na vstupu je možné agregovat. My jen data ze vstupu zapíšeme na výstup, tak, jak jsou.

image9

Tím máme připravené nastavení pro zpracování dat ze zařízení. Nezapomeňte Stream Analytics nastartovat.

image10

Registrace zařízení

Každé zařízení je třeba zaregistrovat a vygenerovat pro něj unikátní klíč. Není doporučeno sdílet jeden klíč pro více zařízení. Pokud dojde ke kompromitaci jednoho zařízení, tak stačí zneplatnit jeden klíč a přijdeme jen o jedno zařízení. Registraci zařízení můžete udělat pomocí SDK nebo využít ukázkovou aplikaci pro správu zařízení.

image11

Konfigurace zařízení

Pro ukázku použijeme Raspberry Pi 2 a Azure IoT Hub SDK pro Node.js s poslední verzí Raspbian Jessie. Po aktualizaci instalace stačí nainstalovat Node.js a npm pomocí apt-get. SDK nainstalujeme pomocí npm.

Připojení teploměru

Jako teploměr jsem na ukázku použil DS18B20. Je to velmi jednoduše použitelný a přesný teploměr za rozumnou cenu. K zapojení je potřeba použít jeden pull-up rezistor o hodnotě 4,7 kΩ.

image12

Pokud zapojíte datový vodič na jiný pin než 7 (BCM 4), tak budete muset přidat parametr gpiopi=xx (používá se číslo BCM) pro modul jádra w1-gpio.

  1. Na konec /boot/config.txt přidejte řádek dtoverlay=w1-gpio
  2. Do souboru /etc/modules přidejte moduly w1-gpio a w1-therm
  3. Restartujte Rapsberry Pi

Informaci z teploměru najdete v adresáři /sys/bus/w1/devices/28-x v souboru w1_slave. Hodnotu t je třeba vydělit číslem 1000.

image13

Ukázka kódu

'use strict';
var fs = require('fs')

fs.readFile('/sys/bus/w1/devices/28-0014525043ff/w1_slave', 'utf8', function (err,data) {
    if (err) {
        return console.log(err);
    }
    // zpracovani teploty ze senzoru    
    var rows = data.split('\n');

    var crc = rows[0].slice(rows[0].lastIndexOf(' ') + 1);

    if (crc !== 'YES') {
        return;
    }

    var temperature = (rows[1].slice(rows[1].lastIndexOf('=') + 1)) / 1000;

    var device = require('azure-iot-device');

    // unikatni pro kazde zarizeni
    var connectionString = 'HostName=stepanb.azure-devices.net;DeviceId=stepanb-rpi-01;SharedAccessKey=xxxx';

    // vytvoreni klienta
    var client = new device.Client(connectionString, new device.Https());

    // priprava dat, musí odpovídat nastaveni pro Output ve Stream Analytics
    var data = JSON.stringify({ deviceId: 'stepanb-rpi-01', time: new Date().getTime(), temperature: temperature });
    // vytvoreni zpravy
    var message = new device.Message(data);
    // kontrolni vystup
    console.log("Odesilani zpravy: " + message.getData());
    // odeslani
    client.sendEvent(message, printResultFor('Odesilani '));
});

// funkce pro kontrolni vystup
function printResultFor(op) {
    return function printResult(err, res) {
        if (err) console.log(op + ' chyba: ' + err.toString());
        if (res && (res.statusCode !== 204)) console.log(op + ' status: ' + res.statusCode + ' ' + res.statusMessage);
    };
}

Po spuštění tohoto kódy by se měla hodnota objevit v TableStorage. Pro monitorování můžete také použít stejnou aplikaci jako pro vytvoření zařízení.

image14

Závěr

Neměl jsem ještě čas do detailů prozkoumat řešení od AWS, ale Azure IoT Hub je zatím to nejlepší, co jsem viděl z hlediska bezpečnosti, zprávy zařízení a jednoduchosti použití. V tuto chvíli bych zejména uvítal podporu pro Python. Dost by se usnadnilo programování aplikací pro Raspberry Pi. Většina knihoven pro komunikaci s hardware je přece jen v Pyhtonu.

Komentáře: 3

Přehled komentářů

Jakub D. Drobná chybička
Aleš Zajímavý téma
Michael
Zdroj: https://www.zdrojak.cz/?p=16265