Official reference client implementation for Cumulocity SmartREST on u-blox C027.

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Vincent Wochnik

Committer:
xinlei
Date:
Wed May 13 12:12:55 2015 +0000
Revision:
107:fc5f25f0e0d5
Parent:
106:c61f0d62b625
Child:
108:f1ee3e1eb126
OperationSupport revamped

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xinlei 72:c5709ae7b193 1 #include <stdio.h>
xinlei 72:c5709ae7b193 2
Cumulocity 41:804f6a0bda26 3 #include "mbed.h"
Cumulocity 41:804f6a0bda26 4 #include "rtos.h"
Cumulocity 41:804f6a0bda26 5 #include "MDM.h"
Cumulocity 47:89ae46d5c466 6 #include "GPS.h"
xinlei 106:c61f0d62b625 7 #include "cyassl/ssl.h"
xinlei 101:dbcd3bc51758 8
Cumulocity 41:804f6a0bda26 9 #include "DeviceInfo.h"
xinlei 105:fd3571349e5d 10 #include "Storage.h"
Cumulocity 41:804f6a0bda26 11 #include "MbedAgent.h"
Cumulocity 47:89ae46d5c466 12 #include "GPSTracker.h"
xinlei 96:5dfdc8568e9f 13 #include "LCDDisplay.h"
xinlei 72:c5709ae7b193 14 #include "logging.h"
vwochnik 67:c360a2b2c948 15
vwochnik 52:8f1370084268 16 /**
vwochnik 52:8f1370084268 17 * SIM PIN. Null for no pin.
vwochnik 52:8f1370084268 18 */
vwochnik 52:8f1370084268 19 #define SIM_PIN NULL
vwochnik 52:8f1370084268 20
vwochnik 52:8f1370084268 21 /**
vwochnik 52:8f1370084268 22 * SIM GPRS login data. Leave commented out for automatic setting.
vwochnik 52:8f1370084268 23 */
vwochnik 52:8f1370084268 24 //#define SIM_APN ""
vwochnik 52:8f1370084268 25 //#define SIM_USER ""
vwochnik 52:8f1370084268 26 //#define SIM_PASS ""
vwochnik 52:8f1370084268 27
xinlei 106:c61f0d62b625 28 MDMSerial* pMdm = NULL;
xinlei 106:c61f0d62b625 29 //CYASSL_CTX *pCtx = NULL;
xinlei 106:c61f0d62b625 30
xinlei 106:c61f0d62b625 31 static unsigned short getMNCLen(const char *imsi)
xinlei 93:0acd11870c6a 32 {
xinlei 80:757c3ff7b92b 33 if (strncmp(imsi, "310", 3) != 0) // Non American ISMI
xinlei 80:757c3ff7b92b 34 return 2;
xinlei 80:757c3ff7b92b 35 else
xinlei 80:757c3ff7b92b 36 return 3;
xinlei 80:757c3ff7b92b 37 }
xinlei 80:757c3ff7b92b 38
xinlei 106:c61f0d62b625 39 static void enableDebug()
xinlei 93:0acd11870c6a 40 {
xinlei 93:0acd11870c6a 41 setLevel(A_DEBUG);
xinlei 93:0acd11870c6a 42 if (pMdm)
xinlei 93:0acd11870c6a 43 pMdm->setDebug(3);
xinlei 93:0acd11870c6a 44 }
xinlei 93:0acd11870c6a 45
xinlei 106:c61f0d62b625 46 static void disableDebug()
xinlei 93:0acd11870c6a 47 {
xinlei 93:0acd11870c6a 48 setLevel(A_NONE);
xinlei 93:0acd11870c6a 49 if (pMdm)
xinlei 93:0acd11870c6a 50 pMdm->setDebug(-1);
xinlei 93:0acd11870c6a 51 }
xinlei 93:0acd11870c6a 52
xinlei 106:c61f0d62b625 53 static void shutdown()
xinlei 106:c61f0d62b625 54 {
xinlei 106:c61f0d62b625 55 // CyaSSL_CTX_free(pCtx);
xinlei 106:c61f0d62b625 56 // CyaSSL_Cleanup();
xinlei 106:c61f0d62b625 57 pMdm->disconnect();
xinlei 106:c61f0d62b625 58 pMdm->powerOff();
xinlei 106:c61f0d62b625 59 }
xinlei 106:c61f0d62b625 60
xinlei 106:c61f0d62b625 61 //static int send(CYASSL *ssl, char *buf, int size, void* ctx)
xinlei 106:c61f0d62b625 62 //{
xinlei 106:c61f0d62b625 63 // int sockfd = *(int*)ctx;
xinlei 106:c61f0d62b625 64 // int ret = pMdm->socketSend(sockfd, buf, size);
xinlei 106:c61f0d62b625 65 // printf("[send](%d, %p): %d/%d\n", sockfd, ssl, ret, size);
xinlei 106:c61f0d62b625 66 // if (ret >= 0)
xinlei 106:c61f0d62b625 67 // return ret;
xinlei 106:c61f0d62b625 68 // else
xinlei 106:c61f0d62b625 69 // return CYASSL_CBIO_ERR_GENERAL;
xinlei 106:c61f0d62b625 70 //}
xinlei 106:c61f0d62b625 71 //
xinlei 106:c61f0d62b625 72 //static int recv(CYASSL *ssl, char *buf, int maxSize, void* ctx)
xinlei 106:c61f0d62b625 73 //{
xinlei 106:c61f0d62b625 74 // int sockfd = *(int*)ctx;
xinlei 106:c61f0d62b625 75 // int ret = pMdm->socketRecv(sockfd, buf, maxSize);
xinlei 106:c61f0d62b625 76 // printf("[recv](%d, %p): %d/%d\n", sockfd, ssl, ret, maxSize);
xinlei 106:c61f0d62b625 77 // if (ret >= 0)
xinlei 106:c61f0d62b625 78 // return ret;
xinlei 106:c61f0d62b625 79 // else
xinlei 106:c61f0d62b625 80 // return CYASSL_CBIO_ERR_GENERAL;
xinlei 106:c61f0d62b625 81 //}
xinlei 106:c61f0d62b625 82
vwochnik 0:ed4d6fd405ea 83 int main()
vwochnik 0:ed4d6fd405ea 84 {
xinlei 106:c61f0d62b625 85 LCDDisplay::inst().setLines("Mbed Agent V2.1rc3", srHost);
xinlei 94:61d44636f020 86 set_time(1256729737);
xinlei 93:0acd11870c6a 87 MDMRtos<MDMSerial> mdm;
xinlei 93:0acd11870c6a 88 pMdm = &mdm;
xinlei 93:0acd11870c6a 89 InterruptIn joystickUp(A2);
xinlei 93:0acd11870c6a 90 InterruptIn joystickDown(A3);
xinlei 101:dbcd3bc51758 91 joystickUp.rise(&enableDebug);
xinlei 101:dbcd3bc51758 92 joystickDown.rise(&disableDebug);
xinlei 101:dbcd3bc51758 93
xinlei 106:c61f0d62b625 94 // CyaSSL_Init();
xinlei 106:c61f0d62b625 95 // pCtx = CyaSSL_CTX_new(CyaTLSv1_2_client_method());
xinlei 106:c61f0d62b625 96 // CyaSSL_Debugging_ON();
xinlei 106:c61f0d62b625 97 // if (pCtx == NULL) {
xinlei 106:c61f0d62b625 98 // shutdown();
xinlei 106:c61f0d62b625 99 // return 1;
xinlei 106:c61f0d62b625 100 // }
xinlei 106:c61f0d62b625 101 // CyaSSL_CTX_set_verify(pCtx, SSL_VERIFY_NONE, 0);
xinlei 106:c61f0d62b625 102 // CyaSSL_CTX_set_cipher_list(pCtx, "DHE-RSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA");
xinlei 106:c61f0d62b625 103 // CyaSSL_SetIORecv(pCtx, recv);
xinlei 106:c61f0d62b625 104 // CyaSSL_SetIOSend(pCtx, send);
xinlei 106:c61f0d62b625 105
Cumulocity 41:804f6a0bda26 106 MDMParser::DevStatus devStatus;
xinlei 76:b07effe83fb8 107 if (!mdm.init(SIM_PIN, &devStatus)) {
xinlei 96:5dfdc8568e9f 108 LCDDisplay::inst().setLines("Modem Init Failure", "No SIM card found", "Or SIM has PIN");
xinlei 106:c61f0d62b625 109 shutdown();
xinlei 106:c61f0d62b625 110 return 2;
xinlei 88:b1de34154513 111 }
xinlei 93:0acd11870c6a 112
xinlei 93:0acd11870c6a 113 DigitalIn fireButton(D4);
xinlei 93:0acd11870c6a 114 if (fireButton) {
xinlei 101:dbcd3bc51758 115 if (delCredential()) {
xinlei 96:5dfdc8568e9f 116 LCDDisplay::inst().setLines("Reset Success");
xinlei 93:0acd11870c6a 117 } else {
xinlei 96:5dfdc8568e9f 118 LCDDisplay::inst().setLines("Reset Failure");
xinlei 88:b1de34154513 119 }
xinlei 101:dbcd3bc51758 120 Thread::wait(2000);
xinlei 106:c61f0d62b625 121 shutdown();
xinlei 90:0525121f307e 122 return 0;
xinlei 90:0525121f307e 123 }
xinlei 96:5dfdc8568e9f 124 LCDDisplay::inst().setLines("Register Network...", "IMEI", devStatus.imei);
Cumulocity 41:804f6a0bda26 125 if (!mdm.registerNet()) {
xinlei 96:5dfdc8568e9f 126 LCDDisplay::inst().setLines("No Network Coverage");
xinlei 106:c61f0d62b625 127 shutdown();
xinlei 93:0acd11870c6a 128 return 3;
vwochnik 28:2004400abeec 129 }
vwochnik 28:2004400abeec 130
xinlei 96:5dfdc8568e9f 131 LCDDisplay::inst().setLines("Join Network");
vwochnik 52:8f1370084268 132 #ifdef SIM_APN
vwochnik 52:8f1370084268 133 if (mdm.join(SIM_APN, SIM_USER, SIM_PASS) == NOIP) {
vwochnik 55:a0f7295ed6b6 134 #else
vwochnik 55:a0f7295ed6b6 135 if (mdm.join() == NOIP) {
vwochnik 55:a0f7295ed6b6 136 #endif
xinlei 93:0acd11870c6a 137 char s[8] = "Unknown";
xinlei 80:757c3ff7b92b 138 const char *p = devStatus.imsi;
xinlei 80:757c3ff7b92b 139 if (p) {
xinlei 80:757c3ff7b92b 140 snprintf(s, sizeof(s), "%.*s-%.*s", 3, p, getMNCLen(p), p+3);
xinlei 80:757c3ff7b92b 141 }
xinlei 96:5dfdc8568e9f 142 LCDDisplay::inst().setLines("Wrong APN Settting", "MCC-MNC:", s);
xinlei 106:c61f0d62b625 143 shutdown();
xinlei 93:0acd11870c6a 144 return 4;
vwochnik 52:8f1370084268 145 }
xinlei 93:0acd11870c6a 146
vwochnik 52:8f1370084268 147 {
xinlei 97:ea056f6be2e8 148 DeviceInfo deviceInfo(devStatus);
xinlei 99:e369fc75c000 149 MbedAgent agent(deviceInfo);
xinlei 93:0acd11870c6a 150
xinlei 96:5dfdc8568e9f 151 LCDDisplay::inst().setLines("Agent Init");
vwochnik 52:8f1370084268 152 if (!agent.init()) {
xinlei 106:c61f0d62b625 153 shutdown();
xinlei 93:0acd11870c6a 154 return 5;
vwochnik 52:8f1370084268 155 }
xinlei 96:5dfdc8568e9f 156 LCDDisplay::inst().setLines("Agent Run");
xinlei 93:0acd11870c6a 157 int ret = 0;
xinlei 93:0acd11870c6a 158 for (uint8_t tries = 3; tries; --tries) {
xinlei 93:0acd11870c6a 159 ret = agent.run();
xinlei 96:5dfdc8568e9f 160 if (ret == 0) {
xinlei 96:5dfdc8568e9f 161 char status[27];
xinlei 99:e369fc75c000 162 const char* user= srUsername;
xinlei 96:5dfdc8568e9f 163 int len = strchr(user, '/')-user+sizeof("Tenant: ");
xinlei 96:5dfdc8568e9f 164 len = len <= 27 ? len : 27;
xinlei 96:5dfdc8568e9f 165 snprintf(status, len, "Tenant: %s", user);
xinlei 96:5dfdc8568e9f 166 LCDDisplay::inst().setFirstLine(status);
vwochnik 52:8f1370084268 167 break;
xinlei 96:5dfdc8568e9f 168 }
xinlei 93:0acd11870c6a 169 }
xinlei 106:c61f0d62b625 170 if (ret == 0)
xinlei 106:c61f0d62b625 171 agent.loop();
xinlei 106:c61f0d62b625 172 shutdown();
xinlei 93:0acd11870c6a 173 return ret;
vwochnik 52:8f1370084268 174 }
vwochnik 4:363b4cc49445 175 }