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 * modify by Suga
3116redtrain 0:b22b65ced05f 3 */
3116redtrain 0:b22b65ced05f 4 #include "Websocket.h"
3116redtrain 0:b22b65ced05f 5 #include <string>
3116redtrain 0:b22b65ced05f 6
3116redtrain 0:b22b65ced05f 7 #ifdef WIFLY
3116redtrain 0:b22b65ced05f 8 Websocket::Websocket(char * url, Wifly * wifi) {
3116redtrain 0:b22b65ced05f 9 this->wifi = wifi;
3116redtrain 0:b22b65ced05f 10 netif = WIF;
3116redtrain 0:b22b65ced05f 11 fillFields(url);
3116redtrain 0:b22b65ced05f 12 }
3116redtrain 0:b22b65ced05f 13 #endif
3116redtrain 0:b22b65ced05f 14
3116redtrain 0:b22b65ced05f 15 void Websocket::isr_dns (DNSReply r) {
3116redtrain 0:b22b65ced05f 16 if (DNS_FOUND) {
3116redtrain 0:b22b65ced05f 17 dns_status = 1;
3116redtrain 0:b22b65ced05f 18 } else {
3116redtrain 0:b22b65ced05f 19 dns_status = -1;
3116redtrain 0:b22b65ced05f 20 }
3116redtrain 0:b22b65ced05f 21 }
3116redtrain 0:b22b65ced05f 22
3116redtrain 0:b22b65ced05f 23 Websocket::Websocket(char * url, EthernetNetIf *e) {
3116redtrain 0:b22b65ced05f 24 server_ip = NULL;
3116redtrain 0:b22b65ced05f 25 netif = ETH;
3116redtrain 0:b22b65ced05f 26 eth_writeable = false;
3116redtrain 0:b22b65ced05f 27 eth_readable = false;
3116redtrain 0:b22b65ced05f 28 eth_connected = false;
3116redtrain 0:b22b65ced05f 29 response_server_eth = false;
3116redtrain 0:b22b65ced05f 30 new_msg = false;
3116redtrain 0:b22b65ced05f 31 fillFields(url);
3116redtrain 0:b22b65ced05f 32
3116redtrain 0:b22b65ced05f 33 #ifdef ETH_SETUP
3116redtrain 0:b22b65ced05f 34 eth = new EthernetNetIf();
3116redtrain 0:b22b65ced05f 35 #else
3116redtrain 0:b22b65ced05f 36 eth = e;
3116redtrain 0:b22b65ced05f 37 #endif
3116redtrain 0:b22b65ced05f 38 sock = new TCPSocket();
3116redtrain 0:b22b65ced05f 39
3116redtrain 0:b22b65ced05f 40 #ifdef ETH_SETUP
3116redtrain 0:b22b65ced05f 41 EthernetErr ethErr = eth->setup();
3116redtrain 0:b22b65ced05f 42 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 43 if (ethErr) {
3116redtrain 0:b22b65ced05f 44 printf("\r\nERROR %d in setup.\r\n", ethErr);
3116redtrain 0:b22b65ced05f 45 }
3116redtrain 0:b22b65ced05f 46 #endif
3116redtrain 0:b22b65ced05f 47 #endif
3116redtrain 0:b22b65ced05f 48
3116redtrain 0:b22b65ced05f 49 //we must use dnsresolver to find the ip address
3116redtrain 0:b22b65ced05f 50 if (server_ip == NULL) {
3116redtrain 0:b22b65ced05f 51 /*
3116redtrain 0:b22b65ced05f 52 DNSResolver dr;
3116redtrain 0:b22b65ced05f 53 server_ip = new IpAddr();
3116redtrain 0:b22b65ced05f 54 *server_ip = dr.resolveName(ip_domain.c_str());
3116redtrain 0:b22b65ced05f 55 */
3116redtrain 0:b22b65ced05f 56 DNSRequest dns;
3116redtrain 0:b22b65ced05f 57 Timer timeout;
3116redtrain 0:b22b65ced05f 58 server_ip = new IpAddr();
3116redtrain 0:b22b65ced05f 59 dns_status = 0;
3116redtrain 0:b22b65ced05f 60 dns.setOnReply(this, &Websocket::isr_dns);
3116redtrain 0:b22b65ced05f 61 if (dns.resolve(ip_domain.c_str()) != DNS_OK) return;
3116redtrain 0:b22b65ced05f 62 timeout.reset();
3116redtrain 0:b22b65ced05f 63 timeout.start();
3116redtrain 0:b22b65ced05f 64 while (timeout.read_ms() < 15000) {
3116redtrain 0:b22b65ced05f 65 if (dns_status) break;
3116redtrain 0:b22b65ced05f 66 Net::poll();
3116redtrain 0:b22b65ced05f 67 }
3116redtrain 0:b22b65ced05f 68 timeout.stop();
3116redtrain 0:b22b65ced05f 69 if (dns_status <= 0) return;
3116redtrain 0:b22b65ced05f 70 dns.getResult(server_ip);
3116redtrain 0:b22b65ced05f 71 dns.close();
3116redtrain 0:b22b65ced05f 72 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 73 printf("\r\nserver with dns=%i.%i.%i.%i\r\n",server_ip[0],server_ip[1],server_ip[2],server_ip[3]);
3116redtrain 0:b22b65ced05f 74 #endif
3116redtrain 0:b22b65ced05f 75
3116redtrain 0:b22b65ced05f 76 }
3116redtrain 0:b22b65ced05f 77
3116redtrain 0:b22b65ced05f 78 IpAddr ipt = eth->getIp();
3116redtrain 0:b22b65ced05f 79 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 80 printf("\r\nmbed IP Address is %d.%d.%d.%d\r\n", ipt[0], ipt[1], ipt[2], ipt[3]);
3116redtrain 0:b22b65ced05f 81 #endif
3116redtrain 0:b22b65ced05f 82
3116redtrain 0:b22b65ced05f 83 sock->setOnEvent(this, &Websocket::onTCPSocketEvent);
3116redtrain 0:b22b65ced05f 84 }
3116redtrain 0:b22b65ced05f 85
3116redtrain 0:b22b65ced05f 86
3116redtrain 0:b22b65ced05f 87 void Websocket::fillFields(char * url) {
3116redtrain 0:b22b65ced05f 88 char *res = NULL;
3116redtrain 0:b22b65ced05f 89 char *res1 = NULL;
3116redtrain 0:b22b65ced05f 90
3116redtrain 0:b22b65ced05f 91 char buf[50];
3116redtrain 0:b22b65ced05f 92 strcpy(buf, url);
3116redtrain 0:b22b65ced05f 93
3116redtrain 0:b22b65ced05f 94 res = strtok(buf, ":");
3116redtrain 0:b22b65ced05f 95 if (strcmp(res, "ws")) {
3116redtrain 0:b22b65ced05f 96 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 97 printf("\r\nFormat error: please use: \"ws://ip-or-domain[:port]/path\"\r\n\r\n");
3116redtrain 0:b22b65ced05f 98 #endif
3116redtrain 0:b22b65ced05f 99 } else {
3116redtrain 0:b22b65ced05f 100 //ip_domain and port
3116redtrain 0:b22b65ced05f 101 res = strtok(NULL, "/");
3116redtrain 0:b22b65ced05f 102
3116redtrain 0:b22b65ced05f 103 //path
3116redtrain 0:b22b65ced05f 104 res1 = strtok(NULL, " ");
3116redtrain 0:b22b65ced05f 105 if (res1 != NULL) {
3116redtrain 0:b22b65ced05f 106 path = res1;
3116redtrain 0:b22b65ced05f 107 }
3116redtrain 0:b22b65ced05f 108
3116redtrain 0:b22b65ced05f 109 //ip_domain
3116redtrain 0:b22b65ced05f 110 res = strtok(res, ":");
3116redtrain 0:b22b65ced05f 111
3116redtrain 0:b22b65ced05f 112 //port
3116redtrain 0:b22b65ced05f 113 res1 = strtok(NULL, " ");
3116redtrain 0:b22b65ced05f 114 //port
3116redtrain 0:b22b65ced05f 115 if (res1 != NULL) {
3116redtrain 0:b22b65ced05f 116 port = res1;
3116redtrain 0:b22b65ced05f 117 } else {
3116redtrain 0:b22b65ced05f 118 port = "80";
3116redtrain 0:b22b65ced05f 119 }
3116redtrain 0:b22b65ced05f 120
3116redtrain 0:b22b65ced05f 121 if (res != NULL) {
3116redtrain 0:b22b65ced05f 122 ip_domain = res;
3116redtrain 0:b22b65ced05f 123
3116redtrain 0:b22b65ced05f 124 //if we use ethernet, we must decode ip address or use dnsresolver
3116redtrain 0:b22b65ced05f 125 if (netif == ETH) {
3116redtrain 0:b22b65ced05f 126 strcpy(buf, res);
3116redtrain 0:b22b65ced05f 127
3116redtrain 0:b22b65ced05f 128 //we try to decode the ip address
3116redtrain 0:b22b65ced05f 129 if (buf[0] >= '0' && buf[0] <= '9') {
3116redtrain 0:b22b65ced05f 130 res = strtok(buf, ".");
3116redtrain 0:b22b65ced05f 131 int i = 0;
3116redtrain 0:b22b65ced05f 132 int ip[4];
3116redtrain 0:b22b65ced05f 133 while (res != NULL) {
3116redtrain 0:b22b65ced05f 134 ip[i] = atoi(res);
3116redtrain 0:b22b65ced05f 135 res = strtok(NULL, ".");
3116redtrain 0:b22b65ced05f 136 i++;
3116redtrain 0:b22b65ced05f 137 }
3116redtrain 0:b22b65ced05f 138 server_ip = new IpAddr(ip[0], ip[1], ip[2], ip[3]);
3116redtrain 0:b22b65ced05f 139 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 140 printf("server without dns=%i.%i.%i.%i\n",(*server_ip)[0],(*server_ip)[1],(*server_ip)[2],(*server_ip)[3]);
3116redtrain 0:b22b65ced05f 141 #endif
3116redtrain 0:b22b65ced05f 142 }
3116redtrain 0:b22b65ced05f 143 }
3116redtrain 0:b22b65ced05f 144 }
3116redtrain 0:b22b65ced05f 145 }
3116redtrain 0:b22b65ced05f 146 }
3116redtrain 0:b22b65ced05f 147
3116redtrain 0:b22b65ced05f 148
3116redtrain 0:b22b65ced05f 149 bool Websocket::connect() {
3116redtrain 0:b22b65ced05f 150 char cmd[50];
3116redtrain 0:b22b65ced05f 151 #ifdef WIFLY
3116redtrain 0:b22b65ced05f 152 if (netif == WIF) {
3116redtrain 0:b22b65ced05f 153 wifi->send("exit\r", "NO");
3116redtrain 0:b22b65ced05f 154 //enter in cmd mode
3116redtrain 0:b22b65ced05f 155 while (!wifi->send("$$$", "CMD")) {
3116redtrain 0:b22b65ced05f 156 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 157 printf("cannot enter in CMD mode\r\n");
3116redtrain 0:b22b65ced05f 158 #endif
3116redtrain 0:b22b65ced05f 159 wifi->exit();
3116redtrain 0:b22b65ced05f 160 }
3116redtrain 0:b22b65ced05f 161
3116redtrain 0:b22b65ced05f 162
3116redtrain 0:b22b65ced05f 163 //open the connection
3116redtrain 0:b22b65ced05f 164 sprintf(cmd, "open %s %s\r\n", ip_domain.c_str(), port.c_str());
3116redtrain 0:b22b65ced05f 165 if (!wifi->send(cmd, "OPEN*")) {
3116redtrain 0:b22b65ced05f 166 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 167 printf("Websocket::connect cannot open\r\n");
3116redtrain 0:b22b65ced05f 168 #endif
3116redtrain 0:b22b65ced05f 169 return false;
3116redtrain 0:b22b65ced05f 170 }
3116redtrain 0:b22b65ced05f 171
3116redtrain 0:b22b65ced05f 172
3116redtrain 0:b22b65ced05f 173 //send websocket HTTP header
3116redtrain 0:b22b65ced05f 174 sprintf(cmd, "GET /%s HTTP/1.1\r\n", path.c_str());
3116redtrain 0:b22b65ced05f 175 wifi->send(cmd, "NO");
3116redtrain 0:b22b65ced05f 176
3116redtrain 0:b22b65ced05f 177 sprintf(cmd, "Host: %s:%s\r\n", ip_domain.c_str(), port.c_str());
3116redtrain 0:b22b65ced05f 178 wifi->send(cmd, "NO");
3116redtrain 0:b22b65ced05f 179
3116redtrain 0:b22b65ced05f 180 wifi->send("Upgrade: WebSocket\r\n", "NO");
3116redtrain 0:b22b65ced05f 181
3116redtrain 0:b22b65ced05f 182 sprintf(cmd, "Origin: http:%s:%s\r\n", ip_domain.c_str(), port.c_str());
3116redtrain 0:b22b65ced05f 183 wifi->send(cmd, "NO");
3116redtrain 0:b22b65ced05f 184
3116redtrain 0:b22b65ced05f 185
3116redtrain 0:b22b65ced05f 186 wifi->send("Connection: Upgrade\r\n", "NO");
3116redtrain 0:b22b65ced05f 187 wifi->send("Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n", "NO");
3116redtrain 0:b22b65ced05f 188 wifi->send("Sec-WebSocket-key2: 12998 5 Y3 1 .P00\r\n\r\n", "NO");
3116redtrain 0:b22b65ced05f 189 if (!wifi->send("^n:ds[4U", "8jKS'y:G*Co,Wxa-"))
3116redtrain 0:b22b65ced05f 190 return false;
3116redtrain 0:b22b65ced05f 191 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 192 printf("\r\nip_domain: %s\r\npath: /%s\r\nport: %s\r\n\r\n",this->ip_domain.c_str(), this->path.c_str(), this->port.c_str());
3116redtrain 0:b22b65ced05f 193 #endif
3116redtrain 0:b22b65ced05f 194 return true;
3116redtrain 0:b22b65ced05f 195 } else
3116redtrain 0:b22b65ced05f 196 #endif
3116redtrain 0:b22b65ced05f 197 if (netif == ETH) {
3116redtrain 0:b22b65ced05f 198 Host server (*server_ip, atoi(port.c_str()));
3116redtrain 0:b22b65ced05f 199 sock->close();
3116redtrain 0:b22b65ced05f 200 TCPSocketErr bindErr = sock->connect(server);
3116redtrain 0:b22b65ced05f 201 if (bindErr) {
3116redtrain 0:b22b65ced05f 202 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 203 printf("\r\nERROR binderr: %d\r\n", bindErr);
3116redtrain 0:b22b65ced05f 204 #endif
3116redtrain 0:b22b65ced05f 205 return false;
3116redtrain 0:b22b65ced05f 206 }
3116redtrain 0:b22b65ced05f 207
3116redtrain 0:b22b65ced05f 208 Timer tmr;
3116redtrain 0:b22b65ced05f 209 tmr.start();
3116redtrain 0:b22b65ced05f 210
3116redtrain 0:b22b65ced05f 211 Timer stop;
3116redtrain 0:b22b65ced05f 212 stop.start();
3116redtrain 0:b22b65ced05f 213
3116redtrain 0:b22b65ced05f 214 int i = 0;
3116redtrain 0:b22b65ced05f 215 while (true) {
3116redtrain 0:b22b65ced05f 216 Net::poll();
3116redtrain 0:b22b65ced05f 217 if (stop.read() > 3)
3116redtrain 0:b22b65ced05f 218 return false;
3116redtrain 0:b22b65ced05f 219 if (tmr.read() > 0.01) {
3116redtrain 0:b22b65ced05f 220 tmr.reset();
3116redtrain 0:b22b65ced05f 221 if (eth_connected) {
3116redtrain 0:b22b65ced05f 222 switch (i) {
3116redtrain 0:b22b65ced05f 223 case 0:
3116redtrain 0:b22b65ced05f 224 sprintf(cmd, "GET /%s HTTP/1.1\r\n", path.c_str());
3116redtrain 0:b22b65ced05f 225 sock->send(cmd, strlen(cmd));
3116redtrain 0:b22b65ced05f 226 i++;
3116redtrain 0:b22b65ced05f 227 break;
3116redtrain 0:b22b65ced05f 228 case 1:
3116redtrain 0:b22b65ced05f 229 sprintf(cmd, "Host: %s:%s\r\n", ip_domain.c_str(), port.c_str());
3116redtrain 0:b22b65ced05f 230 sock->send(cmd, strlen(cmd));
3116redtrain 0:b22b65ced05f 231 i++;
3116redtrain 0:b22b65ced05f 232 break;
3116redtrain 0:b22b65ced05f 233 case 2:
3116redtrain 0:b22b65ced05f 234 sprintf(cmd, "Upgrade: WebSocket\r\n");
3116redtrain 0:b22b65ced05f 235 sock->send(cmd, strlen(cmd));
3116redtrain 0:b22b65ced05f 236 i++;
3116redtrain 0:b22b65ced05f 237 break;
3116redtrain 0:b22b65ced05f 238 case 3:
3116redtrain 0:b22b65ced05f 239 sprintf(cmd, "Origin: http:%s:%s\r\n", ip_domain.c_str(), port.c_str());
3116redtrain 0:b22b65ced05f 240 sock->send(cmd, strlen(cmd));
3116redtrain 0:b22b65ced05f 241 i++;
3116redtrain 0:b22b65ced05f 242 break;
3116redtrain 0:b22b65ced05f 243 case 4:
3116redtrain 0:b22b65ced05f 244 sprintf(cmd, "Connection: Upgrade\r\n");
3116redtrain 0:b22b65ced05f 245 sock->send(cmd, strlen(cmd));
3116redtrain 0:b22b65ced05f 246 i++;
3116redtrain 0:b22b65ced05f 247 break;
3116redtrain 0:b22b65ced05f 248 case 5:
3116redtrain 0:b22b65ced05f 249 sprintf(cmd, "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n");
3116redtrain 0:b22b65ced05f 250 sock->send(cmd, strlen(cmd));
3116redtrain 0:b22b65ced05f 251 i++;
3116redtrain 0:b22b65ced05f 252 break;
3116redtrain 0:b22b65ced05f 253 case 6:
3116redtrain 0:b22b65ced05f 254 sprintf(cmd, "Sec-WebSocket-key2: 12998 5 Y3 1 .P00\r\n\r\n");
3116redtrain 0:b22b65ced05f 255 sock->send(cmd, strlen(cmd));
3116redtrain 0:b22b65ced05f 256 i++;
3116redtrain 0:b22b65ced05f 257 break;
3116redtrain 0:b22b65ced05f 258 case 7:
3116redtrain 0:b22b65ced05f 259 sock->send("^n:ds[4U", 8);
3116redtrain 0:b22b65ced05f 260 i++;
3116redtrain 0:b22b65ced05f 261 break;
3116redtrain 0:b22b65ced05f 262 case 8:
3116redtrain 0:b22b65ced05f 263 if (response_server_eth)
3116redtrain 0:b22b65ced05f 264 i++;
3116redtrain 0:b22b65ced05f 265 else
3116redtrain 0:b22b65ced05f 266 break;
3116redtrain 0:b22b65ced05f 267
3116redtrain 0:b22b65ced05f 268 default:
3116redtrain 0:b22b65ced05f 269 break;
3116redtrain 0:b22b65ced05f 270 }
3116redtrain 0:b22b65ced05f 271 }
3116redtrain 0:b22b65ced05f 272 if (i==9) {
3116redtrain 0:b22b65ced05f 273 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 274 printf("\r\nip_domain: %s\r\npath: /%s\r\nport: %s\r\n\r\n",this->ip_domain.c_str(), this->path.c_str(), this->port.c_str());
3116redtrain 0:b22b65ced05f 275 #endif
3116redtrain 0:b22b65ced05f 276 return true;
3116redtrain 0:b22b65ced05f 277 }
3116redtrain 0:b22b65ced05f 278 }
3116redtrain 0:b22b65ced05f 279 }
3116redtrain 0:b22b65ced05f 280 }
3116redtrain 0:b22b65ced05f 281 //the program shouldn't be here
3116redtrain 0:b22b65ced05f 282 return false;
3116redtrain 0:b22b65ced05f 283 }
3116redtrain 0:b22b65ced05f 284
3116redtrain 0:b22b65ced05f 285 void Websocket::send(char * str) {
3116redtrain 0:b22b65ced05f 286 #ifdef WIFLY
3116redtrain 0:b22b65ced05f 287 if (netif == WIF) {
3116redtrain 0:b22b65ced05f 288 wifi->putc('\x00');
3116redtrain 0:b22b65ced05f 289 wifi->send(str, "NO");
3116redtrain 0:b22b65ced05f 290 wifi->putc('\xff');
3116redtrain 0:b22b65ced05f 291 } else
3116redtrain 0:b22b65ced05f 292 #endif
3116redtrain 0:b22b65ced05f 293 if (netif == ETH) {
3116redtrain 0:b22b65ced05f 294 char c = '\x00';
3116redtrain 0:b22b65ced05f 295 Net::poll();
3116redtrain 0:b22b65ced05f 296 sock->send(&c, 1);
3116redtrain 0:b22b65ced05f 297 sock->send(str, strlen(str));
3116redtrain 0:b22b65ced05f 298 c = '\xff';
3116redtrain 0:b22b65ced05f 299 sock->send(&c, 1);
3116redtrain 0:b22b65ced05f 300 }
3116redtrain 0:b22b65ced05f 301 }
3116redtrain 0:b22b65ced05f 302
3116redtrain 0:b22b65ced05f 303 bool Websocket::read(char * message) {
3116redtrain 0:b22b65ced05f 304 int i = 0;
3116redtrain 0:b22b65ced05f 305
3116redtrain 0:b22b65ced05f 306 #ifdef WIFLY
3116redtrain 0:b22b65ced05f 307 if (netif == WIF) {
3116redtrain 0:b22b65ced05f 308 if (!wifi->read(message))
3116redtrain 0:b22b65ced05f 309 return false;
3116redtrain 0:b22b65ced05f 310
3116redtrain 0:b22b65ced05f 311 //we check if the first byte is 0x00
3116redtrain 0:b22b65ced05f 312 if (message == NULL || message[0] != 0x00) {
3116redtrain 0:b22b65ced05f 313 message = NULL;
3116redtrain 0:b22b65ced05f 314 return false;
3116redtrain 0:b22b65ced05f 315 }
3116redtrain 0:b22b65ced05f 316
3116redtrain 0:b22b65ced05f 317 while (message[i + 1] != 0xff && i < strlen(message + 1))
3116redtrain 0:b22b65ced05f 318 i++;
3116redtrain 0:b22b65ced05f 319
3116redtrain 0:b22b65ced05f 320 if (message[i+1] == 0xff) {
3116redtrain 0:b22b65ced05f 321 message[i+1] = 0;
3116redtrain 0:b22b65ced05f 322 memcpy(message, message + 1, strlen(message + 1) + 1);
3116redtrain 0:b22b65ced05f 323 return true;
3116redtrain 0:b22b65ced05f 324 } else {
3116redtrain 0:b22b65ced05f 325 message = NULL;
3116redtrain 0:b22b65ced05f 326 return false;
3116redtrain 0:b22b65ced05f 327 }
3116redtrain 0:b22b65ced05f 328 } else
3116redtrain 0:b22b65ced05f 329 #endif
3116redtrain 0:b22b65ced05f 330 if (netif == ETH) {
3116redtrain 0:b22b65ced05f 331 Net::poll();
3116redtrain 0:b22b65ced05f 332
3116redtrain 0:b22b65ced05f 333 if (new_msg) {
3116redtrain 0:b22b65ced05f 334 if (eth_rx[0] != 0x00) {
3116redtrain 0:b22b65ced05f 335 message = NULL;
3116redtrain 0:b22b65ced05f 336 return false;
3116redtrain 0:b22b65ced05f 337 }
3116redtrain 0:b22b65ced05f 338 while (eth_rx[i + 1] != 0xff) {
3116redtrain 0:b22b65ced05f 339 message[i] = eth_rx[i + 1];
3116redtrain 0:b22b65ced05f 340 i++;
3116redtrain 0:b22b65ced05f 341 }
3116redtrain 0:b22b65ced05f 342 message[i] = 0;
3116redtrain 0:b22b65ced05f 343 new_msg = false;
3116redtrain 0:b22b65ced05f 344 return true;
3116redtrain 0:b22b65ced05f 345 }
3116redtrain 0:b22b65ced05f 346 return false;
3116redtrain 0:b22b65ced05f 347 }
3116redtrain 0:b22b65ced05f 348 //the program shouldn't be here
3116redtrain 0:b22b65ced05f 349 return false;
3116redtrain 0:b22b65ced05f 350 }
3116redtrain 0:b22b65ced05f 351
3116redtrain 0:b22b65ced05f 352 bool Websocket::close() {
3116redtrain 0:b22b65ced05f 353 #ifdef WIFLY
3116redtrain 0:b22b65ced05f 354 if (netif == WIF) {
3116redtrain 0:b22b65ced05f 355 if (!wifi->cmdMode()) {
3116redtrain 0:b22b65ced05f 356 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 357 printf("Websocket::close: cannot enter in cmd mode\r\n");
3116redtrain 0:b22b65ced05f 358 #endif
3116redtrain 0:b22b65ced05f 359 return false;
3116redtrain 0:b22b65ced05f 360 }
3116redtrain 0:b22b65ced05f 361
3116redtrain 0:b22b65ced05f 362 wifi->send("close\r", "NO");
3116redtrain 0:b22b65ced05f 363
3116redtrain 0:b22b65ced05f 364 if (!wifi->exit())
3116redtrain 0:b22b65ced05f 365 return false;
3116redtrain 0:b22b65ced05f 366 } else
3116redtrain 0:b22b65ced05f 367 #endif
3116redtrain 0:b22b65ced05f 368 if (netif == ETH) {
3116redtrain 0:b22b65ced05f 369
3116redtrain 0:b22b65ced05f 370 if (sock->close())
3116redtrain 0:b22b65ced05f 371 return false;
3116redtrain 0:b22b65ced05f 372 return true;
3116redtrain 0:b22b65ced05f 373 }
3116redtrain 0:b22b65ced05f 374 //the program shouldn't be here
3116redtrain 0:b22b65ced05f 375 return false;
3116redtrain 0:b22b65ced05f 376 }
3116redtrain 0:b22b65ced05f 377
3116redtrain 0:b22b65ced05f 378
3116redtrain 0:b22b65ced05f 379
3116redtrain 0:b22b65ced05f 380 bool Websocket::connected() {
3116redtrain 0:b22b65ced05f 381 #ifdef WIFLY
3116redtrain 0:b22b65ced05f 382 if (netif == WIF) {
3116redtrain 0:b22b65ced05f 383 char str[10];
3116redtrain 0:b22b65ced05f 384
3116redtrain 0:b22b65ced05f 385 wait(0.25);
3116redtrain 0:b22b65ced05f 386 if (!wifi->cmdMode()) {
3116redtrain 0:b22b65ced05f 387 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 388 printf("Websocket::connected: cannot enter in cmd mode\r\n");
3116redtrain 0:b22b65ced05f 389 #endif
3116redtrain 0:b22b65ced05f 390 return false;
3116redtrain 0:b22b65ced05f 391 }
3116redtrain 0:b22b65ced05f 392 wait(0.25);
3116redtrain 0:b22b65ced05f 393
3116redtrain 0:b22b65ced05f 394 wifi->send("show c\r\n", "NO", str);
3116redtrain 0:b22b65ced05f 395
3116redtrain 0:b22b65ced05f 396 if (str[3] == '1') {
3116redtrain 0:b22b65ced05f 397 if (!wifi->exit()) {
3116redtrain 0:b22b65ced05f 398 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 399 printf("Websocket::connected: cannot exit\r\n");
3116redtrain 0:b22b65ced05f 400 #endif
3116redtrain 0:b22b65ced05f 401 return false;
3116redtrain 0:b22b65ced05f 402 }
3116redtrain 0:b22b65ced05f 403 return true;
3116redtrain 0:b22b65ced05f 404 }
3116redtrain 0:b22b65ced05f 405 if (!wifi->exit()) {
3116redtrain 0:b22b65ced05f 406 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 407 printf("Websocket::connected: cannot exit\r\n");
3116redtrain 0:b22b65ced05f 408 #endif
3116redtrain 0:b22b65ced05f 409 }
3116redtrain 0:b22b65ced05f 410 return false;
3116redtrain 0:b22b65ced05f 411 } else
3116redtrain 0:b22b65ced05f 412 #endif
3116redtrain 0:b22b65ced05f 413 if (netif == ETH) {
3116redtrain 0:b22b65ced05f 414
3116redtrain 0:b22b65ced05f 415 return eth_connected;
3116redtrain 0:b22b65ced05f 416 }
3116redtrain 0:b22b65ced05f 417 //the program shouldn't be here
3116redtrain 0:b22b65ced05f 418 return false;
3116redtrain 0:b22b65ced05f 419 }
3116redtrain 0:b22b65ced05f 420
3116redtrain 0:b22b65ced05f 421 std::string Websocket::getPath()
3116redtrain 0:b22b65ced05f 422 {
3116redtrain 0:b22b65ced05f 423 return path;
3116redtrain 0:b22b65ced05f 424 }
3116redtrain 0:b22b65ced05f 425
3116redtrain 0:b22b65ced05f 426
3116redtrain 0:b22b65ced05f 427
3116redtrain 0:b22b65ced05f 428
3116redtrain 0:b22b65ced05f 429 void Websocket::onTCPSocketEvent(TCPSocketEvent e) {
3116redtrain 0:b22b65ced05f 430 if (e == TCPSOCKET_CONNECTED) {
3116redtrain 0:b22b65ced05f 431 eth_connected = true;
3116redtrain 0:b22b65ced05f 432 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 433 printf("TCP Socket Connected\r\n");
3116redtrain 0:b22b65ced05f 434 #endif
3116redtrain 0:b22b65ced05f 435 } else if (e == TCPSOCKET_WRITEABLE) {
3116redtrain 0:b22b65ced05f 436 } else if (e == TCPSOCKET_READABLE) {
3116redtrain 0:b22b65ced05f 437 int len = sock->recv(eth_rx, 512);
3116redtrain 0:b22b65ced05f 438 eth_rx[len] = 0;
3116redtrain 0:b22b65ced05f 439 new_msg = true;
3116redtrain 0:b22b65ced05f 440 if (!response_server_eth) {
3116redtrain 0:b22b65ced05f 441 string checking;
3116redtrain 0:b22b65ced05f 442 size_t found = string::npos;
3116redtrain 0:b22b65ced05f 443 checking = eth_rx;
3116redtrain 0:b22b65ced05f 444 found = checking.find("HTTP");
3116redtrain 0:b22b65ced05f 445 if (found != string::npos)
3116redtrain 0:b22b65ced05f 446 response_server_eth = true;
3116redtrain 0:b22b65ced05f 447 }
3116redtrain 0:b22b65ced05f 448 } else {
3116redtrain 0:b22b65ced05f 449 #ifdef DEBUG
3116redtrain 0:b22b65ced05f 450 printf("TCP Socket Fail\r\n");
3116redtrain 0:b22b65ced05f 451 #endif
3116redtrain 0:b22b65ced05f 452 eth_connected = false;
3116redtrain 0:b22b65ced05f 453 }
3116redtrain 0:b22b65ced05f 454 }
3116redtrain 0:b22b65ced05f 455
3116redtrain 0:b22b65ced05f 456