GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
がじぇるね岡宮です。
GR-ROSEでIBM Watson IoTと接続するサンプルです。Arduino用のチュートリアルではArduinoJSON Version 5が使われているサンプルが見つかるのですが、GR-ROSEではVersion 6を標準ライブラリに入れているため、そのサンプルを掲載します。
WiFi用のssid, passwordのほか、Watson IoT用のORG, DEVICE_TYPE、DEVICE_IDE、TOKENは適宜変更してください。ちなみに、リブートのところはコメントアウトしているため、機能していません。
#include <Arduino.h>#include "WiFiEsp.h"#include <PubSubClient.h>#include <ArduinoJson.h>//-------- Customise these values -----------const char *ssid = "xxxxxxxx";const char *password = "oooooooo";int status = WL_IDLE_STATUS; // the Wifi radio's status#define ORG "xxxxx"#define DEVICE_TYPE "xxxxx"#define DEVICE_ID "xxxxx"#define TOKEN "xxxxxxxxxxxxx"//-------- Customise the above values --------char server[] = ORG ".messaging.internetofthings.ibmcloud.com";char authMethod[] = "use-token-auth";char token[] = TOKEN;char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;const char publishTopic[] = "iot-2/evt/status/fmt/json";const char responseTopic[] = "iotdm-1/response";const char manageTopic[] = "iotdevice-1/mgmt/manage";const char updateTopic[] = "iotdm-1/device/update";const char rebootTopic[] = "iotdm-1/mgmt/initiate/device/reboot";void callback(char *topic, byte *payload, unsigned int payloadLength);WiFiEspClient wifiClient;PubSubClient client(server, 1883, callback, wifiClient);int publishInterval = 2000; // 2 secondslong lastPublishMillis;void wifiConnect();void mqttConnect();void initManagedDevice();void publishData();void handleUpdate(byte *payload);void setup() { // initialize serial for debugging Serial.begin(115200); wifiConnect(); mqttConnect(); initManagedDevice();}void loop() { if (millis() - lastPublishMillis > publishInterval) { publishData(); lastPublishMillis = millis(); } if (!client.loop()) { mqttConnect(); initManagedDevice(); }}void wifiConnect() { // initialize serial for ESP module Serial6.begin(115200); // initialize ESP module WiFi.init(&Serial6); // check for the presence of the shield if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); // don't continue while (true) ; } // attempt to connect to WiFi network while (status != WL_CONNECTED) { Serial.print("Attempting to connect to WPA SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network status = WiFi.begin(ssid, password); } Serial.print("WiFi connected, IP address: "); Serial.println(WiFi.localIP());}void mqttConnect() { if (!client.connected()) { Serial.print("Reconnecting MQTT client to "); Serial.println(server); while (!client.connect(clientId, authMethod, token)) { Serial.print("."); delay(500); } }}void initManagedDevice() { if (client.subscribe("iotdm-1/response")) { Serial.println("subscribe to responses OK"); } else { Serial.println("subscribe to responses FAILED"); } if (client.subscribe(rebootTopic)) { Serial.println("subscribe to reboot OK"); } else { Serial.println("subscribe to reboot FAILED"); } if (client.subscribe("iotdm-1/device/update")) { Serial.println("subscribe to update OK"); } else { Serial.println("subscribe to update FAILED"); } StaticJsonDocument<300> jsonBuffer; JsonObject d = jsonBuffer.createNestedObject("d"); JsonObject metadata = d.createNestedObject("metadata"); metadata["publishInterval"] = publishInterval; JsonObject supports = d.createNestedObject("supports"); supports["deviceActions"] = true; char buff[300]; serializeJson(jsonBuffer, buff); Serial.println("publishing device metadata:"); Serial.println(buff); if (client.publish(manageTopic, buff)) { Serial.println("device Publish ok"); } else { Serial.print("device Publish failed:"); }}void publishData() { String payload = "{\"d\":{\"counter\":"; payload += millis(); payload += "}}"; Serial.print("Sending payload: "); Serial.println(payload); if (client.publish(publishTopic, (char *) payload.c_str())) { Serial.println("Publish OK"); } else { Serial.println("Publish FAILED"); }}void callback(char *topic, byte *payload, unsigned int payloadLength) { Serial.print("callback invoked for topic: "); Serial.println(topic); if (strcmp(responseTopic, topic) == 0) { return; // just print of response for now } if (strcmp(rebootTopic, topic) == 0) { Serial.println("Rebooting..."); // WiFi.restart(); } if (strcmp(updateTopic, topic) == 0) { handleUpdate(payload); }}void handleUpdate(byte *payload) { StaticJsonDocument<300> jsonBuffer; DeserializationError error = deserializeJson(jsonBuffer, payload); if (error) { Serial.println("handleUpdate: payload parse FAILED"); return; } Serial.println("handleUpdate payload:"); serializeJsonPretty(jsonBuffer, Serial); Serial.println(); JsonObject d = jsonBuffer["d"]; JsonArray fields = d["fields"]; for (JsonArray::iterator it = fields.begin(); it != fields.end(); ++it) { JsonObject field = *it; const char *fieldName = field["field"]; if (strcmp(fieldName, "metadata") == 0) { JsonObject fieldValue = field["value"]; if (fieldValue.containsKey("publishInterval")) { publishInterval = fieldValue["publishInterval"]; Serial.print("publishInterval:"); Serial.println(publishInterval); } } }}