yangyang

Dependencies:   WIZnetInterface mbed

Fork of espyun1 by jiang hao

main.cpp

Committer:
846354866
Date:
2016-11-04
Revision:
4:e1d2c6f94c69
Parent:
2:00baa8aaaaf1
Child:
6:bc4901a948b1

File content as of revision 4:e1d2c6f94c69:

#include "mbed.h"
#include "EthernetInterface.h"
#include "cJSON.h"

DigitalInOut myIOD10(D10);
DigitalOut myOutD12(D12);
AnalogIn myInA1(A1);
int socketPort = 8000;
int httpPort = 80;

Serial pc(PA_13,PA_14);

char path[]="/v1/datastreams/test/datapoint/";

int MallocSize = 800*sizeof(char);
bool socket_GET(TCPSocketConnection &conn);
bool http_GET(TCPSocketConnection &conn);
bool http_POST(TCPSocketConnection &conn,int vall);
bool socket_POST(TCPSocketConnection &conn,int vall);
bool closeConnect(TCPSocketConnection &conn);
void receive_dht11();
unsigned char receive_byte();
Timeout receive_dht11Timeout;

void delay(unsigned char ms)
{ 
    unsigned int y;
    while(ms--)
        for(y=1920; y>0; y--);
}

void Delay_us(unsigned char us)
{
    unsigned char y;
    while(us--)
        for(y=2; y>0; y--);
}

float val;
int mathtest;
bool out=false;
unsigned char RH,RL,TH,TL;
unsigned char data_byte;
unsigned int  U8FLAG;
static unsigned char num = 4;
const char receive_module[4][5] = {"Led", "Gas", "Hum", "Temp", };

int main() { 
    int phy_link;
    pc.printf("Wait a second...\r\n");
    uint8_t mac_addr[6] = {0x78, 0x08, 0xDC, 0x1c, 0xa8, 0x95}; 
    receive_dht11Timeout.attach(&receive_dht11,0.2f);
    
    EthernetInterface eth;
    eth.init(mac_addr); //Use DHCP
    eth.connect();
    pc.printf("start IP Address is %s\r\n", eth.getIPAddress());
    /*
    do{
        phy_link = eth.ethernet_link();
        pc.printf("...");
        wait(2);
    }while(!phy_link);
    printf("\r\n");
    */
    pc.printf("IP Address is %s\r\n", eth.getIPAddress());

    TCPSocketConnection conn;
    
    while(true)
    {   
        wait(1);
        int temp = TH;
        int hum = RH;
        int gas = myInA1.read();
        int led = myOutD12.read();
        static int val;
        if(num)
        {
            if (num == 4)
                val = TH;
            else if (num == 3)
                val = RH;
            else if (num == 2)
                val = gas;
            else if (num == 1)
                val = led;
        }
        //ceil(val);//math.h
        pc.printf("send_data=%d,n=%d\r\n",val,mathtest);
        pc.printf("start http_post\r\n");
        if(http_POST(conn, val))
        {
            if(!conn.close()){//短连接,断开一次连接一次
                pc.printf("conn.close OK\r\n");    
            }else{
                pc.printf("conn.close ERR\r\n"); 
                break;   
            }
        }else{
             if(out)break;   
             pc.printf("connect close err!!!to do something\r\n");

        }
        
        val = 0.0;  
        mathtest = 0; 
        
        if(out)break;
    }
                
    eth.disconnect();
    pc.printf("out the program!\r\n");
    return 0;                     
}

