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:
Mon Apr 10 20:18:23 2017 +0000
Revision:
11:dc15a7897495
Parent:
10:6d7e4693dff7
Public M2X Commit

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