Committer:
donatien
Date:
Thu May 31 16:02:12 2012 +0000
Revision:
0:87e52bb764c5

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:87e52bb764c5 1 /**
donatien 0:87e52bb764c5 2 * @author Samuel Mokrani
donatien 0:87e52bb764c5 3 *
donatien 0:87e52bb764c5 4 * @section LICENSE
donatien 0:87e52bb764c5 5 *
donatien 0:87e52bb764c5 6 * Copyright (c) 2011 mbed
donatien 0:87e52bb764c5 7 *
donatien 0:87e52bb764c5 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
donatien 0:87e52bb764c5 9 * of this software and associated documentation files (the "Software"), to deal
donatien 0:87e52bb764c5 10 * in the Software without restriction, including without limitation the rights
donatien 0:87e52bb764c5 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
donatien 0:87e52bb764c5 12 * copies of the Software, and to permit persons to whom the Software is
donatien 0:87e52bb764c5 13 * furnished to do so, subject to the following conditions:
donatien 0:87e52bb764c5 14 *
donatien 0:87e52bb764c5 15 * The above copyright notice and this permission notice shall be included in
donatien 0:87e52bb764c5 16 * all copies or substantial portions of the Software.
donatien 0:87e52bb764c5 17 *
donatien 0:87e52bb764c5 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:87e52bb764c5 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:87e52bb764c5 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:87e52bb764c5 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:87e52bb764c5 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:87e52bb764c5 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
donatien 0:87e52bb764c5 24 * THE SOFTWARE.
donatien 0:87e52bb764c5 25 *
donatien 0:87e52bb764c5 26 * @section DESCRIPTION
donatien 0:87e52bb764c5 27 * Simple websocket client
donatien 0:87e52bb764c5 28 *
donatien 0:87e52bb764c5 29 */
donatien 0:87e52bb764c5 30
donatien 0:87e52bb764c5 31 #ifndef WEBSOCKET_H
donatien 0:87e52bb764c5 32 #define WEBSOCKET_H
donatien 0:87e52bb764c5 33
donatien 0:87e52bb764c5 34 #include "mbed.h"
donatien 0:87e52bb764c5 35 #include <string>
donatien 0:87e52bb764c5 36
donatien 0:87e52bb764c5 37 #include "api/socket.h"
donatien 0:87e52bb764c5 38
donatien 0:87e52bb764c5 39 /** Websocket client Class.
donatien 0:87e52bb764c5 40 *
donatien 0:87e52bb764c5 41 * Warning: you must use a wifi module (Wifly RN131-C) or an ethernet network to use this class
donatien 0:87e52bb764c5 42 *
donatien 0:87e52bb764c5 43 * Example (wifi network):
donatien 0:87e52bb764c5 44 * @code
donatien 0:87e52bb764c5 45 * #include "mbed.h"
donatien 0:87e52bb764c5 46 * #include "Wifly.h"
donatien 0:87e52bb764c5 47 * #include "Websocket.h"
donatien 0:87e52bb764c5 48 *
donatien 0:87e52bb764c5 49 * Serial pc(USBTX, USBRX);
donatien 0:87e52bb764c5 50 * Wifly * wifly;
donatien 0:87e52bb764c5 51 * Websocket * ws;
donatien 0:87e52bb764c5 52 *
donatien 0:87e52bb764c5 53 * int main()
donatien 0:87e52bb764c5 54 * {
donatien 0:87e52bb764c5 55 * wifly = new Wifly(p9, p10, p20, "network", "password", true);
donatien 0:87e52bb764c5 56 * ws = new Websocket("ws://ip_domain/path", wifly);
donatien 0:87e52bb764c5 57 *
donatien 0:87e52bb764c5 58 * if(wifly->join())
donatien 0:87e52bb764c5 59 * {
donatien 0:87e52bb764c5 60 * if(ws->connect())
donatien 0:87e52bb764c5 61 * {
donatien 0:87e52bb764c5 62 * pc.printf("ws connected\r\n");
donatien 0:87e52bb764c5 63 * while(1)
donatien 0:87e52bb764c5 64 * {
donatien 0:87e52bb764c5 65 * wait(0.1);
donatien 0:87e52bb764c5 66 * ws->send("test");
donatien 0:87e52bb764c5 67 * }
donatien 0:87e52bb764c5 68 * }
donatien 0:87e52bb764c5 69 * else
donatien 0:87e52bb764c5 70 * pc.printf("ws not connected\r\n");
donatien 0:87e52bb764c5 71 * }
donatien 0:87e52bb764c5 72 * else
donatien 0:87e52bb764c5 73 * pc.printf("join network failed\r\n");
donatien 0:87e52bb764c5 74 *
donatien 0:87e52bb764c5 75 * }
donatien 0:87e52bb764c5 76 * @endcode
donatien 0:87e52bb764c5 77 *
donatien 0:87e52bb764c5 78 *
donatien 0:87e52bb764c5 79 *
donatien 0:87e52bb764c5 80 * Example (ethernet network):
donatien 0:87e52bb764c5 81 * @code
donatien 0:87e52bb764c5 82 * #include "mbed.h"
donatien 0:87e52bb764c5 83 * #include "Websocket.h"
donatien 0:87e52bb764c5 84 *
donatien 0:87e52bb764c5 85 * Serial pc(USBTX, USBRX);
donatien 0:87e52bb764c5 86 * Websocket * ws;
donatien 0:87e52bb764c5 87 *
donatien 0:87e52bb764c5 88 * int main()
donatien 0:87e52bb764c5 89 * {
donatien 0:87e52bb764c5 90 * ws = new Websocket("ws://ip_domain/path");
donatien 0:87e52bb764c5 91 *
donatien 0:87e52bb764c5 92 * if(ws->connect())
donatien 0:87e52bb764c5 93 * {
donatien 0:87e52bb764c5 94 * pc.printf("ws connected\r\n");
donatien 0:87e52bb764c5 95 * while(1)
donatien 0:87e52bb764c5 96 * {
donatien 0:87e52bb764c5 97 * wait(0.1);
donatien 0:87e52bb764c5 98 * ws->send("test");
donatien 0:87e52bb764c5 99 * }
donatien 0:87e52bb764c5 100 * }
donatien 0:87e52bb764c5 101 * else
donatien 0:87e52bb764c5 102 * pc.printf("ws not connected\r\n");
donatien 0:87e52bb764c5 103 * }
donatien 0:87e52bb764c5 104 * @endcode
donatien 0:87e52bb764c5 105 */
donatien 0:87e52bb764c5 106 class Websocket
donatien 0:87e52bb764c5 107 {
donatien 0:87e52bb764c5 108 public:
donatien 0:87e52bb764c5 109 /**
donatien 0:87e52bb764c5 110 * Constructor for 3g communication
donatien 0:87e52bb764c5 111 *
donatien 0:87e52bb764c5 112 * @param url The Websocket url in the form "ws://ip_domain[:port]/path" (by default: port = 80)
donatien 0:87e52bb764c5 113 */
donatien 0:87e52bb764c5 114 Websocket(char * url);
donatien 0:87e52bb764c5 115
donatien 0:87e52bb764c5 116 /**
donatien 0:87e52bb764c5 117 * Connect to the websocket url
donatien 0:87e52bb764c5 118 *
donatien 0:87e52bb764c5 119 *@return true if the connection is established, false otherwise
donatien 0:87e52bb764c5 120 */
donatien 0:87e52bb764c5 121 bool connect();
donatien 0:87e52bb764c5 122
donatien 0:87e52bb764c5 123 /**
donatien 0:87e52bb764c5 124 * Send a string according to the websocket format: 00 str ff
donatien 0:87e52bb764c5 125 *
donatien 0:87e52bb764c5 126 * @param str string to be sent
donatien 0:87e52bb764c5 127 */
donatien 0:87e52bb764c5 128 void send(char * str);
donatien 0:87e52bb764c5 129
donatien 0:87e52bb764c5 130 /**
donatien 0:87e52bb764c5 131 * Read a websocket message
donatien 0:87e52bb764c5 132 *
donatien 0:87e52bb764c5 133 * @param message pointer to the string to be read (null if drop frame)
donatien 0:87e52bb764c5 134 *
donatien 0:87e52bb764c5 135 * @return true if a string has been read, false otherwise
donatien 0:87e52bb764c5 136 */
donatien 0:87e52bb764c5 137 bool read(char * message);
donatien 0:87e52bb764c5 138
donatien 0:87e52bb764c5 139 /**
donatien 0:87e52bb764c5 140 * To see if there is a websocket connection active
donatien 0:87e52bb764c5 141 *
donatien 0:87e52bb764c5 142 * @return true if there is a connection active
donatien 0:87e52bb764c5 143 */
donatien 0:87e52bb764c5 144 bool connected();
donatien 0:87e52bb764c5 145
donatien 0:87e52bb764c5 146 /**
donatien 0:87e52bb764c5 147 * Close the websocket connection
donatien 0:87e52bb764c5 148 *
donatien 0:87e52bb764c5 149 * @return true if the connection has been closed, false otherwise
donatien 0:87e52bb764c5 150 */
donatien 0:87e52bb764c5 151 bool close();
donatien 0:87e52bb764c5 152
donatien 0:87e52bb764c5 153 /**
donatien 0:87e52bb764c5 154 * Accessor: get path from the websocket url
donatien 0:87e52bb764c5 155 *
donatien 0:87e52bb764c5 156 * @return path
donatien 0:87e52bb764c5 157 */
donatien 0:87e52bb764c5 158 std::string getPath();
donatien 0:87e52bb764c5 159
donatien 0:87e52bb764c5 160 private:
donatien 0:87e52bb764c5 161
donatien 0:87e52bb764c5 162 void fillFields(char * url);
donatien 0:87e52bb764c5 163 void sendOpcode(uint8_t opcode);
donatien 0:87e52bb764c5 164 void sendLength(uint32_t len);
donatien 0:87e52bb764c5 165 void sendMask();
donatien 0:87e52bb764c5 166 void sendChar(uint8_t c);
donatien 0:87e52bb764c5 167 bool readChar(uint8_t* pC, bool block = true);
donatien 0:87e52bb764c5 168
donatien 0:87e52bb764c5 169 std::string ip_domain;
donatien 0:87e52bb764c5 170 std::string path;
donatien 0:87e52bb764c5 171 std::string port;
donatien 0:87e52bb764c5 172
donatien 0:87e52bb764c5 173 int m_sockHandle;
donatien 0:87e52bb764c5 174
donatien 0:87e52bb764c5 175 struct sockaddr_in m_sockAddr;
donatien 0:87e52bb764c5 176
donatien 0:87e52bb764c5 177 bool m_connected;
donatien 0:87e52bb764c5 178
donatien 0:87e52bb764c5 179 int waitReadable(uint32_t timeout);
donatien 0:87e52bb764c5 180 int waitWriteable(uint32_t timeout);
donatien 0:87e52bb764c5 181 int read(uint8_t* buf, int minLen, int maxLen, uint32_t timeout=5000);
donatien 0:87e52bb764c5 182 int write(uint8_t* buf, int len, uint32_t timeout=5000);
donatien 0:87e52bb764c5 183 void timeoutHandler();
donatien 0:87e52bb764c5 184 };
donatien 0:87e52bb764c5 185
donatien 0:87e52bb764c5 186 #endif