Kleber Silva / IOTON-API

Dependents:   ton_demo ton_template

Committer:
krebyy
Date:
Tue Nov 08 00:17:12 2016 +0000
Revision:
0:cbba28a205fa
Child:
2:3a73d77c2cef
First commit - to use with the mbed online compiler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
krebyy 0:cbba28a205fa 1 #ifndef ESP8266_H
krebyy 0:cbba28a205fa 2 #define ESP8266_H
krebyy 0:cbba28a205fa 3 #include "mbed.h"
krebyy 0:cbba28a205fa 4
krebyy 0:cbba28a205fa 5 /**
krebyy 0:cbba28a205fa 6 * An interface to the ESP8266
krebyy 0:cbba28a205fa 7 */
krebyy 0:cbba28a205fa 8 class ESP8266 {
krebyy 0:cbba28a205fa 9 public:
krebyy 0:cbba28a205fa 10
krebyy 0:cbba28a205fa 11 /**
krebyy 0:cbba28a205fa 12 * Create an interface to the ESP8266
krebyy 0:cbba28a205fa 13 *
krebyy 0:cbba28a205fa 14 * @param tx UART TX line pin
krebyy 0:cbba28a205fa 15 * @param rx UART RX line pin
krebyy 0:cbba28a205fa 16 */
krebyy 0:cbba28a205fa 17 ESP8266(PinName tx, PinName rx) : _serial(tx, rx)
krebyy 0:cbba28a205fa 18 {
krebyy 0:cbba28a205fa 19 _serial.baud(115200);
krebyy 0:cbba28a205fa 20 _connected = false;
krebyy 0:cbba28a205fa 21 }
krebyy 0:cbba28a205fa 22
krebyy 0:cbba28a205fa 23
krebyy 0:cbba28a205fa 24 bool connect(const char* ssid, const char* pass, uint8_t mode = 0)
krebyy 0:cbba28a205fa 25 {
krebyy 0:cbba28a205fa 26 sprintf(cmdbuff,"AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pass);
krebyy 0:cbba28a205fa 27 sendCMD();
krebyy 0:cbba28a205fa 28 getReply(8000, 50);
krebyy 0:cbba28a205fa 29
krebyy 0:cbba28a205fa 30 if (strstr(replybuff, "OK") == NULL) return false;
krebyy 0:cbba28a205fa 31
krebyy 0:cbba28a205fa 32 sprintf(cmdbuff,"AT+CIPMUX=%d\r\n", mode);
krebyy 0:cbba28a205fa 33 sendCMD();
krebyy 0:cbba28a205fa 34 getReply(500, 20);
krebyy 0:cbba28a205fa 35
krebyy 0:cbba28a205fa 36 _connected = true;
krebyy 0:cbba28a205fa 37 return true;
krebyy 0:cbba28a205fa 38 }
krebyy 0:cbba28a205fa 39
krebyy 0:cbba28a205fa 40 char* httpGet(const char* host, const char* url, int port = 80)
krebyy 0:cbba28a205fa 41 {
krebyy 0:cbba28a205fa 42 connectToServer(host, port);
krebyy 0:cbba28a205fa 43
krebyy 0:cbba28a205fa 44 sprintf(webbuff,
krebyy 0:cbba28a205fa 45 "GET %s HTTP/1.1\r\nHost: %s\r\nAccept: */*\r\nConnection: close\r\n\r\n",
krebyy 0:cbba28a205fa 46 url, host);
krebyy 0:cbba28a205fa 47
krebyy 0:cbba28a205fa 48 sendWebBuff();
krebyy 0:cbba28a205fa 49
krebyy 0:cbba28a205fa 50 return replybuff;
krebyy 0:cbba28a205fa 51 }
krebyy 0:cbba28a205fa 52
krebyy 0:cbba28a205fa 53 // Send data to the ThingSpeak
krebyy 0:cbba28a205fa 54 bool sendThingSpeak(char* data, const char* apikey)
krebyy 0:cbba28a205fa 55 {
krebyy 0:cbba28a205fa 56 connectToServer("184.106.153.149", 80);
krebyy 0:cbba28a205fa 57
krebyy 0:cbba28a205fa 58 sprintf(webbuff, "GET /update?key=%s&%s\r\n", apikey, data);
krebyy 0:cbba28a205fa 59 sprintf(cmdbuff,"AT+CIPSEND=%d\r\n", strlen(webbuff)); // send buffer character length.
krebyy 0:cbba28a205fa 60 sendCMD();
krebyy 0:cbba28a205fa 61 getReply(200, 50);
krebyy 0:cbba28a205fa 62 SendWEB(); // send data
krebyy 0:cbba28a205fa 63 memset(webbuff, '\0', sizeof(webbuff));
krebyy 0:cbba28a205fa 64
krebyy 0:cbba28a205fa 65 volatile int weberror = 1;
krebyy 0:cbba28a205fa 66 t2.reset();
krebyy 0:cbba28a205fa 67 t2.start();
krebyy 0:cbba28a205fa 68
krebyy 0:cbba28a205fa 69 while(weberror == 1 && t2.read() < 5)
krebyy 0:cbba28a205fa 70 {
krebyy 0:cbba28a205fa 71 getReply(500, 24);
krebyy 0:cbba28a205fa 72 if (strstr(replybuff, "OK") != NULL)
krebyy 0:cbba28a205fa 73 {
krebyy 0:cbba28a205fa 74 weberror=0; // wait for valid SEND OK
krebyy 0:cbba28a205fa 75 }
krebyy 0:cbba28a205fa 76 }
krebyy 0:cbba28a205fa 77
krebyy 0:cbba28a205fa 78 t2.stop();
krebyy 0:cbba28a205fa 79
krebyy 0:cbba28a205fa 80 if(weberror == 1)
krebyy 0:cbba28a205fa 81 { // error
krebyy 0:cbba28a205fa 82 return false;
krebyy 0:cbba28a205fa 83 }
krebyy 0:cbba28a205fa 84 else
krebyy 0:cbba28a205fa 85 { // success
krebyy 0:cbba28a205fa 86 return true;
krebyy 0:cbba28a205fa 87 }
krebyy 0:cbba28a205fa 88 }
krebyy 0:cbba28a205fa 89
krebyy 0:cbba28a205fa 90 bool isConnected(void)
krebyy 0:cbba28a205fa 91 {
krebyy 0:cbba28a205fa 92 return _connected;
krebyy 0:cbba28a205fa 93 }
krebyy 0:cbba28a205fa 94
krebyy 0:cbba28a205fa 95 private:
krebyy 0:cbba28a205fa 96
krebyy 0:cbba28a205fa 97 Serial _serial;
krebyy 0:cbba28a205fa 98 volatile bool _connected;
krebyy 0:cbba28a205fa 99
krebyy 0:cbba28a205fa 100 Timer t1;
krebyy 0:cbba28a205fa 101 Timer t2;
krebyy 0:cbba28a205fa 102 char cmdbuff[64];
krebyy 0:cbba28a205fa 103 char webbuff[1024];
krebyy 0:cbba28a205fa 104 char replybuff[1024];
krebyy 0:cbba28a205fa 105
krebyy 0:cbba28a205fa 106 // Connect to host via TCP
krebyy 0:cbba28a205fa 107 void connectToServer(const char* host, int port)
krebyy 0:cbba28a205fa 108 {
krebyy 0:cbba28a205fa 109 sprintf(cmdbuff,"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", host, port);
krebyy 0:cbba28a205fa 110 sendCMD();
krebyy 0:cbba28a205fa 111 getReply(2000, 50);
krebyy 0:cbba28a205fa 112 }
krebyy 0:cbba28a205fa 113
krebyy 0:cbba28a205fa 114 bool sendWebBuff(void)
krebyy 0:cbba28a205fa 115 {
krebyy 0:cbba28a205fa 116 sprintf(cmdbuff,"AT+CIPSEND=%d\r\n", strlen(webbuff)); // send buffer character length.
krebyy 0:cbba28a205fa 117 sendCMD();
krebyy 0:cbba28a205fa 118 getReply(200, 50);
krebyy 0:cbba28a205fa 119 SendWEB(); // send data
krebyy 0:cbba28a205fa 120 memset(webbuff, '\0', sizeof(webbuff));
krebyy 0:cbba28a205fa 121 return sendCheck();
krebyy 0:cbba28a205fa 122 }
krebyy 0:cbba28a205fa 123
krebyy 0:cbba28a205fa 124 // Wait for ESP "SEND OK" reply
krebyy 0:cbba28a205fa 125 bool sendCheck()
krebyy 0:cbba28a205fa 126 {
krebyy 0:cbba28a205fa 127 volatile int weberror = 1;
krebyy 0:cbba28a205fa 128 t2.reset();
krebyy 0:cbba28a205fa 129 t2.start();
krebyy 0:cbba28a205fa 130
krebyy 0:cbba28a205fa 131 while(weberror == 1 && t2.read() < 5)
krebyy 0:cbba28a205fa 132 {
krebyy 0:cbba28a205fa 133 getReply(500, 24);
krebyy 0:cbba28a205fa 134 if (strstr(replybuff, "SEND OK") != NULL)
krebyy 0:cbba28a205fa 135 {
krebyy 0:cbba28a205fa 136 weberror=0; // wait for valid SEND OK
krebyy 0:cbba28a205fa 137 }
krebyy 0:cbba28a205fa 138 }
krebyy 0:cbba28a205fa 139 t2.stop();
krebyy 0:cbba28a205fa 140
krebyy 0:cbba28a205fa 141 if(weberror == 1)
krebyy 0:cbba28a205fa 142 { // error
krebyy 0:cbba28a205fa 143 strcpy(cmdbuff, "AT+CIPMUX=0\r\n");
krebyy 0:cbba28a205fa 144 sendCMD();
krebyy 0:cbba28a205fa 145 getReply(500, 10);
krebyy 0:cbba28a205fa 146
krebyy 0:cbba28a205fa 147 return false;
krebyy 0:cbba28a205fa 148 }
krebyy 0:cbba28a205fa 149 else
krebyy 0:cbba28a205fa 150 { // close current connection
krebyy 0:cbba28a205fa 151 sprintf(cmdbuff, "AT+CIPCLOSE\r\n");
krebyy 0:cbba28a205fa 152 sendCMD();
krebyy 0:cbba28a205fa 153 getReply(500, 600);
krebyy 0:cbba28a205fa 154
krebyy 0:cbba28a205fa 155 return true;
krebyy 0:cbba28a205fa 156 }
krebyy 0:cbba28a205fa 157 }
krebyy 0:cbba28a205fa 158
krebyy 0:cbba28a205fa 159 // ESP Command data send
krebyy 0:cbba28a205fa 160 void sendCMD()
krebyy 0:cbba28a205fa 161 {
krebyy 0:cbba28a205fa 162 _serial.printf("%s", cmdbuff);
krebyy 0:cbba28a205fa 163 }
krebyy 0:cbba28a205fa 164
krebyy 0:cbba28a205fa 165 // Large WEB buffer data send
krebyy 0:cbba28a205fa 166 int SendWEB()
krebyy 0:cbba28a205fa 167 {
krebyy 0:cbba28a205fa 168 volatile int i = 0;
krebyy 0:cbba28a205fa 169
krebyy 0:cbba28a205fa 170 if(_serial.writeable())
krebyy 0:cbba28a205fa 171 {
krebyy 0:cbba28a205fa 172 while(webbuff[i] != '\0')
krebyy 0:cbba28a205fa 173 {
krebyy 0:cbba28a205fa 174 _serial.putc(webbuff[i]);
krebyy 0:cbba28a205fa 175 i++;
krebyy 0:cbba28a205fa 176 }
krebyy 0:cbba28a205fa 177 }
krebyy 0:cbba28a205fa 178
krebyy 0:cbba28a205fa 179 return i;
krebyy 0:cbba28a205fa 180 }
krebyy 0:cbba28a205fa 181
krebyy 0:cbba28a205fa 182 // Get Command and ESP status replies
krebyy 0:cbba28a205fa 183 void getReply(int timeout, int getcount)
krebyy 0:cbba28a205fa 184 {
krebyy 0:cbba28a205fa 185 volatile int replycount = 0;
krebyy 0:cbba28a205fa 186
krebyy 0:cbba28a205fa 187 memset(replybuff, '\0', sizeof(replybuff));
krebyy 0:cbba28a205fa 188 t1.reset();
krebyy 0:cbba28a205fa 189 t1.start();
krebyy 0:cbba28a205fa 190
krebyy 0:cbba28a205fa 191 while(t1.read_ms() < timeout && replycount < getcount)
krebyy 0:cbba28a205fa 192 {
krebyy 0:cbba28a205fa 193 if(_serial.readable())
krebyy 0:cbba28a205fa 194 {
krebyy 0:cbba28a205fa 195 replybuff[replycount] = _serial.getc();
krebyy 0:cbba28a205fa 196 replycount++;
krebyy 0:cbba28a205fa 197 }
krebyy 0:cbba28a205fa 198 }
krebyy 0:cbba28a205fa 199
krebyy 0:cbba28a205fa 200 t1.stop();
krebyy 0:cbba28a205fa 201 }
krebyy 0:cbba28a205fa 202 };
krebyy 0:cbba28a205fa 203
krebyy 0:cbba28a205fa 204 #endif