A simple interface to mbed Device Connector, where you just declare variables to push them to the cloud.

Dependents:   Wifi_Get_Test_V1 simple-mbed-client-example simple-client-app-shield simple-sensor-client

Fork of simple-mbed-client by Jan Jongboom

TL;DR? See simple-mbed-client-example to get started immediately.

This library is a simpler interface to mbed Client, making it trivial to expose sensors, actuators and other variables to the cloud. It does not require you to change how you write your code. You can take any local variable, swap it out for a call to Simple Mbed Client, and the variable will automatically be synchronised with mbed Cloud.

For example, here's how you expose the value of a light sensor to the cloud:

SimpleMbedClient client;

SimpleResourceInt light_value = client.define_resource("light/0/value", 0);     // create the var

AnalogIn light(A1);

void read_light_sensor() {
    // light_value behaves just like a normal variable that you can read and write to!
    light_value = light.read_u16();
}

// update every second
Ticker t;
t.attach(&read_light_sensor, 1.0f);

Setting up

First import this library to your project. As Simple Mbed Client also needs a way to talk to the outside world, you'll need a NetworkInterface-object. The easiest way is by using the easy-connect library, so add that to your project as well. See the easy-connect docs on how to specify the connectivity method.

We also need a way of authenticating with mbed Cloud. For this we need a security certificate. Go to mbed Cloud, and select 'GET MY DEVICE SECURITY CREDENTIALS'. Save the certificate as security.h in your project folder.

Now we can initiate Simple Mbed Client and connect it to the internet.

#include "mbed.h"
#include "security.h"
#include "easy-connect.h"
#include "simple-mbed-client.h"

SimpleMbedClient client;

DigitalOut led(LED1, 0);

void registered() {
    led = 1;
}

int main() {
    NetworkInterface* network = connect_to_network(); // if connection failed, network will be NULL
    client.setup(network); // returns a bool, check if it's true

    client.on_registered(&registered);

    while (1) {
        wait_ms(25000);
        client.keep_alive();
    }
}

Defining variables

You can define a new variable by a call to client.define_resource. This function takes five arguments:

  1. path - The URL on which your variable is exposed in mbed Cloud. Needs to be three (3) segments, split by a slash (/) in the form of 'sensor/0/value'. The second segment always needs to be numeric.
  2. defaultValue - The default value of the variable. Needs to be either a string or an integer. Depending on the type that you pass in here the type of the variable is defined.
  3. operation - Some variables might be read-only or write-only (seen from the cloud). Use the operation to define these constraints. It's of type M2MBase::Operation. Default is GET_PUT_ALLOWED.
  4. observable - If set to false, cloud applications cannot subscribe to updates on this variable. Default is true.
  5. callback - Function pointer which is called whenever the value of the variable is changed from the cloud.

The type returned by the function is either SimpleResourceInt or SimpleResourceString. You can assign and read from these variables like any normal local variable.

void name_updated(string new_value) {
    printf("Value is now %s\n", new_value.c_str());
}

SimpleResourceString name = client.define_resource("device/0/name", "jan", M2MBase::GET_PUT_ALLOWED, true, &name_updated);

// we can read and write to this variable, e.g.:
stringstream ss;
ss << name;

// or
name = "pietje";

// are all valid

Defining functions

You can define functions, which do not have a value, but can just be invoked from the cloud, by a call to client.define_function. This function takes two arguments:

  1. path - The URL on which your variable is exposed in mbed Cloud. Needs to be three (3) segments, split by a slash (/) in the form of 'sensor/0/value'. The second segment always needs to be numeric.
  2. callback - Function pointer which is invoked when the function is called. Takes in a pointer, which contains the data being passed in from the cloud.

void play(void* data) {
    if (data) { // data can be NULL!
        // cast it to something useful
    }
}

client.define_function("music/0/play", &play);

Accessing the underlying M2MResource

If you need access to the underlying M2MResource you can do so by calling get_resource on a variable, or by calling client.get_resource if it's a function.

SimpleResourceInt led = client.define_resource("led/0/value", true);

client.define_function("led/0/toggle", &toggleLed);

// now to get the resource
M2MResource* ledResource = led.get_resource();
M2MResource* toggleResource = client.get_resource("led/0/toggle");

Printing variables

Unfortunately printf is kind of dumb, and does not automatically cast the variables. If you want to print any of the Simple Mbed Client variables you'll need to cast yourself.

SimpleResourceInt led = client.define_resource("led/0/value", true);

printf("Value is currently %d\n", static_cast<int>(led));

Event Queue

Simple Mbed Client uses an mbed-events EventQueue - running on a separate RTOS thread - to handle incoming events without blocking the main loop. Both the thread and event queue are created when initializing the library. You can override this behavior by providing your own event queue. In this case no thread is created.

EventQueue myQueue;
SimpleMbedClient client(&myQueue);

You can also use the queue to process your own events, which is very useful when dealing with ISRs. The queue is accessible through the eventQueue() function on the client object and returns a pointer to the queue.

SimpleMbedClient client;

InterruptIn btn(D2);

