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).
main.cpp@0:562ad81d9dd4, 2015-01-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |