Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding incoming JASON Parse #16

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ Support for JSON was added using https://github.com/bblanchon/ArduinoJson
Users will need to download the library directly from this link and install it.

Instead of using client.send, you can now use client.sendJSON

To parse the inbound JSON Message add true to the monitor function and readout Rcontent
It can be left out for the parsed pair of Rname and Rcontent

thanks to funkyguy4000, users can now use #define ESP8266, #define W5100 or #define ENC28J60
no need to edit socketio.h anymore
Expand Down
49 changes: 19 additions & 30 deletions SocketIOClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,10 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/

#define ESP8266
#define W5100

#include <SocketIOClient.h>


String tmpdata = ""; //External variables
String RID = "";
String Rname = "";
Expand Down Expand Up @@ -67,22 +66,7 @@ void SocketIOClient::disconnect() {
client.stop();
}

// find the nth colon starting from dataptr
void SocketIOClient::findColon(char which) {
while (*dataptr) {
if (*dataptr == ':') {
if (--which <= 0) return;
}
++dataptr;
}
}

// terminate command at dataptr at closing double quote
void SocketIOClient::terminateCommand(void) {
dataptr[strlen(dataptr) - 3] = 0;
}

void SocketIOClient::parser(int index) {
void SocketIOClient::parser(int index, bool parseJson) {
String rcvdmsg = "";
int sizemsg = databuffer[index + 1]; // 0-125 byte, index ok Fix provide by Galilei11. Thanks
if (databuffer[index + 1]>125)
Expand Down Expand Up @@ -115,18 +99,23 @@ void SocketIOClient::parser(int index) {
break;
case '2':
RID = rcvdmsg.substring(4, rcvdmsg.indexOf("\","));
Rname = rcvdmsg.substring(rcvdmsg.indexOf("\",") + 4, rcvdmsg.indexOf("\":"));
Rcontent = rcvdmsg.substring(rcvdmsg.indexOf("\":") + 3, rcvdmsg.indexOf("\"}"));
//Serial.println("RID = " + RID);
//Serial.println("Rname = " + Rname);
//Serial.println("Rcontent = " + Rcontent);
//Serial.println("RID = " + RID);
if(!parseJson){
Rname = rcvdmsg.substring(rcvdmsg.indexOf("\",") + 4, rcvdmsg.indexOf("\":"));
Rcontent = rcvdmsg.substring(rcvdmsg.indexOf("\":") + 3, rcvdmsg.indexOf("}"));
//Serial.println("Rname = " + Rname);
//Serial.println("Rcontent = " + Rcontent);
}
else{
Rcontent = rcvdmsg.substring(rcvdmsg.indexOf("\",") + 2, rcvdmsg.indexOf("}") + 1);
}
Serial.println(rcvdmsg);
break;
}
}
}

bool SocketIOClient::monitor() {
bool SocketIOClient::monitor(bool parseJson) {
int index = -1;
int index2 = -1;
String tmp = "";
Expand Down Expand Up @@ -155,17 +144,15 @@ bool SocketIOClient::monitor() {
Serial.println(index2);*/
if (index != -1)
{
parser(index);
parser(index, parseJson);

}
if (index2 != -1)
{
parser(index2);
parser(index2, parseJson);
}
}
}

void SocketIOClient::setDataArrivedDelegate(DataArrivedDelegate newdataArrivedDelegate) {
dataArrivedDelegate = newdataArrivedDelegate;
return true;
}

void SocketIOClient::sendHandshake(char hostname[]) {
Expand Down Expand Up @@ -509,3 +496,5 @@ void SocketIOClient::heartbeat(int select) {
client.print(mask);
client.print(masked);
}


14 changes: 5 additions & 9 deletions SocketIOClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,12 @@ OTHER DEALINGS IN THE SOFTWARE.

class SocketIOClient {
public:
typedef void(*DataArrivedDelegate)(SocketIOClient client, char *data);
bool connect(char hostname[], int port = 80);
bool connectHTTP(char hostname[], int port = 80);
bool connected();
void disconnect();
bool reconnect(char hostname[], int port = 80);
bool monitor();
void setDataArrivedDelegate(DataArrivedDelegate dataArrivedDelegate);
bool monitor(bool parseJSON = false);
void send(String RID, String Rname, String Rcontent);
void sendJSON(String RID, String JSON);
void heartbeat(int select);
Expand All @@ -67,12 +65,12 @@ class SocketIOClient {
void putREST(String path, String type, String data);
void deleteREST(String path);
private:
void parser(int index);
void parser(int index, bool parseJSON);
void sendHandshake(char hostname[]);

//EthernetClient client; //For ENC28J60 or W5100
WiFiClient client; //For ESP8266
DataArrivedDelegate dataArrivedDelegate;
bool readHandshake();
WiFiClient client; //For ESP8266
bool readHandshake();
void readLine();
char *dataptr;
char databuffer[DATA_BUFFER_LEN];
Expand All @@ -81,8 +79,6 @@ class SocketIOClient {
char *hostname;
int port;

void findColon(char which);
void terminateCommand(void);
bool waitForInput(void);
void eatHeader(void);
};
81 changes: 81 additions & 0 deletions examples/Hello_time_JSON/Hello_time_JSON.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
#include "SocketIOClient.h"
#include "Ethernet.h"
#include "SPI.h"
#include <ArduinoJson.h>

SocketIOClient client;

byte mac[] = { 0xAA, 0x00, 0xBE, 0xEF, 0xFE, 0xEE };
char hostname[] = "10.10.0.184";
int port = 3000;

extern String RID;
extern String Rname;
extern String Rcontent;
// websocket message handler: do something with command from server
void ondata(SocketIOClient client, char *data)
{
Serial.print(data);
}
unsigned long previousMillis = 0;
long interval = 10000;


void setup() {
//pinMode(13, OUTPUT); //for some ethernet shield on the mega : disables the SD and enables the W5100
digitalWrite(10, LOW);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
Serial.begin(9600);
delay(1000);


Ethernet.begin(mac);

client.setDataArrivedDelegate(ondata);
if (!client.connect(hostname, port))
Serial.println(F("Not connected."));
if (client.connected())
{
String JSON;
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["message"]= "Connected !!!!";
root.printTo(JSON);
client.sendJSON("connection",JSON);
}
else
{
Serial.println("Connection Error");
while(1);
}
delay(1000);
}

void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
//client.heartbeat(0);
String JSON;
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["message"]= "Time please?";
root.printTo(JSON);
Serial.println(JSON);
client.sendJSON("atime",JSON);
}
if (client.monitor(true))
{
Serial.print("JSON is: ");
Serial.println(Rcontent);
String JSON;
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(Rcontent);

const char * nowTime = root["time"];
Serial.print(nowTime);
}
}