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:
Sun Feb 19 21:07:30 2017 +0000
Revision:
8:b18770740a4d
Parent:
7:5f9a23deaca1
Child:
10:6d7e4693dff7
added config file

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