int main() {
  btn.fall(client.eventQueue()->event(&fall));
}
Committer:
Jan Jongboom
Date:
Tue Mar 21 13:03:49 2017 +0100
Revision:
23:c89df15e88d2
Parent:
13:a98cabe88e0f
Update mbed-client, works with mbed OS 5.4.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jan Jongboom 13:a98cabe88e0f 1 /*
Jan Jongboom 13:a98cabe88e0f 2 * Copyright (c) 2016 ARM Limited. All rights reserved.
Jan Jongboom 13:a98cabe88e0f 3 * SPDX-License-Identifier: Apache-2.0
Jan Jongboom 13:a98cabe88e0f 4 * Licensed under the Apache License, Version 2.0 (the License); you may
Jan Jongboom 13:a98cabe88e0f 5 * not use this file except in compliance with the License.
Jan Jongboom 13:a98cabe88e0f 6 * You may obtain a copy of the License at
Jan Jongboom 13:a98cabe88e0f 7 *
Jan Jongboom 13:a98cabe88e0f 8 * http://www.apache.org/licenses/LICENSE-2.0
Jan Jongboom 13:a98cabe88e0f 9 *
Jan Jongboom 13:a98cabe88e0f 10 * Unless required by applicable law or agreed to in writing, software
Jan Jongboom 13:a98cabe88e0f 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
Jan Jongboom 13:a98cabe88e0f 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Jan Jongboom 13:a98cabe88e0f 13 * See the License for the specific language governing permissions and
Jan Jongboom 13:a98cabe88e0f 14 * limitations under the License.
Jan Jongboom 13:a98cabe88e0f 15 */
Jan Jongboom 13:a98cabe88e0f 16 #ifndef MBED_CLIENT_CONFIG_H
Jan Jongboom 13:a98cabe88e0f 17 #define MBED_CLIENT_CONFIG_H
Jan Jongboom 13:a98cabe88e0f 18
Jan Jongboom 13:a98cabe88e0f 19
Jan Jongboom 13:a98cabe88e0f 20 // Defines the number of times client should try re-connection towards
Jan Jongboom 13:a98cabe88e0f 21 // Server in case of connectivity loss , also defines the number of CoAP
Jan Jongboom 13:a98cabe88e0f 22 // re-transmission attempts.Default value is 3
Jan Jongboom 13:a98cabe88e0f 23 #define M2M_CLIENT_RECONNECTION_COUNT 3
Jan Jongboom 13:a98cabe88e0f 24
Jan Jongboom 13:a98cabe88e0f 25 // Defines the interval (in seconds) in which client should try re-connection towards
Jan Jongboom 13:a98cabe88e0f 26 // Server in case of connectivity loss , also use the same interval for CoAP
Jan Jongboom 13:a98cabe88e0f 27 // re-transmission attempts. Default value is 5 seconds
Jan Jongboom 13:a98cabe88e0f 28 #define M2M_CLIENT_RECONNECTION_INTERVAL 5
Jan Jongboom 13:a98cabe88e0f 29
Jan Jongboom 13:a98cabe88e0f 30 // Defines the keep-alive interval (in seconds) in which client should send keep alive
Jan Jongboom 13:a98cabe88e0f 31 // pings to server while connected through TCP mode. Default value is 300 seconds
Jan Jongboom 13:a98cabe88e0f 32 #define M2M_CLIENT_TCP_KEEPALIVE_TIME 300
Jan Jongboom 13:a98cabe88e0f 33
Jan Jongboom 13:a98cabe88e0f 34 // Defines the maximum CoAP messages that client can hold, maximum value is 6
Jan Jongboom 13:a98cabe88e0f 35 #define SN_COAP_DUPLICATION_MAX_MSGS_COUNT 2
Jan Jongboom 13:a98cabe88e0f 36
Jan Jongboom 13:a98cabe88e0f 37 // Defines the size of blockwise CoAP messages that client can handle.
Jan Jongboom 13:a98cabe88e0f 38 // The values that can be defined uust be 2^x and x is at least 4.
Jan Jongboom 13:a98cabe88e0f 39 // Suitable values: 0, 16, 32, 64, 128, 256, 512 and 1024
Jan Jongboom 13:a98cabe88e0f 40 #define SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE 1024
Jan Jongboom 13:a98cabe88e0f 41
Jan Jongboom 13:a98cabe88e0f 42 // Many pure LWM2M servers doen't accept 'obs' text in registration message.
Jan Jongboom 13:a98cabe88e0f 43 // While using Client against such servers, this flag can be set to define to
Jan Jongboom 13:a98cabe88e0f 44 // disable client sending 'obs' text for observable resources.
Jan Jongboom 13:a98cabe88e0f 45 #undef COAP_DISABLE_OBS_FEATURE
Jan Jongboom 13:a98cabe88e0f 46
Jan Jongboom 13:a98cabe88e0f 47 // Disable Bootstrap functionality in client in order to reduce code size, if bootstrap
Jan Jongboom 13:a98cabe88e0f 48 // functionality is not required.
Jan Jongboom 13:a98cabe88e0f 49 #undef M2M_CLIENT_DISABLE_BOOTSTRAP_FEATURE
Jan Jongboom 13:a98cabe88e0f 50
Jan Jongboom 13:a98cabe88e0f 51 #endif // MBED_CLIENT_CONFIG_H