/*http POST*/
bool http_POST(TCPSocketConnection &conn, int val)
{
    pc.printf("1111\r\n");
    //wait(0.5);
    if(conn.is_connected()){
        pc.printf("connect is already ok!\r\n");    
    }else{
        if(!conn.connect("iot.espressif.cn", httpPort)) //80 for http,8000 for socket
            pc.printf("connect OK!\r\n");
        else{
            pc.printf("connct ERR!\r\n");
            out = true;
            return false;    
        }
    }
    pc.printf("2222\r\n");
    cJSON* http_post=NULL;  
    http_post = cJSON_CreateObject();    
    if(NULL == http_post)
    {
         pc.printf("OUT4\r\n");
         out = true;
         return false;
    }
    pc.printf("3333\r\n");
    cJSON* http_post_json=NULL;  
    http_post_json = cJSON_CreateObject();    
    if(NULL == http_post_json)
    {
         cJSON_Delete(http_post);
         pc.printf("OUT5\r\n");
         out = true;
         return false;
    }
    cJSON_AddNumberToObject(http_post_json, "x", val);
    //cJSON_AddNumberToObject(http_post_json, "y", 2);
    //cJSON_AddNumberToObject(http_post_json, "z", 2);
    cJSON_AddItemToObject(http_post, "datapoint", http_post_json);
    char* pJSON_http_post = cJSON_PrintUnformatted(http_post);
    pc.printf("4444\r\n");
    if(NULL == pJSON_http_post)
    {
        cJSON_Delete(http_post);
        pc.printf("OUT6\r\n");
        out = true;
        return false;
    }
    
    //Pay attention to out of memory
    //char http_POST_cmd[500] = "POST /v1/datastreams/jhtest/datapoint/ HTTP/1.1\r\nUser-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3\r\n"\
                     // "Host:iot.espressif.cn\r\nAccept: */*\r\nAuthorization: token ebe1671e9d9f42a5231d017ec550552b9bae2cdf\r\n"\
                     // "Content-Length: 33\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n";
    char http_POST_cmd[500];// = "POST /v1/datastreams/test/datapoint/ HTTP/1.1\r\nUser-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3\r\n"\
    //                  "Host:iot.espressif.cn\r\nAccept: */*\r\nAuthorization: token b1e92cf17fe4482647924941949ab2b07ffab548\r\n"\
    //                  "Content-Length: ";
    sprintf(http_POST_cmd,"POST /v1/datastreams/%s/datapoint/ HTTP/1.1\r\nUser-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3\r\n"\
                      "Host:iot.espressif.cn\r\nAccept: */*\r\nAuthorization: token b1e92cf17fe4482647924941949ab2b07ffab548\r\n"\
                      "Content-Length: ", receive_module[num-1]);
    num--;
    if (num == 0)
        num = 4;
        
    char len[2]; 
    len[0]=strlen(pJSON_http_post)/10%10+48;
    len[1]=strlen(pJSON_http_post)%10+48;
    strcat(http_POST_cmd,len);
    strcat(http_POST_cmd,"\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n");
     
    strcat(http_POST_cmd,pJSON_http_post);
    conn.send_all(http_POST_cmd, strlen(http_POST_cmd));//http_cmd for http,pJSON for socket,should be three changes
    pc.printf("%s\r\n",http_POST_cmd); 
    pc.printf("5555\r\n");
    char *buffer = NULL;
    buffer = (char *)malloc(MallocSize);
    if(!buffer)pc.printf("malloc buffer err\r\n");

    int ret;
    pc.printf("6666\r\n");
    while (true) {
        wait(1);
        ret = conn.receive(buffer, MallocSize-1);
        pc.printf("ret = %d\r\n",ret);
        if (ret <= 0) {
            break;
        }
        buffer[ret] = '\0';
        pc.printf("Received %d chars from server: %s\n", ret, buffer);     
    }
    pc.printf("http_POST OUT\r\n");

    free(pJSON_http_post);
    free(buffer);
    cJSON_Delete(http_post);
    pc.printf("7777\r\n");
    return true;
}

