Example program running mbedClient over UbloxATCellularInterface or OnboardCellularInterface for the C030 platform.

Dependencies:   ublox-cellular-base ublox-at-cellular-interface ublox-ppp-cellular-interface ublox-at-cellular-interface-n2xx ublox-cellular-base-n2xx

Revision:
1:9f355da25904
Child:
3:5b8623c17906
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/simpleclient.h	Fri Jun 09 15:28:40 2017 +0100
@@ -0,0 +1,361 @@
+/*
+ * Copyright (c) 2015 ARM Limited. All rights reserved.
+ * 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.
+ */
+
+#ifndef __SIMPLECLIENT_H__
+#define __SIMPLECLIENT_H__
+
+#include "mbed-client/m2minterfacefactory.h"
+#include "mbed-client/m2mdevice.h"
+#include "mbed-client/m2minterfaceobserver.h"
+#include "mbed-client/m2minterface.h"
+#include "mbed-client/m2mobject.h"
+#include "mbed-client/m2mobjectinstance.h"
+#include "mbed-client/m2mresource.h"
+#include "mbed-client/m2mconfig.h"
+#include "mbed-client/m2mblockmessage.h"
+#include "security.h"
+#include "mbed.h"
+
+#define ETHERNET        1
+#define WIFI            2
+#define MESH_LOWPAN_ND  3
+#define MESH_THREAD     4
+#define ATMEL           5
+#define MCR20           6
+#define SPIRIT1         7
+#define CELL            8
+
+#define STRINGIFY(s) #s
+
+M2MInterface::NetworkStack NETWORK_STACK = M2MInterface::LwIP_IPv4;
+
+M2MInterface::BindingMode SOCKET_MODE = M2MInterface::UDP;
+
+struct MbedClientDevice {
+    const char* Manufacturer;
+    const char* Type;
+    const char* ModelNumber;
+    const char* SerialNumber;
+};
+
+/*
+* Wrapper for mbed client stack that handles all callbacks, error handling, and
+* other shenanigans to make the mbed client stack easier to use.
+*
+* The end user should only have to care about configuring the parameters at the
+* top of this file and making sure they add the security.h file correctly.
+* To add resources you can copy the _TODO__ function and add as many instances as
+* you want.
+*
+*/
+class MbedClient: public M2MInterfaceObserver {
+    
+public:
+
+    /*
+     * Constructor for MbedClient object, initialize private variables
+     */
+    MbedClient(struct MbedClientDevice device)
+    {
+        _interface = NULL;
+        _bootstrapped = false;
+        _error = false;
+        _registered = false;
+        _unregistered = false;
+        _register_security = NULL;
+        _value = 0;
+        _object = NULL;
+        _device = device;
+    }
+
+    /*
+     * Destructor for MbedClient object, you can ignore this
+     */
+    ~MbedClient()
+    {
+        if (_interface) {
+            delete _interface;
+        }
+        if (_register_security) {
+            delete _register_security;
+        }
+    }
+
+    /*
+     *  Creates M2MInterface using which endpoint can
+     *  setup its name, resource type, life time, connection mode,
+     *  Currently only LwIPv4 is supported.
+     */
+    void create_interface(const char *server_address, void *handler=NULL)
+    {
+        // Randomizing listening port for Certificate mode connectivity
+        _server_address = server_address;
+        uint16_t port = 0; // Network interface will randomize with port 0
+
+        // Create mDS interface object, this is the base object everything else attaches to
+        _interface = M2MInterfaceFactory::create_interface(*this,
+                                                          MBED_ENDPOINT_NAME,       // endpoint name string
+                                                          "test",                   // endpoint type string
+                                                          100,                      // lifetime
+                                                          port,                     // listen port
+                                                          MBED_DOMAIN,              // domain string
+                                                          SOCKET_MODE,              // binding mode
+                                                          NETWORK_STACK,            // network stack
+                                                          "");                      // context address string
+        const char *binding_mode = (SOCKET_MODE == M2MInterface::UDP) ? "UDP" : "TCP";
+        printf("SOCKET_MODE : %s\n", binding_mode);
+        printf("Connecting to %s\n", server_address);
+
+        if (_interface) {
+            _interface->set_platform_network_handler(handler);
+        }
+    }
+
+    /*
+     *  Check private variable to see if the registration was sucessful or not
+     */
+    bool register_successful()
+    {
+        return _registered;
+    }
+
+    /*
+     *  Check private variable to see if un-registration was sucessful or not
+     */
+    bool unregister_successful()
+    {
+        return _unregistered;
+    }
+
+    /*
+     *  Creates register server object with mbed device server address and other parameters
+     *  required for client to connect to mbed device server.
+     */
+    M2MSecurity* create_register_object()
+    {
+        // Create security object using the interface factory.
+        // this will generate a security ObjectID and ObjectInstance
+        M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer);
+
+        // Make sure security ObjectID/ObjectInstance was created successfully
+        if (security) {
+            // Add ResourceID's and values to the security ObjectID/ObjectInstance
+            security->set_resource_value(M2MSecurity::M2MServerUri, _server_address);
+            security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Certificate);
+            security->set_resource_value(M2MSecurity::ServerPublicKey, SERVER_CERT, sizeof(SERVER_CERT) - 1);
+            security->set_resource_value(M2MSecurity::PublicKey, CERT, sizeof(CERT) - 1);
+            security->set_resource_value(M2MSecurity::Secretkey, KEY, sizeof(KEY) - 1);
+        }
+        return security;
+    }
+
+    /*
+     * Creates device object which contains mandatory resources linked with
+     * device endpoint.
+     */
+    M2MDevice* create_device_object()
+    {
+        // Create device objectID/ObjectInstance
+        M2MDevice *device = M2MInterfaceFactory::create_device();
+        // Make sure device object was created successfully
+        if (device) {
+            // Add resourceID's to device objectID/ObjectInstance
+            device->create_resource(M2MDevice::Manufacturer, _device.Manufacturer);
+            device->create_resource(M2MDevice::DeviceType, _device.Type);
+            device->create_resource(M2MDevice::ModelNumber, _device.ModelNumber);
+            device->create_resource(M2MDevice::SerialNumber, _device.SerialNumber);
+        }
+        return device;
+    }
+
+    /*
+     * Register an object
+     */
+    void test_register(M2MSecurity *register_object, M2MObjectList object_list)
+    {
+        if (_interface) {
+            // Register function
+            _interface->register_object(register_object, object_list);
+        }
+    }
+
+    /*
+     * Unregister all objects
+     */
+    void test_unregister()
+    {
+        if (_interface) {
+            // Unregister function
+            _interface->unregister_object(NULL); // NULL will unregister all objects
+        }
+    }
+
+    /*
+     * Callback from mbed client stack when the bootstrap
+     * is successful, it returns the mbed Device Server object
+     * which will be used for registering the resources to
+     * mbed Device server.
+     */
+    void bootstrap_done(M2MSecurity *server_object)
+    {
+        if (server_object) {
+            _bootstrapped = true;
+            _error = false;
+            printf("Bootstrapped\n");
+        }
+    }
+
+    /*
+     * Callback from mbed client stack when the registration
+     * is successful, it returns the mbed Device Server object
+     * to which the resources are registered and registered objects.
+     */
+    void object_registered(M2MSecurity */*security_object*/, const M2MServer & /*server_object*/)
+    {
+        _registered = true;
+        _unregistered = false;
+        printf("Registered object successfully!\n");
+    }
+
+    /*
+     * Callback from mbed client stack when the unregistration
+     * is successful, it returns the mbed Device Server object
+     * to which the resources were unregistered.
+     */
+    void object_unregistered(M2MSecurity */*server_object*/)
+    {
+        printf("Unregistered object successfully\n");
+        _unregistered = true;
+        _registered = false;
+    }
+
+    /*
+     * Callback from mbed client stack when registration is updated
+     */
+    void registration_updated(M2MSecurity */*security_object*/, const M2MServer & /*server_object*/)
+    {
+        /* The registration is updated automatically and frequently by the
+        *  mbed client stack. This print statement is turned off because it
+        *  tends to happen a lot.
+        */
+        //printf("Registration updated\n");
+    }
+
+    /*
+     * Callback from mbed client stack if any error is encountered
+     * during any of the LWM2M operations. Error type is passed in
+     * the callback.
+     */
+    void error(M2MInterface::Error error)
+    {
+        _error = true;
+        switch (error){
+            case M2MInterface::AlreadyExists:
+                printf("[ERROR:] M2MInterface::AlreadyExist\n");
+                break;
+            case M2MInterface::BootstrapFailed:
+                printf("[ERROR:] M2MInterface::BootstrapFailed\n");
+                break;
+            case M2MInterface::InvalidParameters:
+                printf("[ERROR:] M2MInterface::InvalidParameters\n");
+                break;
+            case M2MInterface::NotRegistered:
+                printf("[ERROR:] M2MInterface::NotRegistered\n");
+                break;
+            case M2MInterface::Timeout:
+                printf("[ERROR:] M2MInterface::Timeout\n");
+                break;
+            case M2MInterface::NetworkError:
+                printf("[ERROR:] M2MInterface::NetworkError\n");
+                break;
+            case M2MInterface::ResponseParseFailed:
+                printf("[ERROR:] M2MInterface::ResponseParseFailed\n");
+                break;
+            case M2MInterface::UnknownError:
+                printf("[ERROR:] M2MInterface::UnknownError\n");
+                break;
+            case M2MInterface::MemoryFail:
+                printf("[ERROR:] M2MInterface::MemoryFail\n");
+                break;
+            case M2MInterface::NotAllowed:
+                printf("[ERROR:] M2MInterface::NotAllowed\n");
+                break;
+            case M2MInterface::SecureConnectionFailed:
+                printf("[ERROR:] M2MInterface::SecureConnectionFailed\n");
+                break;
+            case M2MInterface::DnsResolvingFailed:
+                printf("[ERROR:] M2MInterface::DnsResolvingFailed\n");
+                break;
+            default:
+                break;
+        }
+    }
+
+    /*
+     * Callback from mbed client stack if any value has changed
+     *  during PUT operation. Object and its type is passed in
+     *  the callback.
+     *  BaseType enum from m2mbase.h
+     *       Object = 0x0, Resource = 0x1, ObjectInstance = 0x2, ResourceInstance = 0x3
+     */
+    void value_updated(M2MBase *base, M2MBase::BaseType type)
+    {
+        printf("PUT request received!");
+        printf("Name :'%s', \nPath : '%s', \nType : '%d' (0 for Object, 1 for Resource), \nType : '%s'\n",
+               base->name(),
+               base->uri_path(),
+               type,
+               base->resource_type());
+    }
+
+    /*
+     * Update the registration period
+     */
+    void test_update_register()
+    {
+        if (_registered) {
+            _interface->update_registration(_register_security, 100);
+        }
+    }
+
+    /*
+     * Manually configure the security object private variable
+     */
+   void set_register_object(M2MSecurity *register_object)
+   {
+        if (_register_security == NULL) {
+            _register_security = register_object;
+        }
+    }
+
+private:
+
+    /*
+     *  Private variables used in class
+     */
+    M2MInterface             *_interface;
+    M2MSecurity              *_register_security;
+    M2MObject                *_object;
+    volatile bool            _bootstrapped;
+    volatile bool            _error;
+    volatile bool            _registered;
+    volatile bool            _unregistered;
+    int                      _value;
+    struct MbedClientDevice  _device;
+    String                   _server_address;
+};
+
+#endif // __SIMPLECLIENT_H__