Draft library for ESP8266

Dependents:   esp8266test

Committer:
adhithyan15
Date:
Fri May 01 14:46:00 2015 +0000
Revision:
0:a94222cedd2e
Initial Commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adhithyan15 0:a94222cedd2e 1 #include "esp8266.h"
adhithyan15 0:a94222cedd2e 2 #include <algorithm>
adhithyan15 0:a94222cedd2e 3 #include <cctype>
adhithyan15 0:a94222cedd2e 4
adhithyan15 0:a94222cedd2e 5 // This file implements the methods described in the esp8266 header file
adhithyan15 0:a94222cedd2e 6 // Copyright: Adhithya Rajasekaran
adhithyan15 0:a94222cedd2e 7 // License: MIT License
adhithyan15 0:a94222cedd2e 8
adhithyan15 0:a94222cedd2e 9 /* General Note About ESP8266
adhithyan15 0:a94222cedd2e 10
adhithyan15 0:a94222cedd2e 11 ESP8266 is controlled by using AT commands sent via Serial. Most of the API
adhithyan15 0:a94222cedd2e 12 is implemented with AT commands. You can find the list of all AT commands at
adhithyan15 0:a94222cedd2e 13 https://nurdspace.nl/ESP8266
adhithyan15 0:a94222cedd2e 14
adhithyan15 0:a94222cedd2e 15 */
adhithyan15 0:a94222cedd2e 16
adhithyan15 0:a94222cedd2e 17 ESP8266::ESP8266(MODSERIAL *input, char* inputSSID, char* inputPassword){
adhithyan15 0:a94222cedd2e 18 /*
adhithyan15 0:a94222cedd2e 19 Inputs:
adhithyan15 0:a94222cedd2e 20 1. MODSERIAL* input - Pass in a reference to a MODSERIAL object. This MODSERIAL object should be connected to the
adhithyan15 0:a94222cedd2e 21 ESP8266 module's pins 3 and 4. MODSERIAL is used instead of regular serial because it has buffering capability.
adhithyan15 0:a94222cedd2e 22 2. char* inputSSID - Pass in a reference to a character array consisting of the SSID of the wireless network you
adhithyan15 0:a94222cedd2e 23 want to connect to. Currently the library assumes that you are passing in the correct SSID and won't do any error
adhithyan15 0:a94222cedd2e 24 checking.
adhithyan15 0:a94222cedd2e 25 3. char* inputPassword - Pass in a reference to a character array consisting of the password/shared key of the wireless network you
adhithyan15 0:a94222cedd2e 26 want to connect to. Currently the library assumes that you are passing in the correct password and won't do any error
adhithyan15 0:a94222cedd2e 27 checking.
adhithyan15 0:a94222cedd2e 28
adhithyan15 0:a94222cedd2e 29 TODO:
adhithyan15 0:a94222cedd2e 30 1. Error checking of SSIDs by calling listOfAccessPoints() method and checking if the inputSSID is in the output of
adhithyan15 0:a94222cedd2e 31 listOfAccessPoints() method.
adhithyan15 0:a94222cedd2e 32 2. Error checking of passwords by trying to actually connect the access point
adhithyan15 0:a94222cedd2e 33 */
adhithyan15 0:a94222cedd2e 34 wifi = input;
adhithyan15 0:a94222cedd2e 35 wifi->baud(115200); // This is the baud rate required to communicate the ESP8266 chip
adhithyan15 0:a94222cedd2e 36 connection_successful = false;
adhithyan15 0:a94222cedd2e 37 if(wiredCorrectly()){
adhithyan15 0:a94222cedd2e 38 //connection_successful = true;
adhithyan15 0:a94222cedd2e 39 if(joinAccessPoint(inputSSID,inputPassword)){
adhithyan15 0:a94222cedd2e 40 getMyIP();
adhithyan15 0:a94222cedd2e 41 string error = "ERROR";
adhithyan15 0:a94222cedd2e 42 if(ip != error){
adhithyan15 0:a94222cedd2e 43 connection_successful = true;
adhithyan15 0:a94222cedd2e 44 }
adhithyan15 0:a94222cedd2e 45 }
adhithyan15 0:a94222cedd2e 46 }
adhithyan15 0:a94222cedd2e 47 }
adhithyan15 0:a94222cedd2e 48
adhithyan15 0:a94222cedd2e 49 string removeSpaces(string input)
adhithyan15 0:a94222cedd2e 50 {
adhithyan15 0:a94222cedd2e 51 input.erase(std::remove(input.begin(),input.end(),'\r'),input.end());
adhithyan15 0:a94222cedd2e 52 input.erase(std::remove(input.begin(),input.end(),'\n'),input.end());
adhithyan15 0:a94222cedd2e 53 return input;
adhithyan15 0:a94222cedd2e 54 }
adhithyan15 0:a94222cedd2e 55
adhithyan15 0:a94222cedd2e 56 bool ESP8266::wiredCorrectly(){
adhithyan15 0:a94222cedd2e 57 // This method checks if the ESP8266 module is wired correctly.
adhithyan15 0:a94222cedd2e 58
adhithyan15 0:a94222cedd2e 59 wifi->printf("AT\r\n");
adhithyan15 0:a94222cedd2e 60 wait(2);
adhithyan15 0:a94222cedd2e 61 char buf[20];
adhithyan15 0:a94222cedd2e 62 int counter = 0;
adhithyan15 0:a94222cedd2e 63 while(1){
adhithyan15 0:a94222cedd2e 64 if(wifi->readable()){
adhithyan15 0:a94222cedd2e 65 buf[counter] = wifi->getc();
adhithyan15 0:a94222cedd2e 66 counter = counter + 1;
adhithyan15 0:a94222cedd2e 67 }else{
adhithyan15 0:a94222cedd2e 68 wait(2);
adhithyan15 0:a94222cedd2e 69 if(!wifi->readable()){
adhithyan15 0:a94222cedd2e 70 break;
adhithyan15 0:a94222cedd2e 71 }
adhithyan15 0:a94222cedd2e 72 }
adhithyan15 0:a94222cedd2e 73 }
adhithyan15 0:a94222cedd2e 74 string test(buf);
adhithyan15 0:a94222cedd2e 75 string actual_output = test.substr(0,counter);
adhithyan15 0:a94222cedd2e 76 printf(actual_output.c_str());
adhithyan15 0:a94222cedd2e 77 //delete[] buf;
adhithyan15 0:a94222cedd2e 78 printf("\n");
adhithyan15 0:a94222cedd2e 79 size_t found = actual_output.find("OK");
adhithyan15 0:a94222cedd2e 80 if (found!=std::string::npos){
adhithyan15 0:a94222cedd2e 81 if(reset() == true){
adhithyan15 0:a94222cedd2e 82 setMode(3);
adhithyan15 0:a94222cedd2e 83 return true;
adhithyan15 0:a94222cedd2e 84 }else{
adhithyan15 0:a94222cedd2e 85 return false;
adhithyan15 0:a94222cedd2e 86 }
adhithyan15 0:a94222cedd2e 87 }else{
adhithyan15 0:a94222cedd2e 88 return false;
adhithyan15 0:a94222cedd2e 89 }
adhithyan15 0:a94222cedd2e 90 }
adhithyan15 0:a94222cedd2e 91
adhithyan15 0:a94222cedd2e 92 bool ESP8266::reset(){
adhithyan15 0:a94222cedd2e 93 // This method resets the settings inside the ESP8266 chip
adhithyan15 0:a94222cedd2e 94
adhithyan15 0:a94222cedd2e 95 wifi->printf("AT+RST\r\n");
adhithyan15 0:a94222cedd2e 96 wait(2);
adhithyan15 0:a94222cedd2e 97 char buf[2000];
adhithyan15 0:a94222cedd2e 98 int counter = 0;
adhithyan15 0:a94222cedd2e 99 while(1){
adhithyan15 0:a94222cedd2e 100 if(wifi->readable()){
adhithyan15 0:a94222cedd2e 101 buf[counter] = wifi->getc();
adhithyan15 0:a94222cedd2e 102 counter = counter + 1;
adhithyan15 0:a94222cedd2e 103 }else{
adhithyan15 0:a94222cedd2e 104 wait(2);
adhithyan15 0:a94222cedd2e 105 if(!wifi->readable()){
adhithyan15 0:a94222cedd2e 106 break;
adhithyan15 0:a94222cedd2e 107 }
adhithyan15 0:a94222cedd2e 108 }
adhithyan15 0:a94222cedd2e 109 }
adhithyan15 0:a94222cedd2e 110 string test(buf);
adhithyan15 0:a94222cedd2e 111 string actual_output = test.substr(0,counter);
adhithyan15 0:a94222cedd2e 112 printf(actual_output.c_str());
adhithyan15 0:a94222cedd2e 113 //delete[] buf;
adhithyan15 0:a94222cedd2e 114 printf("\n");
adhithyan15 0:a94222cedd2e 115 size_t found = actual_output.find("rst");
adhithyan15 0:a94222cedd2e 116 if (found!=std::string::npos){
adhithyan15 0:a94222cedd2e 117 return true;
adhithyan15 0:a94222cedd2e 118 }else{
adhithyan15 0:a94222cedd2e 119 return false;
adhithyan15 0:a94222cedd2e 120 }
adhithyan15 0:a94222cedd2e 121 }
adhithyan15 0:a94222cedd2e 122
adhithyan15 0:a94222cedd2e 123 char* ESP8266::firmwareVersion(){
adhithyan15 0:a94222cedd2e 124 // Incomplete Method. Just use for firmware debugging purposes
adhithyan15 0:a94222cedd2e 125 wifi->printf("AT+GMR\r\n");
adhithyan15 0:a94222cedd2e 126 wait(2);
adhithyan15 0:a94222cedd2e 127 char buf[2000];
adhithyan15 0:a94222cedd2e 128 int counter = 0;
adhithyan15 0:a94222cedd2e 129 while(1){
adhithyan15 0:a94222cedd2e 130 if(wifi->readable()){
adhithyan15 0:a94222cedd2e 131 buf[counter] = wifi->getc();
adhithyan15 0:a94222cedd2e 132 counter = counter + 1;
adhithyan15 0:a94222cedd2e 133 }else{
adhithyan15 0:a94222cedd2e 134 wait(2);
adhithyan15 0:a94222cedd2e 135 if(!wifi->readable()){
adhithyan15 0:a94222cedd2e 136 break;
adhithyan15 0:a94222cedd2e 137 }
adhithyan15 0:a94222cedd2e 138 }
adhithyan15 0:a94222cedd2e 139 }
adhithyan15 0:a94222cedd2e 140 string test(buf);
adhithyan15 0:a94222cedd2e 141 string actual_output = test.substr(0,counter);
adhithyan15 0:a94222cedd2e 142 printf(actual_output.c_str());
adhithyan15 0:a94222cedd2e 143 //delete[] buf;
adhithyan15 0:a94222cedd2e 144 printf("\n");
adhithyan15 0:a94222cedd2e 145 const char* output = actual_output.c_str();
adhithyan15 0:a94222cedd2e 146 return (char*) output;
adhithyan15 0:a94222cedd2e 147 }
adhithyan15 0:a94222cedd2e 148
adhithyan15 0:a94222cedd2e 149 void ESP8266::setMode(int val){
adhithyan15 0:a94222cedd2e 150 // ESP8266 is set to mode 3 which will allow it to act
adhithyan15 0:a94222cedd2e 151 // both as a client and server.
adhithyan15 0:a94222cedd2e 152 wifi->printf("AT+CWMODE=3\r\n");
adhithyan15 0:a94222cedd2e 153 wait(2);
adhithyan15 0:a94222cedd2e 154 char buf[2000];
adhithyan15 0:a94222cedd2e 155 int counter = 0;
adhithyan15 0:a94222cedd2e 156 while(1){
adhithyan15 0:a94222cedd2e 157 if(wifi->readable()){
adhithyan15 0:a94222cedd2e 158 buf[counter] = wifi->getc();
adhithyan15 0:a94222cedd2e 159 counter = counter + 1;
adhithyan15 0:a94222cedd2e 160 }else{
adhithyan15 0:a94222cedd2e 161 wait(2);
adhithyan15 0:a94222cedd2e 162 if(!wifi->readable()){
adhithyan15 0:a94222cedd2e 163 break;
adhithyan15 0:a94222cedd2e 164 }
adhithyan15 0:a94222cedd2e 165 }
adhithyan15 0:a94222cedd2e 166 }
adhithyan15 0:a94222cedd2e 167 string test(buf);
adhithyan15 0:a94222cedd2e 168 string actual_output = test.substr(0,counter);
adhithyan15 0:a94222cedd2e 169 printf(actual_output.c_str());
adhithyan15 0:a94222cedd2e 170 //delete[] buf;
adhithyan15 0:a94222cedd2e 171 printf("\n");
adhithyan15 0:a94222cedd2e 172 }
adhithyan15 0:a94222cedd2e 173
adhithyan15 0:a94222cedd2e 174 bool ESP8266::checkConnection(){
adhithyan15 0:a94222cedd2e 175 return connection_successful;
adhithyan15 0:a94222cedd2e 176 }
adhithyan15 0:a94222cedd2e 177
adhithyan15 0:a94222cedd2e 178 bool ESP8266::gotAnIPAddress(){
adhithyan15 0:a94222cedd2e 179 wifi->printf("AT+CIFSR\r\n");
adhithyan15 0:a94222cedd2e 180 wait(2);
adhithyan15 0:a94222cedd2e 181 char buf[2000];
adhithyan15 0:a94222cedd2e 182 int counter = 0;
adhithyan15 0:a94222cedd2e 183 while(1){
adhithyan15 0:a94222cedd2e 184 if(wifi->readable()){
adhithyan15 0:a94222cedd2e 185 buf[counter] = wifi->getc();
adhithyan15 0:a94222cedd2e 186 counter = counter + 1;
adhithyan15 0:a94222cedd2e 187 }else{
adhithyan15 0:a94222cedd2e 188 wait(2);
adhithyan15 0:a94222cedd2e 189 if(!wifi->readable()){
adhithyan15 0:a94222cedd2e 190 break;
adhithyan15 0:a94222cedd2e 191 }
adhithyan15 0:a94222cedd2e 192 }
adhithyan15 0:a94222cedd2e 193 }
adhithyan15 0:a94222cedd2e 194 string test(buf);
adhithyan15 0:a94222cedd2e 195 string actual_output = test.substr(0,counter);
adhithyan15 0:a94222cedd2e 196 printf(actual_output.c_str());
adhithyan15 0:a94222cedd2e 197 //delete[] buf;
adhithyan15 0:a94222cedd2e 198 printf("\n");
adhithyan15 0:a94222cedd2e 199 size_t found = actual_output.find("ERROR");
adhithyan15 0:a94222cedd2e 200 if (found!=std::string::npos){
adhithyan15 0:a94222cedd2e 201 return false;
adhithyan15 0:a94222cedd2e 202 }else{
adhithyan15 0:a94222cedd2e 203 return true;
adhithyan15 0:a94222cedd2e 204 }
adhithyan15 0:a94222cedd2e 205 }
adhithyan15 0:a94222cedd2e 206
adhithyan15 0:a94222cedd2e 207
adhithyan15 0:a94222cedd2e 208 bool ESP8266::joinAccessPoint(char *inputSSID, char *inputPassword){
adhithyan15 0:a94222cedd2e 209 // This method establishes connection with the requested access point
adhithyan15 0:a94222cedd2e 210 // All authentication methods are supported (WEP, WPA)
adhithyan15 0:a94222cedd2e 211 wifi->printf("AT+CWJAP=\"%s\",\"%s\"\r\n",inputSSID,inputPassword);
adhithyan15 0:a94222cedd2e 212 wait(7);
adhithyan15 0:a94222cedd2e 213 char buf[2000];
adhithyan15 0:a94222cedd2e 214 int counter = 0;
adhithyan15 0:a94222cedd2e 215 while(1){
adhithyan15 0:a94222cedd2e 216 if(wifi->readable()){
adhithyan15 0:a94222cedd2e 217 buf[counter] = wifi->getc();
adhithyan15 0:a94222cedd2e 218 counter = counter + 1;
adhithyan15 0:a94222cedd2e 219 }else{
adhithyan15 0:a94222cedd2e 220 wait(2);
adhithyan15 0:a94222cedd2e 221 if(!wifi->readable()){
adhithyan15 0:a94222cedd2e 222 break;
adhithyan15 0:a94222cedd2e 223 }
adhithyan15 0:a94222cedd2e 224 }
adhithyan15 0:a94222cedd2e 225 }
adhithyan15 0:a94222cedd2e 226 string test(buf);
adhithyan15 0:a94222cedd2e 227 string actual_output = test.substr(0,counter);
adhithyan15 0:a94222cedd2e 228 printf(actual_output.c_str());
adhithyan15 0:a94222cedd2e 229 //delete[] buf;
adhithyan15 0:a94222cedd2e 230 printf("\n");
adhithyan15 0:a94222cedd2e 231 if(gotAnIPAddress() == true){
adhithyan15 0:a94222cedd2e 232 return true;
adhithyan15 0:a94222cedd2e 233 }else{
adhithyan15 0:a94222cedd2e 234 return false;
adhithyan15 0:a94222cedd2e 235 }
adhithyan15 0:a94222cedd2e 236 }
adhithyan15 0:a94222cedd2e 237
adhithyan15 0:a94222cedd2e 238 string ESP8266::getMyIP(){
adhithyan15 0:a94222cedd2e 239 // Fetches the assigned IP address of the module
adhithyan15 0:a94222cedd2e 240 wifi->printf("AT+CIFSR\r\n");
adhithyan15 0:a94222cedd2e 241 wait(2);
adhithyan15 0:a94222cedd2e 242 char buf[2000];
adhithyan15 0:a94222cedd2e 243 int counter = 0;
adhithyan15 0:a94222cedd2e 244 while(1){
adhithyan15 0:a94222cedd2e 245 if(wifi->readable()){
adhithyan15 0:a94222cedd2e 246 buf[counter] = wifi->getc();
adhithyan15 0:a94222cedd2e 247 counter = counter + 1;
adhithyan15 0:a94222cedd2e 248 }else{
adhithyan15 0:a94222cedd2e 249 wait(2);
adhithyan15 0:a94222cedd2e 250 if(!wifi->readable()){
adhithyan15 0:a94222cedd2e 251 break;
adhithyan15 0:a94222cedd2e 252 }
adhithyan15 0:a94222cedd2e 253 }
adhithyan15 0:a94222cedd2e 254 }
adhithyan15 0:a94222cedd2e 255 string test(buf);
adhithyan15 0:a94222cedd2e 256 string actual_output = test.substr(0,counter);
adhithyan15 0:a94222cedd2e 257 printf(actual_output.c_str());
adhithyan15 0:a94222cedd2e 258 string s = actual_output;
adhithyan15 0:a94222cedd2e 259 //delete[] buf;
adhithyan15 0:a94222cedd2e 260 s.erase( remove_if( s.begin(), s.end(),std::isspace ), s.end() );
adhithyan15 0:a94222cedd2e 261 string ip_address = s.substr(8,s.length());
adhithyan15 0:a94222cedd2e 262 string error = "ERROR";
adhithyan15 0:a94222cedd2e 263 if(ip_address == error){
adhithyan15 0:a94222cedd2e 264 ip = error;
adhithyan15 0:a94222cedd2e 265 }else{
adhithyan15 0:a94222cedd2e 266 ip = ip_address;
adhithyan15 0:a94222cedd2e 267 }
adhithyan15 0:a94222cedd2e 268 return ip;
adhithyan15 0:a94222cedd2e 269 }
adhithyan15 0:a94222cedd2e 270
adhithyan15 0:a94222cedd2e 271 bool ESP8266::checkSSID(string inputSSID){
adhithyan15 0:a94222cedd2e 272 // This method checks the presence of the input SSID
adhithyan15 0:a94222cedd2e 273 // with all the SSIDs that the ESP8266 chip detects
adhithyan15 0:a94222cedd2e 274 wifi->printf("AT+CWLAP\r\n");
adhithyan15 0:a94222cedd2e 275 wait(10);
adhithyan15 0:a94222cedd2e 276 char buf[2000];
adhithyan15 0:a94222cedd2e 277 int counter = 0;
adhithyan15 0:a94222cedd2e 278 while(1){
adhithyan15 0:a94222cedd2e 279 if(wifi->readable()){
adhithyan15 0:a94222cedd2e 280 buf[counter] = wifi->getc();
adhithyan15 0:a94222cedd2e 281 counter = counter + 1;
adhithyan15 0:a94222cedd2e 282 }else{
adhithyan15 0:a94222cedd2e 283 wait(2);
adhithyan15 0:a94222cedd2e 284 if(!wifi->readable()){
adhithyan15 0:a94222cedd2e 285 break;
adhithyan15 0:a94222cedd2e 286 }
adhithyan15 0:a94222cedd2e 287 }
adhithyan15 0:a94222cedd2e 288 }
adhithyan15 0:a94222cedd2e 289 string test(buf);
adhithyan15 0:a94222cedd2e 290 string actual_output = test.substr(0,counter);
adhithyan15 0:a94222cedd2e 291 printf(inputSSID.c_str());
adhithyan15 0:a94222cedd2e 292 printf(actual_output.c_str());
adhithyan15 0:a94222cedd2e 293 wait(5);
adhithyan15 0:a94222cedd2e 294 size_t found = actual_output.find(inputSSID);
adhithyan15 0:a94222cedd2e 295 printf("I am here");
adhithyan15 0:a94222cedd2e 296 if (found!=std::string::npos){
adhithyan15 0:a94222cedd2e 297 return false;
adhithyan15 0:a94222cedd2e 298 }else{
adhithyan15 0:a94222cedd2e 299 return true;
adhithyan15 0:a94222cedd2e 300 }
adhithyan15 0:a94222cedd2e 301 //delete[] buf;
adhithyan15 0:a94222cedd2e 302 }