esp8266

Dependencies:   mbed

main.cpp

Committer:
kikoaac
Date:
2016-03-28
Revision:
0:28089dd1adda
Child:
1:49b2903daa5f

File content as of revision 0:28089dd1adda:

#include "mbed.h"

#include <string> 

DigitalOut myled(LED1);
Serial esp(p9,p10);
Serial pc(USBTX,USBRX);
#define end "\r\n"
    
class esp8266
{
    private:
    
    DigitalOut myled;
    Serial *Seri;
    char* buffer;
    int datalen;
    
    void Reception()
    {
        
            char x[100];
            Seri->scanf("%s",x);
            myled=1;
        Serial pc(USBTX,USBRX);
        pc.baud(115200);
            pc.printf("%s\r\n",x);
            if(strstr(x,"+IPD,")==NULL)
            {
                /*
                if(strcmp(x,"0,CONNECT")==0)break;
                if(strcmp(x,"0,CLOSED")==0)break;
                if(strcmp(x,">")==0)break;*/
            }
            else
            {
                strtok(x,",");
                strtok(NULL,":");
                char *data = strtok(NULL,",");
                strtok(x,",");
                char *data_num = strtok(NULL,",");
                datalen = atoi(data_num);
                buffer=data;
                //data = strtok(x,"");
                //buffer = data;
                //pc.printf("%s   , %s ,   %s\r\n",y,data_num,data);
            }
            myled=1;
    }
    bool check()
    {
                
        Serial pc(USBTX,USBRX);
        pc.baud(115200);
        Seri->printf(end);
        bool f = false,ans;
        int i=0; 
        while(1) {
            char x = Seri->getc();
            pc.putc(x);
            if(x=='O')f=true;
            else if(x=='K'&&f==true)
            {
                ans=true;
                break;
            }
            else f=false;
            
            if(x=='F')i=1;
            else if(x=='A'&&i==1)i=2;
            else if(x=='I'&&i==2)i=3;
            else if(x=='L'&&i==3)
            {
                ans=false;
                break;
            }
            else i=0;
            
        }
        wait(0.1);
        return ans;
    }   
    bool connected;
    public:
    char* get_data(char *datax,int num)
    {
        get:
        char x[num+2];
        Seri->scanf("%s",x);
        myled=1;
        Serial pc(USBTX,USBRX);
        pc.baud(115200);
        if(strstr(x,"+IPD,")==NULL)
        {
            
            return NULL;
            /*
            if(strcmp(x,"0,CONNECT")==0)break;
            if(strcmp(x,"0,CLOSED")==0)break;
            if(strcmp(x,">")==0)break;*/
        }
        else
        {

            strtok(x,",");
            strtok(NULL,":");
            datax = strtok(NULL,",");
            strtok(x,",");
            char *data_num = strtok(NULL,",");
            char len = atoi(data_num);
            
            if(strcmp(datax,"\r\n")==0)goto get;
            else if(len > num)return NULL;
            //for(int i=0;i<len;i++)
            //    *datax++=*data++;
            //printf("%s\r\n",datax);
            return datax;
            //data = strtok(x,"");
            //buffer = data;
            //pc.printf("%s   , %s ,   %s\r\n",y,data_num,data);
        }
    }
    /*void uart_setting(int fre=115200,int bit=8,int stopbit=1,int parity=0,int flow_control=3)
    {
        
        Seri->printf("AT+UART_CUR=%d,%d,%d,%d,%d\r\n",fre,bit,stopbit,parity,flow_control);
        Seri->baud(fre);
        Seri->format(bit);
        Seri->set_flow_control(Serial::RTSCTS,p9,p10);
        //check();
        wait(0.1);
    }*/
    bool sleep(int mode)
    {
        Seri->printf("AT+SLEEP=%d",mode);
        return check();   
    }
    bool deepsleep(int ms)
    {
        Seri->printf("AT+GSLP=%d",ms);
        return check();
    }
    bool http_access(char* mode,char* url,int num=80)
    {
        if(connected==false)return false;
        Seri->printf("AT+CIPSTART=\"%s\",\"%s\",%d",mode,url,num);
        return check();  
    }
    void prompt()
    {
        Seri->attach(this,&esp8266::Reception);
    }   
    bool connect(const char* ssid,const char* password)
    {
        Seri->printf("AT+CWJAP=\"%s\",\"%s\"",ssid,password);
        connected|=check();
        if(connected==false)return false;  
        Seri->printf("AT+CIFSR");
        check();
        return true;
    }
    bool softAPfromIP()
    {
        Seri->printf("AT+CWLIF");
        return check();   
    }
    //Seri->printf("AT+CIPSTA_CUR=\"%s\",\"%s\",\"%s\"",IP,gateway,netmask);
    bool EDDHCP(int mode,int en)
    {
        printf("AT+CWDHCP_CUR=%d,%d",mode,en);
        return check();
    }
    bool softAP(const char* ssid,const char* password,int ch,int ecn)
    {
        if(connectmode==AP||connectmode==APST)
        Seri->printf("AT+CWSAP=\"%s\",\"%s\",%d,%d",ssid,password,ch,ecn);
        return check();
    }
    bool send(int num,char* data)
    {
        if(connected==false)return false;
        Seri->printf("AT+CIPSEND=0,%d",num+2);
        check();
        wait(0.01);
        Serial pc(USBTX,USBRX);
        pc.baud(115200);
        while(1)
        {
            char i = Seri->getc();
            pc.putc(i);
            if(i=='>')break;
        }
        Seri->printf("%s",data);
        Seri->printf("\r\n");
        return check();
    }
    bool accesspoint()
    {
        Seri->printf("AT+CWLAP\r\n");
        return check();
    }
    bool find_accesspoint(char *wifi)
    {
        Seri->printf("AT+CWLAP=\"%s\"");
        return check();
    }    
    bool find_accesspoint()
    {
        Seri->printf("AT+CWLAP");
        return check();
    }
    bool multipull(int i)
    {
        Seri->printf("AT+CIPMUX=%d",i);
        return check();
    }
    void reset()
    {
        Serial pc(USBTX,USBRX);
        pc.baud(115200);
        Seri->printf("AT+RST\r\n");
        int f=0;
        while(1)
        {
            char a=Seri->getc();
            pc.putc(a);
            if(a=='r')f=1;
            else if(a=='e'&&f==1)f=2;
            else if(a=='a'&&f==2)f=3;
            else if(a=='d'&&f==3)f=4;
            else if(a=='y'&&f==4)break;
            else f=0;
            
        }
        wait(0.1);       
    }/*
    char *read()
    {
        return buffer;
    }*/
    void tcp_setting(int mode,int port)
    {
        Seri->printf("AT+CIPSERVER=%d,%d",mode,port);
        check();
        wait(0.1);
        printf("\r\nwait connection\r\n");
        while(1)
        {
            char x[10];
            Seri->scanf("%s",x);
            if(strcmp(x,"0,CONNECT")==0)break;
        }
        printf("\r\OK\r\n");
    }
    bool connection_mode(int mode)
    {
        connectmode=mode;
        Seri->printf("AT+CWMODE=%d",mode);
        return check();
    }
    bool disconnect()
    {
        Seri->printf("AT+CWQAP");
        connected=false;
        return check();
    }
    bool ATcommand(const char* cmd)
    {
        char a[20];
        strcat(a,"AT+");
        strcat(a,cmd);
        Seri->printf(a);
        return check();  
    }     
    const char AP=2;
    const char ST=1;
    const char APST=3;
    char  connectmode;
    esp8266(Serial *ser) : myled(LED2)
    {
        myled=1;
        connected=false;
        //string ;
        Seri = ser;
        bool f = false;
        int i=0; 
        
        Seri->printf("AT\r\n");
        while(1) {
            if(Seri->readable())
            {
            char x = Seri->getc();
            pc.putc(x);
            if(x=='O')f=true;
            else if(x=='K'&&f==true)break;
            else f=false;
            }
        }
        //Seri->attach(this,&esp8266::Reception);
        /*data = "AT";
        //data +=end;
        Seri->printf(data);
        Seri->printf(end);*/
        wait(0.5);
    }
    
};
/*void end()
{
    esp.printf("\r\n");
}*/
void send_AT()
{
    esp.printf("AT");
}
int main() {
    string a;
    myled = 1;
    pc.baud(115200);
    esp.baud(115200);
    printf("Start\r\n");
    wait(0.1);
    esp8266 ESP(&esp);
    //send_AT();
    //end();
    //ESP.reset();
    ESP.connection_mode(3);
    ESP.multipull(1);
    ESP.accesspoint();
    
    ESP.connect("biz","roborobo");
    //ESP.http_access("TCP","imaoca.webcrow.jp",80);
    ESP.tcp_setting(1,8888);
    char senddata[10];/*
    pc.printf("\r\n tcp send data\r\n");
    for(int i=0;i<10;i++)
    {
        senddata[i]=pc.getc();
        pc.putc(senddata[i]);    
    }*/
    //ESP.send(10,senddata);
    //ESP.prompt();
    ESP.softAP("ESP8266","",10,0);
    char *data,num=30;
    DigitalOut LED(LED4);
    while(1)
    {
    //    data = ESP.get_data(data,num);
    //    if(data!=NULL)
    //        printf("GET->%s\r\n",data);
        myled=1;
        wait(0.01);
        myled=0;
        data=ESP.get_data(data,num);
        printf("%s\r\n",data);
        if (strstr(data,"ON")!=NULL)
            LED=1;
        if (strstr(data,"OFF")!=NULL)
            LED=0;
       //pc.putc( esp.getc());
    }
    /*while(1) {
        char x = esp.getc();
        pc.putc(x);
        if(x=='O')f=true;
        else if(x=='K'&&f==true)break;
        else f=false;
    }*/
    myled=0;
}