Apríl 22, 2017

Ako pripojiť ESP8266 na Bluemix

Pripojiť zariadenie s ESP8266 pomocou MQTT na server ako Mosquitto, je relatívne jednoduché. Je potrebné pridať jednu závislosť do projektu (súbor platformio.ini):

[env:d1_mini]
lib_deps =
  PubSubClient

Kód pre pripojenie k serveru vyzerá nasledovne:

WiFiClient espClient;
PubSubClient mqttClient(espClient);

static void callback(char* topicChar, byte* payloadByte, unsigned int length) {
  String topic = topicChar;

  // Default size is defined in PubSubClient library and it's limited to 128
  // https://github.com/knolleary/pubsubclient
  char buf[MQTT_MAX_PACKET_SIZE];
  if (length >= MQTT_MAX_PACKET_SIZE) {
    length = MQTT_MAX_PACKET_SIZE - 1;
  }
  snprintf(buf, length + 1, "%s", payloadByte);

  String payload = String((char *)buf);
  Serial.print(payload);
}

void setup() {
  mqttClient.setServer("iot.georgik.rocks", 1883);
  mqttClient.setCallback(callback);
}

void reconnect() {
  if (mqttClient.connect("display")) {
    subscribeTopics()
  } else {
    Serial.println("Connection failed");
  }
}

Kód na prihlásenie odberu nejakej témy vyzerá nasledovne:

void subscribeTopics() {
  mqttClient.subscribe("some/topic/data");
}

Kód pre publikovanie témy vyzerá nasledovne:

mqttClient.publish("other/topic/data", "123");

Tento prístup funguje v bezpečnom prostredí, kde je možné pripojiť sa priamo na Mosquitto. Príklad implementácie môžete nájsť v projekte LampESP vo vetve v0.3 v súbore LampMQTT.ino.

V prípade, že sa presunieme do prostredia cloudu, tak je nutné zobrať do úvahy bezpečnostný model, ktorý sa v danom cloude nachádza. Napríklad Microsoft Azure IoT Hub nepodporuje priamu komunikáciu medzi zariadeniami. Podobné “obmedzenie” je platné aj pre IBM Bluemix. Je nutné zvoliť trochu odlišnú štruktúru tém pre odosielanie a príjem správ.

Akým spôsobom je teda možné pripojiť zariadenie do IBM Bluemix?

Najskôr je nutné vytvoriť si účet v IBM Bluemix. K dispozícii je 30 denná skúšobná verzia. Po 30 dňoch je možné naďalej využívať časť služieb cloudu, ale je nutné zadať číslo vašej kreditnej karty. K dispozícii je 370 GB-hodín, čo plne postačuje na beh virtuálneho počítaču s 512 MB po celý mesiac.

Následne je potrebné vytvoriť službu “Internet of Things Platform”. Táto služba je dostupná len v regióne US a Veľká Británia (United Kingdom). Región Nemecko (Germany) túto službu zatiaľ nepodporuje. Keď služba naštartuje, prejdite do Dashboard-u k službe.

Budete presmerovaní na URL ako: https://ORG-ID.internetofthings.ibmcloud.com/dashboard/#/boards/

Uvidíte IBM Watson IoT Platform Dashboard. Zvoľte Devices.

Kliknite na tlačítko “+ Add Device”. Následne zvoľte “Create device type”.

Kliknite na “Create device type”.

Nastavte meno napríklad na ESP8266 a pokračujte ďalej v registrovaní typu zariadenia.

Po zadefinovaní typu zariadenia ja možné pridať zariadenie. Kliknite na “+ Add device”. Vyberte type ESP8266 z rozbaľovacieho menu. A teraz pozor!

Tlačítko Next sa nachádza v pravom spodnom rohu obrazovky. Vyzerá to, že UX inžinieri nevenovali príliš pozornosť validácii UI rozhrania.

Vyplnte meno a popis zariadenia.

Metadata môžete preskočiť. Nastavenie Security nechajte nastavené na Auto-generated authentication token.

Kliknite na Add.

Zobrazí sa vám stránka s definíciou zariadenia. Najdôležitejšia je sekcia Authentication token.

Nastavenie cloud-u je týmto krokom hotové. Teraz je potrebné zaktualizovať kód. Malým chytákom je meno servera, kam sa má zariadenie pripojiť. Pokiaľ sa pozriete na Watson dashboard, tak by vás mohlo napadnúť, že hostname je možné použiť pre pripojenie k MQTT: ORG-ID.internetofthings.ibmcloud.com. To však nebude fungovať. Je nutné pridať ešte subdoménu “messaging”. Správne hostname je: ORG-ID.messaging.internetofthings.ibmcloud.com.

...
void setup() {
  mqttClient.setServer("ORG-ID.messaging.internetofthings.ibmcloud.com", 1883);
  mqttClient.setCallback(callback);
}
...

Ďalším dôležitým krokom je pridanie tokenu, ktorý bude použitý pri ustanovení spojenia s cloudom. Tento krok nie je úplne priamočiary. Budete potrebovať tri parametre zostaviť správnym spôsobom a zavolať metódu connect z PubSubClient:

  • id = “d:ORG-ID:ESP8266:DEVICE-NAME”
  • username = “user-token”
  • password = “TOKEN-FROM-DEVICE-PAGE”
void reconnect() {
  if (mqttClient.connect(id, username, password)) {
    subscribeTopics()

V prípade použitia cloud verzie MQTT je možné prihlásiť sa k odberu len špecifických tém. Téma musí byť definovaná v správnom formáte. V prípade odberu tému s príkazom (command), by mal byť tvar témy nasledovný: iot-2/cmd/COMMAND/fmt/json. Slovo COMMAND nahradíte reťazcom, na ktoré má zariadenie reagovať.

void subscribeTopics() {
  mqttClient.subscribe("iot-2/cmd/COMMAND/fmt/json");
}

Téma so stavom zariadenia môže byť publikovaná nasledovne:

mqttClient.publish("iot-2/evt/status/fmt/json", "{\"d\":{\"value\":\"online\"}}");

Po tejto zmene kódu je zariadenie pripravené na pripojenie do Bluemix cloud-u. Pokiaľ narazíte na problém, tak jednoducho otvorte detail zariadenia a detailné informácie nájdete v sekcii Connection log.

Zariadenie je potom možné jednoducho spojiť s Node-RED prípadne s iným nástrojom a komunikovať so zariadením. Implementáciu nájdete na Githube v LampESP v0.4 projekte.

Poďme si to zosumarizovať. V celom postupe sú tri chytáky:

  • MQTT musí byť pripojené na subdoménu: ORG-ID.messaging.internetofthings.ibmcloud.com
  • Odber a publikovanie tém je možné len pre témy, ktoré majú správny formát/li>
  • Auth informácie musia byť zostavené presne
    • Keď sa vám podarí prekonať tieto počiatočné problémy, tak ďalšia komunikácia s Bluemix-om a Node-RED je jednoduchá.