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 |
|---|---|---|---|
|
Sistem |
|
LX34-U6M, LG-0001 |
|
Sistem |
|
|
|
Sistem |
|
|
Uređaj |
|
[0.0,100.0] |
|
|
Sistem |
|
|
Uređaj |
|
On ili Off |
|
|
Sistem |
|
|
|
Sistem |
|
|
|
Sistem |
|
[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.