From 21cb4b5e47cfa156f21610450e292884be232554 Mon Sep 17 00:00:00 2001 From: Jonathan Gottfried Date: Wed, 1 Aug 2012 20:00:02 -0400 Subject: [PATCH] Modified to work with WiFlyHQ --- PusherClient.cpp | 17 ++++++++++++----- PusherClient.h | 2 ++ WebSocketClient.cpp | 46 ++++++++++++++++++++++++--------------------- WebSocketClient.h | 6 ++++-- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/PusherClient.cpp b/PusherClient.cpp index 59945e4..f00d475 100644 --- a/PusherClient.cpp +++ b/PusherClient.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include const byte HASH_SIZE = 10; @@ -46,7 +47,7 @@ prog_char unsubscribeMessage[] PROGMEM = "{\"channel\": \"{0}\" }"; prog_char triggerEventMessage[] PROGMEM = "{\"event\": \"{0}\", \"data\": {1} }"; prog_char eventNameStart[] PROGMEM = "event"; prog_char unsubscribeEventName[] PROGMEM = "pusher:unsubscribe"; - +prog_char dataStart[] PROGMEM = "data"; PROGMEM const char *stringTable[] = { @@ -62,7 +63,8 @@ PROGMEM const char *stringTable[] = unsubscribeMessage, triggerEventMessage, eventNameStart, - unsubscribeEventName + unsubscribeEventName, + dataStart }; String PusherClient::getStringTableItem(int index) { @@ -83,7 +85,6 @@ bool PusherClient::connect(String appId) { char pathData[path.length() + 1]; path.toCharArray(pathData, path.length() + 1); - return _client.connect("ws.pusherapp.com", pathData, 80); } @@ -95,6 +96,10 @@ void PusherClient::disconnect() { _client.disconnect(); } +void PusherClient::setClient(WiFly client) { + _client.setClient(client); +} + void PusherClient::monitor () { _client.monitor(); } @@ -159,15 +164,17 @@ void PusherClient::triggerEvent(String eventName, String eventData) { void PusherClient::dataArrived(WebSocketClient client, String data) { String eventNameStart = getStringTableItem(11); + String dataStart = getStringTableItem(13); String eventName = parseMessageMember(eventNameStart, data); + String dataStr = parseMessageMember(dataStart, data); if (_bindAllDelegate != NULL) { - _bindAllDelegate(data); + _bindAllDelegate(dataStr); } EventDelegate delegate = _bindMap[eventName]; if (delegate != NULL) { - delegate(data); + delegate(dataStr); } } diff --git a/PusherClient.h b/PusherClient.h index f679128..3fc22f7 100644 --- a/PusherClient.h +++ b/PusherClient.h @@ -31,6 +31,7 @@ #include #include "Arduino.h" #include +#include //Uncomment this to use WIFLY Client //#define WIFLY true @@ -43,6 +44,7 @@ class PusherClient { bool connect(String appId); bool connected(); void disconnect(); + void setClient(WiFly client); void monitor(); void bindAll(EventDelegate delegate); void bind(String eventName, EventDelegate delegate); diff --git a/WebSocketClient.cpp b/WebSocketClient.cpp index 335329b..674a8a4 100644 --- a/WebSocketClient.cpp +++ b/WebSocketClient.cpp @@ -26,6 +26,7 @@ #include #include #include +#include prog_char stringVar[] PROGMEM = "{0}"; prog_char clientHandshakeLine1[] PROGMEM = "GET {0} HTTP/1.1"; @@ -51,11 +52,12 @@ String WebSocketClient::getStringTableItem(int index) { strcpy_P(buffer, (char*)pgm_read_word(&(WebSocketClientStringTable[index]))); return String(buffer); } - +void WebSocketClient::setClient(WiFly client) { + _client = client; +} bool WebSocketClient::connect(char hostname[], char path[], int port) { bool result = false; - - if (_client.connect(hostname, port)) { + if (_client.open(hostname, port)) { sendHandshake(hostname, path); result = readHandshake(); } @@ -65,28 +67,30 @@ bool WebSocketClient::connect(char hostname[], char path[], int port) { bool WebSocketClient::connected() { - return _client.connected(); + return _client.isConnected(); } void WebSocketClient::disconnect() { - _client.stop(); + _client.close(); } - -void WebSocketClient::monitor () { - char character; - - if (_client.available() > 0 && (character = _client.read()) == 0) { - String data = ""; - bool endReached = false; - while (!endReached) { - character = _client.read(); - endReached = character == -1; - - if (!endReached) { - data += character; - } +int WebSocketClient::getMessage(char *buf, int size) +{ + int len = 0; + + if (_client.available() > 0) { + if (_client.read() == 0) { + /* read up to the end of the message (255) */ + len = _client.getsTerm(buf, size, 255); } - + } + return len; +} +void WebSocketClient::monitor () { + char inBuf[128]; + char outBuf[128]; + uint8_t outBufInd = 0; + if (getMessage(inBuf, sizeof(inBuf)) > 0) { + String data = String(inBuf); if (_dataArrivedDelegate != NULL) { _dataArrivedDelegate(*this, data); } @@ -137,7 +141,7 @@ bool WebSocketClient::readHandshake() { result = handshake.indexOf(response) != -1; if(!result) { - _client.stop(); + _client.close(); } return result; diff --git a/WebSocketClient.h b/WebSocketClient.h index ab4ff77..7071466 100644 --- a/WebSocketClient.h +++ b/WebSocketClient.h @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include "Arduino.h" //Uncomment this to use WIFLY Client @@ -39,6 +39,7 @@ class WebSocketClient { typedef void (*DataArrivedDelegate)(WebSocketClient client, String data); bool connect(char hostname[], char path[] = "/", int port = 80); bool connected(); + void setClient(WiFly client); void disconnect(); void monitor(); void setDataArrivedDelegate(DataArrivedDelegate dataArrivedDelegate); @@ -46,10 +47,11 @@ class WebSocketClient { private: String getStringTableItem(int index); void sendHandshake(char hostname[], char path[]); - EthernetClient _client; + WiFly _client; DataArrivedDelegate _dataArrivedDelegate; bool readHandshake(); String readLine(); + int getMessage(char *buf, int size); };