Konkretan primjer

Ovdje će biti razmotren jedan jednostavan konkretan primjer: pametna lampa. Lampa se može uključivati/isključivati te se može zadavati jačina svjetlosti preko WiFi-a.

Tvornička konfiguracija

Sadržaj datoteke factory_device.json
{
    "name": "SmartLight",
    "vendorId": "ETF",
    "model": "LX34-U6M",
    "functions": [
        [
            { "name": "turnOn", "friendly": "Turn On", "if": "getState=Off" },
            { "name": "turnOff", "friendly": "Turn Off", "if": "getState=On" }
        ],
        {
            "name": "setBrightness", "friendly": "Set Brightness",
            "valueType": "float", "valueRange": [ 0.0, 100.0 ], "unit": "%"
        }
    ],
    "data": [
        {
            "name": "getBrightness", "friendly": "Brightness",
            "valueType": "float", "unit": "%"
        },
        {
            "name": "getState", "friendly": "State",
            "valueType": "StateOnOff", "valueRange": [ "On", "Off" ]
        }
    ]
}

Korisnička konfiguracija

Sadržaj datoteke user_device.json
{
    "serialNo": "xyz",
    "location": "livingroom",
    "ip": "192.168.0.100",
    "subnetMask": "255.255.255.0",
    "defaultGateway": "192.168.0.1",
    "brokerHost": "broker.emqx.io"
}

Identifikacijski parametri su proizvoljno odabrani.

Podaci iz uređaja (niz data)

ON/OFF stanje lampe

{
    "name": "getState", "friendly": "State",
    "valueType": "StateOnOff", "valueRange": [ "On", "Off" ]
}

Stanje koje određuje da li je lampa uključena ili isključena.

Napomena

U klasi Device u datoteci iot_device.h će biti generisan enum tip sa nazivom StateOnOff.

Jačina svjetlosti

{
    "name": "getBrightness", "friendly": "Brightness",
    "valueType": "float", "unit": "%"
},

Funkcije uređaja (niz functions)

Upali/ugasi

[
    { "name": "turnOn", "friendly": "Turn On", "if": "getState=Off" },
    { "name": "turnOff", "friendly": "Turn Off", "if": "getState=On" }
],

Ovo je jedna funkcija koja se sastoji od dvije podfunkcije turnOn i turnOff. Korisniku se ove podfunkcije prikazuju pod nazivima Turn On i Turn Off respektivno.

Pri tome, nisu obje funkcije omogućene istovremeno. Nema smisla paliti sijalicu ako je već upaljena ili gasiti sijalicu ako je već ugašena. Atribut if određuje kada je koja podfunkcija omogućena. U ovom slučaju podfunkcija turnOn je omogućena ako je sijalica u isključenom stanju, tj. kada je vrijednost getState jednaka Off. U suprotnom je omogućena funkcija turnOff.

Napomena

Za ove funkcije će biti generisane metode turnOn i turnOff bez parametara u sklopu klase Device u datoteci iot_device.h. Nalog za izvršavanje ove funkcije se zadaje preko topic-a hodnik/LG-0001/turnOn, odnosno hodnik/LG-0001/turnOff.

Postavi jačinu svjetlosti

{
    "name": "setBrightness", "friendly": "Set Brightness",
    "valueType": "float", "valueRange": [ 0.0, 100.0 ], "unit": "%"
}

Vrijednost trenutne jačine svjetlosti.

Napomena

Klasa Device u generisanoj datoteci iot_device.h će sadržavati metodu getBrightness koja vraća vrijednost tipa float.

Popis korištenih MQTT poruka

Naziv

Publisher

Tema

Payload

requestConnection

Sistem

hodnik/_/requestConnection

LX34-U6M, LG-0001

approveConnection

Sistem

hodnik/LG-0001/approveConnection

getBrightness

Sistem

hodnik/LG-0001/getBrightness

Uređaj

hodnik/LG-0001/getBrightness/response

[0.0,100.0]

getState

Sistem

hodnik/LG-0001/getState

Uređaj

hodnik/LG-0001/getState/response

On ili Off

turnOn

Sistem

hodnik/LG-0001/turnOn

turnOff

Sistem

hodnik/LG-0001/turnOff

setBrightness

Sistem

hodnik/LG-0001/setBrightness

[0.0,100.0]

Generisane C++ datoteke

Datoteka main.cpp

Ova datoteka je potpuno automatski generisana, i u većini slučajeve neće biti potrebno praviti ikakve izmjene.

#include <mbed.h>

#include "iot_device.h"
#include "autogen/user_device.h"
#include "autogen/mqtt_wrapper.h"

int main(void)
{
    ethernetConnect(IP_ADDR, SUBNET_MASK, DEFAULT_GW);
    mqttConnect(BROKER_HOST);
    mqttAutoSubscribe();
    Device::initialize();
    while (true) mqttYield(100);
    return 0;
}

Datoteka iot_device.h

#ifndef IOT_DEVICE_H
#define IOT_DEVICE_H

// Enums
typedef enum {
    On, Off
} StateOnOff;

namespace Device
{

    // Basic device information
    inline const char *getName() { return "SmartLight"; }
    inline const char *getVendorId() { return "ETF"; }
    inline const char *getModel() { return "LX34-U6M"; }

    // Device functions
    void turnOn();
    void turnOff();
    void setBrightness(float value);
    
    // Device data
    float getBrightness();
    StateOnOff getState();
    
    void initialize();
};

#endif // IOT_DEVICE_H

Datoteka iot_device.cpp

Ova datoteka je automatski generisana na osnovu JSON datoteka i ima sljedeći izgled:

#include "iot_device.h"
#include <mbed.h>

// Device functions

void Device::turnOn()
{
    // TODO
}

void Device::turnOff()
{
    // TODO
}

void Device::setBrightness(float value)
{
    // TODO
}

// Device data

float Device::getBrightness()
{
    // TODO
}

StateOnOff Device::getState()
{
    // TODO
}

void Device::initialize()
{
    // TODO
}

Implementirana datoteka bi mogla izgledati na primjer ovako:

#include "iot_device.h"
#include <mbed.h>

PwmOut led(D6);
float brightness = 0.5f;
StateOnOff state = Off;

// Device functions

void Device::turnOn()
{
    state = On;
    led.write(brightness);
}

void Device::turnOff()
{
    state = Off;
    led.write(0);
}

void Device::setBrightness(float value)
{
    brightness = value;
    led.write(value);
}

// Device data

float Device::getBrightness()
{
    return brightness;
}

StateOnOff Device::getState()
{
    return state;
}

void Device::initialize()
{
    led.period(0.01f);
    turnOn();
}

Programski kod se sada može kompajlirati i poslati na uređaj, bez ikakve dodatne konfiguracije.