Sample code for AT&T IoT Services DevLab with IoT StarterKit.
Dependencies: FXOS8700CQ M2XStreamClient-JMF WNCInterface jsonlite mbed-rtos mbed
Fork of WNCInterface_M2Xdemo by
main.cpp@4:08979e323c6e, 2017-04-05 (annotated)
- Committer:
- jk431j
- Date:
- Wed Apr 05 04:53:25 2017 +0000
- Revision:
- 4:08979e323c6e
- Parent:
- 2:eb0768c06c1b
- Child:
- 5:8099493f2c35
Added sensor reading and M2X command handling,
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 | |
jk431j | 4:08979e323c6e | 15 | #include "sensors.h" |
jk431j | 4:08979e323c6e | 16 | |
JMF | 0:62feed0f1fd9 | 17 | #define CRLF "\n\r" |
JMF | 0:62feed0f1fd9 | 18 | |
jk431j | 4:08979e323c6e | 19 | char deviceId[] = "9fc504277536c2450ad5fa2cb4e2b478"; // Device you want to post to |
jk431j | 4:08979e323c6e | 20 | char m2xKey[] = "8ec6719c0ccbd8049494b7404af762f8"; // Your M2X API Key or Master API Key |
JMF | 0:62feed0f1fd9 | 21 | |
JMF | 0:62feed0f1fd9 | 22 | const char *hstreamName = "humidity"; |
jk431j | 4:08979e323c6e | 23 | const char *tstreamName = "temp"; |
JMF | 0:62feed0f1fd9 | 24 | |
JMF | 0:62feed0f1fd9 | 25 | WNCInterface eth; |
JMF | 0:62feed0f1fd9 | 26 | Client client; |
JMF | 0:62feed0f1fd9 | 27 | M2XStreamClient m2xClient(&client, m2xKey); |
JMF | 0:62feed0f1fd9 | 28 | TimeService timeService(&m2xClient); |
jk431j | 4:08979e323c6e | 29 | |
jk431j | 4:08979e323c6e | 30 | I2C i2c(PTC11, PTC10); //SDA, SCL -- define the I2C pins being used |
jk431j | 4:08979e323c6e | 31 | Serial pc(USBTX, USBRX); // tx, rx |
jk431j | 4:08979e323c6e | 32 | DigitalOut led_green(LED_GREEN); |
jk431j | 4:08979e323c6e | 33 | DigitalOut led_red(LED_RED); |
jk431j | 4:08979e323c6e | 34 | DigitalOut led_blue(LED_BLUE); |
jk431j | 4:08979e323c6e | 35 | |
jk431j | 4:08979e323c6e | 36 | K64F_Sensors_t SENSOR_DATA = |
jk431j | 4:08979e323c6e | 37 | { |
jk431j | 4:08979e323c6e | 38 | .Temperature = "0", |
jk431j | 4:08979e323c6e | 39 | .Humidity = "0", |
jk431j | 4:08979e323c6e | 40 | .AccelX = "0", |
jk431j | 4:08979e323c6e | 41 | .AccelY = "0", |
jk431j | 4:08979e323c6e | 42 | .AccelZ = "0", |
jk431j | 4:08979e323c6e | 43 | .MagnetometerX = "0", |
jk431j | 4:08979e323c6e | 44 | .MagnetometerY = "0", |
jk431j | 4:08979e323c6e | 45 | .MagnetometerZ = "0", |
jk431j | 4:08979e323c6e | 46 | .AmbientLightVis = "0", |
jk431j | 4:08979e323c6e | 47 | .AmbientLightIr = "0", |
jk431j | 4:08979e323c6e | 48 | .UVindex = "0", |
jk431j | 4:08979e323c6e | 49 | .Proximity = "0", |
jk431j | 4:08979e323c6e | 50 | .Temperature_Si7020 = "0", |
jk431j | 4:08979e323c6e | 51 | .Humidity_Si7020 = "0", |
jk431j | 4:08979e323c6e | 52 | .Virtual_Sensor1 = "0", |
jk431j | 4:08979e323c6e | 53 | .Virtual_Sensor2 = "0", |
jk431j | 4:08979e323c6e | 54 | .Virtual_Sensor3 = "0", |
jk431j | 4:08979e323c6e | 55 | .Virtual_Sensor4 = "0", |
jk431j | 4:08979e323c6e | 56 | .Virtual_Sensor5 = "0", |
jk431j | 4:08979e323c6e | 57 | .Virtual_Sensor6 = "0", |
jk431j | 4:08979e323c6e | 58 | .Virtual_Sensor7 = "0", |
jk431j | 4:08979e323c6e | 59 | .Virtual_Sensor8 = "0", |
jk431j | 4:08979e323c6e | 60 | .GPS_Satellites = "0", |
jk431j | 4:08979e323c6e | 61 | .GPS_Latitude = "0", |
jk431j | 4:08979e323c6e | 62 | .GPS_Longitude = "0", |
jk431j | 4:08979e323c6e | 63 | .GPS_Altitude = "0", |
jk431j | 4:08979e323c6e | 64 | .GPS_Speed = "0", |
jk431j | 4:08979e323c6e | 65 | .GPS_Course = "0" |
jk431j | 4:08979e323c6e | 66 | }; |
jk431j | 4:08979e323c6e | 67 | |
jk431j | 4:08979e323c6e | 68 | //******************************************************************************************************************************************** |
jk431j | 4:08979e323c6e | 69 | //* Set the RGB LED's Color |
jk431j | 4:08979e323c6e | 70 | //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue) |
jk431j | 4:08979e323c6e | 71 | //******************************************************************************************************************************************** |
jk431j | 4:08979e323c6e | 72 | void SetLedColor(unsigned char ucColor) |
jk431j | 4:08979e323c6e | 73 | { |
jk431j | 4:08979e323c6e | 74 | //Note that when an LED is on, you write a 0 to it: |
jk431j | 4:08979e323c6e | 75 | led_red = !(ucColor & 0x1); //bit 0 |
jk431j | 4:08979e323c6e | 76 | led_green = !(ucColor & 0x2); //bit 1 |
jk431j | 4:08979e323c6e | 77 | led_blue = !(ucColor & 0x4); //bit 2 |
jk431j | 4:08979e323c6e | 78 | } //SetLedColor() |
jk431j | 4:08979e323c6e | 79 | |
JMF | 0:62feed0f1fd9 | 80 | |
jk431j | 4:08979e323c6e | 81 | bool ExecuteCommand(const char* Command) |
jk431j | 4:08979e323c6e | 82 | { |
jk431j | 4:08979e323c6e | 83 | char cLedColor = *Command; |
jk431j | 4:08979e323c6e | 84 | switch(cLedColor) |
jk431j | 4:08979e323c6e | 85 | { |
jk431j | 4:08979e323c6e | 86 | case 'O': |
jk431j | 4:08979e323c6e | 87 | { //Off |
jk431j | 4:08979e323c6e | 88 | SetLedColor(0); |
jk431j | 4:08979e323c6e | 89 | break; |
jk431j | 4:08979e323c6e | 90 | } |
jk431j | 4:08979e323c6e | 91 | case 'R': |
jk431j | 4:08979e323c6e | 92 | { //Red |
jk431j | 4:08979e323c6e | 93 | SetLedColor(1); |
jk431j | 4:08979e323c6e | 94 | break; |
jk431j | 4:08979e323c6e | 95 | } |
jk431j | 4:08979e323c6e | 96 | case 'G': |
jk431j | 4:08979e323c6e | 97 | { //Green |
jk431j | 4:08979e323c6e | 98 | SetLedColor(2); |
jk431j | 4:08979e323c6e | 99 | break; |
jk431j | 4:08979e323c6e | 100 | } |
jk431j | 4:08979e323c6e | 101 | case 'Y': |
jk431j | 4:08979e323c6e | 102 | { //Yellow |
jk431j | 4:08979e323c6e | 103 | SetLedColor(3); |
jk431j | 4:08979e323c6e | 104 | break; |
jk431j | 4:08979e323c6e | 105 | } |
jk431j | 4:08979e323c6e | 106 | case 'B': |
jk431j | 4:08979e323c6e | 107 | { //Blue |
jk431j | 4:08979e323c6e | 108 | SetLedColor(4); |
jk431j | 4:08979e323c6e | 109 | break; |
jk431j | 4:08979e323c6e | 110 | } |
jk431j | 4:08979e323c6e | 111 | case 'M': |
jk431j | 4:08979e323c6e | 112 | { //Magenta |
jk431j | 4:08979e323c6e | 113 | SetLedColor(5); |
jk431j | 4:08979e323c6e | 114 | break; |
jk431j | 4:08979e323c6e | 115 | } |
jk431j | 4:08979e323c6e | 116 | case 'T': |
jk431j | 4:08979e323c6e | 117 | { //Turquoise |
jk431j | 4:08979e323c6e | 118 | SetLedColor(6); |
jk431j | 4:08979e323c6e | 119 | break; |
jk431j | 4:08979e323c6e | 120 | } |
jk431j | 4:08979e323c6e | 121 | case 'W': |
jk431j | 4:08979e323c6e | 122 | { //White |
jk431j | 4:08979e323c6e | 123 | SetLedColor(7); |
jk431j | 4:08979e323c6e | 124 | break; |
jk431j | 4:08979e323c6e | 125 | } |
jk431j | 4:08979e323c6e | 126 | default: |
jk431j | 4:08979e323c6e | 127 | { |
jk431j | 4:08979e323c6e | 128 | return false; |
jk431j | 4:08979e323c6e | 129 | } |
jk431j | 4:08979e323c6e | 130 | } //switch(cLedColor) |
jk431j | 4:08979e323c6e | 131 | return true; |
JMF | 0:62feed0f1fd9 | 132 | } |
JMF | 0:62feed0f1fd9 | 133 | |
JMF | 0:62feed0f1fd9 | 134 | |
jk431j | 4:08979e323c6e | 135 | void on_data_point_found(const char* at, const char* value, int index, void* context, int type) { |
jk431j | 4:08979e323c6e | 136 | pc.printf(">>Found a data point, index: %d type: %d" CRLF, index, type); |
jk431j | 4:08979e323c6e | 137 | pc.printf(">>At: %s" CRLF " Value: %s" CRLF, at, value); |
jk431j | 4:08979e323c6e | 138 | } |
jk431j | 4:08979e323c6e | 139 | |
jk431j | 4:08979e323c6e | 140 | void on_fill_data(Print *print, void *context) { |
jk431j | 4:08979e323c6e | 141 | // no data to fill |
JMF | 0:62feed0f1fd9 | 142 | } |
JMF | 0:62feed0f1fd9 | 143 | |
jk431j | 4:08979e323c6e | 144 | void on_command_found(const char* id, const char* name, int index, void *context) { |
jk431j | 4:08979e323c6e | 145 | pc.printf(">>Found a command, index: %d" CRLF, index); |
jk431j | 4:08979e323c6e | 146 | pc.printf(">>ID: %s" CRLF ">>Name: %s" CRLF, id, name); |
jk431j | 4:08979e323c6e | 147 | ExecuteCommand(name); |
jk431j | 4:08979e323c6e | 148 | m2xClient.markCommandProcessed(deviceId, id, on_fill_data, NULL); |
jk431j | 4:08979e323c6e | 149 | pc.printf(">>Command confirmed" CRLF, id, name); |
JMF | 0:62feed0f1fd9 | 150 | } |
JMF | 0:62feed0f1fd9 | 151 | |
jk431j | 4:08979e323c6e | 152 | |
JMF | 0:62feed0f1fd9 | 153 | int main() { |
jk431j | 4:08979e323c6e | 154 | char timestamp[25]; |
jk431j | 4:08979e323c6e | 155 | int length = 25; |
jk431j | 4:08979e323c6e | 156 | int response; |
jk431j | 4:08979e323c6e | 157 | |
jk431j | 4:08979e323c6e | 158 | pc.baud(115200); |
jk431j | 4:08979e323c6e | 159 | pc.printf("M2X StarterKit demo: initializng the network" CRLF); |
jk431j | 4:08979e323c6e | 160 | response = eth.init(); |
jk431j | 4:08979e323c6e | 161 | pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response); |
jk431j | 4:08979e323c6e | 162 | if( !response ) { |
jk431j | 4:08979e323c6e | 163 | pc.printf(" - - - - - - - SYSTEM RESET - - - - - - - " CRLF); |
jk431j | 4:08979e323c6e | 164 | NVIC_SystemReset(); |
jk431j | 4:08979e323c6e | 165 | while(1); |
jk431j | 4:08979e323c6e | 166 | } |
JMF | 0:62feed0f1fd9 | 167 | |
jk431j | 4:08979e323c6e | 168 | response = eth.connect(); |
jk431j | 4:08979e323c6e | 169 | pc.printf("IP Address: %s " CRLF CRLF, eth.getIPAddress()); |
jk431j | 4:08979e323c6e | 170 | |
jk431j | 4:08979e323c6e | 171 | pc.printf("Initialize the sensors" CRLF); |
jk431j | 4:08979e323c6e | 172 | sensors_init(); |
jk431j | 4:08979e323c6e | 173 | read_sensors(); |
jk431j | 4:08979e323c6e | 174 | |
jk431j | 4:08979e323c6e | 175 | pc.printf(WHT "initialize the M2X time service" CRLF); |
jk431j | 4:08979e323c6e | 176 | if (!m2x_status_is_success(timeService.init())) |
jk431j | 4:08979e323c6e | 177 | pc.printf("Cannot initialize time service!" CRLF); |
jk431j | 4:08979e323c6e | 178 | else { |
jk431j | 4:08979e323c6e | 179 | timeService.getTimestamp(timestamp, &length); |
jk431j | 4:08979e323c6e | 180 | pc.printf("Current timestamp: %s" CRLF, timestamp); |
jk431j | 4:08979e323c6e | 181 | } |
jk431j | 4:08979e323c6e | 182 | |
jk431j | 4:08979e323c6e | 183 | pc.printf("Query for possible commands using this device..." CRLF); |
jk431j | 4:08979e323c6e | 184 | response = m2xClient.listCommands(deviceId, on_command_found, NULL, "status=pending"); |
jk431j | 4:08979e323c6e | 185 | pc.printf("listCommands response code: %d" CRLF, response); |
JMF | 0:62feed0f1fd9 | 186 | |
jk431j | 4:08979e323c6e | 187 | while (true) { |
jk431j | 4:08979e323c6e | 188 | // read sensor values |
jk431j | 4:08979e323c6e | 189 | read_sensors(); |
JMF | 0:62feed0f1fd9 | 190 | |
jk431j | 4:08979e323c6e | 191 | // post the humidity value |
jk431j | 4:08979e323c6e | 192 | pc.printf("Post updateStreamValue (humidity = %f)..." CRLF, SENSOR_DATA.fHumidity); |
jk431j | 4:08979e323c6e | 193 | response = m2xClient.updateStreamValue(deviceId, hstreamName, SENSOR_DATA.fHumidity); |
jk431j | 4:08979e323c6e | 194 | pc.printf("Post response code: %d" CRLF, response); |
jk431j | 4:08979e323c6e | 195 | |
jk431j | 4:08979e323c6e | 196 | // post the temp value |
jk431j | 4:08979e323c6e | 197 | pc.printf("Post updateStreamValue (temp = %f)..." CRLF, SENSOR_DATA.fTemperature); |
jk431j | 4:08979e323c6e | 198 | response = m2xClient.updateStreamValue(deviceId, tstreamName, SENSOR_DATA.fTemperature); |
jk431j | 4:08979e323c6e | 199 | pc.printf("Post response code: %d" CRLF, response); |
jk431j | 4:08979e323c6e | 200 | |
jk431j | 4:08979e323c6e | 201 | timeService.getTimestamp(timestamp, &length); |
jk431j | 4:08979e323c6e | 202 | pc.printf("%s waiting for 60 seconds... " CRLF CRLF CRLF, timestamp); |
jk431j | 4:08979e323c6e | 203 | |
jk431j | 4:08979e323c6e | 204 | for (short idx=0; idx < 6; idx++) { |
jk431j | 4:08979e323c6e | 205 | // wait 10 seconds |
jk431j | 4:08979e323c6e | 206 | delay(10 * 1000); |
JMF | 0:62feed0f1fd9 | 207 | |
jk431j | 4:08979e323c6e | 208 | // and then query fo commands |
jk431j | 4:08979e323c6e | 209 | pc.printf("Query for possible commands using this device..." CRLF); |
jk431j | 4:08979e323c6e | 210 | response = m2xClient.listCommands(deviceId, on_command_found, NULL, "status=pending"); |
jk431j | 4:08979e323c6e | 211 | pc.printf("listCommands response code: %d" CRLF, response); |
jk431j | 4:08979e323c6e | 212 | } |
JMF | 0:62feed0f1fd9 | 213 | |
jk431j | 4:08979e323c6e | 214 | } |
JMF | 0:62feed0f1fd9 | 215 | } |
JMF | 0:62feed0f1fd9 | 216 |