easy connect wnc added to http request with debug mode enabled. traces collected for AT%CGEQOS, AT%MEAS, AT%PCONI
Dependencies: easy-connect-httpmodified mbed-http
Fork of http-example-wnc-modified by
Revision 15:e96b74243a80, committed 2017-04-19
- Comitter:
- JMF
- Date:
- Wed Apr 19 01:05:49 2017 +0000
- Parent:
- 14:3c173847e681
- Child:
- 16:2f0b693653c3
- Commit message:
- Added support for WNC14A2A
Changed in this revision
--- a/README.md Thu Mar 30 15:15:47 2017 +0200
+++ b/README.md Wed Apr 19 01:05:49 2017 +0000
@@ -2,7 +2,7 @@
This application demonstrates how to make HTTP and HTTPS requests and parse the response from mbed OS 5.
-It consists of four demo's, which you can select in ``source/select-demo.h``.
+It consists of five demo's, which you can select in ``source/select-demo.h``.
* HTTP demo:
* Does a GET request to http://httpbin.org/status/418.
@@ -12,6 +12,7 @@
* Does a POST request to https://httpbin.org/post.
* HTTP demo with socket re-use.
* HTTPS demo with socket re-use.
+# HTTP & HTTPS demo with socket re-use and chunked call-backs
Response parsing is done through [nodejs/http-parser](https://github.com/nodejs/http-parser).
@@ -30,3 +31,4 @@
* K64F with Ethernet.
* NUCLEO_F411RE with ESP8266.
+* AT&T Cellular IoT Starter Kit with WNC M14A2A Cellular Data Module
--- a/easy-connect.lib Thu Mar 30 15:15:47 2017 +0200 +++ b/easy-connect.lib Wed Apr 19 01:05:49 2017 +0000 @@ -1,1 +1,1 @@ -https://github.com/ARMmbed/easy-connect/#a913964341394430cd3997c6f2950f93ba1d75c8 +https://github.com/ARMmbed/easy-connect/#5b9cb8cea4a11b0ab974c991b527c9b79fceae75
--- a/mbed_app.json Thu Mar 30 15:15:47 2017 +0200
+++ b/mbed_app.json Wed Apr 19 01:05:49 2017 +0000
@@ -1,8 +1,8 @@
{
"config": {
"network-interface": {
- "help": "options are ETHERNET,WIFI_ESP8266,MESH_LOWPAN_ND,MESH_THREAD",
- "value": "ETHERNET"
+ "help": "options are ETHERNET,WIFI_ESP8266,MESH_LOWPAN_ND,MESH_THREAD,WNC14A2A",
+ "value": "WNC14A2A"
},
"mesh_radio_type": {
"help": "options are ATMEL, MCR20",
@@ -22,6 +22,12 @@
"wifi-ssid": {
"value": "\"SSID\""
},
+ "WNC_DEBUG": {
+ "value": false
+ },
+ "WNC_DEBUG_SETTING": {
+ "value": 0
+ },
"wifi-password": {
"value": "\"Password\""
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/source/main-x.cpp Wed Apr 19 01:05:49 2017 +0000
@@ -0,0 +1,400 @@
+
+#include "select-demo.h"
+
+/* =====================================================================
+ Copyright © 2016, Avnet (R)
+
+ Contributors:
+ * James M Flynn, www.em.avnet.com
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ either express or implied. See the License for the specific
+ language governing permissions and limitations under the License.
+
+ @file main.cpp / WNC14A2AInterface_HTTP_exampel
+ @version 1.0
+ @date Dec 2016
+
+======================================================================== */
+
+#if DEMO == DEMO_HTTPx
+
+#include "mbed.h"
+#include "easy-connect.h"
+#include "http_request.h"
+#include "https_request.h"
+
+#define STREAM_CNT 10 //when we test streaming, this is how many times to stream the string
+#define STR_SIZE 150*(STREAM_CNT+1) //use a fixed size string buffer based on the streaming data count
+
+#define TOSTR(x) #x
+#define INTSTR(x) TOSTR(x)
+
+//
+// We do the same thing for both http and https, so create a macro to eaze the typing...
+//
+
+
+/* List of trusted root CA certificates
+ * currently one: Let's Encrypt, the CA for httpbin.org
+ *
+ * To add more root certificates, just concatenate them.
+ */
+const char SSL_CA_PEM[] = "-----BEGIN CERTIFICATE-----\n"
+ "MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n"
+ "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n"
+ "DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n"
+ "SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n"
+ "GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n"
+ "AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n"
+ "q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n"
+ "SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n"
+ "Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n"
+ "a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n"
+ "/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n"
+ "AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n"
+ "CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n"
+ "bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n"
+ "c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n"
+ "VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n"
+ "ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n"
+ "MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n"
+ "Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n"
+ "AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n"
+ "uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n"
+ "wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n"
+ "X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n"
+ "PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n"
+ "KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n"
+ "-----END CERTIFICATE-----\n";
+
+//
+// This example is setup to use MBED OS (5.2). It sets up a thread to call the different tests
+// so the default stack size can be varied. TLS is stack intensive and needs additional stack
+// to work effeciently.
+//
+
+Serial pc(USBTX, USBRX);
+
+//
+// The two test functions do the same set of tests, the first one uses standard HTTP methods while
+// the second test uses HTTPS.
+//
+
+void https_test_thread(void); //Thread that runs the two tests
+void test_http(NetworkInterface *net); //function makes standard HTTP calls
+void test_https(NetworkInterface *net); //function makes standard HTTPS calls
+
+int main() {
+ Thread http_test(osPriorityNormal, DEFAULT_STACK_SIZE*4, NULL);
+ pc.baud(115200);
+
+ printf("Testing HTTP and HTTPS interface software.\n");
+ http_test.start(https_test_thread);
+ while (true) {
+ osDelay(500);
+ }
+}
+
+//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// this is the Thread that calls each of the two tests.
+//
+void https_test_thread(void) {
+
+ NetworkInterface *network = easy_connect(true);
+
+ if (!network) {
+ printf("Unable to connect to network!\n");
+ return;
+ }
+ else
+ printf("My IP Address is: %s \n\n", network->get_ip_address());
+
+ test_http(network);
+ test_https(network);
+
+ printf(" - - - - - - - ALL DONE - - - - - - - \n");
+
+ network->disconnect();
+ delete network;
+ Thread::wait(osWaitForever);
+}
+
+
+//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// Utility function to print out responses
+//
+void dump_response(HttpResponse* res)
+{
+ printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str());
+
+ printf("Headers:\n");
+ for (size_t ix = 0; ix < res->get_headers_length(); ix++) {
+ printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str());
+ }
+ printf("\nBody (%d bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str());
+}
+
+void stream_callback(const char *data, size_t len)
+{
+ printf("Chunk Received:\n");
+ for( size_t x=0; x<len; x++ )
+ printf("%c",data[x]);
+ printf("\n");
+}
+
+//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// test the HTTP client class
+//
+void test_http(NetworkInterface *net)
+{
+ TCPSocket *socket = new TCPSocket();
+
+ printf(">>>>>>>>>>>><<<<<<<<<<<<\n");
+ printf(">>> TEST HTTPClient <<<\n");
+ printf(">>>>>>>>>>>><<<<<<<<<<<<\n\n");
+
+ nsapi_error_t open_result = socket->open(net);
+ if (open_result != 0) {
+ printf("Opening TCPSocket failed... %d\n", open_result);
+ return;
+ }
+
+ nsapi_error_t connect_result = socket->connect("developer.mbed.org", 80);
+ if (connect_result != 0) {
+ printf("Connecting over TCPSocket failed... %d\n", connect_result);
+ return;
+ }
+ else
+ printf("Connected over TCP to developer.mbed.org\n\n");
+
+ printf(" >>>First, lets get a page from http://developer.mbed.org\n");
+ {
+ HttpRequest* get_req = new HttpRequest(socket,HTTP_GET,"http://developer.mbed.org/media/uploads/mbed_official/hello.txt");
+ HttpResponse* get_res = get_req->send();
+ if (!get_res) {
+ printf("HttpRequest failed (error code %d)\n", get_req->get_error());
+ return;
+ }
+
+ printf("\n----- RESPONSE: -----\n");
+ dump_response(get_res);
+ delete get_req;
+ }
+ delete socket;
+
+ socket = new TCPSocket();
+
+ open_result = socket->open(net);
+ if (open_result != 0) {
+ printf("Opening TCPSocket failed... %d\n", open_result);
+ return;
+ }
+
+ connect_result = socket->connect("httpbin.org", 80);
+ if (connect_result != 0) {
+ printf("Connecting over TCPSocket http://httpbin.org... %d\n", connect_result);
+ return;
+ }
+ else
+ printf("Connected over TCP to httpbin.org\n\n");
+
+ printf("\n\n >>>Post data... **\n");
+ {
+ HttpRequest* post_req = new HttpRequest(socket, HTTP_POST, "http://httpbin.org/post");
+ post_req->set_header("Content-Type", "application/json");
+ const char body[] = "{\"hello\":\"world\"},"
+ "{\"test\":\"1234\"}";
+
+ HttpResponse* post_res = post_req->send(body, strlen(body));
+ if (!post_res) {
+ printf("HttpRequest failed (error code %d)\n", post_req->get_error());
+ return;
+ }
+
+ printf("\n----- RESPONSE: -----\n");
+ dump_response(post_res);
+ delete post_req;
+ }
+
+ printf("\n\n >>>Put data... \n");
+ {
+ HttpRequest* put_req = new HttpRequest(socket, HTTP_PUT, "http://httpbin.org/put");
+ put_req->set_header("Content-Type", "application/json");
+
+ const char body[] = "This is a PUT test!";
+
+ HttpResponse* put_res = put_req->send(body, strlen(body));
+ if (!put_res) {
+ printf("HttpRequest failed (error code %d)\n", put_req->get_error());
+ return;
+ }
+
+ printf("\n----- RESPONSE: -----\n");
+ dump_response(put_res);
+ delete put_req;
+ }
+
+ printf("\n\n >>>Delete data... \n");
+ {
+ HttpRequest* del_req = new HttpRequest(socket, HTTP_DELETE, "http://httpbin.org/delete");
+ del_req->set_header("Content-Type", "application/json");
+
+ HttpResponse* del_res = del_req->send();
+ if (!del_res) {
+ printf("HttpRequest failed (error code %d)\n", del_req->get_error());
+ return;
+ }
+
+ printf("\n----- RESPONSE: -----\n");
+ dump_response(del_res);
+ delete del_req;
+ }
+
+ printf("\n\n >>>HTTP:stream, send http://httpbin.org/stream/" INTSTR(STREAM_CNT) "... \n");
+ {
+ HttpRequest* stream_req = new HttpRequest(socket, HTTP_GET, "http://httpbin.org/stream/" INTSTR(STREAM_CNT),
+ stream_callback );
+ stream_req->send();
+ delete stream_req;
+ }
+
+ printf("\n\n >>>HTTP:Status...\n");
+ {
+ HttpRequest* get_req = new HttpRequest(socket,HTTP_GET,"http://httpbin.org/get?show_env=1");
+ HttpResponse* get_res = get_req->send();
+ if (!get_res) {
+ printf("HttpRequest failed (error code %d)\n", get_req->get_error());
+ return;
+ }
+
+ printf("\n----- RESPONSE: -----\n");
+ dump_response(get_res);
+ delete get_req;
+ }
+ delete socket;
+}
+
+
+void dump_httpsresponse(HttpResponse* res)
+{
+ mbedtls_printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str());
+
+ mbedtls_printf("Headers:\n");
+ for (size_t ix = 0; ix < res->get_headers_length(); ix++) {
+ mbedtls_printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str());
+ }
+ mbedtls_printf("\nBody (%d bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str());
+}
+
+void stream_httpscallback(const char *data, size_t len)
+{
+ printf("Chunk Received:\n");
+ for( size_t x=0; x<len; x++ )
+ printf("%c",data[x]);
+ printf("\n");
+}
+
+//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// test the HTTPS client class
+//
+void test_https(NetworkInterface *net)
+{
+
+ printf(">>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<\n");
+ printf(">>> TEST HTTPS - set up TLS connection <<<\n");
+ printf(">>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<\n\n");
+
+ TLSSocket* socket = new TLSSocket(net, "httpbin.org", 443, SSL_CA_PEM);
+ socket->set_debug(true);
+ if (socket->connect() != 0) {
+ printf("TLS Connect failed %d\n", socket->error());
+ return;
+ }
+
+ printf("\n\n >>>Post data... **\n");
+ {
+ HttpsRequest* post_req = new HttpsRequest(socket, HTTP_POST, "http://httpbin.org/post");
+ post_req->set_header("Content-Type", "application/json");
+ const char body[] = "{\"hello\":\"world\"},"
+ "{\"test\":\"1234\"}";
+
+ HttpResponse* post_res = post_req->send(body, strlen(body));
+ if (!post_res) {
+ printf("HttpsRequest failed (error code %d)\n", post_req->get_error());
+ return;
+ }
+
+ printf("\n----- RESPONSE: -----\n");
+ dump_httpsresponse(post_res);
+ delete post_req;
+ }
+
+ printf("\n\n >>>Put data... \n");
+ {
+ HttpsRequest* put_req = new HttpsRequest(socket, HTTP_PUT, "http://httpbin.org/put");
+ put_req->set_header("Content-Type", "application/json");
+
+ const char body[] = "This is a PUT test!";
+
+ HttpResponse* put_res = put_req->send(body, strlen(body));
+ if (!put_res) {
+ printf("HttpsRequest failed (error code %d)\n", put_req->get_error());
+ return;
+ }
+
+ printf("\n----- RESPONSE: -----\n");
+ dump_httpsresponse(put_res);
+ delete put_req;
+ }
+
+ printf("\n\n >>>Delete data... \n");
+ {
+ HttpsRequest* del_req = new HttpsRequest(socket, HTTP_DELETE, "http://httpbin.org/delete");
+ del_req->set_header("Content-Type", "application/json");
+
+ HttpResponse* del_res = del_req->send();
+ if (!del_res) {
+ printf("HttpsRequest failed (error code %d)\n", del_req->get_error());
+ return;
+ }
+
+ printf("\n----- RESPONSE: -----\n");
+ dump_httpsresponse(del_res);
+ delete del_req;
+ }
+
+ printf("\n\n >>>HTTP:stream, send http://httpbin.org/stream/" INTSTR(STREAM_CNT)"... \n");
+ {
+ HttpsRequest* stream_req = new HttpsRequest(socket, HTTP_GET, "http://httpbin.org/stream/" INTSTR(STREAM_CNT),
+ stream_httpscallback );
+ stream_req->send();
+ delete stream_req;
+ }
+
+ printf("\n\n >>>HTTP:Status...\n");
+ {
+ HttpsRequest* get_req = new HttpsRequest(socket,HTTP_GET,"http://httpbin.org/get?show_env=1");
+ HttpResponse* get_res = get_req->send();
+ if (!get_res) {
+ printf("HttpsRequest failed (error code %d)\n", get_req->get_error());
+ return;
+ }
+
+ printf("\n----- RESPONSE: -----\n");
+ dump_httpsresponse(get_res);
+ delete get_req;
+ }
+ delete socket;
+}
+
+#endif // DEMO
+
--- a/source/select-demo.h Thu Mar 30 15:15:47 2017 +0200 +++ b/source/select-demo.h Wed Apr 19 01:05:49 2017 +0000 @@ -5,7 +5,8 @@ #define DEMO_HTTP_SOCKET_REUSE 2 #define DEMO_HTTPS 3 #define DEMO_HTTPS_SOCKET_REUSE 4 +#define DEMO_HTTPx 5 -#define DEMO DEMO_HTTP +#define DEMO DEMO_HTTP_SOCKET_REUSE #endif // _SELECT_METHOD_H_