/*socket GET*/
bool socket_GET(TCPSocketConnection &conn)
{
    if(conn.is_connected()){
        pc.printf("connect is already ok!\r\n");    
    }else{
        if(!conn.connect("iot.espressif.cn", socketPort)) //80 for http,8000 for socket,处理超时,拔掉网线后,卡在conn.connect
            pc.printf("connect OK!\r\n");
        else{
            pc.printf("connct ERR!\r\n");
            out = true;
            return false;    
        }
    }
    
    cJSON * pJsonRoot = NULL;
    pJsonRoot = cJSON_CreateObject();
    if(NULL == pJsonRoot)
    {
        pc.printf("socket_GET OUT1\r\n");
        out = true;
        return false;
    }

    cJSON * pSubJson = NULL;
    pSubJson = cJSON_CreateObject();
    if(NULL == pSubJson)
    {
         cJSON_Delete(pJsonRoot);
         pc.printf("socket_GET OUT2\r\n");
         out = true;
         return false;
    }

    cJSON_AddStringToObject(pJsonRoot, "path", "/v1/datastreams/test/datapoint/");  
    cJSON_AddStringToObject(pSubJson, "Authorization", "token 48661aa81484f501362ed5ef4cc85e67eb2a3e3d");
    cJSON_AddItemToObject(pJsonRoot, "meta", pSubJson);
    cJSON_AddStringToObject(pJsonRoot, "method", "GET");  
      
    char* pJSON = cJSON_PrintUnformatted(pJsonRoot);
    strcat(pJSON,"\n");//socket at the end should have '\n',use wireshark
 
    if(NULL == pJSON)
    {
        cJSON_Delete(pJsonRoot);
        pc.printf("socket_GET OUT3\r\n");
        out = true;
        return false;
    }
    
    conn.send_all(pJSON, strlen(pJSON));//http_cmd for http,pJSON for socket,should be three changes
    pc.printf("%s\r\n",pJSON);
    
    char *buffer = NULL;
    buffer = (char *)malloc(MallocSize);
    if(!buffer)pc.printf("malloc buffer err\r\n");
    int ret;

    while (true) {
        wait(1);
        ret = conn.receive(buffer, MallocSize-1);
        pc.printf("ret = %d\r\n",ret);
        if (ret <= 0) {
            break;
        }
        buffer[ret] = '\0';
        pc.printf("Received %d chars from server: %s\n", ret, buffer);     
    }
    pc.printf("socket_GET OUT\r\n");
    
    free(pJSON);//for socket
    cJSON_Delete(pJsonRoot);//for socket
    free(buffer);
    return true;
}

/*http_GET*/
bool http_GET(TCPSocketConnection &conn)
{
    if(conn.is_connected()){
        pc.printf("connect is already ok!\r\n");    
    }else{
        if(!conn.connect("iot.espressif.cn", httpPort)) //80 for http,8000 for socket
            pc.printf("connect OK!\r\n");
        else{
            pc.printf("connct ERR!\r\n");
            out = true;
            return false;    
        }
    }
    
    char http_cmd[] = "GET /v1/datastreams/test/datapoint/ HTTP/1.1\r\nUser-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3\r\n"\
                      "Host:iot.espressif.cn\r\nAccept: */*\r\nAuthorization: token ebe1671e9d9f42a5231d017ec550552b9bae2cdf\r\n\r\n";
    
    conn.send_all(http_cmd, strlen(http_cmd));//http_cmd for http,pJSON for socket,should be three changes
    pc.printf("%s\r\n",http_cmd);
    
    //char *buffer = NULL;
    //buffer = (char *)malloc(MallocSize);
    //if(!buffer)pc.printf("malloc buffer err\r\n");
    char buffer[500];
    int ret;

    while (true) {
        wait(1);
        ret = conn.receive(buffer, 500-1);
        pc.printf("ret = %d\r\n",ret);
        if (ret <= 0) {
            break;
        }
        buffer[ret] = '\0';
        pc.printf("Received %d chars from server: %s\n", ret, buffer);     
    }
    pc.printf("http_GET OUT\r\n");
    /* ///conn.close
    if(conn.close()){
        pc.printf("conn.close OK\r\n");    
    }else{
        pc.printf("conn.close ERR\r\n");    
    }
    */
    //free(buffer);
    return true;
}

