Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 0:fae049daf5a1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Sep 14 07:20:09 2020 +0000
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2020 Arm Limited
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "mbed.h"
+#include "mbed_trace.h"
+#include "mbedtls/debug.h"
+#include "aws_credentials.h"
+
+extern "C" {
+// sdk initialization
+#include "iot_init.h"
+// mqtt methods
+#include "iot_mqtt.h"
+}
+
+// debugging facilities
+#define TRACE_GROUP "Main"
+static Mutex trace_mutex;
+static void trace_mutex_lock()
+{
+ trace_mutex.lock();
+}
+static void trace_mutex_unlock()
+{
+ trace_mutex.unlock();
+}
+extern "C" void aws_iot_puts(const char *msg) {
+ trace_mutex_lock();
+ puts(msg);
+ trace_mutex_unlock();
+}
+
+#define MQTT_TIMEOUT_MS 15000
+
+// subscription event handler
+static void on_message_received(void * pCallbackContext, IotMqttCallbackParam_t *pCallbackParam) {
+ auto wait_sem = static_cast<Semaphore*>(pCallbackContext);
+ char* payload = (char*)pCallbackParam->u.message.info.pPayload;
+ auto payloadLen = pCallbackParam->u.message.info.payloadLength;
+ tr_debug("from topic:%s; msg: %.*s", pCallbackParam->u.message.info.pTopicName, payloadLen, payload);
+
+ if (strncmp("Warning", payload, 7) != 0) {
+ tr_info("Hello %.*s !", payloadLen, payload);
+ wait_sem->release();
+ }
+}
+int main()
+{
+ mbed_trace_mutex_wait_function_set( trace_mutex_lock ); // only if thread safety is needed
+ mbed_trace_mutex_release_function_set( trace_mutex_unlock ); // only if thread safety is needed
+ mbed_trace_init();
+
+ tr_info("Connecting to the network...");
+ auto eth = NetworkInterface::get_default_instance();
+ if (eth == NULL) {
+ tr_error("No Network interface found.");
+ return -1;
+ }
+ auto ret = eth->connect();
+ if (ret != 0) {
+ tr_error("Connection error: %x", ret);
+ return -1;
+ }
+ tr_info("MAC: %s", eth->get_mac_address());
+ tr_info("Connection Success");
+
+ // demo :
+ // - Init sdk
+ if (!IotSdk_Init()) {
+ tr_error("AWS Sdk: failed to initialize IotSdk");
+ return -1;
+ }
+ auto init_status = IotMqtt_Init();
+ if (init_status != IOT_MQTT_SUCCESS) {
+ tr_error("AWS Sdk: Failed to initialize IotMqtt with %u", init_status);
+ return -1;
+ }
+ // - Connect to mqtt broker
+ IotMqttNetworkInfo_t network_info = IOT_MQTT_NETWORK_INFO_INITIALIZER;
+ network_info.pNetworkInterface = aws::get_iot_network_interface();
+ // create nework connection
+ network_info.createNetworkConnection = true;
+ network_info.u.setup.pNetworkServerInfo = {
+ .hostname = MBED_CONF_APP_AWS_ENDPOINT,
+ .port = 8883
+ };
+ network_info.u.setup.pNetworkCredentialInfo = {
+ .rootCA = aws::credentials::rootCA,
+ .clientCrt = aws::credentials::clientCrt,
+ .clientKey = aws::credentials::clientKey
+ };
+
+ IotMqttConnectInfo_t connect_info = IOT_MQTT_CONNECT_INFO_INITIALIZER;
+ connect_info.awsIotMqttMode = true; // we are connecting to aws servers
+ connect_info.pClientIdentifier = MBED_CONF_APP_AWS_CLIENT_IDENTIFIER;
+ connect_info.clientIdentifierLength = strlen(MBED_CONF_APP_AWS_CLIENT_IDENTIFIER);
+
+ IotMqttConnection_t connection = IOT_MQTT_CONNECTION_INITIALIZER;
+ auto connect_status = IotMqtt_Connect(&network_info, &connect_info, /* timeout ms */ MQTT_TIMEOUT_MS, &connection);
+ if (connect_status != IOT_MQTT_SUCCESS) {
+ tr_error("AWS Sdk: Connection to the MQTT broker failed with %u", connect_status);
+ return -1;
+ }
+ // - Subscribe to sdkTest/sub
+ // On message
+ // - Display on the console: "Hello %s", message
+ /* Set the members of the subscription. */
+ static const char topic[] = MBED_CONF_APP_AWS_MQTT_TOPIC;
+ Semaphore wait_sem {/* count */ 0, /* max_count */ 1};
+
+ IotMqttSubscription_t subscription = IOT_MQTT_SUBSCRIPTION_INITIALIZER;
+ subscription.qos = IOT_MQTT_QOS_1;
+ subscription.pTopicFilter = topic;
+ subscription.topicFilterLength = strlen(topic);
+ subscription.callback.function = on_message_received;
+ subscription.callback.pCallbackContext = &wait_sem;
+
+ /* Subscribe to the topic using the blocking SUBSCRIBE
+ * function. */
+ auto sub_status = IotMqtt_SubscribeSync(connection, &subscription,
+ /* subscription count */ 1, /* flags */ 0,
+ /* timeout ms */ MQTT_TIMEOUT_MS );
+ if (sub_status != IOT_MQTT_SUCCESS) {
+ tr_error("AWS Sdk: Subscribe failed with : %u", sub_status);
+ }
+
+ /* Set the members of the publish info. */
+ IotMqttPublishInfo_t publish = IOT_MQTT_PUBLISH_INFO_INITIALIZER;
+ publish.qos = IOT_MQTT_QOS_1;
+ publish.pTopicName = topic;
+ publish.topicNameLength = strlen(topic);
+ publish.retryLimit = 3;
+ publish.retryMs = 1000;
+ for (uint32_t i = 0; i < 10; i++) {
+ // - for i in 0..9
+ // - wait up to 1 sec
+ // - if no message received Publish: "You have %d sec remaining to say hello...", 10-i
+ // - other wise, exit
+ if (wait_sem.try_acquire_for(1000)) {
+ break;
+ }
+
+ /* prepare the message */
+ static char message[64];
+ snprintf(message, 64, "Warning: Only %lu second(s) left to say your name !", 10 - i);
+ publish.pPayload = message;
+ publish.payloadLength = strlen(message);
+
+ /* Publish the message. */
+ tr_info("sending warning message: %s", message);
+ auto pub_status = IotMqtt_PublishSync(connection, &publish,
+ /* flags */ 0, /* timeout ms */ MQTT_TIMEOUT_MS);
+ if (pub_status != IOT_MQTT_SUCCESS) {
+ tr_warning("AWS Sdk: failed to publish message with %u.", pub_status);
+ }
+ }
+
+ /* Close the MQTT connection. */
+ IotMqtt_Disconnect(connection, 0);
+
+ IotMqtt_Cleanup();
+ IotSdk_Cleanup();
+
+ tr_info("Done");
+ while (true) {
+ ThisThread::sleep_for(1000);
+ }
+ return 0;
+}