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 Avnet

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?

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"
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