zabuton library

Dependencies:   CushionSock EthernetNetIf MbedJSONValue mbed

Committer:
3116redtrain
Date:
Sat Dec 17 11:03:33 2016 +0000
Revision:
0:b22b65ced05f
ok

Who changed what in which revision?

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