mbed-os-sensor-node

Getting started with mbed Client on mbed OS

Warning

This example application is not supported anymore.

Information

History project:

  • 17/01/2018 - Using mbed-cli the project is compiled using the use-malloc-for-heap feature enabled
  • 24/11/2017 - Added support for uvision5, here instructions
  • 02/10/2017 - First Release

This is the mbed Client example for mbed OS. It demonstrates how to register a device with mbed Device Connector, how to read and write values, and how to deregister. If you are unfamiliar with mbed Device Connector, we recommend that you read the introduction to the data model first.

The application:

  • Connects to network with 6LoWPAN ND connection.
  • Registers with mbed Device Connector.
  • Gives mbed Device Connector access to its resources (read and write).
  • Sends an incremental number to mbed Device Connector.

You can compile this project in three ways:

1. Using the Online compiler. Just clicking here:

/media/uploads/rspelta/image001.png

Information

Learn how to use the Online compiler reading https://docs.mbed.com/docs/mbed-os-handbook/en/latest/dev_tools/online_comp/ page.

2. Using the compiler on your PC

Information

Learn how to use the mbed-cli reading https://docs.mbed.com/docs/mbed-os-handbook/en/latest/dev_tools/cli/ page.
The name of the machine is SILICA_SENSOR_NODE.

3. Exporting to 3rd party tools (IDE)

Information

Learn how to use the mbed-cli reading https://docs.mbed.com/docs/mbed-os-handbook/en/latest/dev_tools/third_party/ page. We have exported the project for you, please read here

Warning

This example requires a Border Router board. For more details please read the Border Router paragraph from this page.

Please read carefully the next pages:

  • What to do before to compile the project: read here. This step is indipendent from the way you compile the project.
