modified by ohneta

Dependencies:   DnsQuery ESP8266Interface NetworkSocketAPI mbed

Fork of HelloESP8266Interface by NetworkSocketAPI

Revision:
24:2b91c0e2067b
Parent:
22:1d355289fc18
Child:
25:8536695a236d
--- a/main.cpp	Thu Aug 13 15:50:46 2015 +0000
+++ b/main.cpp	Tue Nov 10 14:58:47 2015 +0000
@@ -17,39 +17,202 @@
 #include "mbed.h"
 #include "ESP8266Interface.h"
 
-DigitalOut myled(LED1);
-void flash(){myled = !myled;}
+#define     RESPOSE_BUFFER_SIZE     1024
+
+
+Serial pc(USBTX, USBRX);
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+
+uint32_t    _tickCount = 0L;
+void flash()
+{
+    led1 = !led1;
+    _tickCount++;
+}
+
+ESP8266Interface wifi(p9, p10);
+
+/**
+ *
+ */   
+bool parseURL(const char *url, char *scheme, char *host, uint16_t *port, char *path)
+{
+    *port = 0;
+
+    char *schemePtr = (char *)url;
+    char *hostPtr = (char *)strstr(url, "://");
+    if (hostPtr == NULL) {
+        pc.printf("Could not find host");
+        return false;
+    }
+
+    memcpy(scheme, schemePtr, hostPtr - schemePtr);
+    scheme[hostPtr - schemePtr] = '\0';
+
+    if (strcmp(scheme, "http") == 0) {
+        *port = 80;
+    } else if(strcmp(scheme, "https") == 0) {
+        *port = 433;
+    }
+            
+    hostPtr += 3;
+    size_t hostLen = 0;
+
+    char *portPtr = strchr(hostPtr, ':');
+    if (portPtr != NULL) {
+        hostLen = portPtr - hostPtr;
+        portPtr++;
+        if (sscanf(portPtr, "%hu", port) != 1) {
+            pc.printf("Could not find port");
+            return false;
+        }
+    }
+
+    char* pathPtr = strchr(hostPtr, '/');
+    if( hostLen == 0 ) {
+        hostLen = pathPtr - hostPtr;
+    }
+
+    memcpy(host, hostPtr, hostLen);
+    host[hostLen] = '\0';
+
+    size_t pathLen;
+    char *fragmentPtr = strchr(hostPtr, '#');
+    if(fragmentPtr != NULL) {
+        pathLen = fragmentPtr - pathPtr;
+    } else {
+        pathLen = strlen(pathPtr);
+    }
+
+    memcpy(path, pathPtr, pathLen);
+    path[pathLen] = '\0';
+
+    return true;
+}
+
+
+
+bool getHttpDebug(SocketInterface *socket, const char *urlStr)
+{
+    char scheme[8];
+    char host[32];
+    uint16_t port;
+    char path[256];
 
-ESP8266Interface wifi(D1, D0);
+    bool res = parseURL(urlStr, scheme, host, &port, path);
+pc.printf("%lu:parseURL=%d:  %s -->  %s, %s, %d, %s  \n", _tickCount, res, urlStr, scheme, host, port, path);
+#if 1
+    char host_ip[16];
+    wifi.getHostByName(host, host_ip);
+#else
+    char *host_ip = "54.249.236.250";
+#endif
+pc.printf("%lu:host IP address : %s\n", _tickCount, host_ip);
+uint32_t ret;
+
+_tickCount = 0;
+    socket->setAddressPort(host_ip, port);
+    ret = socket->open();
+led2 = 1;
+pc.printf("%d:opend : %d: %s:%d\n", _tickCount, ret, host_ip, port);
+
+    char str[512] = {0};
+    sprintf(str, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", path, host);
+pc.printf("%lu: REQUEST:\n%s\n------\n", _tickCount, str);
+
+    // Send Data
+pc.printf("%lu:Sending GET data...\n", _tickCount);
+    socket->send(str, strlen(str));
+
+    static char retBuf[512] = {0};
+pc.printf("%lu:Waiting on reply ... \n", _tickCount);
+    int revLen = socket->recv(retBuf, 512, 10000);
+    retBuf[revLen] = 0;
+pc.printf("%lu:Received String : (%d) : \n%s\n", _tickCount, revLen, retBuf);
+ 
+    socket->close();
+led2 = 0;
+pc.printf("%lu:socket closed\n", _tickCount);
+
+    return true;
+}
+
+
+bool getHttp(SocketInterface *socket, const char *urlStr, char *rsponse)
+{
+    uint32_t ret;
+
+    char scheme[8];
+    char host[32];
+    uint16_t port;
+    char path[256];
+    int res = parseURL(urlStr, scheme, host, &port, path);
+
+    char host_ip[16];
+    wifi.getHostByName(host, host_ip);
+
+
+    socket->setAddressPort(host_ip, port);
+    ret = socket->open();
+
+led2 = 1;
+    char str[512] = {0};
+    sprintf(str, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", path, host);    // HTTP/1.1の最低限なリクエスト
+
+    // Send Data
+    socket->send(str, strlen(str));
+
+    // Receive Data
+    int revLen = socket->recv(rsponse, RESPOSE_BUFFER_SIZE, 10000);
+    rsponse[revLen] = 0;
+pc.printf("%lu:Received String : (%d) : \n%s\n", _tickCount, revLen, rsponse);
+    socket->close();
+led2 = 0;
+
+    // retBufを httpプロトコルで分解しようか?
+    {
+        // 最低限でもresult codeくらい調べたい
+
+        // 必要なヘッダだけ取り出す
+        //  Date-xx: xxxxxx
+    }
+
+    return true;
+}
+
+
+
 
 int main()
 {
+    pc.baud(115200);
+    
+    
     Ticker t;
-    t.attach(flash, 0.2f);
-    printf("NetworkSocketAPI Example\r\n");
+    t.attach(flash, 0.1f);
+    pc.printf("NetworkSocketAPI TEST by ohneta.\r\n");
 
-    wifi.init();
-    wifi.connect("iotlab", "42F67YxLX4AawRdcj");
-    
+    int32_t ret = wifi.init();
+    pc.printf("wifi.init() : %d\n", ret);
+
+    ret = wifi.connect("elecom2g-15BEAC", "2903851513877");     // SSID-name, SSID-passPhase
+    pc.printf("wifi.connect() : %d\n", ret);
+
+    wifi.setPreferredDns("192.168.2.1");        // Preferred DNS IP-address
+
     char* ip;
     ip = wifi.getIPAddress();
-    printf("IP Address is: %s\n", (ip) ? ip : "No IP");
-    char host_ip[50];
-    wifi.getHostByName("google.com",host_ip);
-    printf("Google.com resolved to: %s\n",host_ip);
-    
+    pc.printf("IP Address is: %s\n", (ip) ? ip : "No IP");
+
+
+    SocketInterface *socket = wifi.allocateSocket(SOCK_TCP);
 
-    SocketInterface* mySocket = wifi.allocateSocket(SOCK_TCP);
-    char recieved[100];
-    int recv_amnt = 0;
+    char responseBuffer[RESPOSE_BUFFER_SIZE] = {0};
+    getHttp(socket, "http://iina.ohneta.net/iinalab_office/api/inout_status.php?person=0&inout=0", responseBuffer);
+
+    wifi.disconnect();
     
-    //Sending and receiving from echo server 
-    mySocket->setAddressPort("192.168.13.8", 7);
-    mySocket->open();
-    mySocket->send("Hello",5, 10000);
-    recieved[5] = 0;
-    recv_amnt = mySocket->recv(recieved, 5, 10000);
-    printf("Recieved: %d, %s\n",recv_amnt, recieved);
-    mySocket->close();
-    wifi.disconnect();
+    while(1) {
+    }
 }