An mbed BLE-to-Cloud Gateway using Nucleo-F429ZI+X-Nucleo-IDB05A1 or Nucleo-L476RG+X-Nucleo-IDB05A1+X-Nucleo-IDW01M1.

Information

Nucleo- F429ZI configuration requires two hardware patches:

  1. on Nucleo-F429ZI open SB121 and close SB122
  2. on X-Nucleo-IDB05A1 move R4 to R6

The BLE client searches for and connects to a MotEnv node.

Committer:
nikapov
Date:
Thu Oct 12 13:58:45 2017 +0200
Revision:
0:c7083010ae49
Child:
1:d9c0c4889bd2
Clone of https://github.com/ARMmbed/mbed-os-example-client/#0a4d843a59eee05e678cc163146d533c80c0b1d7

Who changed what in which revision?

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