Public Repository for IoT demo, leveraging the FRDM-K64F, WNC Cellular Modem, and AT&T M2X platform. Expects GPIO input from a sensor to send a discrete value to M2X.

Dependencies:   ConfigFile M2XStreamClient-JMF PinDetect SDFileSystem WNCInterface jsonlite mbed-rtos mbed

Fork of SVP_IoT_M2X_Cellular by Casey Bleeker

Committer:
geekbleek
Date:
Thu Mar 02 18:04:49 2017 +0000
Revision:
10:6d7e4693dff7
Parent:
8:b18770740a4d
Child:
11:dc15a7897495
Final RetrySD

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JMF 0:62feed0f1fd9 1 //
JMF 0:62feed0f1fd9 2 // This file contains an example implementation of M2X using the HTTP interface as the underlying
JMF 0:62feed0f1fd9 3 // transport.
JMF 0:62feed0f1fd9 4 //
JMF 0:62feed0f1fd9 5
JMF 0:62feed0f1fd9 6 #include "mbed.h"
geekbleek 5:f03cda4a4cc9 7 #include "PinDetect.h"
JMF 0:62feed0f1fd9 8 #include "WNCInterface.h"
geekbleek 10:6d7e4693dff7 9 #include "SDFileSystem.h"
geekbleek 10:6d7e4693dff7 10 #include "FATFileSystem.h"
geekbleek 8:b18770740a4d 11 #include "ConfigFile.h"
geekbleek 8:b18770740a4d 12
JMF 0:62feed0f1fd9 13 #define MBED_PLATFORM
JMF 0:62feed0f1fd9 14 #define M2X_ENABLE_READER
JMF 0:62feed0f1fd9 15
JMF 0:62feed0f1fd9 16 #include <jsonlite.h>
JMF 0:62feed0f1fd9 17 #include "M2XStreamClient.h"
JMF 0:62feed0f1fd9 18
JMF 0:62feed0f1fd9 19 #define CRLF "\n\r"
JMF 0:62feed0f1fd9 20
geekbleek 10:6d7e4693dff7 21
geekbleek 10:6d7e4693dff7 22 WNCInterface eth;
geekbleek 10:6d7e4693dff7 23 Client client;
geekbleek 10:6d7e4693dff7 24 MODSERIAL pc(USBTX,USBRX,256,256);
geekbleek 10:6d7e4693dff7 25
geekbleek 10:6d7e4693dff7 26 //LocalFileSystem local("local"); Not supported on K64F
geekbleek 10:6d7e4693dff7 27 SDFileSystem local(PTE3, PTE1, PTE2, PTE4, "local");
geekbleek 10:6d7e4693dff7 28 ConfigFile cfg;
geekbleek 10:6d7e4693dff7 29
geekbleek 8:b18770740a4d 30 //char deviceId[] = "3263056a467bc4eacd787bb0af9c1ad6"; // Device you want to post to
geekbleek 8:b18770740a4d 31 //char m2xKey[] = "0aad274b67c7faa8110769ae9d739033"; // Your M2X API Key or Master API Key
JMF 0:62feed0f1fd9 32
JMF 0:62feed0f1fd9 33 char fromTime[]= "1969-12-31T19:00:01.000Z"; // yyyy-mm-ddTHH:MM:SS.SSSZ
JMF 0:62feed0f1fd9 34 char endTime[25];
JMF 0:62feed0f1fd9 35
geekbleek 6:67203388294b 36 DigitalOut led_green(LED_GREEN);
geekbleek 6:67203388294b 37 DigitalOut led_red(LED_RED);
geekbleek 6:67203388294b 38 DigitalOut led_blue(LED_BLUE);
geekbleek 4:b9f2193b27cf 39
geekbleek 10:6d7e4693dff7 40 char key1[] = "deviceId";
geekbleek 10:6d7e4693dff7 41 char deviceId[BUFSIZ];
geekbleek 10:6d7e4693dff7 42 char key2[] = "m2xKey";
geekbleek 10:6d7e4693dff7 43 char m2xKey[BUFSIZ];
geekbleek 10:6d7e4693dff7 44
geekbleek 10:6d7e4693dff7 45 char timestamp[25];
geekbleek 10:6d7e4693dff7 46 int length = 25;
geekbleek 10:6d7e4693dff7 47
JMF 0:62feed0f1fd9 48 M2XStreamClient m2xClient(&client, m2xKey);
JMF 0:62feed0f1fd9 49 TimeService timeService(&m2xClient);
geekbleek 10:6d7e4693dff7 50
geekbleek 10:6d7e4693dff7 51
geekbleek 10:6d7e4693dff7 52
JMF 0:62feed0f1fd9 53
geekbleek 4:b9f2193b27cf 54 //********************************************************************************************************************************************
geekbleek 4:b9f2193b27cf 55 //* Set the RGB LED's Color
geekbleek 4:b9f2193b27cf 56 //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue)
geekbleek 4:b9f2193b27cf 57 //********************************************************************************************************************************************
geekbleek 6:67203388294b 58 void SetLedColor(unsigned char ucColor)
geekbleek 6:67203388294b 59 {
geekbleek 6:67203388294b 60 //Note that when an LED is on, you write a 0 to it:
geekbleek 6:67203388294b 61 led_red = !(ucColor & 0x1); //bit 0
geekbleek 6:67203388294b 62 led_green = !(ucColor & 0x2); //bit 1
geekbleek 6:67203388294b 63 led_blue = !(ucColor & 0x4); //bit 2
geekbleek 6:67203388294b 64 } //SetLedColor()
geekbleek 5:f03cda4a4cc9 65
geekbleek 5:f03cda4a4cc9 66
geekbleek 5:f03cda4a4cc9 67
geekbleek 5:f03cda4a4cc9 68 /*
geekbleek 5:f03cda4a4cc9 69 * Note, the PinDetect can be defined thus:-
geekbleek 5:f03cda4a4cc9 70 * PinDetect pin( p21, PullDown );
geekbleek 5:f03cda4a4cc9 71 * This allows you to specify the DigitalIn pinmode
geekbleek 5:f03cda4a4cc9 72 * when you create the PinDetect object. This means
geekbleek 5:f03cda4a4cc9 73 * using pin.mode() later is then no longer required.
geekbleek 5:f03cda4a4cc9 74 */
geekbleek 6:67203388294b 75
geekbleek 6:67203388294b 76 PinDetect pin ( A4, PullUp );
geekbleek 6:67203388294b 77 PinDetect button ( SW3, PullUp );
geekbleek 10:6d7e4693dff7 78 int pinState; //0 = no trigger, 1 = triggered
geekbleek 10:6d7e4693dff7 79 int m2xOnline; //0 = offline, 1= online
geekbleek 6:67203388294b 80
geekbleek 5:f03cda4a4cc9 81 // C function callbacks follow.
geekbleek 5:f03cda4a4cc9 82
geekbleek 5:f03cda4a4cc9 83 void keyPressed( void ) {
geekbleek 6:67203388294b 84 pinState = pinState++;
geekbleek 10:6d7e4693dff7 85 if (m2xOnline >= 1) {
geekbleek 10:6d7e4693dff7 86 SetLedColor(1);
geekbleek 10:6d7e4693dff7 87 }
geekbleek 6:67203388294b 88 //pc.printf("Key Pressed\n");
geekbleek 5:f03cda4a4cc9 89 }
geekbleek 5:f03cda4a4cc9 90
geekbleek 5:f03cda4a4cc9 91 void keyReleased( void ) {
geekbleek 6:67203388294b 92 pinState = pinState--;
geekbleek 10:6d7e4693dff7 93 if (m2xOnline >= 1) {
geekbleek 6:67203388294b 94 SetLedColor(4);
geekbleek 10:6d7e4693dff7 95 }
geekbleek 10:6d7e4693dff7 96 // if(pinState == 0){
geekbleek 10:6d7e4693dff7 97 // SetLedColor(4);
geekbleek 10:6d7e4693dff7 98 // };
geekbleek 6:67203388294b 99 //pc.printf("Key Released\n");
geekbleek 5:f03cda4a4cc9 100 }
geekbleek 5:f03cda4a4cc9 101
geekbleek 5:f03cda4a4cc9 102 void keyPressedHeld( void ) {
geekbleek 6:67203388294b 103 pinState = 2;
geekbleek 6:67203388294b 104 //led3 = 1;
geekbleek 6:67203388294b 105 //pc.printf("Key Pressed Held\n");
geekbleek 5:f03cda4a4cc9 106 }
geekbleek 5:f03cda4a4cc9 107
geekbleek 5:f03cda4a4cc9 108 void keyReleasedHeld( void ) {
geekbleek 6:67203388294b 109 //led4 = 1;
geekbleek 6:67203388294b 110 //pc.printf("Key Released Held\n");
geekbleek 5:f03cda4a4cc9 111 }
geekbleek 7:5f9a23deaca1 112
geekbleek 7:5f9a23deaca1 113 void initModem() {
geekbleek 7:5f9a23deaca1 114 int response;
geekbleek 7:5f9a23deaca1 115 pc.printf("Start m2x-demo-all by initializing the network" CRLF);
geekbleek 7:5f9a23deaca1 116 eth.doDebug(2);
geekbleek 7:5f9a23deaca1 117 response = eth.init(NULL, &pc);
geekbleek 7:5f9a23deaca1 118 pc.printf("Response is: %d" CRLF, response);
geekbleek 7:5f9a23deaca1 119 pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response);
geekbleek 7:5f9a23deaca1 120 while( !response ) {
geekbleek 7:5f9a23deaca1 121 SetLedColor(0);
geekbleek 7:5f9a23deaca1 122 pc.printf(" - - - - - - - WAITING FOR CELL MODEM TO COME ONLINE - - - - - - - " CRLF);
geekbleek 7:5f9a23deaca1 123 wait(30);
geekbleek 7:5f9a23deaca1 124 response = eth.init(NULL, &pc);
geekbleek 7:5f9a23deaca1 125 pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response);
geekbleek 7:5f9a23deaca1 126 };
geekbleek 7:5f9a23deaca1 127
geekbleek 7:5f9a23deaca1 128 if(response){
geekbleek 7:5f9a23deaca1 129 eth.doDebug(0);
geekbleek 7:5f9a23deaca1 130 SetLedColor(2);
geekbleek 7:5f9a23deaca1 131 };
geekbleek 7:5f9a23deaca1 132
geekbleek 7:5f9a23deaca1 133 response = eth.connect();
geekbleek 7:5f9a23deaca1 134 pc.printf("IP Address: %s " CRLF CRLF, eth.getIPAddress());
geekbleek 7:5f9a23deaca1 135
geekbleek 7:5f9a23deaca1 136 }
geekbleek 7:5f9a23deaca1 137
geekbleek 7:5f9a23deaca1 138 void initM2X() {
geekbleek 7:5f9a23deaca1 139 pc.printf("starting M2X data push..." CRLF);
geekbleek 7:5f9a23deaca1 140
geekbleek 7:5f9a23deaca1 141 pc.printf("initialize the M2X time service" CRLF);
geekbleek 7:5f9a23deaca1 142 if (!m2x_status_is_success(timeService.init()))
geekbleek 7:5f9a23deaca1 143 pc.printf("Cannot initialize time service!" CRLF);
geekbleek 7:5f9a23deaca1 144 else {
geekbleek 7:5f9a23deaca1 145 timeService.getTimestamp(timestamp, &length);
geekbleek 7:5f9a23deaca1 146 pc.printf("Current timestamp: %s" CRLF, timestamp);
geekbleek 7:5f9a23deaca1 147 strcpy(endTime,timestamp);
geekbleek 10:6d7e4693dff7 148 m2xOnline = 1;
geekbleek 7:5f9a23deaca1 149 SetLedColor(4);
geekbleek 7:5f9a23deaca1 150 }
geekbleek 7:5f9a23deaca1 151 }
geekbleek 5:f03cda4a4cc9 152
geekbleek 5:f03cda4a4cc9 153 // The main program.
geekbleek 5:f03cda4a4cc9 154
JMF 0:62feed0f1fd9 155 int main() {
geekbleek 8:b18770740a4d 156
geekbleek 10:6d7e4693dff7 157
geekbleek 10:6d7e4693dff7 158
geekbleek 8:b18770740a4d 159 //char deviceId[] = "3263056a467bc4eacd787bb0af9c1ad6"; // Device you want to post to
geekbleek 8:b18770740a4d 160 //char m2xKey[] = "0aad274b67c7faa8110769ae9d739033"; // Your M2X API Key or Master API Key
geekbleek 10:6d7e4693dff7 161 pc.baud(115200);
geekbleek 10:6d7e4693dff7 162 pc.printf("Hello World! I am here!" CRLF);
geekbleek 8:b18770740a4d 163
geekbleek 10:6d7e4693dff7 164 wait(5);
geekbleek 10:6d7e4693dff7 165
geekbleek 10:6d7e4693dff7 166
geekbleek 8:b18770740a4d 167 /*
geekbleek 8:b18770740a4d 168 * Read a configuration file from a mbed.
geekbleek 8:b18770740a4d 169 */
geekbleek 10:6d7e4693dff7 170
geekbleek 8:b18770740a4d 171 if (!cfg.read("/local/settings.txt")) {
geekbleek 10:6d7e4693dff7 172 pc.printf("Failure to read a configuration file." CRLF);
geekbleek 8:b18770740a4d 173 }
geekbleek 10:6d7e4693dff7 174
geekbleek 8:b18770740a4d 175 /*
geekbleek 8:b18770740a4d 176 * Get a configuration value.
geekbleek 8:b18770740a4d 177 */
geekbleek 10:6d7e4693dff7 178
geekbleek 8:b18770740a4d 179 if (cfg.getValue(key1, &deviceId[0], sizeof(deviceId))) {
geekbleek 10:6d7e4693dff7 180 pc.printf("'%s'='%s'" CRLF, key1, deviceId);
geekbleek 8:b18770740a4d 181 }
geekbleek 8:b18770740a4d 182
geekbleek 8:b18770740a4d 183 if (cfg.getValue(key2, &m2xKey[0], sizeof(m2xKey))) {
geekbleek 10:6d7e4693dff7 184 pc.printf("'%s'='%s'" CRLF, key2, m2xKey);
geekbleek 8:b18770740a4d 185 }
geekbleek 8:b18770740a4d 186
geekbleek 8:b18770740a4d 187
geekbleek 6:67203388294b 188 pinState = 0;
geekbleek 5:f03cda4a4cc9 189 pin.attach_asserted( &keyPressed );
geekbleek 5:f03cda4a4cc9 190 pin.attach_deasserted( &keyReleased );
geekbleek 6:67203388294b 191 button.attach_asserted( &keyPressed );
geekbleek 6:67203388294b 192 button.attach_deasserted( &keyReleased );
geekbleek 6:67203388294b 193 //pin.attach_asserted_held( &keyPressedHeld );
geekbleek 4:b9f2193b27cf 194
geekbleek 5:f03cda4a4cc9 195 // This callback will often be of little use as it's
geekbleek 5:f03cda4a4cc9 196 // called after every assertion/deassertion. However,
geekbleek 5:f03cda4a4cc9 197 // it's provided for completeness. You may find a use
geekbleek 5:f03cda4a4cc9 198 // for it. If not, just don't attach a callback and it
geekbleek 5:f03cda4a4cc9 199 // will not activate.
geekbleek 6:67203388294b 200 //pin.attach_deasserted_held( &keyReleasedHeld );
JMF 0:62feed0f1fd9 201
geekbleek 5:f03cda4a4cc9 202 // You can define how many continuous samples must be
geekbleek 5:f03cda4a4cc9 203 // asserted before the attach_asserted() function is called.
geekbleek 5:f03cda4a4cc9 204 // pin.setSamplesTillAssert( 10 );
geekbleek 5:f03cda4a4cc9 205 // This would mean 10 * 20ms debounce time = 200ms.
geekbleek 5:f03cda4a4cc9 206
geekbleek 5:f03cda4a4cc9 207 // You can define how many continuous samples must be
geekbleek 5:f03cda4a4cc9 208 // asserted before the attach_asserted_held() function is called.
geekbleek 5:f03cda4a4cc9 209 // pin.setSamplesTillHeld( 200 );
geekbleek 5:f03cda4a4cc9 210 // This would mean 200 * 20ms debounce time = 2seconds.
geekbleek 5:f03cda4a4cc9 211
geekbleek 5:f03cda4a4cc9 212 // By default, "asserted" assumes the pin going high from 0volts to 5volts
geekbleek 5:f03cda4a4cc9 213 // and deasserted assumes going from 5volts to 0volts. You can invert this
geekbleek 5:f03cda4a4cc9 214 // logic so that going to 0volts is asserted and going to 5volts is deasserted
geekbleek 5:f03cda4a4cc9 215 // using this setup function:-
geekbleek 6:67203388294b 216 pin.setAssertValue( 0 );
geekbleek 6:67203388294b 217 button.setAssertValue( 0 );
geekbleek 7:5f9a23deaca1 218
geekbleek 7:5f9a23deaca1 219 int m2xresponse, cnt=1;
geekbleek 7:5f9a23deaca1 220 int pinValue;
geekbleek 7:5f9a23deaca1 221
geekbleek 7:5f9a23deaca1 222 wait(20);
geekbleek 7:5f9a23deaca1 223 initModem(); //call function to init modem, wait till it comes online, and get IP address
geekbleek 10:6d7e4693dff7 224 initM2X();
geekbleek 7:5f9a23deaca1 225
geekbleek 7:5f9a23deaca1 226 // //debug
geekbleek 7:5f9a23deaca1 227 // wait(10); // wait for terminal connected
geekbleek 7:5f9a23deaca1 228 // pc.printf("STARTING WNCInterface" CRLF);
geekbleek 7:5f9a23deaca1 229 // eth.doDebug(0); // if you want a LOT of AT commands logged (1)
geekbleek 7:5f9a23deaca1 230 //
geekbleek 7:5f9a23deaca1 231 // // init and connect the WNCInterface cell modem
geekbleek 7:5f9a23deaca1 232 // pc.printf("init() returned 0x%04X" CRLF, eth.init());
geekbleek 7:5f9a23deaca1 233 // response = eth.connect();
geekbleek 7:5f9a23deaca1 234 //
geekbleek 7:5f9a23deaca1 235 // if(response){
geekbleek 7:5f9a23deaca1 236 // SetLedColor(2);
geekbleek 7:5f9a23deaca1 237 // };
geekbleek 7:5f9a23deaca1 238
geekbleek 7:5f9a23deaca1 239 // pc.printf("IP Address: %s " CRLF, eth.getIPAddress());
geekbleek 7:5f9a23deaca1 240 // pc.printf("-------------------------------------" CRLF);
geekbleek 7:5f9a23deaca1 241
geekbleek 7:5f9a23deaca1 242
geekbleek 7:5f9a23deaca1 243 // Start Pin Samping
geekbleek 5:f03cda4a4cc9 244 // Sampling does NOT begin until you set the frequency. So, until
geekbleek 5:f03cda4a4cc9 245 // you call this function NO callbacks will be made. With no arguments
geekbleek 5:f03cda4a4cc9 246 // passed the default is 20000 microseconds (20ms). Specifiy the sampling
geekbleek 5:f03cda4a4cc9 247 // period in microseconds if you want a different value to 20ms.
geekbleek 5:f03cda4a4cc9 248 // For example, for a sampling period of 10ms do:-
geekbleek 5:f03cda4a4cc9 249 // pin.setSampleFrequency( 10000 );
geekbleek 5:f03cda4a4cc9 250 // Note, if you change the sampling frequency you will probably also
geekbleek 5:f03cda4a4cc9 251 // want to change the number of samples till assert and held as show
geekbleek 5:f03cda4a4cc9 252 // above.
geekbleek 5:f03cda4a4cc9 253 pin.setSampleFrequency(); // Defaults to 20ms.
geekbleek 6:67203388294b 254 button.setSampleFrequency();
geekbleek 6:67203388294b 255
geekbleek 5:f03cda4a4cc9 256 while( 1 ) {
geekbleek 6:67203388294b 257 //pc.printf("Hello World! I am still here!" CRLF);
geekbleek 6:67203388294b 258 pc.printf("Pin state is: %d" CRLF, pinState);
geekbleek 7:5f9a23deaca1 259 if(pinState >= 1){
geekbleek 7:5f9a23deaca1 260 pinValue = 1;
geekbleek 7:5f9a23deaca1 261 }
geekbleek 7:5f9a23deaca1 262 else {
geekbleek 7:5f9a23deaca1 263 pinValue = 0;
geekbleek 7:5f9a23deaca1 264 }
geekbleek 7:5f9a23deaca1 265 pc.printf("Pin value is: %d" CRLF, pinValue);
geekbleek 6:67203388294b 266 pc.printf("cnt=%d\r\n",cnt++);
geekbleek 6:67203388294b 267 // post the temp value
geekbleek 7:5f9a23deaca1 268 pc.printf("Post updateStreamValue (pinValue = %d)..." CRLF, pinState);
geekbleek 7:5f9a23deaca1 269 m2xresponse = m2xClient.updateStreamValue(deviceId, "water-sensor", pinValue);
geekbleek 7:5f9a23deaca1 270 pc.printf("Post response code: %d" CRLF, m2xresponse);
geekbleek 7:5f9a23deaca1 271 if (m2xresponse != 202){
geekbleek 10:6d7e4693dff7 272 m2xOnline = 0;
geekbleek 7:5f9a23deaca1 273 SetLedColor(2);
geekbleek 7:5f9a23deaca1 274 pc.printf("Error connecting to M2X" CRLF);
geekbleek 10:6d7e4693dff7 275 wait(5);
geekbleek 7:5f9a23deaca1 276 //pc.printf("IP Address: %s " CRLF CRLF, eth.getIPAddress());
geekbleek 7:5f9a23deaca1 277 if (m2xresponse == -1){
geekbleek 7:5f9a23deaca1 278 pc.printf("Modem Error - attempting to reconnect" CRLF);
geekbleek 7:5f9a23deaca1 279 initModem();
geekbleek 7:5f9a23deaca1 280 initM2X();
geekbleek 7:5f9a23deaca1 281 }
geekbleek 7:5f9a23deaca1 282 }
geekbleek 10:6d7e4693dff7 283 if (m2xresponse == 202){
geekbleek 10:6d7e4693dff7 284 if (m2xOnline == 0) { //first time m2x came back online
geekbleek 10:6d7e4693dff7 285 SetLedColor(4);
geekbleek 10:6d7e4693dff7 286 }
geekbleek 10:6d7e4693dff7 287 m2xOnline = m2xOnline++;
geekbleek 10:6d7e4693dff7 288 }
geekbleek 6:67203388294b 289 timeService.getTimestamp(timestamp, &length);
geekbleek 6:67203388294b 290 pc.printf("Thats all folks, got to wait 5 seconds... (%s)" CRLF CRLF CRLF, timestamp);
geekbleek 6:67203388294b 291
geekbleek 6:67203388294b 292 // wait 5 secs and then loop
geekbleek 10:6d7e4693dff7 293 delay(1000);
geekbleek 4:b9f2193b27cf 294 }
geekbleek 5:f03cda4a4cc9 295 }