/*socket POST*/
bool socket_POST(TCPSocketConnection &conn,int vall)
{   
    if(conn.is_connected()){
        pc.printf("connect is already ok!\r\n");    
    }else{
        if(!conn.connect("iot.espressif.cn", socketPort)) //80 for http,8000 for socket
            pc.printf("connect OK!\r\n");
        else{
            pc.printf("connct ERR!\r\n");
            out = true;
            return false;    
        }
    }
    cJSON* socket_post=NULL;  
    socket_post = cJSON_CreateObject();    
    if(NULL == socket_post)
    {
         pc.printf("OUT4\r\n");
         out = true;
         return false;
    }
    
    
    cJSON_AddStringToObject(socket_post, "path", path); 
    cJSON_AddStringToObject(socket_post, "method", "POST"); 
    
    cJSON* sock_post_token=NULL;  
    sock_post_token = cJSON_CreateObject();    
    if(NULL == sock_post_token)
    {
         cJSON_Delete(socket_post);
         pc.printf("OUT5\r\n");
         out = true;
         return false;
    }
    cJSON_AddStringToObject(sock_post_token, "Authorization", "token 514cc9c3aa07a4a56246cb9259c8264fd2ae56f6");
    cJSON_AddItemToObject(socket_post, "meta", sock_post_token);
    
    cJSON* sock_post_xyz=NULL;  
    sock_post_xyz = cJSON_CreateObject();    
    if(NULL == sock_post_xyz)
    {
         cJSON_Delete(socket_post);
         pc.printf("OUT6\r\n");
         out = true;
         return false;
    }
    cJSON_AddNumberToObject(sock_post_xyz, "x", vall);
    //cJSON_AddNumberToObject(sock_post_xyz, "y", 8);
    //cJSON_AddNumberToObject(sock_post_xyz, "z", 8);
    cJSON* sock_post_datapoint=NULL;  
    sock_post_datapoint = cJSON_CreateObject();    
    if(NULL == sock_post_datapoint)
    {
         cJSON_Delete(socket_post);
         pc.printf("OUT6\r\n");
         out = true;
         return false;
    }
    cJSON_AddItemToObject(sock_post_datapoint, "datapoint", sock_post_xyz);
    cJSON_AddItemToObject(socket_post, "body", sock_post_datapoint);
    
    char* pJSON_sock_post = cJSON_PrintUnformatted(socket_post);

    if(NULL == pJSON_sock_post)
    {
        cJSON_Delete(socket_post);
        pc.printf("OUT7\r\n");
        out = true;
        return false;
    } 
    strcat(pJSON_sock_post,"\n");
    
    conn.send_all(pJSON_sock_post, strlen(pJSON_sock_post));//http_cmd for http,pJSON for socket,should be three changes
    pc.printf("%s\r\n",pJSON_sock_post); 
    
    char *buffer = NULL;
    buffer = (char *)malloc(MallocSize);
    if(!buffer)pc.printf("malloc buffer err\r\n");

    int ret;

    while (true) {
        ret = conn.receive(buffer, MallocSize-1);
        pc.printf("ret = %d\r\n",ret);
        if (ret <= 0) {
            break;
        }
        buffer[ret] = '\0';
        pc.printf("Received %d chars from server: %s\n", ret, buffer);     
    }
    pc.printf("socket_POST OUT\r\n");
    
    free(pJSON_sock_post);
    free(buffer);
    cJSON_Delete(socket_post);

    return true;  
}

