| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- // Copyright (c) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE file in the project root for full license information.
- // CAVEAT: This sample is to demonstrate azure IoT client concepts only and is not a guide design principles or style
- // Checking of return codes and error values shall be omitted for brevity. Please practice sound engineering practices
- // when writing production code.
- #include <stdio.h>
- #include <stdlib.h>
- #include "iothub.h"
- #include "iothub_device_client_ll.h"
- #include "iothub_client_options.h"
- #include "iothub_message.h"
- #include "azure_c_shared_utility/threadapi.h"
- #include "azure_c_shared_utility/crt_abstractions.h"
- #include "azure_c_shared_utility/shared_util_options.h"
- #include <rtthread.h>
- #ifdef FINSH_USING_MSH
- #include <finsh.h>
- #endif
- #ifdef SET_TRUSTED_CERT_IN_SAMPLES
- #include "certs/certs.h"
- #endif // SET_TRUSTED_CERT_IN_SAMPLES
- /* This sample uses the _LL APIs of iothub_client for example purposes.
- Simply changing the using the convenience layer (functions not having _LL)
- and removing calls to _DoWork will yield the same results. */
- // The protocol you wish to use should be uncommented
- //
- #ifdef PKG_USING_AZURE_MQTT_PROTOCOL
- #define SAMPLE_MQTT
- #endif
- #ifdef PKG_USING_AZURE_HTTP_PROTOCOL
- #define SAMPLE_HTTP
- #endif
- //#define SAMPLE_MQTT_OVER_WEBSOCKETS
- //#define SAMPLE_AMQP
- //#define SAMPLE_AMQP_OVER_WEBSOCKETS
- #ifdef SAMPLE_MQTT
- #include "iothubtransportmqtt.h"
- #endif // SAMPLE_MQTT
- #ifdef SAMPLE_MQTT_OVER_WEBSOCKETS
- #include "iothubtransportmqtt_websockets.h"
- #endif // SAMPLE_MQTT_OVER_WEBSOCKETS
- #ifdef SAMPLE_AMQP
- #include "iothubtransportamqp.h"
- #endif // SAMPLE_AMQP
- #ifdef SAMPLE_AMQP_OVER_WEBSOCKETS
- #include "iothubtransportamqp_websockets.h"
- #endif // SAMPLE_AMQP_OVER_WEBSOCKETS
- #ifdef SAMPLE_HTTP
- #include "iothubtransporthttp.h"
- #endif // SAMPLE_HTTP
- /* Paste in the your iothub connection string */
- static const char* connectionString ="Your device connection string copied from the device explorer";
- #define MESSAGE_COUNT 5
- static bool g_continueRunning = true;
- static size_t g_message_count_send_confirmations = 0;
- static void send_confirm_callback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback)
- {
- (void)userContextCallback;
- // When a message is sent this callback will get envoked
- g_message_count_send_confirmations++;
- (void)printf("Confirmation callback received for message %zu with result %s\r\n", g_message_count_send_confirmations, ENUM_TO_STRING(IOTHUB_CLIENT_CONFIRMATION_RESULT, result));
- }
- static void connection_status_callback(IOTHUB_CLIENT_CONNECTION_STATUS result, IOTHUB_CLIENT_CONNECTION_STATUS_REASON reason, void* user_context)
- {
- (void)reason;
- (void)user_context;
- // This sample DOES NOT take into consideration network outages.
- if (result == IOTHUB_CLIENT_CONNECTION_AUTHENTICATED)
- {
- (void)printf("The device client is connected to iothub\r\n");
- }
- else
- {
- (void)printf("The device client has been disconnected\r\n");
- }
- }
- void azure_iothub_ll_telemetry_sample(void *parameter)
- {
- IOTHUB_CLIENT_TRANSPORT_PROVIDER protocol;
- IOTHUB_MESSAGE_HANDLE message_handle;
- size_t messages_sent = 0;
- const char* telemetry_msg = "test_message";
- // Select the Protocol to use with the connection
- #ifdef SAMPLE_MQTT
- protocol = MQTT_Protocol;
- #endif // SAMPLE_MQTT
- #ifdef SAMPLE_MQTT_OVER_WEBSOCKETS
- protocol = MQTT_WebSocket_Protocol;
- #endif // SAMPLE_MQTT_OVER_WEBSOCKETS
- #ifdef SAMPLE_AMQP
- protocol = AMQP_Protocol;
- #endif // SAMPLE_AMQP
- #ifdef SAMPLE_AMQP_OVER_WEBSOCKETS
- protocol = AMQP_Protocol_over_WebSocketsTls;
- #endif // SAMPLE_AMQP_OVER_WEBSOCKETS
- #ifdef SAMPLE_HTTP
- protocol = HTTP_Protocol;
- #endif // SAMPLE_HTTP
- // Used to initialize IoTHub SDK subsystem
- (void)IoTHub_Init();
- IOTHUB_DEVICE_CLIENT_LL_HANDLE device_ll_handle;
- (void)rt_kprintf("Creating IoTHub Device handle\r\n");
- // Create the iothub handle here
- device_ll_handle = IoTHubDeviceClient_LL_CreateFromConnectionString(connectionString, protocol);
- if (device_ll_handle == NULL)
- {
- (void)rt_kprintf("Failure createing Iothub device. Hint: Check you connection string.\r\n");
- }
- else
- {
- // Set any option that are neccessary.
- // For available options please see the iothub_sdk_options.md documentation
- #ifndef SAMPLE_HTTP
- bool traceOn = true;
- IoTHubDeviceClient_LL_SetOption(device_ll_handle, OPTION_LOG_TRACE, &traceOn);
- #endif
- #ifdef SET_TRUSTED_CERT_IN_SAMPLES
- // Setting the Trusted Certificate. This is only necessary on system with without
- // built in certificate stores.
- IoTHubDeviceClient_LL_SetOption(device_ll_handle, OPTION_TRUSTED_CERT, certificates);
- #endif // SET_TRUSTED_CERT_IN_SAMPLES
- #if defined SAMPLE_MQTT || defined SAMPLE_MQTT_WS
- //Setting the auto URL Encoder (recommended for MQTT). Please use this option unless
- //you are URL Encoding inputs yourself.
- //ONLY valid for use with MQTT
- // bool urlEncodeOn = true;
- // IoTHubDeviceClient_LL_SetOption(device_ll_handle, OPTION_AUTO_URL_ENCODE_DECODE, &urlEncodeOn);
-
- // bool keep_alive = true;
- // IoTHubDeviceClient_LL_SetOption(device_ll_handle, OPTION_KEEP_ALIVE, &keep_alive);
- #endif
- // Setting connection status callback to get indication of connection to iothub
- (void)IoTHubDeviceClient_LL_SetConnectionStatusCallback(device_ll_handle, connection_status_callback, NULL);
- do
- {
- if (messages_sent < MESSAGE_COUNT)
- {
- // Construct the iothub message from a string or a byte array
- message_handle = IoTHubMessage_CreateFromString(telemetry_msg);
- //message_handle = IoTHubMessage_CreateFromByteArray((const unsigned char*)msgText, strlen(msgText)));
- // Set Message property
- /*(void)IoTHubMessage_SetMessageId(message_handle, "MSG_ID");
- (void)IoTHubMessage_SetCorrelationId(message_handle, "CORE_ID");
- (void)IoTHubMessage_SetContentTypeSystemProperty(message_handle, "application%2fjson");
- (void)IoTHubMessage_SetContentEncodingSystemProperty(message_handle, "utf-8");*/
- // Add custom properties to message
- (void)IoTHubMessage_SetProperty(message_handle, "hello", "RT-Thread");
- (void)rt_kprintf("Sending message %d to IoTHub\r\n", (int)(messages_sent + 1));
- IoTHubDeviceClient_LL_SendEventAsync(device_ll_handle, message_handle, send_confirm_callback, NULL);
- // The message is copied to the sdk so the we can destroy it
- IoTHubMessage_Destroy(message_handle);
- messages_sent++;
- }
- else if (g_message_count_send_confirmations >= MESSAGE_COUNT)
- {
- // After all messages are all received stop running
- g_continueRunning = false;
- }
- IoTHubDeviceClient_LL_DoWork(device_ll_handle);
- ThreadAPI_Sleep(1);
- } while (g_continueRunning);
- // Clean up the iothub sdk handle
- IoTHubDeviceClient_LL_Destroy(device_ll_handle);
- }
- // Free all the sdk subsystem
- IoTHub_Deinit();
- rt_kprintf("Azure Sample Exit");
- //getchar();
- }
- #define THREAD_PRIORITY 10
- #define THREAD_STACK_SIZE 8192
- #define THREAD_TIMESLICE 5
- int azure_telemetry_sample()
- {
- rt_thread_t tid1 = RT_NULL;
-
- tid1 = rt_thread_create("azure",
- azure_iothub_ll_telemetry_sample, (void*)1,
- THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
- if (tid1 != RT_NULL)
- rt_thread_startup(tid1);
- else
- return -1;
- return 0;
- }
- MSH_CMD_EXPORT(azure_telemetry_sample, iothub_ll_telemetry_sample);
|