Simple sample that demonstrates reading the FXOS8700CQ accelerometer, convert the data to JSON and send to an Azure IoT Hub.

Dependencies:   azure_umqtt_c iothub_mqtt_transport mbed-rtos mbed wolfSSL Socket lwip-eth lwip-sys lwip

Committer:
markrad
Date:
Thu Oct 27 22:44:50 2016 +0000
Revision:
2:2b9acda15ef0
Parent:
1:0366fad6e60c
Child:
3:c0556ff7b8e3
Prevent further messages being generated if there are more than two in the queue waiting to be sent.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markrad 0:6c46c366f500 1 // Copyright (c) Microsoft. All rights reserved.
markrad 0:6c46c366f500 2 // Licensed under the MIT license. See LICENSE file at https://github.com/Azure/azure-iot-sdks/blob/master/LICENSE for full license information.
markrad 0:6c46c366f500 3
markrad 0:6c46c366f500 4 /* -------------------------------------------------------------------------- *\
markrad 0:6c46c366f500 5
markrad 0:6c46c366f500 6 Simple progam to demonstrate reading the FRDM-K64F FXOS8700CQ
markrad 0:6c46c366f500 7 accelerometer, convert the data to JSON and send to an Azure IoT Hub. You
markrad 0:6c46c366f500 8 must provide your hub's connection string in the variable
markrad 0:6c46c366f500 9 'connectionString'.
markrad 0:6c46c366f500 10
markrad 0:6c46c366f500 11 markrad
markrad 0:6c46c366f500 12
markrad 0:6c46c366f500 13 \* -------------------------------------------------------------------------- */
markrad 0:6c46c366f500 14
markrad 0:6c46c366f500 15 #include <string.h>
markrad 0:6c46c366f500 16
markrad 0:6c46c366f500 17 #include "SingletonFXOS8700CQ.h"
markrad 0:6c46c366f500 18
markrad 0:6c46c366f500 19 #include "iothub_client.h"
markrad 0:6c46c366f500 20 #include "iothub_message.h"
markrad 0:6c46c366f500 21 #include "azure_c_shared_utility/threadapi.h"
markrad 0:6c46c366f500 22 #include "azure_c_shared_utility/crt_abstractions.h"
markrad 0:6c46c366f500 23 #include "azure_c_shared_utility/platform.h"
markrad 0:6c46c366f500 24 #include "iothubtransportmqtt.h"
markrad 2:2b9acda15ef0 25 #include "lock.h"
markrad 0:6c46c366f500 26
markrad 0:6c46c366f500 27 #include "certs.h"
markrad 0:6c46c366f500 28
markrad 0:6c46c366f500 29 int readingToJSON(char *buffer, int bufferlen, READING &reading)
markrad 0:6c46c366f500 30 {
markrad 0:6c46c366f500 31 static const char READING[] = "\"reading\"";
markrad 0:6c46c366f500 32 static const char ACCELEROMETER[] = "\"accelerometer\"";
markrad 0:6c46c366f500 33 static const char MAGNOMETER[] = "\"magnometer\"";
markrad 0:6c46c366f500 34 static const char X[] = "\"X\"";
markrad 0:6c46c366f500 35 static const char Y[] = "\"Y\"";
markrad 0:6c46c366f500 36 static const char Z[] = "\"Z\"";
markrad 0:6c46c366f500 37 static const char STARTOBJ[] = " : {\n";
markrad 0:6c46c366f500 38 static const char ENDOBJ[] = "}\n";
markrad 0:6c46c366f500 39 static const char PREPEND[] = "{\n";
markrad 0:6c46c366f500 40 static const int MINBUFFERLEN =
markrad 0:6c46c366f500 41 sizeof(READING) +
markrad 0:6c46c366f500 42 sizeof(ACCELEROMETER) +
markrad 0:6c46c366f500 43 sizeof(MAGNOMETER) +
markrad 0:6c46c366f500 44 2 * (sizeof(X) + sizeof(Y) + sizeof(Z)) +
markrad 0:6c46c366f500 45 3 * sizeof(STARTOBJ) +
markrad 0:6c46c366f500 46 4 * sizeof(ENDOBJ) +
markrad 0:6c46c366f500 47 sizeof(PREPEND) +
markrad 0:6c46c366f500 48 6 * 9;
markrad 0:6c46c366f500 49 static const char numConvert[] = "%d";
markrad 0:6c46c366f500 50
markrad 0:6c46c366f500 51 char toNum[10];
markrad 0:6c46c366f500 52 char work[MINBUFFERLEN + 1];
markrad 0:6c46c366f500 53
markrad 0:6c46c366f500 54 if (buffer == NULL)
markrad 0:6c46c366f500 55 return 0;
markrad 0:6c46c366f500 56
markrad 0:6c46c366f500 57 buffer[0] = '\0';
markrad 0:6c46c366f500 58
markrad 0:6c46c366f500 59 strcpy(work, PREPEND);
markrad 0:6c46c366f500 60 strcat(work, READING);
markrad 0:6c46c366f500 61 strcat(work, STARTOBJ);
markrad 0:6c46c366f500 62 strcat(work, ACCELEROMETER);
markrad 0:6c46c366f500 63 strcat(work, STARTOBJ);
markrad 0:6c46c366f500 64 strcat(work, X);
markrad 0:6c46c366f500 65 strcat(work, " : ");
markrad 0:6c46c366f500 66 sprintf(toNum, numConvert, reading.accelerometer.x);
markrad 0:6c46c366f500 67 strcat(work, toNum);
markrad 0:6c46c366f500 68 strcat(work, ",\n");
markrad 0:6c46c366f500 69 strcat(work, Y);
markrad 0:6c46c366f500 70 strcat(work, " : ");
markrad 0:6c46c366f500 71 sprintf(toNum, numConvert, reading.accelerometer.y);
markrad 0:6c46c366f500 72 strcat(work, toNum);
markrad 0:6c46c366f500 73 strcat(work, ",\n");
markrad 0:6c46c366f500 74 strcat(work, Z);
markrad 0:6c46c366f500 75 strcat(work, " : ");
markrad 0:6c46c366f500 76 sprintf(toNum, numConvert, reading.accelerometer.z);
markrad 0:6c46c366f500 77 strcat(work, toNum);
markrad 0:6c46c366f500 78 strcat(work, "\n");
markrad 0:6c46c366f500 79 strcat(work, ENDOBJ);
markrad 0:6c46c366f500 80 strcat(work, MAGNOMETER);
markrad 0:6c46c366f500 81 strcat(work, STARTOBJ);
markrad 0:6c46c366f500 82 strcat(work, X);
markrad 0:6c46c366f500 83 strcat(work, " : ");
markrad 0:6c46c366f500 84 sprintf(toNum, numConvert, reading.magnometer.x);
markrad 0:6c46c366f500 85 strcat(work, toNum);
markrad 0:6c46c366f500 86 strcat(work, ",\n");
markrad 0:6c46c366f500 87 strcat(work, Y);
markrad 0:6c46c366f500 88 strcat(work, " : ");
markrad 0:6c46c366f500 89 sprintf(toNum, numConvert, reading.magnometer.y);
markrad 0:6c46c366f500 90 strcat(work, toNum);
markrad 0:6c46c366f500 91 strcat(work, ",\n");
markrad 0:6c46c366f500 92 strcat(work, Z);
markrad 0:6c46c366f500 93 strcat(work, " : ");
markrad 0:6c46c366f500 94 sprintf(toNum, numConvert, reading.magnometer.z);
markrad 0:6c46c366f500 95 strcat(work, toNum);
markrad 0:6c46c366f500 96 strcat(work, "\n");
markrad 0:6c46c366f500 97 strcat(work, ENDOBJ);
markrad 0:6c46c366f500 98 strcat(work, ENDOBJ);
markrad 0:6c46c366f500 99 strcat(work, ENDOBJ);
markrad 0:6c46c366f500 100
markrad 0:6c46c366f500 101 if (strlen(work) + 1 < bufferlen)
markrad 0:6c46c366f500 102 strcpy(buffer, work);
markrad 0:6c46c366f500 103
markrad 0:6c46c366f500 104 return strlen(work);
markrad 0:6c46c366f500 105 }
markrad 0:6c46c366f500 106
markrad 2:2b9acda15ef0 107 static LOCK_HANDLE msgLock;
markrad 2:2b9acda15ef0 108 static int msgCount = 0;
markrad 2:2b9acda15ef0 109
markrad 0:6c46c366f500 110 static IOTHUBMESSAGE_DISPOSITION_RESULT ReceiveMessageCallback(IOTHUB_MESSAGE_HANDLE message, void* userContextCallback)
markrad 0:6c46c366f500 111 {
markrad 0:6c46c366f500 112 int* counter = (int*)userContextCallback;
markrad 0:6c46c366f500 113 const char* buffer;
markrad 0:6c46c366f500 114 size_t size;
markrad 0:6c46c366f500 115
markrad 0:6c46c366f500 116 if (IoTHubMessage_GetByteArray(message, (const unsigned char**)&buffer, &size) != IOTHUB_MESSAGE_OK)
markrad 0:6c46c366f500 117 {
markrad 0:6c46c366f500 118 (void)printf("unable to retrieve the message data\r\n");
markrad 0:6c46c366f500 119 }
markrad 0:6c46c366f500 120 else
markrad 0:6c46c366f500 121 {
markrad 0:6c46c366f500 122 (void)printf("Received Message [%d] with Data: <<<%.*s>>> & Size=%d\r\n", *counter, (int)size, buffer, (int)size);
markrad 0:6c46c366f500 123 }
markrad 0:6c46c366f500 124
markrad 0:6c46c366f500 125 // Some device specific action code goes here...
markrad 0:6c46c366f500 126 (*counter)++;
markrad 0:6c46c366f500 127
markrad 0:6c46c366f500 128 return IOTHUBMESSAGE_ACCEPTED;
markrad 0:6c46c366f500 129 }
markrad 0:6c46c366f500 130
markrad 0:6c46c366f500 131 static void SendConfirmationCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback)
markrad 0:6c46c366f500 132 {
markrad 2:2b9acda15ef0 133 int* messageTrackingId = (int*)userContextCallback;
markrad 0:6c46c366f500 134
markrad 0:6c46c366f500 135 (void)printf("Confirmation received for message tracking id = %d with result = %s\r\n",
markrad 2:2b9acda15ef0 136 *messageTrackingId, ENUM_TO_STRING(IOTHUB_CLIENT_CONFIRMATION_RESULT, result));
markrad 0:6c46c366f500 137
markrad 2:2b9acda15ef0 138 free(userContextCallback);
markrad 2:2b9acda15ef0 139 Lock(msgLock);
markrad 2:2b9acda15ef0 140 msgCount--;
markrad 2:2b9acda15ef0 141 Unlock(msgLock);
markrad 2:2b9acda15ef0 142
markrad 0:6c46c366f500 143 }
markrad 0:6c46c366f500 144
markrad 0:6c46c366f500 145 void stall(Serial &pc, char *message)
markrad 0:6c46c366f500 146 {
markrad 0:6c46c366f500 147 printf(message);
markrad 0:6c46c366f500 148 printf("stalled ");
markrad 0:6c46c366f500 149
markrad 0:6c46c366f500 150 while(true) {
markrad 0:6c46c366f500 151 pc.putc('.'); // idle dots
markrad 0:6c46c366f500 152 wait(1.0);
markrad 0:6c46c366f500 153 }
markrad 0:6c46c366f500 154 }
markrad 0:6c46c366f500 155
markrad 0:6c46c366f500 156 int main()
markrad 0:6c46c366f500 157 {
markrad 2:2b9acda15ef0 158 const char *connectionString = "HostName=MarkRadML.azure-devices.net;DeviceId=MBEDTest;SharedAccessKey=rgxlnR0rIBW4vnnnDkrbAv+mSOc/Mt60mg1CEjLx7pY=";
markrad 0:6c46c366f500 159
markrad 0:6c46c366f500 160 READING reading;
markrad 0:6c46c366f500 161 Serial pc(USBTX, USBRX); // Primary output to demonstrate library
markrad 0:6c46c366f500 162 SingletonFXOS8700CQ &sfxos = SingletonFXOS8700CQ::getInstance();
markrad 0:6c46c366f500 163 IOTHUB_CLIENT_HANDLE iotHubClientHandle;
markrad 0:6c46c366f500 164 int receiveContext = 0;
markrad 0:6c46c366f500 165 int transmitCounter = 0;
markrad 2:2b9acda15ef0 166
markrad 0:6c46c366f500 167 pc.baud(115200); // Print quickly! 200Hz x line of output data!
markrad 0:6c46c366f500 168
markrad 0:6c46c366f500 169 printf("\n\nFXOS8700CQ identity = %X\n", sfxos.getWhoAmI());
markrad 0:6c46c366f500 170
markrad 2:2b9acda15ef0 171 msgLock = Lock_Init(); // TODO: Check error code
markrad 2:2b9acda15ef0 172
markrad 0:6c46c366f500 173 sfxos.enable();
markrad 0:6c46c366f500 174 sfxos.getData(reading);
markrad 0:6c46c366f500 175
markrad 0:6c46c366f500 176 int rc;
markrad 0:6c46c366f500 177
markrad 0:6c46c366f500 178 if (platform_init() != 0)
markrad 0:6c46c366f500 179 stall(pc, "Failed to initialize platform\n");
markrad 0:6c46c366f500 180
markrad 0:6c46c366f500 181 if ((iotHubClientHandle = IoTHubClient_CreateFromConnectionString(connectionString, MQTT_Protocol)) == NULL)
markrad 0:6c46c366f500 182 stall(pc, "ERROR: Could not create iotHubClientHandle\n");
markrad 0:6c46c366f500 183
markrad 1:0366fad6e60c 184 bool traceOn = false;
markrad 1:0366fad6e60c 185 //bool traceOn = true;
markrad 0:6c46c366f500 186
markrad 0:6c46c366f500 187 IoTHubClient_SetOption(iotHubClientHandle, "logtrace", &traceOn);
markrad 0:6c46c366f500 188
markrad 0:6c46c366f500 189 // For mbed add the certificate information
markrad 0:6c46c366f500 190 if (IoTHubClient_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK)
markrad 0:6c46c366f500 191 stall(pc, "ERROR: failure to set option \"TrustedCerts\"\n");
markrad 0:6c46c366f500 192
markrad 0:6c46c366f500 193 if (IoTHubClient_SetMessageCallback(iotHubClientHandle, ReceiveMessageCallback, &receiveContext) != IOTHUB_CLIENT_OK)
markrad 0:6c46c366f500 194 stall(pc, "ERROR: IoTHubClient_SetMessageCallback failed\r\n");
markrad 0:6c46c366f500 195
markrad 1:0366fad6e60c 196 int LOOPCOUNT = -1; // Set to -1 to run forever
markrad 0:6c46c366f500 197
markrad 2:2b9acda15ef0 198 int localMsgCount;
markrad 2:2b9acda15ef0 199 int *userContext;
markrad 2:2b9acda15ef0 200 IOTHUB_MESSAGE_HANDLE msgHandle;
markrad 2:2b9acda15ef0 201
markrad 0:6c46c366f500 202 char buffer[200];
markrad 0:6c46c366f500 203
markrad 0:6c46c366f500 204 while (LOOPCOUNT)
markrad 0:6c46c366f500 205 {
markrad 0:6c46c366f500 206 if (sfxos.getInt2Triggered())
markrad 0:6c46c366f500 207 {
markrad 0:6c46c366f500 208 sfxos.setInt2Triggered(false);
markrad 0:6c46c366f500 209 sfxos.getData(reading);
markrad 0:6c46c366f500 210 rc = readingToJSON(buffer, sizeof(buffer), reading);
markrad 0:6c46c366f500 211
markrad 0:6c46c366f500 212 if (rc > sizeof(buffer))
markrad 0:6c46c366f500 213 printf("ERROR: JSON buffer too small - require %d characters\n", rc);
markrad 0:6c46c366f500 214
markrad 2:2b9acda15ef0 215 Lock(msgLock);
markrad 2:2b9acda15ef0 216 localMsgCount = msgCount;
markrad 2:2b9acda15ef0 217 Unlock(msgLock);
markrad 0:6c46c366f500 218
markrad 2:2b9acda15ef0 219 if (localMsgCount < 2)
markrad 0:6c46c366f500 220 {
markrad 2:2b9acda15ef0 221 if ((msgHandle = IoTHubMessage_CreateFromByteArray((const unsigned char*)buffer, rc)) == NULL)
markrad 0:6c46c366f500 222 {
markrad 0:6c46c366f500 223 (void)printf("ERROR: iotHubMessageHandle is NULL!\r\n");
markrad 0:6c46c366f500 224 }
markrad 0:6c46c366f500 225 else
markrad 0:6c46c366f500 226 {
markrad 2:2b9acda15ef0 227 userContext = (int *) malloc(sizeof(userContext));
markrad 2:2b9acda15ef0 228
markrad 2:2b9acda15ef0 229 if (userContext != NULL)
markrad 0:6c46c366f500 230 {
markrad 2:2b9acda15ef0 231 *userContext = transmitCounter;
markrad 2:2b9acda15ef0 232
markrad 2:2b9acda15ef0 233 if (IoTHubClient_SendEventAsync(iotHubClientHandle, msgHandle, SendConfirmationCallback, userContext) != IOTHUB_CLIENT_OK)
markrad 2:2b9acda15ef0 234 {
markrad 2:2b9acda15ef0 235 (void)printf("ERROR: IoTHubClient_LL_SendEventAsync..........FAILED!\r\n");
markrad 2:2b9acda15ef0 236 }
markrad 2:2b9acda15ef0 237 else
markrad 2:2b9acda15ef0 238 {
markrad 2:2b9acda15ef0 239 (void)printf("IoTHubClient_LL_SendEventAsync accepted message [%d] for transmission to IoT Hub.\r\n", (int)transmitCounter);
markrad 2:2b9acda15ef0 240 }
markrad 2:2b9acda15ef0 241
markrad 2:2b9acda15ef0 242 IoTHubMessage_Destroy(msgHandle);
markrad 2:2b9acda15ef0 243 Lock(msgLock);
markrad 2:2b9acda15ef0 244 msgCount++;
markrad 2:2b9acda15ef0 245 Unlock(msgLock);
markrad 2:2b9acda15ef0 246
markrad 2:2b9acda15ef0 247 transmitCounter++;
markrad 0:6c46c366f500 248 }
markrad 0:6c46c366f500 249 else
markrad 0:6c46c366f500 250 {
markrad 2:2b9acda15ef0 251 (void)printf("ERROR: malloc - unable to allocate user context\r\n");
markrad 0:6c46c366f500 252 }
markrad 0:6c46c366f500 253 }
markrad 0:6c46c366f500 254 }
markrad 2:2b9acda15ef0 255 else
markrad 2:2b9acda15ef0 256 {
markrad 2:2b9acda15ef0 257 (void)printf("Message dropped queue length %d\r\n", localMsgCount);
markrad 2:2b9acda15ef0 258 }
markrad 0:6c46c366f500 259
markrad 0:6c46c366f500 260 LOOPCOUNT--;
markrad 0:6c46c366f500 261 }
markrad 0:6c46c366f500 262
markrad 0:6c46c366f500 263 wait_ms(500);
markrad 0:6c46c366f500 264 }
markrad 0:6c46c366f500 265
markrad 0:6c46c366f500 266 printf("Loop complete - clean up\n");
markrad 0:6c46c366f500 267
markrad 0:6c46c366f500 268 IoTHubClient_Destroy(iotHubClientHandle);
markrad 0:6c46c366f500 269
markrad 2:2b9acda15ef0 270 Lock_Deinit(msgLock);
markrad 2:2b9acda15ef0 271
markrad 0:6c46c366f500 272 platform_deinit();
markrad 0:6c46c366f500 273
markrad 0:6c46c366f500 274 printf("Test complete\n");
markrad 0:6c46c366f500 275
markrad 0:6c46c366f500 276
markrad 0:6c46c366f500 277 while(true) {
markrad 0:6c46c366f500 278 pc.putc('.'); // idle dots
markrad 0:6c46c366f500 279 wait(1.0);
markrad 0:6c46c366f500 280 }
markrad 0:6c46c366f500 281 }