Simple Mbed Cloud Client application using features of K64 & K66
Connect to Mbed Cloud!
This example was customized a bit for FRDM-K66 and FRDM-K64F.
It depends on having an SD Card plugged in for storage of credentials. It could be changed later to use a SPI flash or other storage on a shield or wired in.
The app keeps track of how many times switch 2 (SW2) is pressed. The value can be retrieved via a GET request to Mbed Cloud.
Also, it will blink a pattern based on milisecond (ms) timing values that can be sent from Mbed Cloud. The pattern can be sent with a PUT request and the blinking sequence can be triggered by a POST request.
Diff: main.cpp
- Revision:
- 0:e13a8a944e25
- Child:
- 1:1ccf36276cd3
diff -r 000000000000 -r e13a8a944e25 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Feb 13 10:07:23 2018 +0000
@@ -0,0 +1,156 @@
+// ----------------------------------------------------------------------------
+// Copyright 2016-2017 ARM Ltd.
+//
+// SPDX-License-Identifier: Apache-2.0
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// ----------------------------------------------------------------------------
+
+#include "simple-mbed-cloud-client.h"
+#include "mbed.h"
+
+// Pointers to the resources that will be created in main_application().
+static M2MResource* button_res;
+static M2MResource* pattern_res;
+static M2MResource* blink_res;
+
+// Pointer to mbedClient, used for calling close function.
+static SimpleMbedCloudClient *client;
+
+void pattern_updated(const char *)
+ {
+ printf("PUT received, new value: %s\n", pattern_res->get_value_string().c_str());
+}
+
+void blink_callback(void *) {
+ String pattern_string = pattern_res->get_value_string();
+ const char *pattern = pattern_string.c_str();
+ printf("LED pattern = %s\n", pattern);
+ // The pattern is something like 500:200:500, so parse that.
+ // LED blinking is done while parsing.
+ toggle_led();
+ while (*pattern != '\0') {
+ // Wait for requested time.
+ do_wait(atoi(pattern));
+ toggle_led();
+ // Search for next value.
+ pattern = strchr(pattern, ':');
+ if(!pattern) {
+ break; // while
+ }
+ pattern++;
+ }
+ led_off();
+}
+
+void button_notification_status_callback(const M2MBase& object, const NoticationDeliveryStatus status)
+{
+ switch(status) {
+ case NOTIFICATION_STATUS_BUILD_ERROR:
+ printf("Notification callback: (%s) error when building CoAP message\n", object.uri_path());
+ break;
+ case NOTIFICATION_STATUS_RESEND_QUEUE_FULL:
+ printf("Notification callback: (%s) CoAP resend queue full\n", object.uri_path());
+ break;
+ case NOTIFICATION_STATUS_SENT:
+ printf("Notification callback: (%s) Notification sent to server\n", object.uri_path());
+ break;
+ case NOTIFICATION_STATUS_DELIVERED:
+ printf("Notification callback: (%s) Notification delivered\n", object.uri_path());
+ break;
+ case NOTIFICATION_STATUS_SEND_FAILED:
+ printf("Notification callback: (%s) Notification sending failed\n", object.uri_path());
+ break;
+ case NOTIFICATION_STATUS_SUBSCRIBED:
+ printf("Notification callback: (%s) subscribed\n", object.uri_path());
+ break;
+ case NOTIFICATION_STATUS_UNSUBSCRIBED:
+ printf("Notification callback: (%s) subscription removed\n", object.uri_path());
+ break;
+ default:
+ break;
+ }
+}
+
+// This function is called when a POST request is received for resource 5000/0/1.
+void unregister(void *)
+{
+ printf("Unregister resource executed\n");
+ client->close();
+}
+
+// This function is called when a POST request is received for resource 5000/0/2.
+void factory_reset(void *)
+{
+ printf("Factory reset resource executed\n");
+ client->close();
+ kcm_status_e kcm_status = kcm_factory_reset();
+ if (kcm_status != KCM_STATUS_SUCCESS) {
+ printf("Failed to do factory reset - %d\n", kcm_status);
+ } else {
+ printf("Factory reset completed. Now restart the device\n");
+ }
+}
+
+int main(void)
+{
+ // IOTMORF-1712: DAPLINK starts the previous application during flashing a new binary
+ // This is workaround to prevent possible deletion of credentials or storage corruption
+ // while replacing the application binary.
+ wait(2);
+
+ // SimpleClient is used for registering and unregistering resources to a server.
+ SimpleMbedCloudClient mbedClient;
+
+ // Save pointer to mbedClient so that other functions can access it.
+ client = &mbedClient;
+
+ printf("Client initialized\r\n");
+#ifdef MBED_HEAP_STATS_ENABLED
+ heap_stats();
+#endif
+
+ // Create resource for button count. Path of this resource will be: 3200/0/5501.
+ button_res = mbedClient.add_cloud_resource(3200, 0, 5501, "button_resource", M2MResourceInstance::INTEGER,
+ M2MBase::GET_ALLOWED, 0, true, NULL, (void*)button_notification_status_callback);
+
+ // Create resource for led blinking pattern. Path of this resource will be: 3201/0/5853.
+ pattern_res = mbedClient.add_cloud_resource(3201, 0, 5853, "pattern_resource", M2MResourceInstance::STRING,
+ M2MBase::GET_PUT_ALLOWED, "500:500:500:500", false, (void*)pattern_updated, NULL);
+
+ // Create resource for starting the led blinking. Path of this resource will be: 3201/0/5850.
+ blink_res = mbedClient.add_cloud_resource(3201, 0, 5850, "blink_resource", M2MResourceInstance::STRING,
+ M2MBase::POST_ALLOWED, "", false, (void*)blink_callback, NULL);
+
+ // Create resource for unregistering the device. Path of this resource will be: 5000/0/1.
+ mbedClient.add_cloud_resource(5000, 0, 1, "unregister", M2MResourceInstance::STRING,
+ M2MBase::POST_ALLOWED, NULL, false, (void*)unregister, NULL);
+
+ // Create resource for running factory reset for the device. Path of this resource will be: 5000/0/2.
+ mbedClient.add_cloud_resource(5000, 0, 2, "factory_reset", M2MResourceInstance::STRING,
+ M2MBase::POST_ALLOWED, NULL, false, (void*)factory_reset, NULL);
+
+ mbedClient.register_and_connect();
+
+ // Check if client is registering or registered, if true sleep and repeat.
+ while (mbedClient.is_register_called()) {
+ static int button_count = 0;
+ do_wait(100);
+ if (button_clicked()) {
+ button_res->set_value(++button_count);
+ }
+ }
+
+ // Client unregistered, exit program.
+ return 0;
+}