bool closeConnect(TCPSocketConnection &conn)
{
    if(conn.is_connected()){
        pc.printf("connect is already ok!\r\n");    
    }else{
        if(!conn.connect("iot.espressif.cn", socketPort)) //80 for http,8000 for socket
            pc.printf("connect OK!\r\n");
        else{
            pc.printf("connct ERR!\r\n");
            out = true;
            return false;    
        }
    }
    

    cJSON* close_post=NULL;  
    close_post = cJSON_CreateObject();    
    if(NULL == close_post)
    {
         pc.printf("OUT4\r\n");
         out = true;
         return false;
    }
    
    
    cJSON_AddStringToObject(close_post, "path", "/v1/The_Gas/quit/"); 
    cJSON_AddStringToObject(close_post, "method", "POST"); 
    
    cJSON* close_post_token=NULL;  
    close_post_token = cJSON_CreateObject();    
    if(NULL == close_post_token)
    {
         cJSON_Delete(close_post);
         pc.printf("OUT5\r\n");
         out = true;
         return false;
    }
    cJSON_AddStringToObject(close_post_token, "Authorization", "token 514cc9c3aa07a4a56246cb9259c8264fd2ae56f6");
    cJSON_AddItemToObject(close_post, "meta", close_post_token);  
    
    char* close_pJSON = cJSON_PrintUnformatted(close_post);

    if(NULL == close_pJSON)
    {
        cJSON_Delete(close_post);
        pc.printf("OUT7\r\n");
        out = true;
        return false;
    } 
    strcat(close_pJSON,"\n");
    
    conn.send_all(close_pJSON, strlen(close_pJSON));//http_cmd for http,pJSON for socket,should be three changes
    pc.printf("%s\r\n",close_pJSON); 
    
    char *buffer = NULL;
    buffer = (char *)malloc(MallocSize);
    if(!buffer)pc.printf("malloc buffer err\r\n");

    int ret;

    while (true) {
        ret = conn.receive(buffer, MallocSize-1);
        pc.printf("ret = %d\r\n",ret);
        if (ret <= 0) {
            break;
        }
        buffer[ret] = '\0';
        pc.printf("Received %d chars from server: %s\n", ret, buffer);     
    }
    pc.printf("close_POST OUT\r\n");
    
    free(close_pJSON);
    free(buffer);
    cJSON_Delete(close_post);

    return true;
}

unsigned char receive_byte()
{
    unsigned char i,temp;
    for(i=0;i<8;i++)
    {
        U8FLAG = 2;
        while(!myIOD10.read() && U8FLAG++);
        Delay_us(30);
        temp=0;
        if(myIOD10.read()==1)
        temp=1;
        U8FLAG = 2;
        while(myIOD10.read() && U8FLAG++);
        
        if(U8FLAG==1)break;
        data_byte<<=1;//
        data_byte|=temp;
    }
    return data_byte;
}

void receive_dht11()
{
    unsigned char T_H,T_L,R_H,R_L,check,num_check;
    
   
    myIOD10.output();
    myIOD10.write(0);
    delay(20);
    
    myIOD10.write(1);
    Delay_us(25);
    myIOD10.write(1);
    
    myIOD10.input();
    if(!myIOD10.read())
    {
        while(!myIOD10.read());
        while(myIOD10.read());
        R_H=receive_byte();
        R_L=receive_byte();
        T_H=receive_byte();
        T_L=receive_byte();
        check=receive_byte();
        pc.printf("--R_H--%d---R_L---%d--T_H--%d---T_L---%d\r\n", R_H,R_L,T_H,T_L);
        Delay_us(20);
        num_check=R_H+R_L+T_H+T_L;pc.printf("--num_check--%d---check---%d\r\n", num_check,check);
        if(num_check==check)
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
            check=num_check;
        }
    }
    
    //pc.printf("humidity [H] -out--%d\r\n", RH);
    //pc.printf("humidity [L] -out--%d\r\n", RL);
    //pc.printf("temperature [H] -out--%d\r\n", TH);
    //pc.printf("temperature [L] -out--%d\r\n", TL);
    
    receive_dht11Timeout.attach(&receive_dht11,0.2f);
}