esp8266

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 #include <string>
00004 
00005 DigitalOut myled(LED1);
00006 Serial esp(p13,p14);
00007 Serial pc(USBTX,USBRX);
00008 #define end "\r\n"
00009 
00010 class esp8266
00011 {
00012     //AP アクセスポイント
00013     //ST client
00014     //APST Server and Client
00015 private:
00016 
00017     DigitalOut myled;
00018     Serial *Seri;
00019     char* buffer;
00020     int datalen;
00021     void strChack(char data[]) {
00022         int f = 0;
00023         for (;;) {
00024             if(f == strlen(data))
00025             {
00026                 break;
00027             }
00028             char a=Seri->getc();
00029             if(a!=data[f])f=0;
00030             else f++;
00031 
00032         }
00033         wait(0.1);
00034     }
00035     void Reception() {
00036 
00037         char inputData[100];
00038         Seri->scanf("%s",inputData);
00039         myled=1;
00040         Serial pc(USBTX,USBRX);
00041         pc.baud(115200);
00042         pc.printf("%s\r\n",inputData);
00043         if(strstr(inputData,"+IPD,")==NULL) {
00044             /*
00045             if(strcmp(x,"0,CONNECT")==0)break;
00046             if(strcmp(x,"0,CLOSED")==0)break;
00047             if(strcmp(x,">")==0)break;*/
00048         } else {
00049             strtok(inputData,",");
00050             strtok(NULL,":");
00051             char *data = strtok(NULL,",");
00052             strtok(inputData,",");
00053             char *data_num = strtok(NULL,",");
00054             datalen = atoi(data_num);
00055             buffer=data;
00056             //data = strtok(x,"");
00057             //buffer = data;
00058             //pc.printf("%s   , %s ,   %s\r\n",y,data_num,data);
00059         }
00060         myled=1;
00061     }
00062     bool check() {
00063 
00064         Serial pc(USBTX,USBRX);
00065         pc.baud(115200);
00066         Seri->printf(end);
00067         bool f = false,ans;
00068         int i=0;
00069         while(1) {
00070             char x = Seri->getc();
00071             pc.putc(x);
00072             if(x=='O')f=true;
00073             else if(x=='K'&&f==true) {
00074                 ans=true;
00075                 break;
00076             } else f=false;
00077 
00078             if(x=='F')i=1;
00079             else if(x=='A'&&i==1)i=2;
00080             else if(x=='I'&&i==2)i=3;
00081             else if(x=='L'&&i==3) {
00082                 ans=false;
00083                 break;
00084             } else i=0;
00085 
00086         }
00087         wait(0.1);
00088         return ans;
00089     }
00090     bool connected;
00091 public:
00092     char* get_data(char *datax,int num) {
00093     get:
00094         char x[num+2];
00095         Seri->scanf("%s",x);
00096         myled=1;
00097         Serial pc(USBTX,USBRX);
00098         pc.baud(115200);
00099         if(strstr(x,"+IPD,")==NULL) {
00100 
00101             return NULL;
00102             /*
00103             if(strcmp(x,"0,CONNECT")==0)break;
00104             if(strcmp(x,"0,CLOSED")==0)break;
00105             if(strcmp(x,">")==0)break;*/
00106         } else {
00107 
00108             strtok(x,",");
00109             strtok(NULL,":");
00110             datax = strtok(NULL,",");
00111             strtok(x,",");
00112             char *data_num = strtok(NULL,",");
00113             char len = atoi(data_num);
00114 
00115             if(strcmp(datax,"\r\n")==0)goto get;
00116             else if(len > num)return NULL;
00117             //for(int i=0;i<len;i++)
00118             //    *datax++=*data++;
00119             //printf("%s\r\n",datax);
00120             return datax;
00121             //data = strtok(x,"");
00122             //buffer = data;
00123             //pc.printf("%s   , %s ,   %s\r\n",y,data_num,data);
00124         }
00125     }
00126     bool sleep(int mode) {
00127         Seri->printf("AT+SLEEP=%d",mode);
00128         return check();
00129     }
00130     bool deepsleep(int ms) {
00131         Seri->printf("AT+GSLP=%d",ms);
00132         return check();
00133     }
00134     bool httpAccess(char* mode,char* url,int port=80) {
00135         if(connected==false)return false;
00136         Seri->printf("AT+CIPSTART=\"%s\",\"%s\",%d",mode,url,port);
00137         return check();
00138     }    
00139     bool httpAccess(char id,char* url,char* mode = "TCP",int port=80) {
00140         if(connected==false)return false;
00141         Seri->printf("AT+CIPSTART=\"%d\",\"%s\",\"%s\",%d",id,mode,url,port);
00142         return check();
00143     }
00144     bool Disconnection(int id = 0)
00145     {
00146         printf("AT+CIPCLOSE==%d",id);
00147         return check();
00148     }
00149     void prompt() {
00150         Seri->attach(this,&esp8266::Reception);
00151     }
00152     //Seri->printf("AT+CIPSTA_CUR=\"%s\",\"%s\",\"%s\"",IP,gateway,netmask);
00153     bool setDHCP(int mode,int en) {
00154         DHCPMode = mode;
00155         DHCPenable = en;
00156         printf("AT+CWDHCP_CUR=%d,%d",mode,en);
00157         return check();
00158     }
00159     bool send( int num,char* data,int id) {
00160         if(connected==false)return false;
00161         Seri->printf("AT+CIPSEND=%d,%d",id,num+2);
00162         check();
00163         wait(0.01);
00164         while(1) {
00165             char i = Seri->getc();
00166             pc.putc(i);
00167             if(i=='>')break;
00168         }
00169         Seri->printf("%s",data);
00170         Seri->printf("\r\n");
00171         return check();
00172     }
00173 
00174     bool multipull(int i) {
00175         Seri->printf("AT+CIPMUX=%d",i);
00176         return check();
00177     }
00178     void reset() {
00179         Seri->printf("AT+RST\r\n");
00180         strChack("ready");
00181         wait(0.1);
00182     }
00183     void serverCreate(int mode,int port) {
00184         Seri->printf("AT+CIPSERVER=%d,%d",mode,port);
00185         check();
00186         wait(0.1);
00187         /*printf("\r\nwait connection\r\n");
00188         while(1) {
00189             char x[10];
00190             Seri->scanf("%s",x);
00191             if(strcmp(x,"0,CONNECT")==0)break;
00192         }*/
00193         printf("\r\OK\r\n");
00194     }
00195     void serverTimeOutSet(int time = 60)
00196     {
00197         Seri->printf("AT+CIPSTO=%d",time);
00198         check(); 
00199     }
00200     
00201     bool accesspoint() {
00202         Seri->printf("AT+CWLAP\r\n");
00203         return check();
00204     }
00205 
00206     bool wifiSoftAPSetting(const char* ssid,const char* password,int ch,int ecn) {
00207         if(connectmode==AP||connectmode==APST)
00208             Seri->printf("AT+CWSAP_CUR=\"%s\",\"%s\",%d,%d",ssid,password,ch,ecn);
00209         else false;
00210         return check();
00211     }
00212     bool wifiConnectionMode(int mode) {
00213         connectmode=mode;
00214         Seri->printf("AT+CWMODE_CUR=%d",mode);
00215         return check();
00216     }
00217     bool wifiDisconnect() {
00218         Seri->printf("AT+CWQAP");
00219         connected=false;
00220         return check();
00221     }
00222     bool WifiFindAccesspoint(char *wifi) {
00223         Seri->printf("AT+CWLAP=\"%s\"");
00224         return check();
00225     }
00226     bool WifiFindAccesspoint() {
00227         Seri->printf("AT+CWLAP");
00228         return check();
00229     }
00230     bool wifiConnect(const char* ssid,const char* password) {
00231         Seri->printf("AT+CWJAP_CUR=\"%s\",\"%s\"",ssid,password);
00232         connected|=check();
00233         //if(connected==false)return false;
00234         //Seri->printf("AT+CIFSR");
00235         //check();
00236         return connected;
00237     }
00238     bool wifiSoftAPFromIP() {
00239         if(connectmode == ST) return false;
00240         Seri->printf("AT+CWLIF");
00241         return check();
00242     }
00243     bool setSTMACAddress(char addr[6])
00244     {
00245         Seri->printf("AT+CIPSTART_CUR=\"%2x:%2x:%2x:%2x:%2x:%2x\"",addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
00246         return check();
00247     }
00248     bool setAPMACAddress(char addr[6])
00249     {
00250         Seri->printf("AT+CIPAPMAC_CUR=\"%2x:%2x:%2x:%2x:%2x:%2x\"",addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
00251         return check();
00252     }    
00253     bool setSTIPAddress(char addr[4])
00254     {
00255         Seri->printf("AT+CIPSTA_CUR=\"%3d:%3d:%3d:%3d\"",addr[0],addr[1],addr[2],addr[3]);
00256         return check();
00257     }
00258     bool setAPIPAddress(char addr[4])
00259     {
00260         Seri->printf("AT+CIPAP_CUR=\"%3d:%3d:%3d:%3d\"",addr[0],addr[1],addr[2],addr[3]);
00261         return check();
00262     }
00263     
00264     
00265     
00266     bool ATcommand(const char* cmd) {
00267         char a[20];
00268         strcat(a,"AT+");
00269         strcat(a,cmd);
00270         Seri->printf(a);
00271         return check();
00272     }
00273     const char AP=2;
00274     const char ST=1;
00275     const char APST=3;
00276     char  connectmode;
00277     char DHCPMode;
00278     char DHCPenable;
00279     esp8266(Serial *ser) : myled(LED2) {
00280         myled=1;
00281         connected=false;
00282         
00283         DHCPMode = 0;
00284         DHCPenable = 1;
00285         Seri = ser;
00286         bool f = false;
00287         int i=0;
00288         Seri->printf("AT\r\n");
00289         
00290         strChack("OK");
00291         reset();
00292         wait(0.5);
00293     }
00294 
00295 };
00296 /*void end()
00297 {
00298     esp.printf("\r\n");
00299 }*/
00300 void send_AT()
00301 {
00302     esp.printf("AT\r\n");
00303 }
00304 int main()
00305 {
00306     //myled = 1;
00307     pc.baud(115200);
00308     esp.baud(115200);
00309     printf("Start\r\n");
00310     wait(0.1);
00311     esp8266 ESP(&esp);
00312     send_AT();
00313     myled = 1;
00314     bool f = true;
00315     while(f)
00316     {
00317         /*char *x;
00318         esp.scanf("%s",x);
00319         printf("%s",x);
00320         f = !strcmp(x,"OK\r\n");*/
00321         //esp.putc(pc.getc());
00322         //pc.putc(esp.getc());
00323     }
00324     //end();
00325     //ESP.reset();
00326     /*ESP.connection_mode(3);
00327     ESP.multipull(1);
00328     ESP.accesspoint();
00329 
00330     ESP.connect("biz","roborobo");
00331     //ESP.http_access("TCP","imaoca.webcrow.jp",80);
00332     ESP.tcp_setting(1,8888);
00333     char senddata[10];
00334     pc.printf("\r\n tcp send data\r\n");
00335     for(int i=0;i<10;i++)
00336     {
00337         senddata[i]=pc.getc();
00338         pc.putc(senddata[i]);
00339     }
00340     //ESP.send(10,senddata);
00341     //ESP.prompt();
00342     ESP.softAP("ESP8266","",10,0);
00343     char *data,num=30;
00344     DigitalOut LED(LED4);
00345     while(1) {
00346         //    data = ESP.get_data(data,num);
00347         //    if(data!=NULL)
00348         //        printf("GET->%s\r\n",data);
00349         myled=1;
00350         wait(0.01);
00351         myled=0;
00352         data=ESP.get_data(data,num);
00353         printf("%s\r\n",data);
00354         if (strstr(data,"ON")!=NULL)
00355             LED=1;
00356         if (strstr(data,"OFF")!=NULL)
00357             LED=0;
00358         //pc.putc( esp.getc());
00359     }
00360     /*while(1) {
00361         char x = esp.getc();
00362         pc.putc(x);
00363         if(x=='O')f=true;
00364         else if(x=='K'&&f==true)break;
00365         else f=false;
00366     }*/
00367     myled=0;
00368 }