HTTP Client test for AbitUSBModem. see: http://developer.mbed.org/users/phsfan/notebook/abitusbmodem/

Dependencies:   AbitUSBModem USBHost mbed

Files at this revision

API Documentation at this revision

Comitter:
phsfan
Date:
Thu Feb 19 00:08:49 2015 +0000
Commit message:
1st build;

Changed in this revision

AbitUSBModem.lib Show annotated file Show diff for this revision Revisions of this file
TinyHTTP.cpp Show annotated file Show diff for this revision Revisions of this file
TinyHTTP.h Show annotated file Show diff for this revision Revisions of this file
USBHost.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AbitUSBModem.lib	Thu Feb 19 00:08:49 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/phsfan/code/AbitUSBModem/#1b851249d70b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TinyHTTP.cpp	Thu Feb 19 00:08:49 2015 +0000
@@ -0,0 +1,128 @@
+/*
+ * mbed Tiny HTTP Client for Ethernet Interface Library
+ * Copyright (c) 2012 Hiroshi Suga
+ * Released under the MIT License: http://mbed.org/license/mit
+ */
+
+/** @file
+ * @brief Tiny HTTP Client
+ */
+
+#include "mbed.h"
+#include "TinyHTTP.h"
+#include "TCPSocketConnection.h"
+#include <ctype.h>
+
+//#define DEBUG
+
+static onHttpReceiveFunc onHttpReceive = NULL;
+
+// Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
+int base64enc(const char *input, unsigned int length, char *output, int len) {
+  static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+  unsigned int c, c1, c2, c3;
+
+  if (len < ((((length-1)/3)+1)<<2)) return -1;
+  for(unsigned int i = 0, j = 0; i<length; i+=3,j+=4) {
+    c1 = ((((unsigned char)*((unsigned char *)&input[i]))));
+    c2 = (length>i+1)?((((unsigned char)*((unsigned char *)&input[i+1])))):0;
+    c3 = (length>i+2)?((((unsigned char)*((unsigned char *)&input[i+2])))):0;
+
+    c = ((c1 & 0xFC) >> 2);
+    output[j+0] = base64[c];
+    c = ((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4);
+    output[j+1] = base64[c];
+    c = ((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6);
+    output[j+2] = (length>i+1)?base64[c]:'=';
+    c = (c3 & 0x3F);
+    output[j+3] = (length>i+2)?base64[c]:'=';
+  }
+  output[(((length-1)/3)+1)<<2] = '\0';
+  return 0;
+}
+
+// Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
+int urlencode(char *str, char *buf, int len) {
+  static const char to_hex[] = "0123456789ABCDEF";
+//  char *pstr = str, *buf = (char*)malloc(strlen(str) * 3 + 1), *pbuf = buf;
+  char *pstr = str, *pbuf = buf;
+
+  if (len < (strlen(str) * 3 + 1)) return -1;
+  while (*pstr) {
+    if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~') {
+      *pbuf++ = *pstr;
+    } else if (*pstr == ' ') {
+      *pbuf++ = '+';
+    } else { 
+      *pbuf++ = '%';
+      *pbuf++ = to_hex[(*pstr >> 4) & 0x0f];
+      *pbuf++ = to_hex[*pstr & 0x0f];
+    }
+    pstr++;
+  }
+  *pbuf = '\0';
+  return 0;
+}
+
+void createauth (char *user, char *pwd, char *buf, int len) {
+    char tmp[80];
+
+    strncpy(buf, "Authorization: Basic ", len);
+    snprintf(tmp, sizeof(tmp), "%s:%s", user, pwd);
+    base64enc(tmp, strlen(tmp), &buf[strlen(buf)], len - strlen(buf));
+    strncat(buf, "\r\n", len - strlen(buf));
+}
+
+int httpRequest (int method, char *host, int port, char *uri, char *head, char *body, onHttpReceiveFunc func) {
+    char buf[1000];
+    int i, ret = -1;
+
+    onHttpReceive = func;
+
+    TCPSocketConnection socket;
+    if (socket.connect(host, port) < 0)  goto exit;
+
+#ifdef DEBUG
+        printf("connected\r\n");
+#endif
+
+    // send request
+    if (method == METHOD_POST) {
+        socket.send_all("POST ", 5);
+    } else {
+        socket.send_all("GET ", 4);
+    }
+    socket.send_all(uri, strlen(uri));
+    socket.send_all(" HTTP/1.1\r\nHost: ", 17);
+    socket.send_all(host, strlen(host));
+    socket.send_all("\r\n", 2);
+    socket.send_all("Connection: close\r\n", 19);
+    if (head) {
+        socket.send_all(head, strlen(head));
+    }
+    if (method == METHOD_POST) {
+        sprintf(buf, "Content-Length: %d\r\n", strlen(body));
+        socket.send_all(buf, strlen(buf));
+    }
+    socket.send_all("\r\n", 2);
+
+    // post method
+    if (method == METHOD_POST && body) {
+        socket.send_all(body, strlen(body));
+    }
+
+    printf("wait for response\r\n");
+    // recv
+    for (;;) {
+        i = socket.receive(buf, sizeof(buf) - 1);
+        if (i == 0) break;
+
+        if (onHttpReceive != NULL) onHttpReceive(buf, i);
+    }
+    ret = 0;
+
+exit:
+    socket.close();
+
+    return ret;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TinyHTTP.h	Thu Feb 19 00:08:49 2015 +0000
@@ -0,0 +1,40 @@
+/*
+ * mbed Tiny HTTP Client for Ethernet Interface Library
+ * Copyright (c) 2012 Hiroshi Suga
+ * Released under the MIT License: http://mbed.org/license/mit
+ */
+
+/** @file
+ * @brief Tiny HTTP Client
+ */
+
+#ifndef TinyHTTP_h
+#define TinyHTTP_h
+
+#include "mbed.h"
+
+#define HTTP_PORT 80
+#define HTTP_TIMEOUT 3000 // ms
+
+#define METHOD_GET 0
+#define METHOD_POST 1
+
+typedef void (*onHttpReceiveFunc)(char *buf, int len);
+
+/** send http request
+ * @param method METHOD_GET or METHOD_POST
+ * @param host http server
+ * @param uri URI
+ * @param head http header (CR+LF) (or NULL)
+ * @param body POST body (or NULL)
+ * @return http code, -1:failue
+ */
+int httpRequest (int method, char *host, int port, char *uri, char *head, char *body, onHttpReceiveFunc func);
+
+void createauth (char *user, char *pwd, char *buf, int len);
+
+int base64enc(const char *input, unsigned int length, char *output, int len);
+
+int urlencode(char *str, char *buf, int len);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBHost.lib	Thu Feb 19 00:08:49 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/phsfan/code/USBHost/#87dd5da1a5fe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Feb 19 00:08:49 2015 +0000
@@ -0,0 +1,47 @@
+#include "mbed.h"
+#include "AbitUSBModem.h"
+#include "TinyHTTP.h"
+#include <new>
+
+Serial pc(USBTX, USBRX);
+DigitalOut myled(LED1);
+
+void callback (char *buf, int len) {
+    buf[len] = 0;
+    printf(buf);
+}
+
+void test(void const*) 
+{
+    AbitUSBModem modem;
+
+    printf("connect\r\n");
+    int ret = modem.connect("prin", "prin");
+    if(ret) {
+      printf("Could not connect\r\n");
+      return;
+    }
+
+    printf("IP Address %s\r\n", modem.getIPAddress());
+
+    //GET data
+    printf("Trying to fetch page...\r\n");
+    httpRequest(METHOD_GET, "developer.mbed.org", 80, "/media/uploads/phsfan/hello.txt", NULL, NULL, callback);
+    printf("\r\n");
+
+    Thread::wait(1000);
+    printf("exit\r\n");
+    modem.disconnect();  
+}
+
+int main()
+{
+    pc.baud(115200); 
+    printf("** PHS\r\n");
+
+    Thread testTask(test, NULL, osPriorityNormal, 1024 * 4);
+    while(1) {
+        myled = !myled;
+        Thread::wait(1000);  
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Feb 19 00:08:49 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9ad691361fac
\ No newline at end of file