WIP. send a large constant string twice a second, in order to test out the transport with something indicative of our required load.

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

Fork of FXOS8700CQ_To_Azure_IoT by Mark Radbourne

Committer:
markrad
Date:
Fri Oct 14 21:16:25 2016 +0000
Revision:
0:6c46c366f500
Child:
1:0366fad6e60c
Original commit

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 0:6c46c366f500 25
markrad 0:6c46c366f500 26 #include "certs.h"
markrad 0:6c46c366f500 27
markrad 0:6c46c366f500 28 typedef struct EVENT_INSTANCE_TAG
markrad 0:6c46c366f500 29 {
markrad 0:6c46c366f500 30 IOTHUB_MESSAGE_HANDLE messageHandle;
markrad 0:6c46c366f500 31 int messageTrackingId; // For tracking the messages within the user callback.
markrad 0:6c46c366f500 32 } EVENT_INSTANCE;
markrad 0:6c46c366f500 33
markrad 0:6c46c366f500 34 int readingToJSON(char *buffer, int bufferlen, READING &reading)
markrad 0:6c46c366f500 35 {
markrad 0:6c46c366f500 36 static const char READING[] = "\"reading\"";
markrad 0:6c46c366f500 37 static const char ACCELEROMETER[] = "\"accelerometer\"";
markrad 0:6c46c366f500 38 static const char MAGNOMETER[] = "\"magnometer\"";
markrad 0:6c46c366f500 39 static const char X[] = "\"X\"";
markrad 0:6c46c366f500 40 static const char Y[] = "\"Y\"";
markrad 0:6c46c366f500 41 static const char Z[] = "\"Z\"";
markrad 0:6c46c366f500 42 static const char STARTOBJ[] = " : {\n";
markrad 0:6c46c366f500 43 static const char ENDOBJ[] = "}\n";
markrad 0:6c46c366f500 44 static const char PREPEND[] = "{\n";
markrad 0:6c46c366f500 45 static const int MINBUFFERLEN =
markrad 0:6c46c366f500 46 sizeof(READING) +
markrad 0:6c46c366f500 47 sizeof(ACCELEROMETER) +
markrad 0:6c46c366f500 48 sizeof(MAGNOMETER) +
markrad 0:6c46c366f500 49 2 * (sizeof(X) + sizeof(Y) + sizeof(Z)) +
markrad 0:6c46c366f500 50 3 * sizeof(STARTOBJ) +
markrad 0:6c46c366f500 51 4 * sizeof(ENDOBJ) +
markrad 0:6c46c366f500 52 sizeof(PREPEND) +
markrad 0:6c46c366f500 53 6 * 9;
markrad 0:6c46c366f500 54 static const char numConvert[] = "%d";
markrad 0:6c46c366f500 55
markrad 0:6c46c366f500 56 char toNum[10];
markrad 0:6c46c366f500 57 char work[MINBUFFERLEN + 1];
markrad 0:6c46c366f500 58
markrad 0:6c46c366f500 59 if (buffer == NULL)
markrad 0:6c46c366f500 60 return 0;
markrad 0:6c46c366f500 61
markrad 0:6c46c366f500 62 buffer[0] = '\0';
markrad 0:6c46c366f500 63
markrad 0:6c46c366f500 64 strcpy(work, PREPEND);
markrad 0:6c46c366f500 65 strcat(work, READING);
markrad 0:6c46c366f500 66 strcat(work, STARTOBJ);
markrad 0:6c46c366f500 67 strcat(work, ACCELEROMETER);
markrad 0:6c46c366f500 68 strcat(work, STARTOBJ);
markrad 0:6c46c366f500 69 strcat(work, X);
markrad 0:6c46c366f500 70 strcat(work, " : ");
markrad 0:6c46c366f500 71 sprintf(toNum, numConvert, reading.accelerometer.x);
markrad 0:6c46c366f500 72 strcat(work, toNum);
markrad 0:6c46c366f500 73 strcat(work, ",\n");
markrad 0:6c46c366f500 74 strcat(work, Y);
markrad 0:6c46c366f500 75 strcat(work, " : ");
markrad 0:6c46c366f500 76 sprintf(toNum, numConvert, reading.accelerometer.y);
markrad 0:6c46c366f500 77 strcat(work, toNum);
markrad 0:6c46c366f500 78 strcat(work, ",\n");
markrad 0:6c46c366f500 79 strcat(work, Z);
markrad 0:6c46c366f500 80 strcat(work, " : ");
markrad 0:6c46c366f500 81 sprintf(toNum, numConvert, reading.accelerometer.z);
markrad 0:6c46c366f500 82 strcat(work, toNum);
markrad 0:6c46c366f500 83 strcat(work, "\n");
markrad 0:6c46c366f500 84 strcat(work, ENDOBJ);
markrad 0:6c46c366f500 85 strcat(work, MAGNOMETER);
markrad 0:6c46c366f500 86 strcat(work, STARTOBJ);
markrad 0:6c46c366f500 87 strcat(work, X);
markrad 0:6c46c366f500 88 strcat(work, " : ");
markrad 0:6c46c366f500 89 sprintf(toNum, numConvert, reading.magnometer.x);
markrad 0:6c46c366f500 90 strcat(work, toNum);
markrad 0:6c46c366f500 91 strcat(work, ",\n");
markrad 0:6c46c366f500 92 strcat(work, Y);
markrad 0:6c46c366f500 93 strcat(work, " : ");
markrad 0:6c46c366f500 94 sprintf(toNum, numConvert, reading.magnometer.y);
markrad 0:6c46c366f500 95 strcat(work, toNum);
markrad 0:6c46c366f500 96 strcat(work, ",\n");
markrad 0:6c46c366f500 97 strcat(work, Z);
markrad 0:6c46c366f500 98 strcat(work, " : ");
markrad 0:6c46c366f500 99 sprintf(toNum, numConvert, reading.magnometer.z);
markrad 0:6c46c366f500 100 strcat(work, toNum);
markrad 0:6c46c366f500 101 strcat(work, "\n");
markrad 0:6c46c366f500 102 strcat(work, ENDOBJ);
markrad 0:6c46c366f500 103 strcat(work, ENDOBJ);
markrad 0:6c46c366f500 104 strcat(work, ENDOBJ);
markrad 0:6c46c366f500 105
markrad 0:6c46c366f500 106 if (strlen(work) + 1 < bufferlen)
markrad 0:6c46c366f500 107 strcpy(buffer, work);
markrad 0:6c46c366f500 108
markrad 0:6c46c366f500 109 return strlen(work);
markrad 0:6c46c366f500 110 }
markrad 0:6c46c366f500 111
markrad 0:6c46c366f500 112 static IOTHUBMESSAGE_DISPOSITION_RESULT ReceiveMessageCallback(IOTHUB_MESSAGE_HANDLE message, void* userContextCallback)
markrad 0:6c46c366f500 113 {
markrad 0:6c46c366f500 114 int* counter = (int*)userContextCallback;
markrad 0:6c46c366f500 115 const char* buffer;
markrad 0:6c46c366f500 116 size_t size;
markrad 0:6c46c366f500 117
markrad 0:6c46c366f500 118 if (IoTHubMessage_GetByteArray(message, (const unsigned char**)&buffer, &size) != IOTHUB_MESSAGE_OK)
markrad 0:6c46c366f500 119 {
markrad 0:6c46c366f500 120 (void)printf("unable to retrieve the message data\r\n");
markrad 0:6c46c366f500 121 }
markrad 0:6c46c366f500 122 else
markrad 0:6c46c366f500 123 {
markrad 0:6c46c366f500 124 (void)printf("Received Message [%d] with Data: <<<%.*s>>> & Size=%d\r\n", *counter, (int)size, buffer, (int)size);
markrad 0:6c46c366f500 125 }
markrad 0:6c46c366f500 126
markrad 0:6c46c366f500 127 // Some device specific action code goes here...
markrad 0:6c46c366f500 128 (*counter)++;
markrad 0:6c46c366f500 129
markrad 0:6c46c366f500 130 return IOTHUBMESSAGE_ACCEPTED;
markrad 0:6c46c366f500 131 }
markrad 0:6c46c366f500 132
markrad 0:6c46c366f500 133 static void SendConfirmationCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback)
markrad 0:6c46c366f500 134 {
markrad 0:6c46c366f500 135 EVENT_INSTANCE* eventInstance = (EVENT_INSTANCE*)userContextCallback;
markrad 0:6c46c366f500 136
markrad 0:6c46c366f500 137 (void)printf("Confirmation received for message tracking id = %d with result = %s\r\n",
markrad 0:6c46c366f500 138 eventInstance->messageTrackingId, ENUM_TO_STRING(IOTHUB_CLIENT_CONFIRMATION_RESULT, result));
markrad 0:6c46c366f500 139
markrad 0:6c46c366f500 140 /* Some device specific action code goes here... */
markrad 0:6c46c366f500 141 //callbackCounter++;
markrad 0:6c46c366f500 142
markrad 0:6c46c366f500 143 IoTHubMessage_Destroy(eventInstance->messageHandle);
markrad 0:6c46c366f500 144 free(eventInstance);
markrad 0:6c46c366f500 145 }
markrad 0:6c46c366f500 146
markrad 0:6c46c366f500 147 void stall(Serial &pc, char *message)
markrad 0:6c46c366f500 148 {
markrad 0:6c46c366f500 149 printf(message);
markrad 0:6c46c366f500 150 printf("stalled ");
markrad 0:6c46c366f500 151
markrad 0:6c46c366f500 152 while(true) {
markrad 0:6c46c366f500 153 pc.putc('.'); // idle dots
markrad 0:6c46c366f500 154 wait(1.0);
markrad 0:6c46c366f500 155 }
markrad 0:6c46c366f500 156 }
markrad 0:6c46c366f500 157
markrad 0:6c46c366f500 158 int main()
markrad 0:6c46c366f500 159 {
markrad 0:6c46c366f500 160 const char *connectionString = "Your Azure IoT Hub connection string here";
markrad 0:6c46c366f500 161
markrad 0:6c46c366f500 162 READING reading;
markrad 0:6c46c366f500 163 Serial pc(USBTX, USBRX); // Primary output to demonstrate library
markrad 0:6c46c366f500 164 SingletonFXOS8700CQ &sfxos = SingletonFXOS8700CQ::getInstance();
markrad 0:6c46c366f500 165 IOTHUB_CLIENT_HANDLE iotHubClientHandle;
markrad 0:6c46c366f500 166 int receiveContext = 0;
markrad 0:6c46c366f500 167 int transmitCounter = 0;
markrad 0:6c46c366f500 168
markrad 0:6c46c366f500 169 pc.baud(115200); // Print quickly! 200Hz x line of output data!
markrad 0:6c46c366f500 170
markrad 0:6c46c366f500 171 printf("\n\nFXOS8700CQ identity = %X\n", sfxos.getWhoAmI());
markrad 0:6c46c366f500 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 0:6c46c366f500 184 //bool traceOn = false;
markrad 0:6c46c366f500 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 0:6c46c366f500 196 int LOOPCOUNT = 100; // Set to -1 to run forever
markrad 0:6c46c366f500 197
markrad 0:6c46c366f500 198 char buffer[200];
markrad 0:6c46c366f500 199
markrad 0:6c46c366f500 200 while (LOOPCOUNT)
markrad 0:6c46c366f500 201 {
markrad 0:6c46c366f500 202 if (sfxos.getInt2Triggered())
markrad 0:6c46c366f500 203 {
markrad 0:6c46c366f500 204 sfxos.setInt2Triggered(false);
markrad 0:6c46c366f500 205 sfxos.getData(reading);
markrad 0:6c46c366f500 206 rc = readingToJSON(buffer, sizeof(buffer), reading);
markrad 0:6c46c366f500 207
markrad 0:6c46c366f500 208 if (rc > sizeof(buffer))
markrad 0:6c46c366f500 209 printf("ERROR: JSON buffer too small - require %d characters\n", rc);
markrad 0:6c46c366f500 210
markrad 0:6c46c366f500 211 //printf(buffer);
markrad 0:6c46c366f500 212
markrad 0:6c46c366f500 213 EVENT_INSTANCE* message = (EVENT_INSTANCE*)malloc(sizeof(EVENT_INSTANCE));
markrad 0:6c46c366f500 214
markrad 0:6c46c366f500 215 if (message == NULL)
markrad 0:6c46c366f500 216 {
markrad 0:6c46c366f500 217 (void)printf("ERROR: Unable to allocate EVENT_INSTANCE!\r\n");
markrad 0:6c46c366f500 218 }
markrad 0:6c46c366f500 219 else
markrad 0:6c46c366f500 220 {
markrad 0:6c46c366f500 221 if ((message->messageHandle = 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 0:6c46c366f500 227 message->messageTrackingId = transmitCounter;
markrad 0:6c46c366f500 228
markrad 0:6c46c366f500 229 if (IoTHubClient_SendEventAsync(iotHubClientHandle, message->messageHandle, SendConfirmationCallback, message) != IOTHUB_CLIENT_OK)
markrad 0:6c46c366f500 230 {
markrad 0:6c46c366f500 231 (void)printf("ERROR: IoTHubClient_LL_SendEventAsync..........FAILED!\r\n");
markrad 0:6c46c366f500 232 }
markrad 0:6c46c366f500 233 else
markrad 0:6c46c366f500 234 {
markrad 0:6c46c366f500 235 (void)printf("IoTHubClient_LL_SendEventAsync accepted message [%d] for transmission to IoT Hub.\r\n", (int)transmitCounter);
markrad 0:6c46c366f500 236 }
markrad 0:6c46c366f500 237
markrad 0:6c46c366f500 238 transmitCounter++;
markrad 0:6c46c366f500 239 }
markrad 0:6c46c366f500 240 }
markrad 0:6c46c366f500 241
markrad 0:6c46c366f500 242 LOOPCOUNT--;
markrad 0:6c46c366f500 243 }
markrad 0:6c46c366f500 244
markrad 0:6c46c366f500 245 wait_ms(500);
markrad 0:6c46c366f500 246 }
markrad 0:6c46c366f500 247
markrad 0:6c46c366f500 248 printf("Loop complete - clean up\n");
markrad 0:6c46c366f500 249
markrad 0:6c46c366f500 250 IoTHubClient_Destroy(iotHubClientHandle);
markrad 0:6c46c366f500 251
markrad 0:6c46c366f500 252 platform_deinit();
markrad 0:6c46c366f500 253
markrad 0:6c46c366f500 254 printf("Test complete\n");
markrad 0:6c46c366f500 255
markrad 0:6c46c366f500 256
markrad 0:6c46c366f500 257 while(true) {
markrad 0:6c46c366f500 258 pc.putc('.'); // idle dots
markrad 0:6c46c366f500 259 wait(1.0);
markrad 0:6c46c366f500 260 }
markrad 0:6c46c366f500 261 }