SocketIO is a compatibility library on top of the MBED Websockets API. Currently the broadcast paradigm is supported. There is much more to the SocketIO spec that could be built into this API. Have fun!

Dependents:   df-2013-thermostat-handson df-2013-minihack-thermostat-complete df-2013-minihack-thermostat df-2013-thermostat-remotes ... more

Committer:
ansond
Date:
Sun Nov 10 02:17:45 2013 +0000
Revision:
12:8fe60d9ca3bf
Parent:
10:997b8c5d2d46
updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ansond 0:5e68215d973a 1 /**
ansond 0:5e68215d973a 2 * @author Doug Anson
ansond 0:5e68215d973a 3 *
ansond 0:5e68215d973a 4 * @section LICENSE
ansond 0:5e68215d973a 5 *
ansond 0:5e68215d973a 6 * Copyright (c) 2013 mbed
ansond 0:5e68215d973a 7 *
ansond 0:5e68215d973a 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
ansond 0:5e68215d973a 9 * of this software and associated documentation files (the "Software"), to deal
ansond 0:5e68215d973a 10 * in the Software without restriction, including without limitation the rights
ansond 0:5e68215d973a 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
ansond 0:5e68215d973a 12 * copies of the Software, and to permit persons to whom the Software is
ansond 0:5e68215d973a 13 * furnished to do so, subject to the following conditions:
ansond 0:5e68215d973a 14 *
ansond 0:5e68215d973a 15 * The above copyright notice and this permission notice shall be included in
ansond 0:5e68215d973a 16 * all copies or substantial portions of the Software.
ansond 0:5e68215d973a 17 *
ansond 0:5e68215d973a 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
ansond 0:5e68215d973a 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
ansond 0:5e68215d973a 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
ansond 0:5e68215d973a 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
ansond 0:5e68215d973a 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ansond 0:5e68215d973a 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
ansond 0:5e68215d973a 24 * THE SOFTWARE.
ansond 0:5e68215d973a 25 *
ansond 0:5e68215d973a 26 * @section DESCRIPTION
ansond 0:5e68215d973a 27 * Simple SocketIO client library
ansond 0:5e68215d973a 28 *
ansond 0:5e68215d973a 29 */
ansond 0:5e68215d973a 30
ansond 0:5e68215d973a 31 #ifndef SOCKETIO_H
ansond 0:5e68215d973a 32 #define SOCKETIO_H
ansond 0:5e68215d973a 33
ansond 0:5e68215d973a 34 #include "mbed.h"
ansond 0:5e68215d973a 35
ansond 0:5e68215d973a 36 // Default SocketIO version
ansond 10:997b8c5d2d46 37 #define DEFAULT_VERSION 1
ansond 10:997b8c5d2d46 38
ansond 10:997b8c5d2d46 39 // Default SocketIO message length (suggestion only...)
ansond 12:8fe60d9ca3bf 40 #define SOCKETIO_MESSAGE_LENGTH 512
ansond 0:5e68215d973a 41
ansond 0:5e68215d973a 42 // HTTP support for session key retrieval
ansond 0:5e68215d973a 43 #include "HTTPClient.h"
ansond 0:5e68215d973a 44
ansond 0:5e68215d973a 45 // WebSocket layer support
ansond 0:5e68215d973a 46 #include "Websocket.h"
ansond 0:5e68215d973a 47
ansond 0:5e68215d973a 48 /** SocketIO client Class.
ansond 0:5e68215d973a 49 *
ansond 0:5e68215d973a 50 * Example (ethernet network):
ansond 0:5e68215d973a 51 * @code
ansond 0:5e68215d973a 52 * #include "mbed.h"
ansond 0:5e68215d973a 53 * #include "WiflyInterface.h"
ansond 0:5e68215d973a 54 * #include "SocketIO.h"
ansond 0:5e68215d973a 55 *
ansond 0:5e68215d973a 56 * // our wifi interface
ansond 0:5e68215d973a 57 * WiflyInterface wifly(p9, p10, p30, p29, "mysid", "mypw", WPA);
ansond 0:5e68215d973a 58 *
ansond 0:5e68215d973a 59 * int main() {
ansond 0:5e68215d973a 60 * wifly.init(); //Use DHCP
ansond 0:5e68215d973a 61 * wifly.connect();
ansond 0:5e68215d973a 62 * printf("IP Address is %s\n\r", wifly.getIPAddress());
ansond 0:5e68215d973a 63 *
ansond 0:5e68215d973a 64 * SocketIO socketio("myapp.herokuapp.com");
ansond 0:5e68215d973a 65 * socketio.connect();
ansond 0:5e68215d973a 66 *
ansond 0:5e68215d973a 67 * char recv[256];
ansond 0:5e68215d973a 68 * while (1) {
ansond 0:5e68215d973a 69 * int res = socketio.emit("mesage_name","[\"SocketIO Hello World!\"]");
ansond 0:5e68215d973a 70 * if (socketio.read(recv)) {
ansond 0:5e68215d973a 71 * printf("rcv: %s\r\n", recv);
ansond 0:5e68215d973a 72 * }
ansond 0:5e68215d973a 73 * wait(0.1);
ansond 0:5e68215d973a 74 * }
ansond 0:5e68215d973a 75 * }
ansond 0:5e68215d973a 76 * @endcode
ansond 0:5e68215d973a 77 */
ansond 0:5e68215d973a 78
ansond 0:5e68215d973a 79 class SocketIO
ansond 0:5e68215d973a 80 {
ansond 0:5e68215d973a 81 public:
ansond 0:5e68215d973a 82 /**
ansond 0:5e68215d973a 83 * Constructor
ansond 0:5e68215d973a 84 *
ansond 0:5e68215d973a 85 * @param url The SocketIO url in the form "www.example.com:[port]" (by default: port = 80) - i.e. just the endpoint name
ansond 0:5e68215d973a 86 */
ansond 0:5e68215d973a 87 SocketIO(char * url);
ansond 0:5e68215d973a 88
ansond 0:5e68215d973a 89 /**
ansond 0:5e68215d973a 90 * Constructor
ansond 0:5e68215d973a 91 *
ansond 0:5e68215d973a 92 * @param url The SocketIO url in the form "www.example.com:[port]" (by default: port = 80) - i.e. just the endpoint name
ansond 0:5e68215d973a 93 * @param version The SocketIO version for the session URL (by default version = 1)
ansond 0:5e68215d973a 94 */
ansond 0:5e68215d973a 95 SocketIO(char * url, int version);
ansond 0:5e68215d973a 96
ansond 0:5e68215d973a 97 /**
ansond 0:5e68215d973a 98 * Connect to the SocketIO url
ansond 0:5e68215d973a 99 *
ansond 0:5e68215d973a 100 *@return true if the connection is established, false otherwise
ansond 0:5e68215d973a 101 */
ansond 0:5e68215d973a 102 bool connect();
ansond 0:5e68215d973a 103
ansond 0:5e68215d973a 104 /**
ansond 0:5e68215d973a 105 * Emit (Broadcast) a socket.io message to the SocketIO server
ansond 0:5e68215d973a 106 *
ansond 0:5e68215d973a 107 * Socket.IO message Format (JSON): { "name": <name>, "args":<args> }
ansond 0:5e68215d973a 108 * name: the "name" of the socket.io message
ansond 0:5e68215d973a 109 * args: the argument(s) (must always be a JSON array) of the message. Example: "[ \"foo\", {\"bar\": \"none\"}]"
ansond 0:5e68215d973a 110 *
ansond 0:5e68215d973a 111 * @param name "name" of the socket.io message to broadcast
ansond 0:5e68215d973a 112 * @param args argument string to be sent ( must be in a JSON array format. Example: "[ \"foo\", {\"bar\": \"none\"}]" )
ansond 0:5e68215d973a 113 *
ansond 0:5e68215d973a 114 * @returns the number of bytes sent
ansond 0:5e68215d973a 115 */
ansond 0:5e68215d973a 116 int emit(char * name, char * args);
ansond 0:5e68215d973a 117
ansond 0:5e68215d973a 118 /**
ansond 0:5e68215d973a 119 * Read a SocketIO message
ansond 0:5e68215d973a 120 *
ansond 0:5e68215d973a 121 * @param message pointer to the string to be read (null if drop frame)
ansond 0:5e68215d973a 122 *
ansond 0:5e68215d973a 123 * @return true if a SocketIO frame has been read
ansond 0:5e68215d973a 124 */
ansond 0:5e68215d973a 125 bool read(char * message);
ansond 0:5e68215d973a 126
ansond 0:5e68215d973a 127 /**
ansond 0:5e68215d973a 128 * To see if there is a SocketIO connection active
ansond 0:5e68215d973a 129 *
ansond 0:5e68215d973a 130 * @return true if there is a connection active
ansond 0:5e68215d973a 131 */
ansond 0:5e68215d973a 132 bool is_connected();
ansond 0:5e68215d973a 133
ansond 0:5e68215d973a 134 /**
ansond 0:5e68215d973a 135 * Close the SocketIO connection
ansond 0:5e68215d973a 136 *
ansond 0:5e68215d973a 137 * @return true if the connection has been closed, false otherwise
ansond 0:5e68215d973a 138 */
ansond 0:5e68215d973a 139 bool close();
ansond 0:5e68215d973a 140
ansond 2:2979735cb379 141 protected:
ansond 2:2979735cb379 142 Websocket *ws; // websocket endpoint
ansond 2:2979735cb379 143
ansond 0:5e68215d973a 144 private:
ansond 0:5e68215d973a 145 // Variables
ansond 0:5e68215d973a 146 int version; // default socket.io version
ansond 0:5e68215d973a 147 char *url; // base URL endpoint to connect to. Example: "myapp.herokuapp.com"
ansond 0:5e68215d973a 148 char *url_session_key; // generated session key URL - used to extract the session key
ansond 2:2979735cb379 149 char *url_session; // session URL - specific socket.io session to bind to
ansond 0:5e68215d973a 150 char *session_key; // our session key
ansond 0:5e68215d973a 151 char *ws_channel; // our websocket channel for the session
ansond 0:5e68215d973a 152
ansond 0:5e68215d973a 153 // Methods
ansond 0:5e68215d973a 154 char *prepareSocketIOJSONMessage(char *name, char *args, char *buffer);
ansond 0:5e68215d973a 155 void prepareSessionURL();
ansond 0:5e68215d973a 156 bool attemptWebSocketConnect();
ansond 0:5e68215d973a 157 void parseSessionKey(char *response, char *sessionkey, char *ws_channel);
ansond 0:5e68215d973a 158 bool acquireSessionKey();
ansond 0:5e68215d973a 159 void prepareSessionKeyURL(char *myurl, int myversion);
ansond 0:5e68215d973a 160
ansond 0:5e68215d973a 161
ansond 0:5e68215d973a 162 };
ansond 0:5e68215d973a 163
ansond 0:5e68215d973a 164 #endif