Committer:
rspelta
Date:
Wed Jan 17 13:42:55 2018 +0100
Revision:
7:e89dae7682f7
Parent:
0:e9b834175c38
fixed memory heap

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rspelta 0:e9b834175c38 1 /*
rspelta 0:e9b834175c38 2 * Copyright (c) 2015, 2016 ARM Limited. All rights reserved.
rspelta 0:e9b834175c38 3 * SPDX-License-Identifier: Apache-2.0
rspelta 0:e9b834175c38 4 * Licensed under the Apache License, Version 2.0 (the License); you may
rspelta 0:e9b834175c38 5 * not use this file except in compliance with the License.
rspelta 0:e9b834175c38 6 * You may obtain a copy of the License at
rspelta 0:e9b834175c38 7 *
rspelta 0:e9b834175c38 8 * http://www.apache.org/licenses/LICENSE-2.0
rspelta 0:e9b834175c38 9 *
rspelta 0:e9b834175c38 10 * Unless required by applicable law or agreed to in writing, software
rspelta 0:e9b834175c38 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
rspelta 0:e9b834175c38 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rspelta 0:e9b834175c38 13 * See the License for the specific language governing permissions and
rspelta 0:e9b834175c38 14 * limitations under the License.
rspelta 0:e9b834175c38 15 */
rspelta 0:e9b834175c38 16 #define __STDC_FORMAT_MACROS
rspelta 0:e9b834175c38 17 #include <inttypes.h>
rspelta 0:e9b834175c38 18 #include "simpleclient.h"
rspelta 0:e9b834175c38 19 #include <string>
rspelta 0:e9b834175c38 20 #include <sstream>
rspelta 0:e9b834175c38 21 #include <vector>
rspelta 0:e9b834175c38 22 #include "mbed-trace/mbed_trace.h"
rspelta 0:e9b834175c38 23 #include "mbedtls/entropy_poll.h"
rspelta 0:e9b834175c38 24
rspelta 0:e9b834175c38 25 #include "security.h"
rspelta 0:e9b834175c38 26
rspelta 0:e9b834175c38 27 #include "mbed.h"
rspelta 0:e9b834175c38 28
rspelta 0:e9b834175c38 29 // easy-connect compliancy, it has 2 sets of wifi pins we have only one
rspelta 0:e9b834175c38 30 #define MBED_CONF_APP_ESP8266_TX MBED_CONF_APP_WIFI_TX
rspelta 0:e9b834175c38 31 #define MBED_CONF_APP_ESP8266_RX MBED_CONF_APP_WIFI_RX
rspelta 0:e9b834175c38 32 #include "easy-connect/easy-connect.h"
rspelta 0:e9b834175c38 33
rspelta 0:e9b834175c38 34 #ifdef TARGET_STM
rspelta 0:e9b834175c38 35 #define RED_LED (LED3)
rspelta 0:e9b834175c38 36 #define GREEN_LED (LED1)
rspelta 0:e9b834175c38 37 #define BLUE_LED (LED2)
rspelta 0:e9b834175c38 38 #define LED_ON (1)
rspelta 0:e9b834175c38 39 #else // !TARGET_STM
rspelta 0:e9b834175c38 40 #define RED_LED (LED1)
rspelta 0:e9b834175c38 41 #define GREEN_LED (LED2)
rspelta 0:e9b834175c38 42 #define BLUE_LED (LED3)
rspelta 0:e9b834175c38 43 #define LED_ON (0)
rspelta 0:e9b834175c38 44 #endif // !TARGET_STM
rspelta 0:e9b834175c38 45 #define LED_OFF (!LED_ON)
rspelta 0:e9b834175c38 46
rspelta 0:e9b834175c38 47 #include "hts221.h"
rspelta 0:e9b834175c38 48 HTS221 hts221(I2C_SDA, I2C_SCL);
rspelta 0:e9b834175c38 49
rspelta 0:e9b834175c38 50 // Status indication
rspelta 0:e9b834175c38 51 DigitalOut red_led(RED_LED);
rspelta 0:e9b834175c38 52 DigitalOut green_led(GREEN_LED);
rspelta 0:e9b834175c38 53 DigitalOut blue_led(BLUE_LED);
rspelta 0:e9b834175c38 54
rspelta 0:e9b834175c38 55 Ticker status_ticker;
rspelta 0:e9b834175c38 56 void blinky() {
rspelta 0:e9b834175c38 57 green_led = !green_led;
rspelta 0:e9b834175c38 58 }
rspelta 0:e9b834175c38 59
rspelta 0:e9b834175c38 60 // These are example resource values for the Device Object
rspelta 0:e9b834175c38 61 struct MbedClientDevice device = {
rspelta 0:e9b834175c38 62 "Manufacturer_String", // Manufacturer
rspelta 0:e9b834175c38 63 "Type_String", // Type
rspelta 0:e9b834175c38 64 "ModelNumber_String", // ModelNumber
rspelta 0:e9b834175c38 65 "SerialNumber_String" // SerialNumber
rspelta 0:e9b834175c38 66 };
rspelta 0:e9b834175c38 67
rspelta 0:e9b834175c38 68 // Instantiate the class which implements LWM2M Client API (from simpleclient.h)
rspelta 0:e9b834175c38 69 MbedClient mbed_client(device);
rspelta 0:e9b834175c38 70
rspelta 0:e9b834175c38 71
rspelta 0:e9b834175c38 72 // In case of K64F board , there is button resource available
rspelta 0:e9b834175c38 73 // to change resource value and unregister
rspelta 0:e9b834175c38 74 #ifdef TARGET_K64F
rspelta 0:e9b834175c38 75 // Set up Hardware interrupt button.
rspelta 0:e9b834175c38 76 InterruptIn obs_button(SW2);
rspelta 0:e9b834175c38 77 InterruptIn unreg_button(SW3);
rspelta 0:e9b834175c38 78 #else
rspelta 0:e9b834175c38 79 //In non K64F boards , set up a timer to simulate updating resource,
rspelta 0:e9b834175c38 80 // there is no functionality to unregister.
rspelta 0:e9b834175c38 81 Ticker timer;
rspelta 0:e9b834175c38 82 #endif
rspelta 0:e9b834175c38 83
rspelta 0:e9b834175c38 84 /*
rspelta 0:e9b834175c38 85 * Arguments for running "blink" in it's own thread.
rspelta 0:e9b834175c38 86 */
rspelta 0:e9b834175c38 87 class BlinkArgs {
rspelta 0:e9b834175c38 88 public:
rspelta 0:e9b834175c38 89 BlinkArgs() {
rspelta 0:e9b834175c38 90 clear();
rspelta 0:e9b834175c38 91 }
rspelta 0:e9b834175c38 92 void clear() {
rspelta 0:e9b834175c38 93 position = 0;
rspelta 0:e9b834175c38 94 blink_pattern.clear();
rspelta 0:e9b834175c38 95 }
rspelta 0:e9b834175c38 96 uint16_t position;
rspelta 0:e9b834175c38 97 std::vector<uint32_t> blink_pattern;
rspelta 0:e9b834175c38 98 };
rspelta 0:e9b834175c38 99
rspelta 0:e9b834175c38 100 /*
rspelta 0:e9b834175c38 101 * The Led contains one property (pattern) and a function (blink).
rspelta 0:e9b834175c38 102 * When the function blink is executed, the pattern is read, and the LED
rspelta 0:e9b834175c38 103 * will blink based on the pattern.
rspelta 0:e9b834175c38 104 */
rspelta 0:e9b834175c38 105 class LedResource {
rspelta 0:e9b834175c38 106 public:
rspelta 0:e9b834175c38 107 LedResource() {
rspelta 0:e9b834175c38 108 // create ObjectID with metadata tag of '3201', which is 'digital output'
rspelta 0:e9b834175c38 109 led_object = M2MInterfaceFactory::create_object("3201");
rspelta 0:e9b834175c38 110 M2MObjectInstance* led_inst = led_object->create_object_instance();
rspelta 0:e9b834175c38 111
rspelta 0:e9b834175c38 112 // 5853 = Multi-state output
rspelta 0:e9b834175c38 113 M2MResource* pattern_res = led_inst->create_dynamic_resource("5853", "Pattern",
rspelta 0:e9b834175c38 114 M2MResourceInstance::STRING, false);
rspelta 0:e9b834175c38 115 // read and write
rspelta 0:e9b834175c38 116 pattern_res->set_operation(M2MBase::GET_PUT_ALLOWED);
rspelta 0:e9b834175c38 117 // set initial pattern (toggle every 200ms. 7 toggles in total)
rspelta 0:e9b834175c38 118 pattern_res->set_value((const uint8_t*)"500:500:500:500:500:500:500", 27);
rspelta 0:e9b834175c38 119
rspelta 0:e9b834175c38 120 // there's not really an execute LWM2M ID that matches... hmm...
rspelta 0:e9b834175c38 121 M2MResource* led_res = led_inst->create_dynamic_resource("5850", "Blink",
rspelta 0:e9b834175c38 122 M2MResourceInstance::OPAQUE, false);
rspelta 0:e9b834175c38 123 // we allow executing a function here...
rspelta 0:e9b834175c38 124 led_res->set_operation(M2MBase::POST_ALLOWED);
rspelta 0:e9b834175c38 125 // when a POST comes in, we want to execute the led_execute_callback
rspelta 0:e9b834175c38 126 led_res->set_execute_function(execute_callback(this, &LedResource::blink));
rspelta 0:e9b834175c38 127 // Completion of execute function can take a time, that's why delayed response is used
rspelta 0:e9b834175c38 128 led_res->set_delayed_response(true);
rspelta 0:e9b834175c38 129 blink_args = new BlinkArgs();
rspelta 0:e9b834175c38 130 }
rspelta 0:e9b834175c38 131
rspelta 0:e9b834175c38 132 ~LedResource() {
rspelta 0:e9b834175c38 133 delete blink_args;
rspelta 0:e9b834175c38 134 }
rspelta 0:e9b834175c38 135
rspelta 0:e9b834175c38 136 M2MObject* get_object() {
rspelta 0:e9b834175c38 137 return led_object;
rspelta 0:e9b834175c38 138 }
rspelta 0:e9b834175c38 139
rspelta 0:e9b834175c38 140 void blink(void *argument) {
rspelta 0:e9b834175c38 141 // read the value of 'Pattern'
rspelta 0:e9b834175c38 142 status_ticker.detach();
rspelta 0:e9b834175c38 143 green_led = LED_OFF;
rspelta 0:e9b834175c38 144
rspelta 0:e9b834175c38 145 M2MObjectInstance* inst = led_object->object_instance();
rspelta 0:e9b834175c38 146 M2MResource* res = inst->resource("5853");
rspelta 0:e9b834175c38 147 // Clear previous blink data
rspelta 0:e9b834175c38 148 blink_args->clear();
rspelta 0:e9b834175c38 149
rspelta 0:e9b834175c38 150 // values in mbed Client are all buffers, and we need a vector of int's
rspelta 0:e9b834175c38 151 uint8_t* buffIn = NULL;
rspelta 0:e9b834175c38 152 uint32_t sizeIn;
rspelta 0:e9b834175c38 153 res->get_value(buffIn, sizeIn);
rspelta 0:e9b834175c38 154
rspelta 0:e9b834175c38 155 // turn the buffer into a string, and initialize a vector<int> on the heap
rspelta 0:e9b834175c38 156 std::string s((char*)buffIn, sizeIn);
rspelta 0:e9b834175c38 157 free(buffIn);
rspelta 0:e9b834175c38 158 printf("led_execute_callback pattern=%s\n", s.c_str());
rspelta 0:e9b834175c38 159
rspelta 0:e9b834175c38 160 // our pattern is something like 500:200:500, so parse that
rspelta 0:e9b834175c38 161 std::size_t found = s.find_first_of(":");
rspelta 0:e9b834175c38 162 while (found!=std::string::npos) {
rspelta 0:e9b834175c38 163 blink_args->blink_pattern.push_back(atoi((const char*)s.substr(0,found).c_str()));
rspelta 0:e9b834175c38 164 s = s.substr(found+1);
rspelta 0:e9b834175c38 165 found=s.find_first_of(":");
rspelta 0:e9b834175c38 166 if(found == std::string::npos) {
rspelta 0:e9b834175c38 167 blink_args->blink_pattern.push_back(atoi((const char*)s.c_str()));
rspelta 0:e9b834175c38 168 }
rspelta 0:e9b834175c38 169 }
rspelta 0:e9b834175c38 170 // check if POST contains payload
rspelta 0:e9b834175c38 171 if (argument) {
rspelta 0:e9b834175c38 172 M2MResource::M2MExecuteParameter* param = (M2MResource::M2MExecuteParameter*)argument;
rspelta 0:e9b834175c38 173 String object_name = param->get_argument_object_name();
rspelta 0:e9b834175c38 174 uint16_t object_instance_id = param->get_argument_object_instance_id();
rspelta 0:e9b834175c38 175 String resource_name = param->get_argument_resource_name();
rspelta 0:e9b834175c38 176 int payload_length = param->get_argument_value_length();
rspelta 0:e9b834175c38 177 uint8_t* payload = param->get_argument_value();
rspelta 0:e9b834175c38 178 printf("Resource: %s/%d/%s executed\n", object_name.c_str(), object_instance_id, resource_name.c_str());
rspelta 0:e9b834175c38 179 printf("Payload: %.*s\n", payload_length, payload);
rspelta 0:e9b834175c38 180 }
rspelta 0:e9b834175c38 181 // do_blink is called with the vector, and starting at -1
rspelta 0:e9b834175c38 182 blinky_thread.start(callback(this, &LedResource::do_blink));
rspelta 0:e9b834175c38 183 }
rspelta 0:e9b834175c38 184
rspelta 0:e9b834175c38 185 private:
rspelta 0:e9b834175c38 186 M2MObject* led_object;
rspelta 0:e9b834175c38 187 Thread blinky_thread;
rspelta 0:e9b834175c38 188 BlinkArgs *blink_args;
rspelta 0:e9b834175c38 189 void do_blink() {
rspelta 0:e9b834175c38 190 for (;;) {
rspelta 0:e9b834175c38 191 // blink the LED
rspelta 0:e9b834175c38 192 red_led = !red_led;
rspelta 0:e9b834175c38 193 // up the position, if we reached the end of the vector
rspelta 0:e9b834175c38 194 if (blink_args->position >= blink_args->blink_pattern.size()) {
rspelta 0:e9b834175c38 195 // send delayed response after blink is done
rspelta 0:e9b834175c38 196 M2MObjectInstance* inst = led_object->object_instance();
rspelta 0:e9b834175c38 197 M2MResource* led_res = inst->resource("5850");
rspelta 0:e9b834175c38 198 led_res->send_delayed_post_response();
rspelta 0:e9b834175c38 199 red_led = LED_OFF;
rspelta 0:e9b834175c38 200 status_ticker.attach_us(blinky, 250000);
rspelta 0:e9b834175c38 201 return;
rspelta 0:e9b834175c38 202 }
rspelta 0:e9b834175c38 203 // Wait requested time, then continue prosessing the blink pattern from next position.
rspelta 0:e9b834175c38 204 Thread::wait(blink_args->blink_pattern.at(blink_args->position));
rspelta 0:e9b834175c38 205 blink_args->position++;
rspelta 0:e9b834175c38 206 }
rspelta 0:e9b834175c38 207 }
rspelta 0:e9b834175c38 208 };
rspelta 0:e9b834175c38 209
rspelta 0:e9b834175c38 210 /*
rspelta 0:e9b834175c38 211 * The button contains one property (click count).
rspelta 0:e9b834175c38 212 * When `handle_button_click` is executed, the counter updates.
rspelta 0:e9b834175c38 213 */
rspelta 0:e9b834175c38 214 class ButtonResource {
rspelta 0:e9b834175c38 215 public:
rspelta 0:e9b834175c38 216 ButtonResource(): counter(0) {
rspelta 0:e9b834175c38 217 // create ObjectID with metadata tag of '3200', which is 'digital input'
rspelta 0:e9b834175c38 218 btn_object = M2MInterfaceFactory::create_object("3200");
rspelta 0:e9b834175c38 219 M2MObjectInstance* btn_inst = btn_object->create_object_instance();
rspelta 0:e9b834175c38 220 // create resource with ID '5501', which is digital input counter
rspelta 0:e9b834175c38 221 M2MResource* btn_res = btn_inst->create_dynamic_resource("5501", "Button",
rspelta 0:e9b834175c38 222 M2MResourceInstance::INTEGER, true /* observable */);
rspelta 0:e9b834175c38 223 // we can read this value
rspelta 0:e9b834175c38 224 btn_res->set_operation(M2MBase::GET_ALLOWED);
rspelta 0:e9b834175c38 225 // set initial value (all values in mbed Client are buffers)
rspelta 0:e9b834175c38 226 // to be able to read this data easily in the Connector console, we'll use a string
rspelta 0:e9b834175c38 227 btn_res->set_value((uint8_t*)"0", 1);
rspelta 0:e9b834175c38 228 }
rspelta 0:e9b834175c38 229
rspelta 0:e9b834175c38 230 ~ButtonResource() {
rspelta 0:e9b834175c38 231 }
rspelta 0:e9b834175c38 232
rspelta 0:e9b834175c38 233 M2MObject* get_object() {
rspelta 0:e9b834175c38 234 return btn_object;
rspelta 0:e9b834175c38 235 }
rspelta 0:e9b834175c38 236
rspelta 0:e9b834175c38 237 /*
rspelta 0:e9b834175c38 238 * When you press the button, we read the current value of the click counter
rspelta 0:e9b834175c38 239 * from mbed Device Connector, then up the value with one.
rspelta 0:e9b834175c38 240 */
rspelta 0:e9b834175c38 241 void handle_button_click() {
rspelta 0:e9b834175c38 242 if (mbed_client.register_successful()) {
rspelta 0:e9b834175c38 243 M2MObjectInstance* inst = btn_object->object_instance();
rspelta 0:e9b834175c38 244 M2MResource* res = inst->resource("5501");
rspelta 0:e9b834175c38 245
rspelta 0:e9b834175c38 246 // up counter
rspelta 0:e9b834175c38 247 counter++;
rspelta 0:e9b834175c38 248 #ifdef TARGET_K64F
rspelta 0:e9b834175c38 249 printf("handle_button_click, new value of counter is %d\n", counter);
rspelta 0:e9b834175c38 250 #else
rspelta 0:e9b834175c38 251 printf("simulate button_click, new value of counter is %d\n", counter);
rspelta 0:e9b834175c38 252 #endif
rspelta 0:e9b834175c38 253 // serialize the value of counter as a string, and tell connector
rspelta 0:e9b834175c38 254 char buffer[20];
rspelta 0:e9b834175c38 255 int size = sprintf(buffer,"%d",counter);
rspelta 0:e9b834175c38 256 res->set_value((uint8_t*)buffer, size);
rspelta 0:e9b834175c38 257 } else {
rspelta 0:e9b834175c38 258 printf("simulate button_click, device not registered\n");
rspelta 0:e9b834175c38 259 }
rspelta 0:e9b834175c38 260 }
rspelta 0:e9b834175c38 261
rspelta 0:e9b834175c38 262 private:
rspelta 0:e9b834175c38 263 M2MObject* btn_object;
rspelta 0:e9b834175c38 264 uint16_t counter;
rspelta 0:e9b834175c38 265 };
rspelta 0:e9b834175c38 266
rspelta 0:e9b834175c38 267 class BigPayloadResource {
rspelta 0:e9b834175c38 268 public:
rspelta 0:e9b834175c38 269 BigPayloadResource() {
rspelta 0:e9b834175c38 270 big_payload = M2MInterfaceFactory::create_object("1000");
rspelta 0:e9b834175c38 271 M2MObjectInstance* payload_inst = big_payload->create_object_instance();
rspelta 0:e9b834175c38 272 M2MResource* payload_res = payload_inst->create_dynamic_resource("1", "BigData",
rspelta 0:e9b834175c38 273 M2MResourceInstance::STRING, true /* observable */);
rspelta 0:e9b834175c38 274 payload_res->set_operation(M2MBase::GET_PUT_ALLOWED);
rspelta 0:e9b834175c38 275 payload_res->set_value((uint8_t*)"0", 1);
rspelta 0:e9b834175c38 276 payload_res->set_incoming_block_message_callback(
rspelta 0:e9b834175c38 277 incoming_block_message_callback(this, &BigPayloadResource::block_message_received));
rspelta 0:e9b834175c38 278 payload_res->set_outgoing_block_message_callback(
rspelta 0:e9b834175c38 279 outgoing_block_message_callback(this, &BigPayloadResource::block_message_requested));
rspelta 0:e9b834175c38 280 }
rspelta 0:e9b834175c38 281
rspelta 0:e9b834175c38 282 M2MObject* get_object() {
rspelta 0:e9b834175c38 283 return big_payload;
rspelta 0:e9b834175c38 284 }
rspelta 0:e9b834175c38 285
rspelta 0:e9b834175c38 286 void block_message_received(M2MBlockMessage *argument) {
rspelta 0:e9b834175c38 287 if (argument) {
rspelta 0:e9b834175c38 288 if (M2MBlockMessage::ErrorNone == argument->error_code()) {
rspelta 0:e9b834175c38 289 if (argument->is_last_block()) {
rspelta 0:e9b834175c38 290 printf("Last block received\n");
rspelta 0:e9b834175c38 291 }
rspelta 0:e9b834175c38 292 printf("Block number: %d\n", argument->block_number());
rspelta 0:e9b834175c38 293 // First block received
rspelta 0:e9b834175c38 294 if (argument->block_number() == 0) {
rspelta 0:e9b834175c38 295 // Store block
rspelta 0:e9b834175c38 296 // More blocks coming
rspelta 0:e9b834175c38 297 } else {
rspelta 0:e9b834175c38 298 // Store blocks
rspelta 0:e9b834175c38 299 }
rspelta 0:e9b834175c38 300 } else {
rspelta 0:e9b834175c38 301 printf("Error when receiving block message! - EntityTooLarge\n");
rspelta 0:e9b834175c38 302 }
rspelta 0:e9b834175c38 303 printf("Total message size: %" PRIu32 "\n", argument->total_message_size());
rspelta 0:e9b834175c38 304 }
rspelta 0:e9b834175c38 305 }
rspelta 0:e9b834175c38 306
rspelta 0:e9b834175c38 307 void block_message_requested(const String& resource, uint8_t *&/*data*/, uint32_t &/*len*/) {
rspelta 0:e9b834175c38 308 printf("GET request received for resource: %s\n", resource.c_str());
rspelta 0:e9b834175c38 309 // Copy data and length to coap response
rspelta 0:e9b834175c38 310 }
rspelta 0:e9b834175c38 311
rspelta 0:e9b834175c38 312 private:
rspelta 0:e9b834175c38 313 M2MObject* big_payload;
rspelta 0:e9b834175c38 314 };
rspelta 0:e9b834175c38 315
rspelta 0:e9b834175c38 316 // Network interaction must be performed outside of interrupt context
rspelta 0:e9b834175c38 317 Semaphore updates(0);
rspelta 0:e9b834175c38 318 volatile bool registered = false;
rspelta 0:e9b834175c38 319 volatile bool clicked = false;
rspelta 0:e9b834175c38 320 osThreadId mainThread;
rspelta 0:e9b834175c38 321
rspelta 0:e9b834175c38 322 void unregister() {
rspelta 0:e9b834175c38 323 registered = false;
rspelta 0:e9b834175c38 324 updates.release();
rspelta 0:e9b834175c38 325 }
rspelta 0:e9b834175c38 326
rspelta 0:e9b834175c38 327 void button_clicked() {
rspelta 0:e9b834175c38 328 clicked = true;
rspelta 0:e9b834175c38 329 updates.release();
rspelta 0:e9b834175c38 330 }
rspelta 0:e9b834175c38 331
rspelta 0:e9b834175c38 332 // Entry point to the program
rspelta 0:e9b834175c38 333 int main() {
rspelta 0:e9b834175c38 334
rspelta 0:e9b834175c38 335 unsigned int seed;
rspelta 0:e9b834175c38 336 size_t len;
rspelta 0:e9b834175c38 337
rspelta 0:e9b834175c38 338 #ifdef MBEDTLS_ENTROPY_HARDWARE_ALT
rspelta 0:e9b834175c38 339 // Used to randomize source port
rspelta 0:e9b834175c38 340 mbedtls_hardware_poll(NULL, (unsigned char *) &seed, sizeof seed, &len);
rspelta 0:e9b834175c38 341
rspelta 0:e9b834175c38 342 #elif defined MBEDTLS_TEST_NULL_ENTROPY
rspelta 0:e9b834175c38 343
rspelta 0:e9b834175c38 344 #warning "mbedTLS security feature is disabled. Connection will not be secure !! Implement proper hardware entropy for your selected hardware."
rspelta 0:e9b834175c38 345 // Used to randomize source port
rspelta 0:e9b834175c38 346 mbedtls_null_entropy_poll( NULL,(unsigned char *) &seed, sizeof seed, &len);
rspelta 0:e9b834175c38 347
rspelta 0:e9b834175c38 348 #else
rspelta 0:e9b834175c38 349
rspelta 0:e9b834175c38 350 #error "This hardware does not have entropy, endpoint will not register to Connector.\
rspelta 0:e9b834175c38 351 You need to enable NULL ENTROPY for your application, but if this configuration change is made then no security is offered by mbed TLS.\
rspelta 0:e9b834175c38 352 Add MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES and MBEDTLS_TEST_NULL_ENTROPY in mbed_app.json macros to register your endpoint."
rspelta 0:e9b834175c38 353
rspelta 0:e9b834175c38 354 #endif
rspelta 0:e9b834175c38 355
rspelta 0:e9b834175c38 356 srand(seed);
rspelta 0:e9b834175c38 357 red_led = LED_OFF;
rspelta 0:e9b834175c38 358 blue_led = LED_OFF;
rspelta 0:e9b834175c38 359
rspelta 0:e9b834175c38 360 status_ticker.attach_us(blinky, 250000);
rspelta 0:e9b834175c38 361 // Keep track of the main thread
rspelta 0:e9b834175c38 362 mainThread = osThreadGetId();
rspelta 0:e9b834175c38 363
rspelta 0:e9b834175c38 364 printf("\nStarting mbed Client example\n");
rspelta 0:e9b834175c38 365
rspelta 0:e9b834175c38 366 mbed_trace_init();
rspelta 0:e9b834175c38 367 mbed_trace_config_set(TRACE_MODE_COLOR | TRACE_ACTIVE_LEVEL_INFO | TRACE_CARRIAGE_RETURN);
rspelta 0:e9b834175c38 368
rspelta 0:e9b834175c38 369 NetworkInterface* network = easy_connect(true);
rspelta 0:e9b834175c38 370 if(network == NULL) {
rspelta 0:e9b834175c38 371 printf("\nConnection to Network Failed - exiting application...\n");
rspelta 0:e9b834175c38 372 return -1;
rspelta 0:e9b834175c38 373 }
rspelta 0:e9b834175c38 374
rspelta 0:e9b834175c38 375 // we create our button and LED resources
rspelta 0:e9b834175c38 376 ButtonResource button_resource;
rspelta 0:e9b834175c38 377 LedResource led_resource;
rspelta 0:e9b834175c38 378 BigPayloadResource big_payload_resource;
rspelta 0:e9b834175c38 379
rspelta 0:e9b834175c38 380 #ifdef TARGET_K64F
rspelta 0:e9b834175c38 381 // On press of SW3 button on K64F board, example application
rspelta 0:e9b834175c38 382 // will call unregister API towards mbed Device Connector
rspelta 0:e9b834175c38 383 //unreg_button.fall(&mbed_client,&MbedClient::test_unregister);
rspelta 0:e9b834175c38 384 unreg_button.fall(&unregister);
rspelta 0:e9b834175c38 385
rspelta 0:e9b834175c38 386 // Observation Button (SW2) press will send update of endpoint resource values to connector
rspelta 0:e9b834175c38 387 obs_button.fall(&button_clicked);
rspelta 0:e9b834175c38 388 #else
rspelta 0:e9b834175c38 389 // Send update of endpoint resource values to connector every 15 seconds periodically
rspelta 0:e9b834175c38 390 timer.attach(&button_clicked, 15.0);
rspelta 0:e9b834175c38 391 #endif
rspelta 0:e9b834175c38 392
rspelta 0:e9b834175c38 393 // Create endpoint interface to manage register and unregister
rspelta 0:e9b834175c38 394 mbed_client.create_interface(MBED_SERVER_ADDRESS, network);
rspelta 0:e9b834175c38 395
rspelta 0:e9b834175c38 396 // Create Objects of varying types, see simpleclient.h for more details on implementation.
rspelta 0:e9b834175c38 397 M2MSecurity* register_object = mbed_client.create_register_object(); // server object specifying connector info
rspelta 0:e9b834175c38 398 M2MDevice* device_object = mbed_client.create_device_object(); // device resources object
rspelta 0:e9b834175c38 399
rspelta 0:e9b834175c38 400 // Create list of Objects to register
rspelta 0:e9b834175c38 401 M2MObjectList object_list;
rspelta 0:e9b834175c38 402
rspelta 0:e9b834175c38 403 // Add objects to list
rspelta 0:e9b834175c38 404 object_list.push_back(device_object);
rspelta 0:e9b834175c38 405 object_list.push_back(button_resource.get_object());
rspelta 0:e9b834175c38 406 object_list.push_back(led_resource.get_object());
rspelta 0:e9b834175c38 407 object_list.push_back(big_payload_resource.get_object());
rspelta 0:e9b834175c38 408
rspelta 0:e9b834175c38 409 // Set endpoint registration object
rspelta 0:e9b834175c38 410 mbed_client.set_register_object(register_object);
rspelta 0:e9b834175c38 411
rspelta 0:e9b834175c38 412 // Register with mbed Device Connector
rspelta 0:e9b834175c38 413 mbed_client.test_register(register_object, object_list);
rspelta 0:e9b834175c38 414 registered = true;
rspelta 0:e9b834175c38 415
rspelta 0:e9b834175c38 416 while (true) {
rspelta 0:e9b834175c38 417 updates.wait(25000);
rspelta 0:e9b834175c38 418 if(registered) {
rspelta 0:e9b834175c38 419 if(!clicked) {
rspelta 0:e9b834175c38 420 mbed_client.test_update_register();
rspelta 0:e9b834175c38 421 }
rspelta 0:e9b834175c38 422 }else {
rspelta 0:e9b834175c38 423 break;
rspelta 0:e9b834175c38 424 }
rspelta 0:e9b834175c38 425 if(clicked) {
rspelta 0:e9b834175c38 426 clicked = false;
rspelta 0:e9b834175c38 427 button_resource.handle_button_click();
rspelta 0:e9b834175c38 428 }
rspelta 0:e9b834175c38 429 }
rspelta 0:e9b834175c38 430
rspelta 0:e9b834175c38 431 mbed_client.test_unregister();
rspelta 0:e9b834175c38 432 status_ticker.detach();
rspelta 0:e9b834175c38 433 }