esp8266 websocket and socket

Committer:
metabi814
Date:
Fri Jun 12 10:06:12 2015 +0000
Revision:
0:46166e7d81a8
ESP8266 socket and websocket ; -set ip ; -set mac

Who changed what in which revision?

UserRevisionLine numberNew contents of line
metabi814 0:46166e7d81a8 1 #include "mbed.h"
metabi814 0:46166e7d81a8 2 #include "ESP8266.h"
metabi814 0:46166e7d81a8 3
metabi814 0:46166e7d81a8 4 #define MAX_TRY_WRITE 20
metabi814 0:46166e7d81a8 5 #define MAX_TRY_READ 10
metabi814 0:46166e7d81a8 6
metabi814 0:46166e7d81a8 7 //Debug is disabled by default
metabi814 0:46166e7d81a8 8 #if 0
metabi814 0:46166e7d81a8 9 #define DBG(x, ...) std::printf("[WebSocket : DBG]"x"\r\n", ##__VA_ARGS__);
metabi814 0:46166e7d81a8 10 #define WARN(x, ...) std::printf("[WebSocket : WARN]"x"\r\n", ##__VA_ARGS__);
metabi814 0:46166e7d81a8 11 #define ERR(x, ...) std::printf("[WebSocket : ERR]"x"\r\n", ##__VA_ARGS__);
metabi814 0:46166e7d81a8 12 #else
metabi814 0:46166e7d81a8 13 #define DBG(x, ...)
metabi814 0:46166e7d81a8 14 #define WARN(x, ...)
metabi814 0:46166e7d81a8 15 #define ERR(x, ...)
metabi814 0:46166e7d81a8 16 #endif
metabi814 0:46166e7d81a8 17
metabi814 0:46166e7d81a8 18 #define INFO(x, ...) printf("[WebSocket : INFO]"x"\r\n", ##__VA_ARGS__);
metabi814 0:46166e7d81a8 19
metabi814 0:46166e7d81a8 20 esp8266* esp8266::inst;
metabi814 0:46166e7d81a8 21
metabi814 0:46166e7d81a8 22 esp8266::esp8266(PinName tx,PinName rx,int baudRate, const char *ssid, const char *password,const char *host,const char *port) : Modem(tx,rx,baudRate)
metabi814 0:46166e7d81a8 23 {
metabi814 0:46166e7d81a8 24 inst = this;
metabi814 0:46166e7d81a8 25 _ssid=ssid;
metabi814 0:46166e7d81a8 26 _password=password;
metabi814 0:46166e7d81a8 27 _host=host;
metabi814 0:46166e7d81a8 28 _port=port;
metabi814 0:46166e7d81a8 29 }
metabi814 0:46166e7d81a8 30
metabi814 0:46166e7d81a8 31 bool esp8266::join()
metabi814 0:46166e7d81a8 32 {
metabi814 0:46166e7d81a8 33 char cmd[64];
metabi814 0:46166e7d81a8 34 int r;
metabi814 0:46166e7d81a8 35 //disable echo
metabi814 0:46166e7d81a8 36 sendCmd("ATE0\r\n");
metabi814 0:46166e7d81a8 37
metabi814 0:46166e7d81a8 38 r=sendCmdAndWaitForResp("AT+CWMODE=1\r\n","OK",DEFAULT_TIMEOUT,CMD);
metabi814 0:46166e7d81a8 39 printf("wifi.CWMODE=%d\r\n",r);
metabi814 0:46166e7d81a8 40
metabi814 0:46166e7d81a8 41 snprintf(cmd,sizeof(cmd),"AT+CWJAP=\"%s\",\"%s\"\r\n",_ssid,_password);
metabi814 0:46166e7d81a8 42 printf("mensaje=%s\r\n",cmd);
metabi814 0:46166e7d81a8 43 r=sendCmdAndWaitForResp(cmd,"OK",15,CMD);
metabi814 0:46166e7d81a8 44 printf("wifi.CWJAP=%d\r\n",r);
metabi814 0:46166e7d81a8 45
metabi814 0:46166e7d81a8 46 if(r==0) {
metabi814 0:46166e7d81a8 47 getip();
metabi814 0:46166e7d81a8 48 return true;
metabi814 0:46166e7d81a8 49 } else {
metabi814 0:46166e7d81a8 50 return false;
metabi814 0:46166e7d81a8 51 }
metabi814 0:46166e7d81a8 52
metabi814 0:46166e7d81a8 53
metabi814 0:46166e7d81a8 54 }
metabi814 0:46166e7d81a8 55
metabi814 0:46166e7d81a8 56 int esp8266::connect(int socket)
metabi814 0:46166e7d81a8 57 {
metabi814 0:46166e7d81a8 58 char cmd[64];
metabi814 0:46166e7d81a8 59 int r;
metabi814 0:46166e7d81a8 60
metabi814 0:46166e7d81a8 61 r=sendCmdAndWaitForResp("AT+CIPMUX=1\r\n","OK",DEFAULT_TIMEOUT,CMD);
metabi814 0:46166e7d81a8 62 printf("socket.CIPMUX1=%d\r\n",r);
metabi814 0:46166e7d81a8 63
metabi814 0:46166e7d81a8 64
metabi814 0:46166e7d81a8 65 sprintf(cmd,"AT+CIPSTART=%d,\"TCP\",\"%s\",%s\r\n",socket,_host,_port);
metabi814 0:46166e7d81a8 66 printf("mensaje2=%s\r\n",cmd);
metabi814 0:46166e7d81a8 67 r=sendCmdAndWaitForResp(cmd,"CONNECT",15,CMD);
metabi814 0:46166e7d81a8 68 printf("socket.AT+CIPSTART=%d\r\n",r);
metabi814 0:46166e7d81a8 69
metabi814 0:46166e7d81a8 70 return r;
metabi814 0:46166e7d81a8 71 }
metabi814 0:46166e7d81a8 72
metabi814 0:46166e7d81a8 73 int esp8266::send(int socket,const char * str,int len)
metabi814 0:46166e7d81a8 74 {
metabi814 0:46166e7d81a8 75
metabi814 0:46166e7d81a8 76 char cmd[100];
metabi814 0:46166e7d81a8 77 cleanBuffer(cmd,100);
metabi814 0:46166e7d81a8 78 wait(0.3);
metabi814 0:46166e7d81a8 79 if(len > 0) {
metabi814 0:46166e7d81a8 80 snprintf(cmd,sizeof(cmd),"AT+CIPSEND=%d,%d\r\n",socket,len);
metabi814 0:46166e7d81a8 81 printf("mensaje3=%s\r\n",cmd);
metabi814 0:46166e7d81a8 82 if(0 != sendCmdAndWaitForResp(cmd,">",2,CMD)) {
metabi814 0:46166e7d81a8 83 return -1;
metabi814 0:46166e7d81a8 84 }
metabi814 0:46166e7d81a8 85 sendCmd(str);
metabi814 0:46166e7d81a8 86
metabi814 0:46166e7d81a8 87 }
metabi814 0:46166e7d81a8 88 return len;
metabi814 0:46166e7d81a8 89 }
metabi814 0:46166e7d81a8 90
metabi814 0:46166e7d81a8 91 bool esp8266::disconnect(int socket)
metabi814 0:46166e7d81a8 92 {
metabi814 0:46166e7d81a8 93 char cmd[35];
metabi814 0:46166e7d81a8 94 sprintf(cmd,"AT+CIPCLOSE=%d\r\n",socket);
metabi814 0:46166e7d81a8 95 sendCmd(cmd);
metabi814 0:46166e7d81a8 96
metabi814 0:46166e7d81a8 97 return true;
metabi814 0:46166e7d81a8 98 }
metabi814 0:46166e7d81a8 99
metabi814 0:46166e7d81a8 100
metabi814 0:46166e7d81a8 101 void esp8266::reset()
metabi814 0:46166e7d81a8 102 {
metabi814 0:46166e7d81a8 103 sendCmdAndWaitForResp("AT+CWMODE=1\r\n","OK",DEFAULT_TIMEOUT,CMD);
metabi814 0:46166e7d81a8 104 sendCmd("AT+RST\r\n");
metabi814 0:46166e7d81a8 105 }
metabi814 0:46166e7d81a8 106
metabi814 0:46166e7d81a8 107 bool esp8266::is_connected() //RETURN 2 GOT IP 3 CONNECTED 4 DISCONNECTED
metabi814 0:46166e7d81a8 108 {
metabi814 0:46166e7d81a8 109 char resp[20];
metabi814 0:46166e7d81a8 110
metabi814 0:46166e7d81a8 111 sendCmd("AT+CIPSTATUS\r\n");
metabi814 0:46166e7d81a8 112 readBuffer(resp,sizeof(resp),DEFAULT_TIMEOUT/2);
metabi814 0:46166e7d81a8 113 if(NULL != strstr(resp,"STATUS:3")) {
metabi814 0:46166e7d81a8 114 //+CIPSTATUS: 1,0,"TCP","216.52.233.120","80","CONNECTED"
metabi814 0:46166e7d81a8 115 return true;
metabi814 0:46166e7d81a8 116 } else {
metabi814 0:46166e7d81a8 117 //+CIPSTATUS: 1,0,"TCP","216.52.233.120","80","CLOSED"
metabi814 0:46166e7d81a8 118 //+CIPSTATUS: 0,,"","","","INITIAL"
metabi814 0:46166e7d81a8 119 return false;
metabi814 0:46166e7d81a8 120 }
metabi814 0:46166e7d81a8 121 }
metabi814 0:46166e7d81a8 122
metabi814 0:46166e7d81a8 123 void esp8266::getip()
metabi814 0:46166e7d81a8 124 {
metabi814 0:46166e7d81a8 125 sendCmd("AT+CIFSR\r\n");
metabi814 0:46166e7d81a8 126 readBuffer(_ip,100,10);
metabi814 0:46166e7d81a8 127 }
metabi814 0:46166e7d81a8 128
metabi814 0:46166e7d81a8 129 void esp8266::set_sta_ip(char * s_ip)
metabi814 0:46166e7d81a8 130 {
metabi814 0:46166e7d81a8 131 int r;
metabi814 0:46166e7d81a8 132 char cmd[30];
metabi814 0:46166e7d81a8 133 sprintf(cmd,"AT+CIPSTA=\"%s\"\r\n",s_ip);
metabi814 0:46166e7d81a8 134 r=sendCmdAndWaitForResp(cmd,"OK",5,CMD);
metabi814 0:46166e7d81a8 135 printf("mensaje4=%s\r\n",cmd);
metabi814 0:46166e7d81a8 136 printf("cambio ip=%d\r\n",r);
metabi814 0:46166e7d81a8 137 getip();
metabi814 0:46166e7d81a8 138 }
metabi814 0:46166e7d81a8 139
metabi814 0:46166e7d81a8 140 void esp8266::list_ap()
metabi814 0:46166e7d81a8 141 {
metabi814 0:46166e7d81a8 142 int r;
metabi814 0:46166e7d81a8 143 r=sendCmdAndWaitForResp("AT+CWLAP\r\n","+",5,CMD);
metabi814 0:46166e7d81a8 144 printf("cambio ip=%d\r\n",r);
metabi814 0:46166e7d81a8 145 readBuffer(_lap,2000,10);
metabi814 0:46166e7d81a8 146 }
metabi814 0:46166e7d81a8 147
metabi814 0:46166e7d81a8 148 int esp8266::recv(char* buf, int len)
metabi814 0:46166e7d81a8 149 {
metabi814 0:46166e7d81a8 150 cleanBuffer(buf,len);
metabi814 0:46166e7d81a8 151 readBuffer(buf,len,DEFAULT_TIMEOUT/2);
metabi814 0:46166e7d81a8 152 return len;
metabi814 0:46166e7d81a8 153 //return strlen(buf);
metabi814 0:46166e7d81a8 154 }
metabi814 0:46166e7d81a8 155
metabi814 0:46166e7d81a8 156 //----------------------------------websocket-------------------------------------------------------
metabi814 0:46166e7d81a8 157
metabi814 0:46166e7d81a8 158 void esp8266::websocket(char * url)
metabi814 0:46166e7d81a8 159 {
metabi814 0:46166e7d81a8 160 int ret = parseURL(url, scheme, sizeof(scheme), host, sizeof(host), &port, path, sizeof(path));
metabi814 0:46166e7d81a8 161 if(ret) {
metabi814 0:46166e7d81a8 162 ERR("URL parsing failed; please use: \"ws://ip-or-domain[:port]/path\"");
metabi814 0:46166e7d81a8 163 return;
metabi814 0:46166e7d81a8 164 }
metabi814 0:46166e7d81a8 165
metabi814 0:46166e7d81a8 166 if(port == 0) { //TODO do handle WSS->443
metabi814 0:46166e7d81a8 167 port = 80;
metabi814 0:46166e7d81a8 168 }
metabi814 0:46166e7d81a8 169
metabi814 0:46166e7d81a8 170 if(strcmp(scheme, "ws")) {
metabi814 0:46166e7d81a8 171 ERR("Wrong scheme, please use \"ws\" instead");
metabi814 0:46166e7d81a8 172 }
metabi814 0:46166e7d81a8 173 }
metabi814 0:46166e7d81a8 174
metabi814 0:46166e7d81a8 175 int esp8266::parseURL(const char* url, char* scheme, size_t maxSchemeLen, char* host, size_t maxHostLen, uint16_t* port, char* path, size_t maxPathLen) //Parse URL
metabi814 0:46166e7d81a8 176 {
metabi814 0:46166e7d81a8 177 char* schemePtr = (char*) url;
metabi814 0:46166e7d81a8 178 char* hostPtr = (char*) strstr(url, "://");
metabi814 0:46166e7d81a8 179 if(hostPtr == NULL) {
metabi814 0:46166e7d81a8 180 WARN("Could not find host");
metabi814 0:46166e7d81a8 181 return -1; //URL is invalid
metabi814 0:46166e7d81a8 182 }
metabi814 0:46166e7d81a8 183
metabi814 0:46166e7d81a8 184 if( maxSchemeLen < hostPtr - schemePtr + 1 ) { //including NULL-terminating char
metabi814 0:46166e7d81a8 185 WARN("Scheme str is too small (%d >= %d)", maxSchemeLen, hostPtr - schemePtr + 1);
metabi814 0:46166e7d81a8 186 return -1;
metabi814 0:46166e7d81a8 187 }
metabi814 0:46166e7d81a8 188 memcpy(scheme, schemePtr, hostPtr - schemePtr);
metabi814 0:46166e7d81a8 189 scheme[hostPtr - schemePtr] = '\0';
metabi814 0:46166e7d81a8 190
metabi814 0:46166e7d81a8 191 hostPtr+=3;
metabi814 0:46166e7d81a8 192
metabi814 0:46166e7d81a8 193 size_t hostLen = 0;
metabi814 0:46166e7d81a8 194
metabi814 0:46166e7d81a8 195 char* portPtr = strchr(hostPtr, ':');
metabi814 0:46166e7d81a8 196 if( portPtr != NULL ) {
metabi814 0:46166e7d81a8 197 hostLen = portPtr - hostPtr;
metabi814 0:46166e7d81a8 198 portPtr++;
metabi814 0:46166e7d81a8 199 if( sscanf(portPtr, "%hu", port) != 1) {
metabi814 0:46166e7d81a8 200 WARN("Could not find port");
metabi814 0:46166e7d81a8 201 return -1;
metabi814 0:46166e7d81a8 202 }
metabi814 0:46166e7d81a8 203 } else {
metabi814 0:46166e7d81a8 204 *port=0;
metabi814 0:46166e7d81a8 205 }
metabi814 0:46166e7d81a8 206 char* pathPtr = strchr(hostPtr, '/');
metabi814 0:46166e7d81a8 207 if( hostLen == 0 ) {
metabi814 0:46166e7d81a8 208 hostLen = pathPtr - hostPtr;
metabi814 0:46166e7d81a8 209 }
metabi814 0:46166e7d81a8 210
metabi814 0:46166e7d81a8 211 if( maxHostLen < hostLen + 1 ) { //including NULL-terminating char
metabi814 0:46166e7d81a8 212 WARN("Host str is too small (%d >= %d)", maxHostLen, hostLen + 1);
metabi814 0:46166e7d81a8 213 return -1;
metabi814 0:46166e7d81a8 214 }
metabi814 0:46166e7d81a8 215 memcpy(host, hostPtr, hostLen);
metabi814 0:46166e7d81a8 216 host[hostLen] = '\0';
metabi814 0:46166e7d81a8 217
metabi814 0:46166e7d81a8 218 size_t pathLen;
metabi814 0:46166e7d81a8 219 char* fragmentPtr = strchr(hostPtr, '#');
metabi814 0:46166e7d81a8 220 if(fragmentPtr != NULL) {
metabi814 0:46166e7d81a8 221 pathLen = fragmentPtr - pathPtr;
metabi814 0:46166e7d81a8 222 } else {
metabi814 0:46166e7d81a8 223 pathLen = strlen(pathPtr);
metabi814 0:46166e7d81a8 224 }
metabi814 0:46166e7d81a8 225
metabi814 0:46166e7d81a8 226 if( maxPathLen < pathLen + 1 ) { //including NULL-terminating char
metabi814 0:46166e7d81a8 227 WARN("Path str is too small (%d >= %d)", maxPathLen, pathLen + 1);
metabi814 0:46166e7d81a8 228 return -1;
metabi814 0:46166e7d81a8 229 }
metabi814 0:46166e7d81a8 230 memcpy(path, pathPtr, pathLen);
metabi814 0:46166e7d81a8 231 path[pathLen] = '\0';
metabi814 0:46166e7d81a8 232
metabi814 0:46166e7d81a8 233 return 0;
metabi814 0:46166e7d81a8 234 }
metabi814 0:46166e7d81a8 235
metabi814 0:46166e7d81a8 236 bool esp8266::w_connect(int socket) {
metabi814 0:46166e7d81a8 237 char cmd[200];
metabi814 0:46166e7d81a8 238 /*
metabi814 0:46166e7d81a8 239 while (connect(socket) < 0) {
metabi814 0:46166e7d81a8 240 ERR("Unable to connect to (%s) on port (%d)", host, port);
metabi814 0:46166e7d81a8 241 wait(0.2);
metabi814 0:46166e7d81a8 242 return false;
metabi814 0:46166e7d81a8 243 }
metabi814 0:46166e7d81a8 244 */
metabi814 0:46166e7d81a8 245 // sent http header to upgrade to the ws protocol
metabi814 0:46166e7d81a8 246
metabi814 0:46166e7d81a8 247 printf("path=%s\r\n",path);
metabi814 0:46166e7d81a8 248 printf("host=%s\r\n",host);
metabi814 0:46166e7d81a8 249 printf("port=%d\r\n",port);
metabi814 0:46166e7d81a8 250
metabi814 0:46166e7d81a8 251 sprintf(cmd, "GET %s HTTP/1.1\r\n", path);
metabi814 0:46166e7d81a8 252 printf("n-GET=%d\r\n",strlen(cmd));
metabi814 0:46166e7d81a8 253 printf("%s\r\n",cmd);
metabi814 0:46166e7d81a8 254 write(cmd, strlen(cmd));
metabi814 0:46166e7d81a8 255
metabi814 0:46166e7d81a8 256 sprintf(cmd, "Host: %s:%d\r\n", host, port);
metabi814 0:46166e7d81a8 257 printf("n-host=%d\r\n",strlen(cmd));
metabi814 0:46166e7d81a8 258 printf("%s\r\n",cmd);
metabi814 0:46166e7d81a8 259 write(cmd, strlen(cmd));
metabi814 0:46166e7d81a8 260
metabi814 0:46166e7d81a8 261 sprintf(cmd, "Upgrade: WebSocket\r\n");
metabi814 0:46166e7d81a8 262 printf("n-up=%d\r\n",strlen(cmd));
metabi814 0:46166e7d81a8 263 printf("%s\r\n",cmd);
metabi814 0:46166e7d81a8 264 write(cmd, strlen(cmd));
metabi814 0:46166e7d81a8 265
metabi814 0:46166e7d81a8 266 sprintf(cmd, "Connection: Upgrade\r\n");
metabi814 0:46166e7d81a8 267 printf("n-con=%d\r\n",strlen(cmd));
metabi814 0:46166e7d81a8 268 printf("%s\r\n",cmd);
metabi814 0:46166e7d81a8 269 write(cmd, strlen(cmd));
metabi814 0:46166e7d81a8 270
metabi814 0:46166e7d81a8 271 sprintf(cmd, "Sec-WebSocket-Key: L159VM0TWUzyDxwJEIEzjw==\r\n");
metabi814 0:46166e7d81a8 272 printf("n-key=%d\r\n",strlen(cmd));
metabi814 0:46166e7d81a8 273 printf("%s\r\n",cmd);
metabi814 0:46166e7d81a8 274 write(cmd, strlen(cmd));
metabi814 0:46166e7d81a8 275
metabi814 0:46166e7d81a8 276 sprintf(cmd, "Sec-WebSocket-Version: 13\r\n\r\n");
metabi814 0:46166e7d81a8 277 printf("n-ver=%d\r\n",strlen(cmd));
metabi814 0:46166e7d81a8 278 printf("%s\r\n",cmd);
metabi814 0:46166e7d81a8 279 int ret = write(cmd, strlen(cmd));
metabi814 0:46166e7d81a8 280 if (ret != strlen(cmd)) {
metabi814 0:46166e7d81a8 281 disconnect(socket);
metabi814 0:46166e7d81a8 282 ERR("Could not send request");
metabi814 0:46166e7d81a8 283 return false;
metabi814 0:46166e7d81a8 284 }
metabi814 0:46166e7d81a8 285
metabi814 0:46166e7d81a8 286 ret = read(cmd, 200, 100);
metabi814 0:46166e7d81a8 287 if (ret < 0) {
metabi814 0:46166e7d81a8 288 disconnect(socket);
metabi814 0:46166e7d81a8 289 ERR("Could not receive answer\r\n");
metabi814 0:46166e7d81a8 290 return false;
metabi814 0:46166e7d81a8 291 }
metabi814 0:46166e7d81a8 292
metabi814 0:46166e7d81a8 293 cmd[ret] = '\0';
metabi814 0:46166e7d81a8 294 DBG("recv: %s\r\n", cmd);
metabi814 0:46166e7d81a8 295
metabi814 0:46166e7d81a8 296 if ( strstr(cmd, "DdLWT/1JcX+nQFHebYP+rqEx5xI=") == NULL ) {
metabi814 0:46166e7d81a8 297 ERR("Wrong answer from server, got \"%s\" instead\r\n", cmd);
metabi814 0:46166e7d81a8 298 do {
metabi814 0:46166e7d81a8 299 ret = read(cmd, 200, 100);
metabi814 0:46166e7d81a8 300 if (ret < 0) {
metabi814 0:46166e7d81a8 301 ERR("Could not receive answer\r\n");
metabi814 0:46166e7d81a8 302 return false;
metabi814 0:46166e7d81a8 303 }
metabi814 0:46166e7d81a8 304 cmd[ret] = '\0';
metabi814 0:46166e7d81a8 305 printf("%s",cmd);
metabi814 0:46166e7d81a8 306 } while (ret > 0);
metabi814 0:46166e7d81a8 307 disconnect(socket);
metabi814 0:46166e7d81a8 308 return false;
metabi814 0:46166e7d81a8 309 }
metabi814 0:46166e7d81a8 310
metabi814 0:46166e7d81a8 311 INFO("\r\nhost: %s\r\npath: %s\r\nport: %d\r\n\r\n", host, path, port);
metabi814 0:46166e7d81a8 312 return true;
metabi814 0:46166e7d81a8 313 }
metabi814 0:46166e7d81a8 314
metabi814 0:46166e7d81a8 315 int esp8266::sendLength(uint32_t len, char * msg) { //sendlength(5,msg+1)
metabi814 0:46166e7d81a8 316
metabi814 0:46166e7d81a8 317 if (len < 126) {
metabi814 0:46166e7d81a8 318 msg[0] = len | (1<<7);
metabi814 0:46166e7d81a8 319 return 1;
metabi814 0:46166e7d81a8 320 } else if (len < 65535) {
metabi814 0:46166e7d81a8 321 msg[0] = 126 | (1<<7);
metabi814 0:46166e7d81a8 322 msg[1] = (len >> 8) & 0xff;
metabi814 0:46166e7d81a8 323 msg[2] = len & 0xff;
metabi814 0:46166e7d81a8 324 return 3;
metabi814 0:46166e7d81a8 325 } else {
metabi814 0:46166e7d81a8 326 msg[0] = 127 | (1<<7);
metabi814 0:46166e7d81a8 327 for (int i = 0; i < 8; i++) {
metabi814 0:46166e7d81a8 328 msg[i+1] = (len >> i*8) & 0xff;
metabi814 0:46166e7d81a8 329 }
metabi814 0:46166e7d81a8 330 return 9;
metabi814 0:46166e7d81a8 331 }
metabi814 0:46166e7d81a8 332 }
metabi814 0:46166e7d81a8 333
metabi814 0:46166e7d81a8 334 int esp8266::readChar(char * pC, bool block) {
metabi814 0:46166e7d81a8 335 return read(pC, 1, 1);
metabi814 0:46166e7d81a8 336 }
metabi814 0:46166e7d81a8 337
metabi814 0:46166e7d81a8 338 int esp8266::sendOpcode(uint8_t opcode, char * msg) {
metabi814 0:46166e7d81a8 339 msg[0] = 0x80 | (opcode & 0x0f);
metabi814 0:46166e7d81a8 340 return 1;
metabi814 0:46166e7d81a8 341 }
metabi814 0:46166e7d81a8 342
metabi814 0:46166e7d81a8 343 int esp8266::sendMask(char * msg) {
metabi814 0:46166e7d81a8 344 for (int i = 0; i < 4; i++) {
metabi814 0:46166e7d81a8 345 msg[i] = 0;
metabi814 0:46166e7d81a8 346 }
metabi814 0:46166e7d81a8 347 return 4;
metabi814 0:46166e7d81a8 348 }
metabi814 0:46166e7d81a8 349
metabi814 0:46166e7d81a8 350 int esp8266::w_send(char * str) {
metabi814 0:46166e7d81a8 351 char msg[strlen(str) + 15]; //msg[20]
metabi814 0:46166e7d81a8 352 int idx = 0;
metabi814 0:46166e7d81a8 353 idx = sendOpcode(0x01, msg); //msg[0]=0x81
metabi814 0:46166e7d81a8 354 idx += sendLength(strlen(str), msg + idx);// sendlength(5,msg+1) idx=2
metabi814 0:46166e7d81a8 355 idx += sendMask(msg + idx); //idx=6
metabi814 0:46166e7d81a8 356 memcpy(msg+idx, str, strlen(str));
metabi814 0:46166e7d81a8 357 int res = write(msg, idx + strlen(str));
metabi814 0:46166e7d81a8 358 return res;
metabi814 0:46166e7d81a8 359 }
metabi814 0:46166e7d81a8 360
metabi814 0:46166e7d81a8 361 bool esp8266::w_read(char * message) {
metabi814 0:46166e7d81a8 362 int i = 0;
metabi814 0:46166e7d81a8 363 uint32_t len_msg;
metabi814 0:46166e7d81a8 364 char opcode = 0;
metabi814 0:46166e7d81a8 365 char c;
metabi814 0:46166e7d81a8 366 char mask[4] = {0, 0, 0, 0};
metabi814 0:46166e7d81a8 367 bool is_masked = false;
metabi814 0:46166e7d81a8 368 Timer tmr;
metabi814 0:46166e7d81a8 369
metabi814 0:46166e7d81a8 370 // read the opcode
metabi814 0:46166e7d81a8 371 tmr.start();
metabi814 0:46166e7d81a8 372 while (true) {
metabi814 0:46166e7d81a8 373 if (tmr.read() > 3) {
metabi814 0:46166e7d81a8 374 DBG("timeout ws\r\n");
metabi814 0:46166e7d81a8 375 return false;
metabi814 0:46166e7d81a8 376 }
metabi814 0:46166e7d81a8 377
metabi814 0:46166e7d81a8 378 if(!is_connected())
metabi814 0:46166e7d81a8 379 {
metabi814 0:46166e7d81a8 380 WARN("Connection was closed by server");
metabi814 0:46166e7d81a8 381 return false;
metabi814 0:46166e7d81a8 382 }
metabi814 0:46166e7d81a8 383
metabi814 0:46166e7d81a8 384 //----------socket.set_blocking(false, 1);
metabi814 0:46166e7d81a8 385 if (recv(&opcode, 1) != 1) {
metabi814 0:46166e7d81a8 386
metabi814 0:46166e7d81a8 387 //socket.set_blocking(false, 2000);
metabi814 0:46166e7d81a8 388 return false;
metabi814 0:46166e7d81a8 389 }
metabi814 0:46166e7d81a8 390
metabi814 0:46166e7d81a8 391 //-----------socket.set_blocking(false, 2000);
metabi814 0:46166e7d81a8 392
metabi814 0:46166e7d81a8 393 if (opcode == 0x81)
metabi814 0:46166e7d81a8 394 break;
metabi814 0:46166e7d81a8 395 }
metabi814 0:46166e7d81a8 396 DBG("opcode: 0x%X\r\n", opcode);
metabi814 0:46166e7d81a8 397
metabi814 0:46166e7d81a8 398 readChar(&c);
metabi814 0:46166e7d81a8 399 len_msg = c & 0x7f;
metabi814 0:46166e7d81a8 400 is_masked = c & 0x80;
metabi814 0:46166e7d81a8 401 if (len_msg == 126) {
metabi814 0:46166e7d81a8 402 readChar(&c);
metabi814 0:46166e7d81a8 403 len_msg = c << 8;
metabi814 0:46166e7d81a8 404 readChar(&c);
metabi814 0:46166e7d81a8 405 len_msg += c;
metabi814 0:46166e7d81a8 406 } else if (len_msg == 127) {
metabi814 0:46166e7d81a8 407 len_msg = 0;
metabi814 0:46166e7d81a8 408 for (int i = 0; i < 8; i++) {
metabi814 0:46166e7d81a8 409 readChar(&c);
metabi814 0:46166e7d81a8 410 len_msg += (c << (7-i)*8);
metabi814 0:46166e7d81a8 411 }
metabi814 0:46166e7d81a8 412 }
metabi814 0:46166e7d81a8 413
metabi814 0:46166e7d81a8 414 if (len_msg == 0) {
metabi814 0:46166e7d81a8 415 return false;
metabi814 0:46166e7d81a8 416 }
metabi814 0:46166e7d81a8 417 DBG("length: %d\r\n", len_msg);
metabi814 0:46166e7d81a8 418
metabi814 0:46166e7d81a8 419 if (is_masked) {
metabi814 0:46166e7d81a8 420 for (i = 0; i < 4; i++)
metabi814 0:46166e7d81a8 421 readChar(&c);
metabi814 0:46166e7d81a8 422 mask[i] = c;
metabi814 0:46166e7d81a8 423 }
metabi814 0:46166e7d81a8 424
metabi814 0:46166e7d81a8 425 int nb = read(message, len_msg, len_msg);
metabi814 0:46166e7d81a8 426 if (nb != len_msg)
metabi814 0:46166e7d81a8 427 return false;
metabi814 0:46166e7d81a8 428
metabi814 0:46166e7d81a8 429 for (i = 0; i < len_msg; i++) {
metabi814 0:46166e7d81a8 430 message[i] = message[i] ^ mask[i % 4];
metabi814 0:46166e7d81a8 431 }
metabi814 0:46166e7d81a8 432
metabi814 0:46166e7d81a8 433 message[len_msg] = '\0';
metabi814 0:46166e7d81a8 434
metabi814 0:46166e7d81a8 435 return true;
metabi814 0:46166e7d81a8 436 }
metabi814 0:46166e7d81a8 437 char* esp8266::getPath() {
metabi814 0:46166e7d81a8 438 return path;
metabi814 0:46166e7d81a8 439 }
metabi814 0:46166e7d81a8 440
metabi814 0:46166e7d81a8 441 int esp8266::write(char * str, int len) {
metabi814 0:46166e7d81a8 442 int res = 0, idx = 0;
metabi814 0:46166e7d81a8 443
metabi814 0:46166e7d81a8 444 for (int j = 0; j < MAX_TRY_WRITE; j++) {
metabi814 0:46166e7d81a8 445 /*
metabi814 0:46166e7d81a8 446 if(!is_connected())
metabi814 0:46166e7d81a8 447 {
metabi814 0:46166e7d81a8 448 WARN("Connection was closed by server");
metabi814 0:46166e7d81a8 449 break;
metabi814 0:46166e7d81a8 450 }
metabi814 0:46166e7d81a8 451 */
metabi814 0:46166e7d81a8 452 if ((res = send(4,str + idx,len - idx)) == -1)
metabi814 0:46166e7d81a8 453 continue;
metabi814 0:46166e7d81a8 454
metabi814 0:46166e7d81a8 455 idx += res;
metabi814 0:46166e7d81a8 456
metabi814 0:46166e7d81a8 457 if (idx == len)
metabi814 0:46166e7d81a8 458 return len;
metabi814 0:46166e7d81a8 459 }
metabi814 0:46166e7d81a8 460
metabi814 0:46166e7d81a8 461 return (idx == 0) ? -1 : idx;
metabi814 0:46166e7d81a8 462 }
metabi814 0:46166e7d81a8 463
metabi814 0:46166e7d81a8 464 int esp8266::read(char * str, int len, int min_len) {
metabi814 0:46166e7d81a8 465 int res = 0, idx = 0;
metabi814 0:46166e7d81a8 466
metabi814 0:46166e7d81a8 467 for (int j = 0; j < MAX_TRY_WRITE; j++) {
metabi814 0:46166e7d81a8 468
metabi814 0:46166e7d81a8 469 if ((res = recv(str + idx, len - idx)) == -1)
metabi814 0:46166e7d81a8 470 continue;
metabi814 0:46166e7d81a8 471
metabi814 0:46166e7d81a8 472 idx += res;
metabi814 0:46166e7d81a8 473
metabi814 0:46166e7d81a8 474 if (idx == len || (min_len != -1 && idx > min_len))
metabi814 0:46166e7d81a8 475 return idx;
metabi814 0:46166e7d81a8 476 }
metabi814 0:46166e7d81a8 477
metabi814 0:46166e7d81a8 478 return (idx == 0) ? -1 : idx;
metabi814 0:46166e7d81a8 479 }
metabi814 0:46166e7d81a8 480
metabi814 0:46166e7d81a8 481