Ethernetwebsoc

Dependencies:   C12832_lcd LM75B WebSocketClient mbed-rtos mbed Socket lwip-eth lwip-sys lwip

Committer:
GordonSin
Date:
Fri May 31 04:09:54 2013 +0000
Revision:
0:0ed2a7c7190c
31/5/2013;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GordonSin 0:0ed2a7c7190c 1 /**
GordonSin 0:0ed2a7c7190c 2 * @author Samuel Mokrani
GordonSin 0:0ed2a7c7190c 3 *
GordonSin 0:0ed2a7c7190c 4 * @section LICENSE
GordonSin 0:0ed2a7c7190c 5 *
GordonSin 0:0ed2a7c7190c 6 * Copyright (c) 2011 mbed
GordonSin 0:0ed2a7c7190c 7 *
GordonSin 0:0ed2a7c7190c 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
GordonSin 0:0ed2a7c7190c 9 * of this software and associated documentation files (the "Software"), to deal
GordonSin 0:0ed2a7c7190c 10 * in the Software without restriction, including without limitation the rights
GordonSin 0:0ed2a7c7190c 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
GordonSin 0:0ed2a7c7190c 12 * copies of the Software, and to permit persons to whom the Software is
GordonSin 0:0ed2a7c7190c 13 * furnished to do so, subject to the following conditions:
GordonSin 0:0ed2a7c7190c 14 *
GordonSin 0:0ed2a7c7190c 15 * The above copyright notice and this permission notice shall be included in
GordonSin 0:0ed2a7c7190c 16 * all copies or substantial portions of the Software.
GordonSin 0:0ed2a7c7190c 17 *
GordonSin 0:0ed2a7c7190c 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
GordonSin 0:0ed2a7c7190c 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
GordonSin 0:0ed2a7c7190c 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
GordonSin 0:0ed2a7c7190c 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
GordonSin 0:0ed2a7c7190c 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
GordonSin 0:0ed2a7c7190c 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
GordonSin 0:0ed2a7c7190c 24 * THE SOFTWARE.
GordonSin 0:0ed2a7c7190c 25 *
GordonSin 0:0ed2a7c7190c 26 * @section DESCRIPTION
GordonSin 0:0ed2a7c7190c 27 * Simple websocket client
GordonSin 0:0ed2a7c7190c 28 *
GordonSin 0:0ed2a7c7190c 29 */
GordonSin 0:0ed2a7c7190c 30
GordonSin 0:0ed2a7c7190c 31 #ifndef WEBSOCKET_H
GordonSin 0:0ed2a7c7190c 32 #define WEBSOCKET_H
GordonSin 0:0ed2a7c7190c 33
GordonSin 0:0ed2a7c7190c 34 #include "mbed.h"
GordonSin 0:0ed2a7c7190c 35 #include <string>
GordonSin 0:0ed2a7c7190c 36
GordonSin 0:0ed2a7c7190c 37 #include "TCPSocketConnection.h"
GordonSin 0:0ed2a7c7190c 38
GordonSin 0:0ed2a7c7190c 39 /** Websocket client Class.
GordonSin 0:0ed2a7c7190c 40 *
GordonSin 0:0ed2a7c7190c 41 * Example (ethernet network):
GordonSin 0:0ed2a7c7190c 42 * @code
GordonSin 0:0ed2a7c7190c 43 * #include "mbed.h"
GordonSin 0:0ed2a7c7190c 44 * #include "EthernetInterface.h"
GordonSin 0:0ed2a7c7190c 45 * #include "Websocket.h"
GordonSin 0:0ed2a7c7190c 46 *
GordonSin 0:0ed2a7c7190c 47 * int main() {
GordonSin 0:0ed2a7c7190c 48 * EthernetInterface eth;
GordonSin 0:0ed2a7c7190c 49 * eth.init(); //Use DHCP
GordonSin 0:0ed2a7c7190c 50 * eth.connect();
GordonSin 0:0ed2a7c7190c 51 * printf("IP Address is %s\n\r", eth.getIPAddress());
GordonSin 0:0ed2a7c7190c 52 *
GordonSin 0:0ed2a7c7190c 53 * Websocket ws("ws://sockets.mbed.org:443/ws/demo/rw");
GordonSin 0:0ed2a7c7190c 54 * ws.connect();
GordonSin 0:0ed2a7c7190c 55 *
GordonSin 0:0ed2a7c7190c 56 * while (1) {
GordonSin 0:0ed2a7c7190c 57 * int res = ws.send("WebSocket Hello World!");
GordonSin 0:0ed2a7c7190c 58 *
GordonSin 0:0ed2a7c7190c 59 * if (ws.read(recv)) {
GordonSin 0:0ed2a7c7190c 60 * printf("rcv: %s\r\n", recv);
GordonSin 0:0ed2a7c7190c 61 * }
GordonSin 0:0ed2a7c7190c 62 *
GordonSin 0:0ed2a7c7190c 63 * wait(0.1);
GordonSin 0:0ed2a7c7190c 64 * }
GordonSin 0:0ed2a7c7190c 65 * }
GordonSin 0:0ed2a7c7190c 66 * @endcode
GordonSin 0:0ed2a7c7190c 67 */
GordonSin 0:0ed2a7c7190c 68
GordonSin 0:0ed2a7c7190c 69 class Websocket
GordonSin 0:0ed2a7c7190c 70 {
GordonSin 0:0ed2a7c7190c 71 public:
GordonSin 0:0ed2a7c7190c 72 /**
GordonSin 0:0ed2a7c7190c 73 * Constructor
GordonSin 0:0ed2a7c7190c 74 *
GordonSin 0:0ed2a7c7190c 75 * @param url The Websocket url in the form "ws://ip_domain[:port]/path" (by default: port = 80)
GordonSin 0:0ed2a7c7190c 76 */
GordonSin 0:0ed2a7c7190c 77 Websocket(char * url);
GordonSin 0:0ed2a7c7190c 78
GordonSin 0:0ed2a7c7190c 79 /**
GordonSin 0:0ed2a7c7190c 80 * Connect to the websocket url
GordonSin 0:0ed2a7c7190c 81 *
GordonSin 0:0ed2a7c7190c 82 *@return true if the connection is established, false otherwise
GordonSin 0:0ed2a7c7190c 83 */
GordonSin 0:0ed2a7c7190c 84 bool connect();
GordonSin 0:0ed2a7c7190c 85
GordonSin 0:0ed2a7c7190c 86 /**
GordonSin 0:0ed2a7c7190c 87 * Send a string according to the websocket format (see rfc 6455)
GordonSin 0:0ed2a7c7190c 88 *
GordonSin 0:0ed2a7c7190c 89 * @param str string to be sent
GordonSin 0:0ed2a7c7190c 90 *
GordonSin 0:0ed2a7c7190c 91 * @returns the number of bytes sent
GordonSin 0:0ed2a7c7190c 92 */
GordonSin 0:0ed2a7c7190c 93 int send(char * str);
GordonSin 0:0ed2a7c7190c 94
GordonSin 0:0ed2a7c7190c 95 /**
GordonSin 0:0ed2a7c7190c 96 * Read a websocket message
GordonSin 0:0ed2a7c7190c 97 *
GordonSin 0:0ed2a7c7190c 98 * @param message pointer to the string to be read (null if drop frame)
GordonSin 0:0ed2a7c7190c 99 *
GordonSin 0:0ed2a7c7190c 100 * @return true if a websocket frame has been read
GordonSin 0:0ed2a7c7190c 101 */
GordonSin 0:0ed2a7c7190c 102 bool read(char * message);
GordonSin 0:0ed2a7c7190c 103
GordonSin 0:0ed2a7c7190c 104 /**
GordonSin 0:0ed2a7c7190c 105 * To see if there is a websocket connection active
GordonSin 0:0ed2a7c7190c 106 *
GordonSin 0:0ed2a7c7190c 107 * @return true if there is a connection active
GordonSin 0:0ed2a7c7190c 108 */
GordonSin 0:0ed2a7c7190c 109 bool is_connected();
GordonSin 0:0ed2a7c7190c 110
GordonSin 0:0ed2a7c7190c 111 /**
GordonSin 0:0ed2a7c7190c 112 * Close the websocket connection
GordonSin 0:0ed2a7c7190c 113 *
GordonSin 0:0ed2a7c7190c 114 * @return true if the connection has been closed, false otherwise
GordonSin 0:0ed2a7c7190c 115 */
GordonSin 0:0ed2a7c7190c 116 bool close();
GordonSin 0:0ed2a7c7190c 117
GordonSin 0:0ed2a7c7190c 118 /*
GordonSin 0:0ed2a7c7190c 119 * Accessor: get path from the websocket url
GordonSin 0:0ed2a7c7190c 120 *
GordonSin 0:0ed2a7c7190c 121 * @return path
GordonSin 0:0ed2a7c7190c 122 */
GordonSin 0:0ed2a7c7190c 123 std::string getPath();
GordonSin 0:0ed2a7c7190c 124
GordonSin 0:0ed2a7c7190c 125 private:
GordonSin 0:0ed2a7c7190c 126
GordonSin 0:0ed2a7c7190c 127 void fillFields(char * url);
GordonSin 0:0ed2a7c7190c 128 int sendOpcode(uint8_t opcode, char * msg);
GordonSin 0:0ed2a7c7190c 129 int sendLength(uint32_t len, char * msg);
GordonSin 0:0ed2a7c7190c 130 int sendMask(char * msg);
GordonSin 0:0ed2a7c7190c 131 int readChar(char * pC, bool block = true);
GordonSin 0:0ed2a7c7190c 132
GordonSin 0:0ed2a7c7190c 133 std::string ip_domain;
GordonSin 0:0ed2a7c7190c 134 std::string path;
GordonSin 0:0ed2a7c7190c 135 std::string port;
GordonSin 0:0ed2a7c7190c 136
GordonSin 0:0ed2a7c7190c 137 TCPSocketConnection socket;
GordonSin 0:0ed2a7c7190c 138
GordonSin 0:0ed2a7c7190c 139 int read(char * buf, int len, int min_len = -1);
GordonSin 0:0ed2a7c7190c 140 int write(char * buf, int len);
GordonSin 0:0ed2a7c7190c 141 };
GordonSin 0:0ed2a7c7190c 142
GordonSin 0:0ed2a7c7190c 143 #endif