From 6a542f4eada583caf74d351d95a0ef321b932583 Mon Sep 17 00:00:00 2001 From: vmasdani Date: Fri, 18 Jan 2019 15:42:11 +0700 Subject: [PATCH] Pretty json print, added parsing functionality --- .../AntaresMQTTPublish/AntaresMQTTPublish.ino | 43 +++++++++++++-- .../AntaresMQTTSubscribe.ino | 42 +++++++++++++-- keywords.txt | 10 ++++ src/AntaresESP8266MQTT.cpp | 54 +++++++++++++++++-- src/AntaresESP8266MQTT.h | 13 ++++- 5 files changed, 148 insertions(+), 14 deletions(-) diff --git a/examples/AntaresMQTTPublish/AntaresMQTTPublish.ino b/examples/AntaresMQTTPublish/AntaresMQTTPublish.ino index 355bfbc..92722f1 100644 --- a/examples/AntaresMQTTPublish/AntaresMQTTPublish.ino +++ b/examples/AntaresMQTTPublish/AntaresMQTTPublish.ino @@ -1,3 +1,19 @@ +/* + This is an example sketch to publish MQTT data to your + Antares IoT Platform project device via ESP8266. + + MQTT server & port: + platform.antares.id, port 1338 + + MQTT topic: + /oneM2M/req/your-access-key/antares-cse/json + + This sketch will deploy data to your Antares device + and publish to the MQTT topic simultaneously. + + For more information, please visit https://antares.id/id/docs.html +*/ + #include #define ACCESSKEY "your-access-key" @@ -15,14 +31,31 @@ void setup() { antares.wifiConnection(WIFISSID, PASSWORD); antares.setMqttServer(); } + void loop() { + /* + Check if we're still connected to the MQTT broker/server. + If disconnected, the device will try to reconnect. + */ antares.checkMqttConnection(); - antares.add("temperature", 30); - antares.add("humidity", 75); - antares.add("message", "Hello World!"); - antares.add("temperature", 45); - antares.printData(); + // Variable init + int temp = random(25,30) ; + int hum = random(75,90); + float windsp = float(random(20, 30))/3.33; + float rainlv = float(random(0, 20))/6.99; + String lat = "-6.8718189"; + String lon = "107.5872477"; + + // Add variable to data storage buffer + antares.add("temperature", temp); + antares.add("humidity", hum); + antares.add("wind_speed", windsp); + antares.add("rain_level", rainlv); + antares.add("latitude", lat); + antares.add("longitude", lon); + + // Publish and print data antares.publish(projectName, deviceName); delay(5000); } diff --git a/examples/AntaresMQTTSubscribe/AntaresMQTTSubscribe.ino b/examples/AntaresMQTTSubscribe/AntaresMQTTSubscribe.ino index 0505d7f..47efd18 100644 --- a/examples/AntaresMQTTSubscribe/AntaresMQTTSubscribe.ino +++ b/examples/AntaresMQTTSubscribe/AntaresMQTTSubscribe.ino @@ -1,3 +1,20 @@ +/* + This is an example sketch to subscribe to MQTT data on ESP8266 + via the Antares IoT Platform. + + MQTT server & port: + platform.antares.id, port 1338 + + MQTT topic: + /oneM2M/req/your-access-key/antares-cse/json + + The main function in this sketch is the callback function, + which will be fired every time a new message is published + to the topic. + + For more information, please visit https://antares.id/id/docs.html +*/ + #include #define ACCESSKEY "your-access-key" @@ -10,12 +27,23 @@ AntaresESP8266MQTT antares(ACCESSKEY); void callback(char topic[], byte payload[], unsigned int length) { - String topicString = String(topic); - String payloadString = antares.byteToString(payload, length); + /* + Get the whole received data, including the topic, + and parse the data according to the Antares data format. + */ + antares.get(topic, payload, length); - Serial.println("[ANTARES] New Mesage: "); - Serial.println(topicString); - Serial.println(payloadString); + Serial.println("New Message!"); + // Print topic and payload + Serial.println("Topic: " + antares.getTopic()); + Serial.println("Payload: " + antares.getPayload()); + // Print individual data + Serial.println("Temperature: " + String(antares.getInt("temperature"))); + Serial.println("Humidity: " + String(antares.getInt("humidity"))); + Serial.println("Wind speed: " + String(antares.getFloat("wind_speed"))); + Serial.println("Rain level: " + String(antares.getFloat("rain_level"))); + Serial.println("Latitude: " + antares.getString("latitude")); + Serial.println("Longitude: " + antares.getString("longitude")); } void setup() { @@ -26,5 +54,9 @@ void setup() { antares.setCallback(callback); } void loop() { + /* + Check if we're still connected to the MQTT broker/server. + If disconnected, the device will try to reconnect. + */ antares.checkMqttConnection(); } diff --git a/keywords.txt b/keywords.txt index d35bd05..9fd87d2 100644 --- a/keywords.txt +++ b/keywords.txt @@ -19,6 +19,16 @@ ipToString KEYWORD2 setMqttServer KEYWORD2 checkMqttConnection KEYWORD2 printdata KEYWORD2 +add KEYWORD2 +get KEYWORD2 +printData KEYWORD2 +publish KEYWORD2 +getTopic KEYWORD2 +getPayload KEYWORD2 +getInt KEYWORD2 +getFloat KEYWORD2 +getDouble KEYWORD2 +getString KEYWORD2 ###################################### # Constants (LITERAL1) diff --git a/src/AntaresESP8266MQTT.cpp b/src/AntaresESP8266MQTT.cpp index 4c727fe..d8197a5 100644 --- a/src/AntaresESP8266MQTT.cpp +++ b/src/AntaresESP8266MQTT.cpp @@ -127,8 +127,16 @@ void AntaresESP8266MQTT::publish(String projectName, String deviceName) { String topic = "/oneM2M/req/" + _accessKey + "/antares-cse/json"; String finalData; + if(_debug) { + DynamicJsonBuffer jsonBuffer; + JsonObject& object = jsonBuffer.parseObject(_jsonDataString); + printDebug("[ANTARES] PUBLISH DATA:\n\n"); + object.prettyPrintTo(Serial); + Serial.println("\n"); + } + _jsonDataString.replace("\"", "\\\""); - Serial.println(_jsonDataString); + finalData += "{"; finalData += "\"m2m:rqp\": {"; @@ -161,6 +169,30 @@ void AntaresESP8266MQTT::publish(String projectName, String deviceName) { client.publish(topicChar, finalDataChar); } +int AntaresESP8266MQTT::getInt(String key) { + DynamicJsonBuffer jsonBuffer; + JsonObject& object = jsonBuffer.parseObject(_jsonSubDataString); + return object[key]; +} + +float AntaresESP8266MQTT::getFloat(String key) { + DynamicJsonBuffer jsonBuffer; + JsonObject& object = jsonBuffer.parseObject(_jsonSubDataString); + return object[key]; +} + +double AntaresESP8266MQTT::getDouble(String key) { + DynamicJsonBuffer jsonBuffer; + JsonObject& object = jsonBuffer.parseObject(_jsonSubDataString); + return object[key]; +} + +String AntaresESP8266MQTT::getString(String key) { + DynamicJsonBuffer jsonBuffer; + JsonObject& object = jsonBuffer.parseObject(_jsonSubDataString); + return object[key]; +} + void AntaresESP8266MQTT::setCallback(std::function callbackFunc) { client.setCallback(callbackFunc); } @@ -169,12 +201,28 @@ bool AntaresESP8266MQTT::setDebug(bool trueFalse) { _debug = trueFalse; } -String AntaresESP8266MQTT::byteToString(byte* payload, unsigned int length) { +String AntaresESP8266MQTT::get(char* topic, byte* payload, unsigned int length) { + _receivedTopic = String(topic); + String payloadString; for(int i = 0; i < length; i++) { payloadString += char(payload[i]); } - return payloadString; + + DynamicJsonBuffer jsonBuffer; + JsonObject& object = jsonBuffer.parseObject(payloadString); + String parsedString = object["m2m:rqp"]["pc"]["m2m:cin"]["con"]; + _jsonSubDataString = parsedString; + + return _jsonSubDataString; +} + +String AntaresESP8266MQTT::getTopic() { + return _receivedTopic; +} + +String AntaresESP8266MQTT::getPayload() { + return _jsonSubDataString; } String AntaresESP8266MQTT::ipToString(IPAddress ip) { diff --git a/src/AntaresESP8266MQTT.h b/src/AntaresESP8266MQTT.h index 663ba4c..86edbd6 100644 --- a/src/AntaresESP8266MQTT.h +++ b/src/AntaresESP8266MQTT.h @@ -17,7 +17,9 @@ private: char* _wifiPass; String _accessKey; String _jsonDataString = "{}"; + String _jsonSubDataString; String _subscriptionTopic; + String _receivedTopic; public: AntaresESP8266MQTT(String accessKey); @@ -33,11 +35,20 @@ public: /* Overloaded functions end */ void printData(); void publish(String projectName, String deviceName); + /* Get subscription callback data*/ + int getInt(String key); + float getFloat(String key); + double getDouble(String key); + String getString(String key); + /* Get data end */ + + String getTopic(); + String getPayload(); void setMqttServer(); void checkMqttConnection(); void setCallback(std::function callbackFunc); - String byteToString(byte* payload, unsigned int length); + String get(char* topic, byte* payload, unsigned int length); void setSubscriptionTopic(); };