see: https://developer.mbed.org/users/phsfan/notebook/phsshield/

Dependencies:   a3gs mbed

Files at this revision

API Documentation at this revision

Comitter:
phsfan
Date:
Tue Mar 10 01:18:38 2015 +0000
Commit message:
1st build

Changed in this revision

TinyHTTP_a3gs.cpp Show annotated file Show diff for this revision Revisions of this file
TinyHTTP_a3gs.h Show annotated file Show diff for this revision Revisions of this file
a3gs.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
diff -r 000000000000 -r 864cc2bec4bf TinyHTTP_a3gs.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TinyHTTP_a3gs.cpp	Tue Mar 10 01:18:38 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_a3gs.h"
+#include "a3gs.h"
+#include <ctype.h>
+
+//#define DEBUG
+
+extern A3GS a3gs;
+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;
+
+    if (a3gs.connectTCP(host, port)) return -1;
+
+#ifdef DEBUG
+        printf("connected\r\n");
+#endif
+
+    // send request
+    if (method == METHOD_POST) {
+        a3gs.write((uint8_t*)"POST ", 5);
+    } else {
+        a3gs.write((uint8_t*)"GET ", 4);
+    }
+    a3gs.write((uint8_t*)uri, strlen(uri));
+    a3gs.write((uint8_t*)" HTTP/1.1\r\nHost: ", 17);
+    a3gs.write((uint8_t*)host, strlen(host));
+    a3gs.write((uint8_t*)"\r\n", 2);
+    a3gs.write((uint8_t*)"Connection: close\r\n", 19);
+    if (head) {
+        a3gs.write((uint8_t*)head, strlen(head));
+    }
+    if (method == METHOD_POST) {
+        sprintf(buf, "Content-Length: %d\r\n", strlen(body));
+        a3gs.write((uint8_t*)buf, strlen(buf));
+    }
+    a3gs.write((uint8_t*)"\r\n", 2);
+
+    // post method
+    if (method == METHOD_POST && body) {
+        a3gs.write((uint8_t*)body, strlen(body));
+    }
+
+    printf("wait for response\r\n");
+    // recv
+    int err = 0;
+    for (;;) {
+        i = a3gs.read(buf, sizeof(buf) - 1);
+        if (i <= 0) break;
+
+        if (onHttpReceive != NULL) onHttpReceive(buf, i);
+    }
+    ret = 0;
+
+    a3gs.disconnectTCP();
+
+    return ret;
+}
diff -r 000000000000 -r 864cc2bec4bf TinyHTTP_a3gs.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TinyHTTP_a3gs.h	Tue Mar 10 01:18:38 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
diff -r 000000000000 -r 864cc2bec4bf a3gs.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/a3gs.lib	Tue Mar 10 01:18:38 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/phsfan/code/a3gs/#ca471c239d5f
diff -r 000000000000 -r 864cc2bec4bf main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Mar 10 01:18:38 2015 +0000
@@ -0,0 +1,41 @@
+#include "mbed.h"
+#include "a3gs.h"
+#include "TinyHTTP_a3gs.h"
+
+Serial pc(USBTX, USBRX);
+DigitalOut myled(LED1);
+
+A3GS a3gs(p28, p27, p29, p23, p11, 9600); // tx, rx, interrupt, power, regulator
+
+void callback (char *buf, int len) {
+    buf[len] = 0;
+    printf(buf);
+}
+
+int main() {
+    pc.baud(115200);
+    pc.printf("*** PHS Shield\r\n");
+
+    a3gs.start();
+    if (a3gs.begin()) {
+        error("Could not connect");
+    }
+    myled = 1;
+
+    //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");
+/*
+    char buf[a3gsMAX_RESULT_LENGTH + 1];
+    char header[] = "Server: developer.mbed.org\n";
+    if (a3gs.httpGET("developer.mbed.org", 80, "/media/uploads/phsfan/hello.txt", buf, sizeof(buf), false, header) == 0) {
+        printf("HTTP GET: %s\r\n", buf);
+    }
+*/
+    wait(1);
+    pc.printf("bye\r\n");
+    a3gs.end();
+    a3gs.shutdown();
+    myled = 0;
+}
diff -r 000000000000 -r 864cc2bec4bf mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Mar 10 01:18:38 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/7e07b6fb45cf
\ No newline at end of file