modified by ohneta
Dependencies: DnsQuery ESP8266Interface NetworkSocketAPI mbed
Fork of HelloESP8266Interface by
Diff: main.cpp
- 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) { + } }