A simple client that allows the user to send Json data to Axeda's IoT cloud using an SSL socket (with certificate verification).

Dependencies:   mbed

Only allows use of URLs, not IP addresses. Most CyaSSL errors are caused by incorrect certificates or failed certificate verification (188, 151, 155).

Committer:
Vanger
Date:
Mon Jan 19 22:44:46 2015 +0000
Revision:
0:562ad81d9dd4
Child:
1:2d299b96dc79
Test Example Client for Axeda's IoT server.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vanger 0:562ad81d9dd4 1 #include "mbed.h"
Vanger 0:562ad81d9dd4 2 #include "mtsas.h"
Vanger 0:562ad81d9dd4 3
Vanger 0:562ad81d9dd4 4 //Simple function that converts the HTTP result to a string
Vanger 0:562ad81d9dd4 5 //Ex: Result is 0, the string result will be "HTTP_OK"
Vanger 0:562ad81d9dd4 6 char * httpResToStr(HTTPResult res);
Vanger 0:562ad81d9dd4 7
Vanger 0:562ad81d9dd4 8 int main(){
Vanger 0:562ad81d9dd4 9
Vanger 0:562ad81d9dd4 10 //Sets the log level to INFO, higher log levels produce more log output.
Vanger 0:562ad81d9dd4 11 //Possible levels: NONE, FATAL, ERROR, WARNING, INFO, DEBUG, TRACE
Vanger 0:562ad81d9dd4 12 MTSLog::setLogLevel(MTSLog::INFO_LEVEL);
Vanger 0:562ad81d9dd4 13
Vanger 0:562ad81d9dd4 14 /**Root Certificate(s) of the remote server you want to connect to.
Vanger 0:562ad81d9dd4 15 * Make sure the certificates are in PEM format, contain \r\n to end each line,
Vanger 0:562ad81d9dd4 16 * and if using multiple root CA certificates, just make multiple calls to the addRootCACertificate
Vanger 0:562ad81d9dd4 17 * function for each root certificate you wish to add.
Vanger 0:562ad81d9dd4 18 */
Vanger 0:562ad81d9dd4 19 const char CERTIFICATES[] = "";
Vanger 0:562ad81d9dd4 20 /**Example certificate formatted correctly (length not to scale):
Vanger 0:562ad81d9dd4 21 -----BEGIN CERTIFICATE-----\r\n
Vanger 0:562ad81d9dd4 22 aosdfijaaosdfijaaosdfijaaosdfijaaosdfijaaosdfijaaosdfijaaosdfija\r\n
Vanger 0:562ad81d9dd4 23 afjklewijafliefhiszelifhlsfhilasihflihsalifhalhifliahlfihaslihfl\r\n
Vanger 0:562ad81d9dd4 24 fawefaewf==\r\n
Vanger 0:562ad81d9dd4 25 -----END CERTIFICATE-----\r\n
Vanger 0:562ad81d9dd4 26 */
Vanger 0:562ad81d9dd4 27
Vanger 0:562ad81d9dd4 28 //Modify to match your apn if you are using an HSPA radio with a SIM card
Vanger 0:562ad81d9dd4 29 const char APN[] = "";
Vanger 0:562ad81d9dd4 30
Vanger 0:562ad81d9dd4 31 /** STMicro Nucelo F401RE
Vanger 0:562ad81d9dd4 32 * The supported jumper configurations of the MTSAS do not line up with
Vanger 0:562ad81d9dd4 33 * the pin mapping of the Nucleo F401RE. Therefore, the MTSAS serial TX
Vanger 0:562ad81d9dd4 34 * pin (JP8 Pin 2) must be manually jumped to Serial1 RX (Shield pin D2)
Vanger 0:562ad81d9dd4 35 * and the MTSAS serial RX pin (JP9 Pin 2) pin must be manually jumped to
Vanger 0:562ad81d9dd4 36 * Serial1 TX (Shield pin D8).
Vanger 0:562ad81d9dd4 37 * Uncomment the following line to use the STMicro Nuceleo F401RE
Vanger 0:562ad81d9dd4 38 */
Vanger 0:562ad81d9dd4 39 MTSSerialFlowControl* io = new MTSSerialFlowControl(D8, D2, D3, D6);
Vanger 0:562ad81d9dd4 40
Vanger 0:562ad81d9dd4 41 /** Freescale KL46Z
Vanger 0:562ad81d9dd4 42 * To configure the serial pins for the Freescale KL46Z board, use MTSAS jumper
Vanger 0:562ad81d9dd4 43 * configuration B. Uncomment the following line to use the Freescale KL46Z board
Vanger 0:562ad81d9dd4 44 */
Vanger 0:562ad81d9dd4 45 //MTSSerialFlowControl* io = new MTSSerialFlowControl(D2, D9, D3, D6);
Vanger 0:562ad81d9dd4 46
Vanger 0:562ad81d9dd4 47 /** Freescale K64F
Vanger 0:562ad81d9dd4 48 * To configure the serial pins for the Freescale K64F board, use MTSAS jumper
Vanger 0:562ad81d9dd4 49 * configuration A. Uncomment the following line to use the Freescale K64F board
Vanger 0:562ad81d9dd4 50 */
Vanger 0:562ad81d9dd4 51 //MTSSerialFlowControl* io = new MTSSerialFlowControl(D1, D0, D3, D6);
Vanger 0:562ad81d9dd4 52
Vanger 0:562ad81d9dd4 53 //Sets the baud rate for communicating with the radio
Vanger 0:562ad81d9dd4 54 io->baud(115200);
Vanger 0:562ad81d9dd4 55
Vanger 0:562ad81d9dd4 56 //Initialize radio configurations
Vanger 0:562ad81d9dd4 57 Cellular* radio = CellularFactory::create(io);
Vanger 0:562ad81d9dd4 58 if( ! radio) {
Vanger 0:562ad81d9dd4 59 logFatal("Radio initialization failed");
Vanger 0:562ad81d9dd4 60 return 1;
Vanger 0:562ad81d9dd4 61 }
Vanger 0:562ad81d9dd4 62 radio->configureSignals(D4,D7,RESET);
Vanger 0:562ad81d9dd4 63 Transport::setTransport(radio);
Vanger 0:562ad81d9dd4 64
Vanger 0:562ad81d9dd4 65 //Set radio APN
Vanger 0:562ad81d9dd4 66 for (int i = 0; i < 10; i++) {
Vanger 0:562ad81d9dd4 67 if (i >= 10) {
Vanger 0:562ad81d9dd4 68 logError("Failed to set APN to %s", APN);
Vanger 0:562ad81d9dd4 69 }
Vanger 0:562ad81d9dd4 70 if (radio->setApn(APN) == MTS_SUCCESS) {
Vanger 0:562ad81d9dd4 71 logInfo("Successfully set APN to %s", APN);
Vanger 0:562ad81d9dd4 72 break;
Vanger 0:562ad81d9dd4 73 } else {
Vanger 0:562ad81d9dd4 74 wait(1);
Vanger 0:562ad81d9dd4 75 }
Vanger 0:562ad81d9dd4 76 }
Vanger 0:562ad81d9dd4 77
Vanger 0:562ad81d9dd4 78 //Establish PPP link
Vanger 0:562ad81d9dd4 79 for (int i = 0; i < 10; i++) {
Vanger 0:562ad81d9dd4 80 if (i >= 10) {
Vanger 0:562ad81d9dd4 81 logError("Failed to establish PPP link");
Vanger 0:562ad81d9dd4 82 }
Vanger 0:562ad81d9dd4 83 if (radio->connect() == true) {
Vanger 0:562ad81d9dd4 84 logInfo("Successfully established PPP link");
Vanger 0:562ad81d9dd4 85 break;
Vanger 0:562ad81d9dd4 86 } else {
Vanger 0:562ad81d9dd4 87 wait(1);
Vanger 0:562ad81d9dd4 88 }
Vanger 0:562ad81d9dd4 89 }
Vanger 0:562ad81d9dd4 90
Vanger 0:562ad81d9dd4 91 //Receive buffer
Vanger 0:562ad81d9dd4 92 char rbuf[2000];
Vanger 0:562ad81d9dd4 93 HTTPText* receive = new HTTPText(rbuf, sizeof(rbuf));
Vanger 0:562ad81d9dd4 94
Vanger 0:562ad81d9dd4 95 //Json output object, data must be in Json format
Vanger 0:562ad81d9dd4 96 char sbuf[2000] = "{\"data\":[{\"dataItems\":{\"mental_trauma\":1,\"physical_trauma\":2,\"emotional_trauma\":3}}]}\0";
Vanger 0:562ad81d9dd4 97 HTTPJson* send = new HTTPJson(sbuf);
Vanger 0:562ad81d9dd4 98
Vanger 0:562ad81d9dd4 99 //Create HTTP Client Instance
Vanger 0:562ad81d9dd4 100 HTTPClient* http = new HTTPClient();
Vanger 0:562ad81d9dd4 101 if( !http || !receive || !send) {
Vanger 0:562ad81d9dd4 102 logFatal("Failed to instantiate client or send buffer or receive buffer");
Vanger 0:562ad81d9dd4 103 return 1;
Vanger 0:562ad81d9dd4 104 }
Vanger 0:562ad81d9dd4 105
Vanger 0:562ad81d9dd4 106 logTrace("Loading certificate(s)");
Vanger 0:562ad81d9dd4 107 HTTPResult res = http->addRootCACertificate(CERTIFICATES);
Vanger 0:562ad81d9dd4 108 if(res != HTTP_OK) {
Vanger 0:562ad81d9dd4 109 logError("Failed to load CERTIFICATES");
Vanger 0:562ad81d9dd4 110 }
Vanger 0:562ad81d9dd4 111
Vanger 0:562ad81d9dd4 112 /**Set whether or not to verify the remote server's certificate
Vanger 0:562ad81d9dd4 113 * VERIFY_NONE,VERIFY_PEER
Vanger 0:562ad81d9dd4 114 */
Vanger 0:562ad81d9dd4 115 http->setPeerVerification(VERIFY_PEER);
Vanger 0:562ad81d9dd4 116
Vanger 0:562ad81d9dd4 117 //URL for remote host (includes path)
Vanger 0:562ad81d9dd4 118 //Format: https://nucleus-connect.axeda.com/ammp/data/1/MODEL_STRING_HERE!<SERIAL_NUMBER_HERE>
Vanger 0:562ad81d9dd4 119 string url = "https://nucleus-connect.axeda.com/ammp/data/1/nlr_selfcrt_arm32!nlr__EPratt_multitech_com___1159423";
Vanger 0:562ad81d9dd4 120
Vanger 0:562ad81d9dd4 121 logTrace("HTTPS POST Request with Certificate");
Vanger 0:562ad81d9dd4 122 res = http->post(url.c_str(), *send, receive);
Vanger 0:562ad81d9dd4 123 if(res == HTTP_OK) {
Vanger 0:562ad81d9dd4 124 logInfo("HTTPS POST succeeded");
Vanger 0:562ad81d9dd4 125 } else {
Vanger 0:562ad81d9dd4 126 logInfo("HTTPS POST failed [%s]", httpResToStr(res));
Vanger 0:562ad81d9dd4 127 }
Vanger 0:562ad81d9dd4 128
Vanger 0:562ad81d9dd4 129 return 0;
Vanger 0:562ad81d9dd4 130 }
Vanger 0:562ad81d9dd4 131
Vanger 0:562ad81d9dd4 132 //Simple error code to string function
Vanger 0:562ad81d9dd4 133 char * httpResToStr(HTTPResult res) {
Vanger 0:562ad81d9dd4 134 switch(res) {
Vanger 0:562ad81d9dd4 135 case HTTP_PROCESSING:
Vanger 0:562ad81d9dd4 136 return "HTTP_PROCESSING";
Vanger 0:562ad81d9dd4 137 case HTTP_PARSE:
Vanger 0:562ad81d9dd4 138 return "HTTP_PARSE";
Vanger 0:562ad81d9dd4 139 case HTTP_DNS:
Vanger 0:562ad81d9dd4 140 return "HTTP_DNS";
Vanger 0:562ad81d9dd4 141 case HTTP_PRTCL:
Vanger 0:562ad81d9dd4 142 return "HTTP_PRTCL";
Vanger 0:562ad81d9dd4 143 case HTTP_NOTFOUND:
Vanger 0:562ad81d9dd4 144 return "HTTP_NOTFOUND";
Vanger 0:562ad81d9dd4 145 case HTTP_REFUSED:
Vanger 0:562ad81d9dd4 146 return "HTTP_REFUSED";
Vanger 0:562ad81d9dd4 147 case HTTP_ERROR:
Vanger 0:562ad81d9dd4 148 return "HTTP_ERROR";
Vanger 0:562ad81d9dd4 149 case HTTP_TIMEOUT:
Vanger 0:562ad81d9dd4 150 return "HTTP_TIMEOUT";
Vanger 0:562ad81d9dd4 151 case HTTP_CONN:
Vanger 0:562ad81d9dd4 152 return "HTTP_CONN";
Vanger 0:562ad81d9dd4 153 case HTTP_CLOSED:
Vanger 0:562ad81d9dd4 154 return "HTTP_CLOSED";
Vanger 0:562ad81d9dd4 155 case HTTP_REDIRECT:
Vanger 0:562ad81d9dd4 156 return "HTTP_REDIRECT";
Vanger 0:562ad81d9dd4 157 case HTTP_OK:
Vanger 0:562ad81d9dd4 158 return "HTTP_OK";
Vanger 0:562ad81d9dd4 159 default:
Vanger 0:562ad81d9dd4 160 return "HTTP Result unknown";
Vanger 0:562ad81d9dd4 161 }
Vanger 0:562ad81d9dd4 162 }