Demonstration program with support for the WNC M14A2A Cellular LTE Data Module added. An additional demonstration program was also added that shows a few other features (for chunked responses).

Dependencies:   easy-connect mbed-http

mbed-os-example-http(s) using WNC 14A2A Data Module

This application builds on the application provided by ARM (see https://developer.mbed.org/teams/sandbox/code/mbed-http/). It demonstrates how to make HTTP and HTTPS requests and parse the response from mbed OS 5.

There are a total of five demo's, which can be selected by modifying source/select-demo.h.

1. HTTP demo (DEMO_HTTP):

2. HTTPS demo (DEMO_HTTPS):

3. HTTP demo with socket re-use (DEMO_HTTP_SOCKET_REUSE).

  • Similar to the HTTP demo but reuses the socket for all interactions

4. HTTPS demo with socket re-use (DEMO_HTTPS_SOCKET_REUSE).

  • Similar to the HTTPS demo above

5. HTTP & HTTPS demo with socket re-use and chunked call-backs (DEMO_HTTPx)

Response parsing is done through [nodejs/http-parser](https://github.com/nodejs/http-parser).

To build

1. Open ``mbed_app.json`` and change the `network-interface` option to your connectivity method ([more info](https://github.com/ARMmbed/easy-connect)). 2. Build the project in the online compiler or using mbed CLI. 3. Flash the project to your development board. 4. Attach a serial monitor to your board to see the debug messages.

Entropy (or lack thereof)

On all platforms except the FRDM-K64F and FRDM-K22F the application is compiled without TLS entropy sources. This means that your code is inherently unsafe and should not be deployed to any production systems. To enable entropy, remove the `MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES` and `MBEDTLS_TEST_NULL_ENTROPY` macros from mbed_app.json.

Tested on

  • K64F with Ethernet.
  • NUCLEO_F411RE with ESP8266.
  • AT&T Cellular IoT Starter Kit with WNC M14A2A Cellular Data Module

The WNCInterface class currently supports the following version(s):

  • MPSS: M14A2A_v11.50.164451 APSS: M14A2A_v11.53.164451

License

This library is released under the Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License and 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.

Committer:
Jan Jongboom
Date:
Tue Mar 28 14:53:07 2017 +0200
Revision:
12:4c226ca06191
Add socket reuse demo's

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jan Jongboom 12:4c226ca06191 1 #include "select-demo.h"
Jan Jongboom 12:4c226ca06191 2
Jan Jongboom 12:4c226ca06191 3 #if DEMO == DEMO_HTTP_SOCKET_REUSE
Jan Jongboom 12:4c226ca06191 4
Jan Jongboom 12:4c226ca06191 5 #include "mbed.h"
Jan Jongboom 12:4c226ca06191 6 #include "easy-connect.h"
Jan Jongboom 12:4c226ca06191 7 #include "http_request.h"
Jan Jongboom 12:4c226ca06191 8
Jan Jongboom 12:4c226ca06191 9 Serial pc(USBTX, USBRX);
Jan Jongboom 12:4c226ca06191 10
Jan Jongboom 12:4c226ca06191 11 void dump_response(HttpResponse* res) {
Jan Jongboom 12:4c226ca06191 12 printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str());
Jan Jongboom 12:4c226ca06191 13
Jan Jongboom 12:4c226ca06191 14 printf("Headers:\n");
Jan Jongboom 12:4c226ca06191 15 for (size_t ix = 0; ix < res->get_headers_length(); ix++) {
Jan Jongboom 12:4c226ca06191 16 printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str());
Jan Jongboom 12:4c226ca06191 17 }
Jan Jongboom 12:4c226ca06191 18 printf("\nBody (%d bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str());
Jan Jongboom 12:4c226ca06191 19 }
Jan Jongboom 12:4c226ca06191 20
Jan Jongboom 12:4c226ca06191 21 int main() {
Jan Jongboom 12:4c226ca06191 22 pc.baud(115200);
Jan Jongboom 12:4c226ca06191 23 // Connect to the network (see mbed_app.json for the connectivity method used)
Jan Jongboom 12:4c226ca06191 24 NetworkInterface *network = easy_connect(true);
Jan Jongboom 12:4c226ca06191 25 if (!network) {
Jan Jongboom 12:4c226ca06191 26 printf("Cannot connect to the network, see serial output");
Jan Jongboom 12:4c226ca06191 27 return 1;
Jan Jongboom 12:4c226ca06191 28 }
Jan Jongboom 12:4c226ca06191 29
Jan Jongboom 12:4c226ca06191 30 // Create a TCP socket
Jan Jongboom 12:4c226ca06191 31 printf("\n----- Setting up TCP connection -----\n");
Jan Jongboom 12:4c226ca06191 32
Jan Jongboom 12:4c226ca06191 33 TCPSocket* socket = new TCPSocket();
Jan Jongboom 12:4c226ca06191 34 nsapi_error_t open_result = socket->open(network);
Jan Jongboom 12:4c226ca06191 35 if (open_result != 0) {
Jan Jongboom 12:4c226ca06191 36 printf("Opening TCPSocket failed... %d\n", open_result);
Jan Jongboom 12:4c226ca06191 37 return 1;
Jan Jongboom 12:4c226ca06191 38 }
Jan Jongboom 12:4c226ca06191 39
Jan Jongboom 12:4c226ca06191 40 nsapi_error_t connect_result = socket->connect("httpbin.org", 80);
Jan Jongboom 12:4c226ca06191 41 if (connect_result != 0) {
Jan Jongboom 12:4c226ca06191 42 printf("Connecting over TCPSocket failed... %d\n", connect_result);
Jan Jongboom 12:4c226ca06191 43 return 1;
Jan Jongboom 12:4c226ca06191 44 }
Jan Jongboom 12:4c226ca06191 45
Jan Jongboom 12:4c226ca06191 46 printf("Connected over TCP to httpbin.org:80\n");
Jan Jongboom 12:4c226ca06191 47
Jan Jongboom 12:4c226ca06191 48 // Do a GET request to httpbin.org
Jan Jongboom 12:4c226ca06191 49 {
Jan Jongboom 12:4c226ca06191 50 HttpRequest* get_req = new HttpRequest(socket, HTTP_GET, "http://httpbin.org/status/418");
Jan Jongboom 12:4c226ca06191 51
Jan Jongboom 12:4c226ca06191 52 // By default the body is automatically parsed and stored in a string, this is memory heavy.
Jan Jongboom 12:4c226ca06191 53 // To receive chunked response, pass in a callback as third parameter to 'send'.
Jan Jongboom 12:4c226ca06191 54 HttpResponse* get_res = get_req->send();
Jan Jongboom 12:4c226ca06191 55 if (!get_res) {
Jan Jongboom 12:4c226ca06191 56 printf("HttpRequest failed (error code %d)\n", get_req->get_error());
Jan Jongboom 12:4c226ca06191 57 return 1;
Jan Jongboom 12:4c226ca06191 58 }
Jan Jongboom 12:4c226ca06191 59
Jan Jongboom 12:4c226ca06191 60 printf("\n----- HTTP GET response -----\n");
Jan Jongboom 12:4c226ca06191 61 dump_response(get_res);
Jan Jongboom 12:4c226ca06191 62
Jan Jongboom 12:4c226ca06191 63 delete get_req;
Jan Jongboom 12:4c226ca06191 64 }
Jan Jongboom 12:4c226ca06191 65
Jan Jongboom 12:4c226ca06191 66 // POST request to httpbin.org
Jan Jongboom 12:4c226ca06191 67 {
Jan Jongboom 12:4c226ca06191 68 HttpRequest* post_req = new HttpRequest(socket, HTTP_POST, "http://httpbin.org/post");
Jan Jongboom 12:4c226ca06191 69 post_req->set_header("Content-Type", "application/json");
Jan Jongboom 12:4c226ca06191 70
Jan Jongboom 12:4c226ca06191 71 const char body[] = "{\"hello\":\"world\"}";
Jan Jongboom 12:4c226ca06191 72
Jan Jongboom 12:4c226ca06191 73 HttpResponse* post_res = post_req->send(body, strlen(body));
Jan Jongboom 12:4c226ca06191 74 if (!post_res) {
Jan Jongboom 12:4c226ca06191 75 printf("HttpRequest failed (error code %d)\n", post_req->get_error());
Jan Jongboom 12:4c226ca06191 76 return 1;
Jan Jongboom 12:4c226ca06191 77 }
Jan Jongboom 12:4c226ca06191 78
Jan Jongboom 12:4c226ca06191 79 printf("\n----- HTTP POST response -----\n");
Jan Jongboom 12:4c226ca06191 80 dump_response(post_res);
Jan Jongboom 12:4c226ca06191 81
Jan Jongboom 12:4c226ca06191 82 delete post_req;
Jan Jongboom 12:4c226ca06191 83 }
Jan Jongboom 12:4c226ca06191 84
Jan Jongboom 12:4c226ca06191 85 delete socket;
Jan Jongboom 12:4c226ca06191 86
Jan Jongboom 12:4c226ca06191 87 Thread::wait(osWaitForever);
Jan Jongboom 12:4c226ca06191 88 }
Jan Jongboom 12:4c226ca06191 89
Jan Jongboom 12:4c226ca06191 90 #endif