terence zhang / Mbed OS mbed-os-example-wakaama

Dependencies:   C12832 LM75B

Committer:
terencez
Date:
Sat May 06 11:21:27 2017 +0000
Revision:
14:ec9e195830ff
Parent:
object_device.c@4:35892233a85d
Child:
15:d0f20339c1ad
First compile version, registration success but could not handle request.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
terencez 0:f9d13e09cf11 1 /*******************************************************************************
terencez 0:f9d13e09cf11 2 *
terence zhang 4:35892233a85d 3 * Copyright (c) 2013, 2014, 2015 Intel Corporation and others.
terencez 0:f9d13e09cf11 4 * All rights reserved. This program and the accompanying materials
terencez 0:f9d13e09cf11 5 * are made available under the terms of the Eclipse Public License v1.0
terencez 0:f9d13e09cf11 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
terencez 0:f9d13e09cf11 7 *
terencez 0:f9d13e09cf11 8 * The Eclipse Public License is available at
terencez 0:f9d13e09cf11 9 * http://www.eclipse.org/legal/epl-v10.html
terencez 0:f9d13e09cf11 10 * The Eclipse Distribution License is available at
terencez 0:f9d13e09cf11 11 * http://www.eclipse.org/org/documents/edl-v10.php.
terencez 0:f9d13e09cf11 12 *
terencez 0:f9d13e09cf11 13 * Contributors:
terencez 0:f9d13e09cf11 14 * David Navarro, Intel Corporation - initial API and implementation
terencez 0:f9d13e09cf11 15 * domedambrosio - Please refer to git log
terencez 0:f9d13e09cf11 16 * Fabien Fleutot - Please refer to git log
terencez 0:f9d13e09cf11 17 * Axel Lorente - Please refer to git log
terence zhang 4:35892233a85d 18 * Bosch Software Innovations GmbH - Please refer to git log
terence zhang 4:35892233a85d 19 * Pascal Rieux - Please refer to git log
terencez 0:f9d13e09cf11 20 *
terencez 0:f9d13e09cf11 21 *******************************************************************************/
terencez 0:f9d13e09cf11 22
terencez 0:f9d13e09cf11 23 /*
terencez 0:f9d13e09cf11 24 Copyright (c) 2013, 2014 Intel Corporation
terencez 0:f9d13e09cf11 25
terencez 0:f9d13e09cf11 26 Redistribution and use in source and binary forms, with or without modification,
terencez 0:f9d13e09cf11 27 are permitted provided that the following conditions are met:
terencez 0:f9d13e09cf11 28
terencez 0:f9d13e09cf11 29 * Redistributions of source code must retain the above copyright notice,
terencez 0:f9d13e09cf11 30 this list of conditions and the following disclaimer.
terencez 0:f9d13e09cf11 31 * Redistributions in binary form must reproduce the above copyright notice,
terencez 0:f9d13e09cf11 32 this list of conditions and the following disclaimer in the documentation
terencez 0:f9d13e09cf11 33 and/or other materials provided with the distribution.
terencez 0:f9d13e09cf11 34 * Neither the name of Intel Corporation nor the names of its contributors
terencez 0:f9d13e09cf11 35 may be used to endorse or promote products derived from this software
terencez 0:f9d13e09cf11 36 without specific prior written permission.
terencez 0:f9d13e09cf11 37
terencez 0:f9d13e09cf11 38 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
terencez 0:f9d13e09cf11 39 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
terencez 0:f9d13e09cf11 40 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
terencez 0:f9d13e09cf11 41 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
terencez 0:f9d13e09cf11 42 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
terencez 0:f9d13e09cf11 43 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
terencez 0:f9d13e09cf11 44 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
terencez 0:f9d13e09cf11 45 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
terencez 0:f9d13e09cf11 46 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
terencez 0:f9d13e09cf11 47 THE POSSIBILITY OF SUCH DAMAGE.
terencez 0:f9d13e09cf11 48
terencez 0:f9d13e09cf11 49 David Navarro <david.navarro@intel.com>
terencez 0:f9d13e09cf11 50
terencez 0:f9d13e09cf11 51 */
terencez 0:f9d13e09cf11 52
terencez 0:f9d13e09cf11 53 /*
terencez 0:f9d13e09cf11 54 * This object is single instance only, and is mandatory to all LWM2M device as it describe the object such as its
terencez 0:f9d13e09cf11 55 * manufacturer, model, etc...
terence zhang 4:35892233a85d 56 *
terence zhang 4:35892233a85d 57 * Here we implement only some of the optional resources.
terence zhang 4:35892233a85d 58 *
terencez 0:f9d13e09cf11 59 */
terencez 0:f9d13e09cf11 60
terencez 0:f9d13e09cf11 61 #include "liblwm2m.h"
terencez 0:f9d13e09cf11 62
terencez 0:f9d13e09cf11 63 #include <stdio.h>
terencez 0:f9d13e09cf11 64 #include <stdlib.h>
terencez 0:f9d13e09cf11 65 #include <string.h>
terencez 0:f9d13e09cf11 66 #include <ctype.h>
terencez 0:f9d13e09cf11 67
terencez 0:f9d13e09cf11 68
terencez 0:f9d13e09cf11 69 #define PRV_MANUFACTURER "Open Mobile Alliance"
terencez 0:f9d13e09cf11 70 #define PRV_MODEL_NUMBER "Lightweight M2M Client"
terencez 0:f9d13e09cf11 71 #define PRV_BINDING_MODE "U"
terencez 0:f9d13e09cf11 72
terence zhang 4:35892233a85d 73 // Resource Id's:
terence zhang 4:35892233a85d 74 #define RES_O_MANUFACTURER 0
terence zhang 4:35892233a85d 75 #define RES_O_MODEL_NUMBER 1
terence zhang 4:35892233a85d 76 #define RES_O_SERIAL_NUMBER 2
terence zhang 4:35892233a85d 77 #define RES_O_FIRMWARE_VERSION 3
terence zhang 4:35892233a85d 78 #define RES_M_REBOOT 4
terence zhang 4:35892233a85d 79 #define RES_O_FACTORY_RESET 5
terence zhang 4:35892233a85d 80 #define RES_O_AVL_POWER_SOURCES 6
terence zhang 4:35892233a85d 81 #define RES_O_POWER_SOURCE_VOLTAGE 7
terence zhang 4:35892233a85d 82 #define RES_O_POWER_SOURCE_CURRENT 8
terence zhang 4:35892233a85d 83 #define RES_O_BATTERY_LEVEL 9
terence zhang 4:35892233a85d 84 #define RES_O_MEMORY_FREE 10
terence zhang 4:35892233a85d 85 #define RES_M_ERROR_CODE 11
terence zhang 4:35892233a85d 86 #define RES_O_RESET_ERROR_CODE 12
terence zhang 4:35892233a85d 87 #define RES_O_CURRENT_TIME 13
terence zhang 4:35892233a85d 88 #define RES_O_UTC_OFFSET 14
terence zhang 4:35892233a85d 89 #define RES_O_TIMEZONE 15
terence zhang 4:35892233a85d 90 #define RES_M_BINDING_MODES 16
terence zhang 4:35892233a85d 91 #define RES_O_DEVICE_TYPE 17
terence zhang 4:35892233a85d 92 #define RES_O_HARDWARE_VERSION 18
terence zhang 4:35892233a85d 93 #define RES_O_SOFTWARE_VERSION 19
terence zhang 4:35892233a85d 94 #define RES_O_BATTERY_STATUS 20
terence zhang 4:35892233a85d 95 #define RES_O_MEMORY_TOTAL 21
terencez 0:f9d13e09cf11 96
terencez 0:f9d13e09cf11 97
terence zhang 4:35892233a85d 98 static uint8_t prv_set_value(lwm2m_data_t * dataP)
terencez 0:f9d13e09cf11 99 {
terencez 0:f9d13e09cf11 100 // a simple switch structure is used to respond at the specified resource asked
terence zhang 4:35892233a85d 101 switch (dataP->id)
terencez 0:f9d13e09cf11 102 {
terence zhang 4:35892233a85d 103 case RES_O_MANUFACTURER:
terence zhang 4:35892233a85d 104 lwm2m_data_encode_string(PRV_MANUFACTURER, dataP);
terencez 0:f9d13e09cf11 105 return COAP_205_CONTENT;
terencez 0:f9d13e09cf11 106
terence zhang 4:35892233a85d 107 case RES_O_MODEL_NUMBER:
terence zhang 4:35892233a85d 108 lwm2m_data_encode_string(PRV_MODEL_NUMBER, dataP);
terencez 0:f9d13e09cf11 109 return COAP_205_CONTENT;
terencez 0:f9d13e09cf11 110
terence zhang 4:35892233a85d 111 case RES_M_REBOOT:
terence zhang 4:35892233a85d 112 return COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 113
terence zhang 4:35892233a85d 114 case RES_M_BINDING_MODES:
terence zhang 4:35892233a85d 115 lwm2m_data_encode_string(PRV_BINDING_MODE, dataP);
terencez 0:f9d13e09cf11 116 return COAP_205_CONTENT;
terencez 0:f9d13e09cf11 117
terence zhang 4:35892233a85d 118
terencez 0:f9d13e09cf11 119 default:
terencez 0:f9d13e09cf11 120 return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 121 }
terencez 0:f9d13e09cf11 122 }
terencez 0:f9d13e09cf11 123
terencez 0:f9d13e09cf11 124 static uint8_t prv_device_read(uint16_t instanceId,
terencez 0:f9d13e09cf11 125 int * numDataP,
terence zhang 4:35892233a85d 126 lwm2m_data_t ** dataArrayP,
terencez 0:f9d13e09cf11 127 lwm2m_object_t * objectP)
terencez 0:f9d13e09cf11 128 {
terencez 0:f9d13e09cf11 129 uint8_t result;
terencez 0:f9d13e09cf11 130 int i;
terencez 0:f9d13e09cf11 131
terencez 0:f9d13e09cf11 132 // this is a single instance object
terencez 0:f9d13e09cf11 133 if (instanceId != 0)
terencez 0:f9d13e09cf11 134 {
terencez 0:f9d13e09cf11 135 return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 136 }
terencez 0:f9d13e09cf11 137
terencez 0:f9d13e09cf11 138 // is the server asking for the full object ?
terencez 0:f9d13e09cf11 139 if (*numDataP == 0)
terencez 0:f9d13e09cf11 140 {
terence zhang 4:35892233a85d 141 uint16_t resList[] = {
terence zhang 4:35892233a85d 142 RES_O_MANUFACTURER,
terence zhang 4:35892233a85d 143 RES_O_MODEL_NUMBER,
terence zhang 4:35892233a85d 144 RES_M_BINDING_MODES
terence zhang 4:35892233a85d 145 };
terencez 0:f9d13e09cf11 146 int nbRes = sizeof(resList)/sizeof(uint16_t);
terencez 0:f9d13e09cf11 147
terence zhang 4:35892233a85d 148 *dataArrayP = lwm2m_data_new(nbRes);
terencez 0:f9d13e09cf11 149 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terencez 0:f9d13e09cf11 150 *numDataP = nbRes;
terencez 0:f9d13e09cf11 151 for (i = 0 ; i < nbRes ; i++)
terencez 0:f9d13e09cf11 152 {
terencez 0:f9d13e09cf11 153 (*dataArrayP)[i].id = resList[i];
terencez 0:f9d13e09cf11 154 }
terencez 0:f9d13e09cf11 155 }
terencez 0:f9d13e09cf11 156
terencez 0:f9d13e09cf11 157 i = 0;
terencez 0:f9d13e09cf11 158 do
terencez 0:f9d13e09cf11 159 {
terence zhang 4:35892233a85d 160 result = prv_set_value((*dataArrayP) + i);
terencez 0:f9d13e09cf11 161 i++;
terencez 0:f9d13e09cf11 162 } while (i < *numDataP && result == COAP_205_CONTENT);
terencez 0:f9d13e09cf11 163
terencez 0:f9d13e09cf11 164 return result;
terencez 0:f9d13e09cf11 165 }
terencez 0:f9d13e09cf11 166
terence zhang 4:35892233a85d 167 static uint8_t prv_device_discover(uint16_t instanceId,
terence zhang 4:35892233a85d 168 int * numDataP,
terence zhang 4:35892233a85d 169 lwm2m_data_t ** dataArrayP,
terence zhang 4:35892233a85d 170 lwm2m_object_t * objectP)
terencez 0:f9d13e09cf11 171 {
terence zhang 4:35892233a85d 172 uint8_t result;
terencez 0:f9d13e09cf11 173 int i;
terencez 0:f9d13e09cf11 174
terencez 0:f9d13e09cf11 175 // this is a single instance object
terencez 0:f9d13e09cf11 176 if (instanceId != 0)
terencez 0:f9d13e09cf11 177 {
terencez 0:f9d13e09cf11 178 return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 179 }
terencez 0:f9d13e09cf11 180
terence zhang 4:35892233a85d 181 result = COAP_205_CONTENT;
terencez 0:f9d13e09cf11 182
terence zhang 4:35892233a85d 183 // is the server asking for the full object ?
terence zhang 4:35892233a85d 184 if (*numDataP == 0)
terencez 0:f9d13e09cf11 185 {
terence zhang 4:35892233a85d 186 uint16_t resList[] = {
terence zhang 4:35892233a85d 187 RES_O_MANUFACTURER,
terence zhang 4:35892233a85d 188 RES_O_MODEL_NUMBER,
terence zhang 4:35892233a85d 189 RES_M_BINDING_MODES,
terence zhang 4:35892233a85d 190 RES_M_REBOOT
terence zhang 4:35892233a85d 191 };
terence zhang 4:35892233a85d 192 int nbRes = sizeof(resList)/sizeof(uint16_t);
terencez 0:f9d13e09cf11 193
terence zhang 4:35892233a85d 194 *dataArrayP = lwm2m_data_new(nbRes);
terence zhang 4:35892233a85d 195 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 196 *numDataP = nbRes;
terence zhang 4:35892233a85d 197 for (i = 0 ; i < nbRes ; i++)
terence zhang 4:35892233a85d 198 {
terence zhang 4:35892233a85d 199 (*dataArrayP)[i].id = resList[i];
terence zhang 4:35892233a85d 200 }
terence zhang 4:35892233a85d 201 }
terence zhang 4:35892233a85d 202 else
terence zhang 4:35892233a85d 203 {
terence zhang 4:35892233a85d 204 for (i = 0; i < *numDataP && result == COAP_205_CONTENT; i++)
terence zhang 4:35892233a85d 205 {
terence zhang 4:35892233a85d 206 switch ((*dataArrayP)[i].id)
terencez 0:f9d13e09cf11 207 {
terence zhang 4:35892233a85d 208 case RES_O_MANUFACTURER:
terence zhang 4:35892233a85d 209 case RES_O_MODEL_NUMBER:
terence zhang 4:35892233a85d 210 case RES_M_BINDING_MODES:
terence zhang 4:35892233a85d 211 case RES_M_REBOOT:
terence zhang 4:35892233a85d 212 break;
terence zhang 4:35892233a85d 213 default:
terence zhang 4:35892233a85d 214 result = COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 215 }
terencez 0:f9d13e09cf11 216 }
terence zhang 4:35892233a85d 217 }
terencez 0:f9d13e09cf11 218
terencez 0:f9d13e09cf11 219 return result;
terencez 0:f9d13e09cf11 220 }
terencez 0:f9d13e09cf11 221
terencez 0:f9d13e09cf11 222 static uint8_t prv_device_execute(uint16_t instanceId,
terencez 0:f9d13e09cf11 223 uint16_t resourceId,
terence zhang 4:35892233a85d 224 uint8_t * buffer,
terencez 0:f9d13e09cf11 225 int length,
terencez 0:f9d13e09cf11 226 lwm2m_object_t * objectP)
terencez 0:f9d13e09cf11 227 {
terencez 0:f9d13e09cf11 228 // this is a single instance object
terencez 0:f9d13e09cf11 229 if (instanceId != 0)
terencez 0:f9d13e09cf11 230 {
terencez 0:f9d13e09cf11 231 return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 232 }
terencez 0:f9d13e09cf11 233
terencez 0:f9d13e09cf11 234 if (length != 0) return COAP_400_BAD_REQUEST;
terencez 0:f9d13e09cf11 235
terence zhang 4:35892233a85d 236 if (resourceId == RES_M_REBOOT)
terencez 0:f9d13e09cf11 237 {
terencez 0:f9d13e09cf11 238 fprintf(stdout, "\n\t REBOOT\r\n\n");
terencez 0:f9d13e09cf11 239 return COAP_204_CHANGED;
terencez 0:f9d13e09cf11 240 }
terence zhang 4:35892233a85d 241
terence zhang 4:35892233a85d 242 return COAP_405_METHOD_NOT_ALLOWED;
terencez 0:f9d13e09cf11 243 }
terencez 0:f9d13e09cf11 244
terencez 0:f9d13e09cf11 245 lwm2m_object_t * get_object_device()
terencez 0:f9d13e09cf11 246 {
terencez 0:f9d13e09cf11 247 /*
terencez 0:f9d13e09cf11 248 * The get_object_device function create the object itself and return a pointer to the structure that represent it.
terencez 0:f9d13e09cf11 249 */
terencez 0:f9d13e09cf11 250 lwm2m_object_t * deviceObj;
terencez 0:f9d13e09cf11 251
terence zhang 4:35892233a85d 252 deviceObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
terencez 0:f9d13e09cf11 253
terencez 0:f9d13e09cf11 254 if (NULL != deviceObj)
terencez 0:f9d13e09cf11 255 {
terencez 0:f9d13e09cf11 256 memset(deviceObj, 0, sizeof(lwm2m_object_t));
terencez 0:f9d13e09cf11 257
terencez 0:f9d13e09cf11 258 /*
terence zhang 4:35892233a85d 259 * It assigns his unique ID
terencez 0:f9d13e09cf11 260 * The 3 is the standard ID for the mandatory object "Object device".
terencez 0:f9d13e09cf11 261 */
terence zhang 4:35892233a85d 262 deviceObj->objID = LWM2M_DEVICE_OBJECT_ID;
terencez 0:f9d13e09cf11 263
terencez 0:f9d13e09cf11 264 /*
terence zhang 4:35892233a85d 265 * and its unique instance
terence zhang 4:35892233a85d 266 *
terence zhang 4:35892233a85d 267 */
terence zhang 4:35892233a85d 268 deviceObj->instanceList = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t));
terence zhang 4:35892233a85d 269 if (NULL != deviceObj->instanceList)
terence zhang 4:35892233a85d 270 {
terence zhang 4:35892233a85d 271 memset(deviceObj->instanceList, 0, sizeof(lwm2m_list_t));
terence zhang 4:35892233a85d 272 }
terence zhang 4:35892233a85d 273 else
terence zhang 4:35892233a85d 274 {
terence zhang 4:35892233a85d 275 lwm2m_free(deviceObj);
terence zhang 4:35892233a85d 276 return NULL;
terence zhang 4:35892233a85d 277 }
terence zhang 4:35892233a85d 278
terence zhang 4:35892233a85d 279 /*
terencez 0:f9d13e09cf11 280 * And the private function that will access the object.
terencez 0:f9d13e09cf11 281 * Those function will be called when a read/write/execute query is made by the server. In fact the library don't need to
terencez 0:f9d13e09cf11 282 * know the resources of the object, only the server does.
terencez 0:f9d13e09cf11 283 */
terence zhang 4:35892233a85d 284 deviceObj->readFunc = prv_device_read;
terence zhang 4:35892233a85d 285 deviceObj->executeFunc = prv_device_execute;
terence zhang 4:35892233a85d 286 deviceObj->discoverFunc = prv_device_discover;
terencez 0:f9d13e09cf11 287
terence zhang 4:35892233a85d 288 }
terencez 0:f9d13e09cf11 289
terencez 0:f9d13e09cf11 290 return deviceObj;
terencez 0:f9d13e09cf11 291 }
terence zhang 4:35892233a85d 292
terence zhang 4:35892233a85d 293 void free_object_device(lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 294 {
terence zhang 4:35892233a85d 295 if (NULL != objectP->userData)
terence zhang 4:35892233a85d 296 {
terence zhang 4:35892233a85d 297 lwm2m_free(objectP->userData);
terence zhang 4:35892233a85d 298 objectP->userData = NULL;
terence zhang 4:35892233a85d 299 }
terence zhang 4:35892233a85d 300 if (NULL != objectP->instanceList)
terence zhang 4:35892233a85d 301 {
terence zhang 4:35892233a85d 302 lwm2m_free(objectP->instanceList);
terence zhang 4:35892233a85d 303 objectP->instanceList = NULL;
terence zhang 4:35892233a85d 304 }
terence zhang 4:35892233a85d 305
terence zhang 4:35892233a85d 306 lwm2m_free(objectP);
terence zhang 4:35892233a85d 307 }