Example program that uses HTTPS to send JSON data to Axeda's cloud using a cellular device.

Dependencies:   mbed

Fork of Axeda_IoT_Connection_Example by Multi-Hackers

Revision:
0:562ad81d9dd4
Child:
1:2d299b96dc79
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 19 22:44:46 2015 +0000
@@ -0,0 +1,162 @@
+#include "mbed.h"
+#include "mtsas.h"
+
+//Simple function that converts the HTTP result to a string
+//Ex: Result is 0, the string result will be "HTTP_OK"
+char * httpResToStr(HTTPResult res);
+
+int main(){
+    
+    //Sets the log level to INFO, higher log levels produce more log output.
+    //Possible levels: NONE, FATAL, ERROR, WARNING, INFO, DEBUG, TRACE
+    MTSLog::setLogLevel(MTSLog::INFO_LEVEL);
+    
+    /**Root Certificate(s) of the remote server you want to connect to.
+     * Make sure the certificates are in PEM format, contain \r\n to end each line,
+     * and if using multiple root CA certificates, just make multiple calls to the addRootCACertificate
+     * function for each root certificate you wish to add.
+     */
+    const char CERTIFICATES[] = "";
+    /**Example certificate formatted correctly (length not to scale):
+     -----BEGIN CERTIFICATE-----\r\n
+     aosdfijaaosdfijaaosdfijaaosdfijaaosdfijaaosdfijaaosdfijaaosdfija\r\n
+     afjklewijafliefhiszelifhlsfhilasihflihsalifhalhifliahlfihaslihfl\r\n
+     fawefaewf==\r\n
+     -----END CERTIFICATE-----\r\n
+     */
+    
+    //Modify to match your apn if you are using an HSPA radio with a SIM card
+    const char APN[] = "";
+    
+    /** STMicro Nucelo F401RE
+    * The supported jumper configurations of the MTSAS do not line up with
+    * the pin mapping of the Nucleo F401RE. Therefore, the MTSAS serial TX
+    * pin (JP8 Pin 2) must be manually jumped to Serial1 RX (Shield pin D2)
+    * and the MTSAS serial RX pin (JP9 Pin 2) pin must be manually jumped to
+    * Serial1 TX (Shield pin D8).
+    * Uncomment the following line to use the STMicro Nuceleo F401RE
+    */
+    MTSSerialFlowControl* io = new MTSSerialFlowControl(D8, D2, D3, D6);
+    
+    /** Freescale KL46Z
+    * To configure the serial pins for the Freescale KL46Z board, use MTSAS jumper
+    * configuration B. Uncomment the following line to use the Freescale KL46Z board
+    */
+    //MTSSerialFlowControl* io = new MTSSerialFlowControl(D2, D9, D3, D6);
+    
+    /** Freescale K64F
+    * To configure the serial pins for the Freescale K64F board, use MTSAS jumper
+    * configuration A. Uncomment the following line to use the Freescale K64F board
+    */
+    //MTSSerialFlowControl* io = new MTSSerialFlowControl(D1, D0, D3, D6);
+    
+    //Sets the baud rate for communicating with the radio
+    io->baud(115200); 
+    
+    //Initialize radio configurations
+    Cellular* radio = CellularFactory::create(io);
+    if( ! radio) {
+        logFatal("Radio initialization failed");
+        return 1;
+    }
+    radio->configureSignals(D4,D7,RESET);
+    Transport::setTransport(radio);
+    
+    //Set radio APN
+    for (int i = 0; i < 10; i++) {
+        if (i >= 10) {
+            logError("Failed to set APN to %s", APN);
+        }
+        if (radio->setApn(APN) == MTS_SUCCESS) {
+            logInfo("Successfully set APN to %s", APN);
+            break;
+        } else {
+            wait(1);
+        }
+    }
+    
+    //Establish PPP link
+    for (int i = 0; i < 10; i++) {
+        if (i >= 10) {
+            logError("Failed to establish PPP link");
+        }
+        if (radio->connect() == true) {
+            logInfo("Successfully established PPP link");
+            break;
+        } else {
+            wait(1);
+        }
+    }
+    
+    //Receive buffer
+    char rbuf[2000];
+    HTTPText* receive = new HTTPText(rbuf, sizeof(rbuf));
+    
+    //Json output object, data must be in Json format
+    char sbuf[2000] = "{\"data\":[{\"dataItems\":{\"mental_trauma\":1,\"physical_trauma\":2,\"emotional_trauma\":3}}]}\0";
+    HTTPJson* send = new HTTPJson(sbuf);
+    
+    //Create HTTP Client Instance
+    HTTPClient* http = new HTTPClient();
+    if( !http || !receive || !send) {
+        logFatal("Failed to instantiate client or send buffer or receive buffer");
+        return 1;
+    }
+    
+    logTrace("Loading certificate(s)");
+    HTTPResult res = http->addRootCACertificate(CERTIFICATES);
+    if(res != HTTP_OK) {
+        logError("Failed to load CERTIFICATES");
+    }
+    
+    /**Set whether or not to verify the remote server's certificate
+     * VERIFY_NONE,VERIFY_PEER
+     */
+    http->setPeerVerification(VERIFY_PEER);
+    
+    //URL for remote host (includes path)
+    //Format: https://nucleus-connect.axeda.com/ammp/data/1/MODEL_STRING_HERE!<SERIAL_NUMBER_HERE>
+    string url = "https://nucleus-connect.axeda.com/ammp/data/1/nlr_selfcrt_arm32!nlr__EPratt_multitech_com___1159423";
+        
+    logTrace("HTTPS POST Request with Certificate");
+    res = http->post(url.c_str(), *send, receive);
+        if(res == HTTP_OK) {
+            logInfo("HTTPS POST succeeded");
+        } else {
+            logInfo("HTTPS POST failed [%s]", httpResToStr(res));
+        }
+    
+    return 0;
+}
+
+//Simple error code to string function
+char * httpResToStr(HTTPResult res) {
+    switch(res) {
+        case HTTP_PROCESSING:
+            return "HTTP_PROCESSING";
+        case HTTP_PARSE:
+            return "HTTP_PARSE";
+        case HTTP_DNS:
+            return "HTTP_DNS";
+        case HTTP_PRTCL:
+            return "HTTP_PRTCL";
+        case HTTP_NOTFOUND:
+            return "HTTP_NOTFOUND";
+        case HTTP_REFUSED:
+            return "HTTP_REFUSED";
+        case HTTP_ERROR:
+            return "HTTP_ERROR";
+        case HTTP_TIMEOUT:
+            return "HTTP_TIMEOUT";
+        case HTTP_CONN:
+            return "HTTP_CONN";
+        case HTTP_CLOSED:
+            return "HTTP_CLOSED";
+        case HTTP_REDIRECT:
+            return "HTTP_REDIRECT";
+        case HTTP_OK:
+            return "HTTP_OK";
+        default:
+            return "HTTP Result unknown";
+    }
+}
\ No newline at end of file