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
main.cpp@4:b9f2193b27cf, 2017-02-07 (annotated)
- Committer:
- geekbleek
- Date:
- Tue Feb 07 23:41:18 2017 +0000
- Revision:
- 4:b9f2193b27cf
- Parent:
- 2:eb0768c06c1b
- Child:
- 5:f03cda4a4cc9
My Sensor Code
Who changed what in which revision?
User | Revision | Line number | New 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" |
JMF | 0:62feed0f1fd9 | 7 | #include "WNCInterface.h" |
JMF | 0:62feed0f1fd9 | 8 | |
JMF | 0:62feed0f1fd9 | 9 | #define MBED_PLATFORM |
JMF | 0:62feed0f1fd9 | 10 | #define M2X_ENABLE_READER |
JMF | 0:62feed0f1fd9 | 11 | |
JMF | 0:62feed0f1fd9 | 12 | #include <jsonlite.h> |
JMF | 0:62feed0f1fd9 | 13 | #include "M2XStreamClient.h" |
JMF | 0:62feed0f1fd9 | 14 | |
JMF | 0:62feed0f1fd9 | 15 | #define CRLF "\n\r" |
JMF | 0:62feed0f1fd9 | 16 | |
geekbleek | 4:b9f2193b27cf | 17 | char deviceId[] = "3263056a467bc4eacd787bb0af9c1ad6"; // Device you want to post to |
geekbleek | 4:b9f2193b27cf | 18 | char m2xKey[] = "0aad274b67c7faa8110769ae9d739033"; // Your M2X API Key or Master API Key |
JMF | 0:62feed0f1fd9 | 19 | |
JMF | 0:62feed0f1fd9 | 20 | const char *hstreamName = "humidity"; |
JMF | 0:62feed0f1fd9 | 21 | const char *tstreamName = "temperature"; |
JMF | 0:62feed0f1fd9 | 22 | const char *streamNames[] = { tstreamName, hstreamName }; |
JMF | 0:62feed0f1fd9 | 23 | char name[] = "Wake Forest"; // Name of current location of datasource |
JMF | 0:62feed0f1fd9 | 24 | |
JMF | 0:62feed0f1fd9 | 25 | int counts[] = { 2, 1 }; |
JMF | 0:62feed0f1fd9 | 26 | const char *ats[] = { "2016-09-09T02:05:14.692Z", |
JMF | 0:62feed0f1fd9 | 27 | "2016-09-09T02:05:14.700Z", |
JMF | 0:62feed0f1fd9 | 28 | "2016-09-09T02:05:14.692Z" }; |
JMF | 0:62feed0f1fd9 | 29 | double values[] = { 10.9, 11.2, 6.1 }; |
JMF | 0:62feed0f1fd9 | 30 | |
JMF | 0:62feed0f1fd9 | 31 | char fromTime[]= "1969-12-31T19:00:01.000Z"; // yyyy-mm-ddTHH:MM:SS.SSSZ |
JMF | 0:62feed0f1fd9 | 32 | char endTime[25]; |
JMF | 0:62feed0f1fd9 | 33 | |
JMF | 0:62feed0f1fd9 | 34 | double latitude = 33.007872; // You could read these values from a GPS but |
JMF | 0:62feed0f1fd9 | 35 | double longitude = -96.751614; // for now, will just hardcode them |
JMF | 0:62feed0f1fd9 | 36 | double elevation = 697.00; |
JMF | 0:62feed0f1fd9 | 37 | |
geekbleek | 4:b9f2193b27cf | 38 | DigitalIn mypin(A2); |
geekbleek | 4:b9f2193b27cf | 39 | DigitalOut led_green(LED_GREEN); |
geekbleek | 4:b9f2193b27cf | 40 | DigitalOut led_red(LED_RED); |
geekbleek | 4:b9f2193b27cf | 41 | DigitalOut led_blue(LED_BLUE); |
geekbleek | 4:b9f2193b27cf | 42 | |
geekbleek | 4:b9f2193b27cf | 43 | |
JMF | 0:62feed0f1fd9 | 44 | WNCInterface eth; |
JMF | 0:62feed0f1fd9 | 45 | Client client; |
JMF | 0:62feed0f1fd9 | 46 | M2XStreamClient m2xClient(&client, m2xKey); |
JMF | 0:62feed0f1fd9 | 47 | TimeService timeService(&m2xClient); |
JMF | 1:1c840717deea | 48 | MODSERIAL pc(USBTX,USBRX,256,256); |
JMF | 0:62feed0f1fd9 | 49 | |
JMF | 0:62feed0f1fd9 | 50 | void on_data_point_found(const char* at, const char* value, int index, void* context, int type) { |
JMF | 2:eb0768c06c1b | 51 | pc.printf(">>Found a data point, index: %d type: %d" CRLF, index, type); |
JMF | 2:eb0768c06c1b | 52 | pc.printf(">>At: %s" CRLF " Value: %s" CRLF, at, value); |
JMF | 0:62feed0f1fd9 | 53 | } |
JMF | 0:62feed0f1fd9 | 54 | |
JMF | 0:62feed0f1fd9 | 55 | |
JMF | 0:62feed0f1fd9 | 56 | void on_command_found(const char* id, const char* name, int index, void *context) { |
JMF | 2:eb0768c06c1b | 57 | pc.printf(">>Found a command, index: %d" CRLF, index); |
JMF | 2:eb0768c06c1b | 58 | pc.printf(">>ID: %s\n Name: %s" CRLF, id, name); |
JMF | 0:62feed0f1fd9 | 59 | } |
JMF | 0:62feed0f1fd9 | 60 | |
JMF | 0:62feed0f1fd9 | 61 | void on_location_found(const char* name, |
JMF | 0:62feed0f1fd9 | 62 | double latitude, |
JMF | 0:62feed0f1fd9 | 63 | double longitude, |
JMF | 0:62feed0f1fd9 | 64 | double elevation, |
JMF | 0:62feed0f1fd9 | 65 | const char* timestamp, |
JMF | 0:62feed0f1fd9 | 66 | int index, |
JMF | 0:62feed0f1fd9 | 67 | void* context) { |
JMF | 2:eb0768c06c1b | 68 | pc.printf(">>Found a location, index: %d" CRLF, index); |
JMF | 2:eb0768c06c1b | 69 | pc.printf(">>Name: %s" CRLF ">>Latitude: %lf" CRLF ">>Longitude: %lf" CRLF, name, latitude, longitude); |
JMF | 2:eb0768c06c1b | 70 | pc.printf(">>Elevation: %lf" CRLF ">>Timestamp: %s" CRLF, elevation, timestamp); |
JMF | 0:62feed0f1fd9 | 71 | } |
JMF | 0:62feed0f1fd9 | 72 | |
geekbleek | 4:b9f2193b27cf | 73 | //******************************************************************************************************************************************** |
geekbleek | 4:b9f2193b27cf | 74 | //* Set the RGB LED's Color |
geekbleek | 4:b9f2193b27cf | 75 | //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue) |
geekbleek | 4:b9f2193b27cf | 76 | //******************************************************************************************************************************************** |
geekbleek | 4:b9f2193b27cf | 77 | void SetLedColor(unsigned char ucColor) |
geekbleek | 4:b9f2193b27cf | 78 | { |
geekbleek | 4:b9f2193b27cf | 79 | //Note that when an LED is on, you write a 0 to it: |
geekbleek | 4:b9f2193b27cf | 80 | led_red = !(ucColor & 0x1); //bit 0 |
geekbleek | 4:b9f2193b27cf | 81 | led_green = !(ucColor & 0x2); //bit 1 |
geekbleek | 4:b9f2193b27cf | 82 | led_blue = !(ucColor & 0x4); //bit 2 |
geekbleek | 4:b9f2193b27cf | 83 | } //SetLedColor() |
geekbleek | 4:b9f2193b27cf | 84 | |
geekbleek | 4:b9f2193b27cf | 85 | |
geekbleek | 4:b9f2193b27cf | 86 | |
geekbleek | 4:b9f2193b27cf | 87 | |
geekbleek | 4:b9f2193b27cf | 88 | //int main() { |
geekbleek | 4:b9f2193b27cf | 89 | // char timestamp[25]; |
geekbleek | 4:b9f2193b27cf | 90 | // int length = 25; |
geekbleek | 4:b9f2193b27cf | 91 | // char amb_temp[6]; |
geekbleek | 4:b9f2193b27cf | 92 | // char amb_humd[6]; |
geekbleek | 4:b9f2193b27cf | 93 | // int response, cnt=1; |
geekbleek | 4:b9f2193b27cf | 94 | // double temp=0.00; //we will just increment these 0.01 each time through the loop |
geekbleek | 4:b9f2193b27cf | 95 | // double humid=0.00; //we will just increment these 1 each time through the loop wrapping at 100 |
geekbleek | 4:b9f2193b27cf | 96 | // |
geekbleek | 4:b9f2193b27cf | 97 | // pc.baud(115200); |
geekbleek | 4:b9f2193b27cf | 98 | // pc.printf("Start m2x-demo-all by initializng the network" CRLF); |
geekbleek | 4:b9f2193b27cf | 99 | // response = eth.init(); |
geekbleek | 4:b9f2193b27cf | 100 | // pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response); |
geekbleek | 4:b9f2193b27cf | 101 | // if( !response ) { |
geekbleek | 4:b9f2193b27cf | 102 | // pc.printf(" - - - - - - - ALL DONE - - - - - - - " CRLF); |
geekbleek | 4:b9f2193b27cf | 103 | // while(1); |
geekbleek | 4:b9f2193b27cf | 104 | // } |
geekbleek | 4:b9f2193b27cf | 105 | // |
geekbleek | 4:b9f2193b27cf | 106 | // response = eth.connect(); |
geekbleek | 4:b9f2193b27cf | 107 | // pc.printf("IP Address: %s " CRLF CRLF, eth.getIPAddress()); |
geekbleek | 4:b9f2193b27cf | 108 | // |
geekbleek | 4:b9f2193b27cf | 109 | // pc.printf("initialize the M2X time service" CRLF); |
geekbleek | 4:b9f2193b27cf | 110 | // if (!m2x_status_is_success(timeService.init())) |
geekbleek | 4:b9f2193b27cf | 111 | // pc.printf("Cannot initialize time service!" CRLF); |
geekbleek | 4:b9f2193b27cf | 112 | // else { |
geekbleek | 4:b9f2193b27cf | 113 | // timeService.getTimestamp(timestamp, &length); |
geekbleek | 4:b9f2193b27cf | 114 | // pc.printf("Current timestamp: %s" CRLF, timestamp); |
geekbleek | 4:b9f2193b27cf | 115 | // strcpy(endTime,timestamp); |
geekbleek | 4:b9f2193b27cf | 116 | // } |
geekbleek | 4:b9f2193b27cf | 117 | // |
geekbleek | 4:b9f2193b27cf | 118 | //// pc.printf("Now delete all existing values" CRLF); |
geekbleek | 4:b9f2193b27cf | 119 | //// // Delete values |
geekbleek | 4:b9f2193b27cf | 120 | //// pc.printf("Delete humidity values..." CRLF); |
geekbleek | 4:b9f2193b27cf | 121 | //// response = m2xClient.deleteValues(deviceId,hstreamName, fromTime, endTime); |
geekbleek | 4:b9f2193b27cf | 122 | //// pc.printf("Delete response code: %d" CRLF, response); |
geekbleek | 4:b9f2193b27cf | 123 | //// |
geekbleek | 4:b9f2193b27cf | 124 | //// pc.printf("Delete temp values..." CRLF); |
geekbleek | 4:b9f2193b27cf | 125 | //// response = m2xClient.deleteValues(deviceId,tstreamName, fromTime, endTime); |
geekbleek | 4:b9f2193b27cf | 126 | //// pc.printf("Delete response code: %d" CRLF, response); |
geekbleek | 4:b9f2193b27cf | 127 | //// |
geekbleek | 4:b9f2193b27cf | 128 | //// pc.printf("Delete location values..." CRLF); |
geekbleek | 4:b9f2193b27cf | 129 | //// response = m2xClient.deleteLocations(deviceId, fromTime, endTime); |
geekbleek | 4:b9f2193b27cf | 130 | //// pc.printf("Delete response code: %d" CRLF, response); |
geekbleek | 4:b9f2193b27cf | 131 | // |
geekbleek | 4:b9f2193b27cf | 132 | // pc.printf("Query for possible commands using this device..." CRLF); |
geekbleek | 4:b9f2193b27cf | 133 | // response = m2xClient.listCommands(deviceId, on_command_found, NULL); |
geekbleek | 4:b9f2193b27cf | 134 | // pc.printf("listCommands response code: %d" CRLF, response); |
geekbleek | 4:b9f2193b27cf | 135 | // |
geekbleek | 4:b9f2193b27cf | 136 | // |
geekbleek | 4:b9f2193b27cf | 137 | // |
geekbleek | 4:b9f2193b27cf | 138 | // |
geekbleek | 4:b9f2193b27cf | 139 | // while (true) { |
geekbleek | 4:b9f2193b27cf | 140 | // // read temp -- for now, just use a fixed temp, but will need to read the HTS221 |
geekbleek | 4:b9f2193b27cf | 141 | // // and put it into a 6 byte string formatted as "%0.2f" |
geekbleek | 4:b9f2193b27cf | 142 | // sprintf(amb_temp,"%0.2f",temp); |
geekbleek | 4:b9f2193b27cf | 143 | // sprintf(amb_humd,"%0.2f",humid); |
geekbleek | 4:b9f2193b27cf | 144 | // temp += .01; |
geekbleek | 4:b9f2193b27cf | 145 | // humid += 1.0; |
geekbleek | 4:b9f2193b27cf | 146 | // humid = fmod(humid,100.0); |
geekbleek | 4:b9f2193b27cf | 147 | // pc.printf("cnt=%d\r\n",cnt++); |
geekbleek | 4:b9f2193b27cf | 148 | // |
geekbleek | 4:b9f2193b27cf | 149 | // // post the temp value |
geekbleek | 4:b9f2193b27cf | 150 | // //pc.printf("Post updateStreamValue (temp)..." CRLF); |
geekbleek | 4:b9f2193b27cf | 151 | //// response = m2xClient.updateStreamValue(deviceId, "water-sensor", temp); |
geekbleek | 4:b9f2193b27cf | 152 | //// pc.printf("Post response code: %d" CRLF, response); |
geekbleek | 4:b9f2193b27cf | 153 | // |
geekbleek | 4:b9f2193b27cf | 154 | // timeService.getTimestamp(timestamp, &length); |
geekbleek | 4:b9f2193b27cf | 155 | // pc.printf("Thats all folks, got to wait 5 seconds... (%s)" CRLF CRLF CRLF, timestamp); |
geekbleek | 4:b9f2193b27cf | 156 | // |
geekbleek | 4:b9f2193b27cf | 157 | // // wait 5 secs and then loop |
geekbleek | 4:b9f2193b27cf | 158 | // delay(5000); |
geekbleek | 4:b9f2193b27cf | 159 | // |
geekbleek | 4:b9f2193b27cf | 160 | // |
geekbleek | 4:b9f2193b27cf | 161 | // } |
geekbleek | 4:b9f2193b27cf | 162 | //} |
geekbleek | 4:b9f2193b27cf | 163 | |
geekbleek | 4:b9f2193b27cf | 164 | |
geekbleek | 4:b9f2193b27cf | 165 | |
geekbleek | 4:b9f2193b27cf | 166 | |
JMF | 0:62feed0f1fd9 | 167 | int main() { |
geekbleek | 4:b9f2193b27cf | 168 | int response, cnt=1; |
geekbleek | 4:b9f2193b27cf | 169 | pc.baud(115200); |
geekbleek | 4:b9f2193b27cf | 170 | pc.printf("Start m2x-demo-all by initializng the network" CRLF); |
geekbleek | 4:b9f2193b27cf | 171 | response = eth.init(); |
geekbleek | 4:b9f2193b27cf | 172 | pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response); |
geekbleek | 4:b9f2193b27cf | 173 | if( !response ) { |
JMF | 2:eb0768c06c1b | 174 | pc.printf(" - - - - - - - ALL DONE - - - - - - - " CRLF); |
JMF | 0:62feed0f1fd9 | 175 | while(1); |
geekbleek | 4:b9f2193b27cf | 176 | } |
geekbleek | 4:b9f2193b27cf | 177 | |
geekbleek | 4:b9f2193b27cf | 178 | // check mypin object is initialized and connected to a pin |
geekbleek | 4:b9f2193b27cf | 179 | if(mypin.is_connected()) { |
geekbleek | 4:b9f2193b27cf | 180 | pc.printf("mypin is connected and initialized! \n\r"); |
geekbleek | 4:b9f2193b27cf | 181 | } |
geekbleek | 4:b9f2193b27cf | 182 | |
geekbleek | 4:b9f2193b27cf | 183 | // Optional: set mode as PullUp/PullDown/PullNone/OpenDrain |
geekbleek | 4:b9f2193b27cf | 184 | mypin.mode(PullUp); |
JMF | 0:62feed0f1fd9 | 185 | |
geekbleek | 4:b9f2193b27cf | 186 | while(true) { |
geekbleek | 4:b9f2193b27cf | 187 | pc.printf("mypin has value : %d \n\r", mypin.read()); |
geekbleek | 4:b9f2193b27cf | 188 | if (mypin) { |
geekbleek | 4:b9f2193b27cf | 189 | SetLedColor(1) |
geekbleek | 4:b9f2193b27cf | 190 | } |
geekbleek | 4:b9f2193b27cf | 191 | if (!mypin) { |
geekbleek | 4:b9f2193b27cf | 192 | SetLedColor(4) |
geekbleek | 4:b9f2193b27cf | 193 | } |
geekbleek | 4:b9f2193b27cf | 194 | wait(0.25); |
geekbleek | 4:b9f2193b27cf | 195 | } |
JMF | 0:62feed0f1fd9 | 196 | } |
JMF | 0:62feed0f1fd9 | 197 |