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

Dependencies:   C12832 LM75B

Committer:
terence zhang
Date:
Fri Apr 28 18:20:36 2017 +0800
Revision:
4:35892233a85d
Parent:
2:5a8853c481ad
update and merge wakaama objects from examples/lightclient.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
terencez 0:f9d13e09cf11 1 /*******************************************************************************
terencez 0:f9d13e09cf11 2 *
terencez 0:f9d13e09cf11 3 * Copyright (c) 2013, 2014 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 * Julien Vermillard, Sierra Wireless
terence zhang 4:35892233a85d 16 * Bosch Software Innovations GmbH - Please refer to git log
terence zhang 4:35892233a85d 17 * Pascal Rieux - Please refer to git log
terencez 0:f9d13e09cf11 18 *
terencez 0:f9d13e09cf11 19 *******************************************************************************/
terencez 0:f9d13e09cf11 20
terencez 0:f9d13e09cf11 21 /*
terencez 0:f9d13e09cf11 22 * Resources:
terencez 0:f9d13e09cf11 23 *
terencez 0:f9d13e09cf11 24 * Name | ID | Operations | Instances | Mandatory | Type | Range | Units |
terencez 0:f9d13e09cf11 25 * Short ID | 0 | R | Single | Yes | Integer | 1-65535 | |
terencez 0:f9d13e09cf11 26 * Lifetime | 1 | R/W | Single | Yes | Integer | | s |
terencez 0:f9d13e09cf11 27 * Default Min Period | 2 | R/W | Single | No | Integer | | s |
terencez 0:f9d13e09cf11 28 * Default Max Period | 3 | R/W | Single | No | Integer | | s |
terencez 0:f9d13e09cf11 29 * Disable | 4 | E | Single | No | | | |
terencez 0:f9d13e09cf11 30 * Disable Timeout | 5 | R/W | Single | No | Integer | | s |
terence zhang 4:35892233a85d 31 * Notification Storing | 6 | R/W | Single | Yes | Boolean | | |
terence zhang 4:35892233a85d 32 * Binding | 7 | R/W | Single | Yes | String | | |
terencez 0:f9d13e09cf11 33 * Registration Update | 8 | E | Single | Yes | | | |
terencez 0:f9d13e09cf11 34 *
terencez 0:f9d13e09cf11 35 */
terencez 0:f9d13e09cf11 36
terence zhang 4:35892233a85d 37 #include "liblwm2m.h"
terence zhang 4:35892233a85d 38
terence zhang 4:35892233a85d 39 #include <stdio.h>
terence zhang 4:35892233a85d 40 #include <stdlib.h>
terence zhang 4:35892233a85d 41 #include <string.h>
terence zhang 4:35892233a85d 42
terence zhang 4:35892233a85d 43 typedef struct _server_instance_
terence zhang 4:35892233a85d 44 {
terence zhang 4:35892233a85d 45 struct _server_instance_ * next; // matches lwm2m_list_t::next
terence zhang 4:35892233a85d 46 uint16_t instanceId; // matches lwm2m_list_t::id
terence zhang 4:35892233a85d 47 uint16_t shortServerId;
terence zhang 4:35892233a85d 48 uint32_t lifetime;
terence zhang 4:35892233a85d 49 bool storing;
terence zhang 4:35892233a85d 50 char binding[4];
terence zhang 4:35892233a85d 51 } server_instance_t;
terence zhang 4:35892233a85d 52
terence zhang 4:35892233a85d 53 static uint8_t prv_get_value(lwm2m_data_t * dataP,
terence zhang 4:35892233a85d 54 server_instance_t * targetP)
terence zhang 4:35892233a85d 55 {
terence zhang 4:35892233a85d 56 switch (dataP->id)
terence zhang 4:35892233a85d 57 {
terence zhang 4:35892233a85d 58 case LWM2M_SERVER_SHORT_ID_ID:
terence zhang 4:35892233a85d 59 lwm2m_data_encode_int(targetP->shortServerId, dataP);
terence zhang 4:35892233a85d 60 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 61
terence zhang 4:35892233a85d 62 case LWM2M_SERVER_LIFETIME_ID:
terence zhang 4:35892233a85d 63 lwm2m_data_encode_int(targetP->lifetime, dataP);
terence zhang 4:35892233a85d 64 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 65
terence zhang 4:35892233a85d 66 case LWM2M_SERVER_DISABLE_ID:
terence zhang 4:35892233a85d 67 return COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 68
terence zhang 4:35892233a85d 69 case LWM2M_SERVER_STORING_ID:
terence zhang 4:35892233a85d 70 lwm2m_data_encode_bool(targetP->storing, dataP);
terence zhang 4:35892233a85d 71 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 72
terence zhang 4:35892233a85d 73 case LWM2M_SERVER_BINDING_ID:
terence zhang 4:35892233a85d 74 lwm2m_data_encode_string(targetP->binding, dataP);
terence zhang 4:35892233a85d 75 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 76
terence zhang 4:35892233a85d 77 case LWM2M_SERVER_UPDATE_ID:
terence zhang 4:35892233a85d 78 return COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 79
terence zhang 4:35892233a85d 80 default:
terence zhang 4:35892233a85d 81 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 82 }
terence zhang 4:35892233a85d 83 }
terence zhang 4:35892233a85d 84
terence zhang 4:35892233a85d 85 static uint8_t prv_server_read(uint16_t instanceId,
terence zhang 4:35892233a85d 86 int * numDataP,
terence zhang 4:35892233a85d 87 lwm2m_data_t ** dataArrayP,
terence zhang 4:35892233a85d 88 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 89 {
terence zhang 4:35892233a85d 90 server_instance_t * targetP;
terence zhang 4:35892233a85d 91 uint8_t result;
terence zhang 4:35892233a85d 92 int i;
terence zhang 4:35892233a85d 93
terence zhang 4:35892233a85d 94 targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);
terence zhang 4:35892233a85d 95 if (NULL == targetP) return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 96
terence zhang 4:35892233a85d 97 // is the server asking for the full instance ?
terence zhang 4:35892233a85d 98 if (*numDataP == 0)
terence zhang 4:35892233a85d 99 {
terence zhang 4:35892233a85d 100 uint16_t resList[] = {
terence zhang 4:35892233a85d 101 LWM2M_SERVER_SHORT_ID_ID,
terence zhang 4:35892233a85d 102 LWM2M_SERVER_LIFETIME_ID,
terence zhang 4:35892233a85d 103 LWM2M_SERVER_STORING_ID,
terence zhang 4:35892233a85d 104 LWM2M_SERVER_BINDING_ID
terence zhang 4:35892233a85d 105 };
terence zhang 4:35892233a85d 106 int nbRes = sizeof(resList)/sizeof(uint16_t);
terence zhang 4:35892233a85d 107
terence zhang 4:35892233a85d 108 *dataArrayP = lwm2m_data_new(nbRes);
terence zhang 4:35892233a85d 109 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 110 *numDataP = nbRes;
terence zhang 4:35892233a85d 111 for (i = 0 ; i < nbRes ; i++)
terence zhang 4:35892233a85d 112 {
terence zhang 4:35892233a85d 113 (*dataArrayP)[i].id = resList[i];
terence zhang 4:35892233a85d 114 }
terence zhang 4:35892233a85d 115 }
terence zhang 4:35892233a85d 116
terence zhang 4:35892233a85d 117 i = 0;
terence zhang 4:35892233a85d 118 do
terence zhang 4:35892233a85d 119 {
terence zhang 4:35892233a85d 120 result = prv_get_value((*dataArrayP) + i, targetP);
terence zhang 4:35892233a85d 121 i++;
terence zhang 4:35892233a85d 122 } while (i < *numDataP && result == COAP_205_CONTENT);
terence zhang 4:35892233a85d 123
terence zhang 4:35892233a85d 124 return result;
terence zhang 4:35892233a85d 125 }
terencez 0:f9d13e09cf11 126
terence zhang 4:35892233a85d 127 static uint8_t prv_server_discover(uint16_t instanceId,
terence zhang 4:35892233a85d 128 int * numDataP,
terence zhang 4:35892233a85d 129 lwm2m_data_t ** dataArrayP,
terence zhang 4:35892233a85d 130 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 131 {
terence zhang 4:35892233a85d 132 uint8_t result;
terence zhang 4:35892233a85d 133 int i;
terence zhang 4:35892233a85d 134
terence zhang 4:35892233a85d 135 result = COAP_205_CONTENT;
terencez 0:f9d13e09cf11 136
terence zhang 4:35892233a85d 137 // is the server asking for the full object ?
terence zhang 4:35892233a85d 138 if (*numDataP == 0)
terencez 0:f9d13e09cf11 139 {
terence zhang 4:35892233a85d 140 uint16_t resList[] = {
terence zhang 4:35892233a85d 141 LWM2M_SERVER_SHORT_ID_ID,
terence zhang 4:35892233a85d 142 LWM2M_SERVER_LIFETIME_ID,
terence zhang 4:35892233a85d 143 LWM2M_SERVER_MIN_PERIOD_ID,
terence zhang 4:35892233a85d 144 LWM2M_SERVER_MAX_PERIOD_ID,
terence zhang 4:35892233a85d 145 LWM2M_SERVER_DISABLE_ID,
terence zhang 4:35892233a85d 146 LWM2M_SERVER_TIMEOUT_ID,
terence zhang 4:35892233a85d 147 LWM2M_SERVER_STORING_ID,
terence zhang 4:35892233a85d 148 LWM2M_SERVER_BINDING_ID,
terence zhang 4:35892233a85d 149 LWM2M_SERVER_UPDATE_ID
terence zhang 4:35892233a85d 150 };
terence zhang 4:35892233a85d 151 int nbRes = sizeof(resList)/sizeof(uint16_t);
terence zhang 4:35892233a85d 152
terence zhang 4:35892233a85d 153 *dataArrayP = lwm2m_data_new(nbRes);
terence zhang 4:35892233a85d 154 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 155 *numDataP = nbRes;
terence zhang 4:35892233a85d 156 for (i = 0 ; i < nbRes ; i++)
terence zhang 4:35892233a85d 157 {
terence zhang 4:35892233a85d 158 (*dataArrayP)[i].id = resList[i];
terence zhang 4:35892233a85d 159 }
terencez 0:f9d13e09cf11 160 }
terencez 0:f9d13e09cf11 161 else
terencez 0:f9d13e09cf11 162 {
terence zhang 4:35892233a85d 163 for (i = 0; i < *numDataP && result == COAP_205_CONTENT; i++)
terence zhang 4:35892233a85d 164 {
terence zhang 4:35892233a85d 165 switch ((*dataArrayP)[i].id)
terence zhang 4:35892233a85d 166 {
terence zhang 4:35892233a85d 167 case LWM2M_SERVER_SHORT_ID_ID:
terence zhang 4:35892233a85d 168 case LWM2M_SERVER_LIFETIME_ID:
terence zhang 4:35892233a85d 169 case LWM2M_SERVER_MIN_PERIOD_ID:
terence zhang 4:35892233a85d 170 case LWM2M_SERVER_MAX_PERIOD_ID:
terence zhang 4:35892233a85d 171 case LWM2M_SERVER_DISABLE_ID:
terence zhang 4:35892233a85d 172 case LWM2M_SERVER_TIMEOUT_ID:
terence zhang 4:35892233a85d 173 case LWM2M_SERVER_STORING_ID:
terence zhang 4:35892233a85d 174 case LWM2M_SERVER_BINDING_ID:
terence zhang 4:35892233a85d 175 case LWM2M_SERVER_UPDATE_ID:
terence zhang 4:35892233a85d 176 break;
terence zhang 4:35892233a85d 177 default:
terence zhang 4:35892233a85d 178 result = COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 179 }
terence zhang 4:35892233a85d 180 }
terence zhang 4:35892233a85d 181 }
terencez 0:f9d13e09cf11 182
terence zhang 4:35892233a85d 183 return result;
terence zhang 4:35892233a85d 184 }
terencez 0:f9d13e09cf11 185
terence zhang 4:35892233a85d 186 static uint8_t prv_set_int_value(lwm2m_data_t * dataArray,
terence zhang 4:35892233a85d 187 uint32_t * data)
terence zhang 4:35892233a85d 188 {
terence zhang 4:35892233a85d 189 uint8_t result;
terence zhang 4:35892233a85d 190 int64_t value;
terence zhang 4:35892233a85d 191
terence zhang 4:35892233a85d 192 if (1 == lwm2m_data_decode_int(dataArray, &value))
terence zhang 4:35892233a85d 193 {
terence zhang 4:35892233a85d 194 if (value >= 0 && value <= 0xFFFFFFFF)
terencez 0:f9d13e09cf11 195 {
terence zhang 4:35892233a85d 196 *data = value;
terence zhang 4:35892233a85d 197 result = COAP_204_CHANGED;
terencez 0:f9d13e09cf11 198 }
terencez 0:f9d13e09cf11 199 else
terencez 0:f9d13e09cf11 200 {
terence zhang 4:35892233a85d 201 result = COAP_406_NOT_ACCEPTABLE;
terence zhang 4:35892233a85d 202 }
terence zhang 4:35892233a85d 203 }
terence zhang 4:35892233a85d 204 else
terence zhang 4:35892233a85d 205 {
terence zhang 4:35892233a85d 206 result = COAP_400_BAD_REQUEST;
terence zhang 4:35892233a85d 207 }
terence zhang 4:35892233a85d 208 return result;
terence zhang 4:35892233a85d 209 }
terence zhang 4:35892233a85d 210
terence zhang 4:35892233a85d 211 static uint8_t prv_server_write(uint16_t instanceId,
terence zhang 4:35892233a85d 212 int numData,
terence zhang 4:35892233a85d 213 lwm2m_data_t * dataArray,
terence zhang 4:35892233a85d 214 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 215 {
terence zhang 4:35892233a85d 216 server_instance_t * targetP;
terence zhang 4:35892233a85d 217 int i;
terence zhang 4:35892233a85d 218 uint8_t result;
terence zhang 4:35892233a85d 219
terence zhang 4:35892233a85d 220 targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);
terence zhang 4:35892233a85d 221 if (NULL == targetP)
terence zhang 4:35892233a85d 222 {
terence zhang 4:35892233a85d 223 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 224 }
terence zhang 4:35892233a85d 225
terence zhang 4:35892233a85d 226 i = 0;
terence zhang 4:35892233a85d 227 do
terence zhang 4:35892233a85d 228 {
terence zhang 4:35892233a85d 229 switch (dataArray[i].id)
terence zhang 4:35892233a85d 230 {
terence zhang 4:35892233a85d 231 case LWM2M_SERVER_SHORT_ID_ID:
terence zhang 4:35892233a85d 232 {
terence zhang 4:35892233a85d 233 uint32_t value;
terence zhang 4:35892233a85d 234
terence zhang 4:35892233a85d 235 result = prv_set_int_value(dataArray + i, &value);
terence zhang 4:35892233a85d 236 if (COAP_204_CHANGED == result)
terencez 0:f9d13e09cf11 237 {
terence zhang 4:35892233a85d 238 if (0 < value && value <= 0xFFFF)
terencez 0:f9d13e09cf11 239 {
terence zhang 4:35892233a85d 240 targetP->shortServerId = value;
terencez 0:f9d13e09cf11 241 }
terencez 0:f9d13e09cf11 242 else
terencez 0:f9d13e09cf11 243 {
terence zhang 4:35892233a85d 244 result = COAP_406_NOT_ACCEPTABLE;
terencez 0:f9d13e09cf11 245 }
terence zhang 4:35892233a85d 246 }
terence zhang 4:35892233a85d 247 }
terence zhang 4:35892233a85d 248 break;
terencez 0:f9d13e09cf11 249
terence zhang 4:35892233a85d 250 case LWM2M_SERVER_LIFETIME_ID:
terence zhang 4:35892233a85d 251 result = prv_set_int_value(dataArray + i, (uint32_t *)&(targetP->lifetime));
terence zhang 4:35892233a85d 252 break;
terencez 0:f9d13e09cf11 253
terence zhang 4:35892233a85d 254 case LWM2M_SERVER_DISABLE_ID:
terence zhang 4:35892233a85d 255 result = COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 256 break;
terence zhang 4:35892233a85d 257
terence zhang 4:35892233a85d 258 case LWM2M_SERVER_STORING_ID:
terence zhang 4:35892233a85d 259 {
terence zhang 4:35892233a85d 260 bool value;
terence zhang 4:35892233a85d 261
terence zhang 4:35892233a85d 262 if (1 == lwm2m_data_decode_bool(dataArray + i, &value))
terence zhang 4:35892233a85d 263 {
terence zhang 4:35892233a85d 264 targetP->storing = value;
terence zhang 4:35892233a85d 265 result = COAP_204_CHANGED;
terence zhang 4:35892233a85d 266 }
terence zhang 4:35892233a85d 267 else
terence zhang 4:35892233a85d 268 {
terence zhang 4:35892233a85d 269 result = COAP_400_BAD_REQUEST;
terencez 0:f9d13e09cf11 270 }
terencez 0:f9d13e09cf11 271 }
terence zhang 4:35892233a85d 272 break;
terence zhang 4:35892233a85d 273
terence zhang 4:35892233a85d 274 case LWM2M_SERVER_BINDING_ID:
terence zhang 4:35892233a85d 275 if ((dataArray[i].type == LWM2M_TYPE_STRING || dataArray[i].type == LWM2M_TYPE_OPAQUE)
terence zhang 4:35892233a85d 276 && dataArray[i].value.asBuffer.length > 0 && dataArray[i].value.asBuffer.length <= 3
terence zhang 4:35892233a85d 277 && (strncmp((char*)dataArray[i].value.asBuffer.buffer, "U", dataArray[i].value.asBuffer.length) == 0
terence zhang 4:35892233a85d 278 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "UQ", dataArray[i].value.asBuffer.length) == 0
terence zhang 4:35892233a85d 279 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "S", dataArray[i].value.asBuffer.length) == 0
terence zhang 4:35892233a85d 280 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "SQ", dataArray[i].value.asBuffer.length) == 0
terence zhang 4:35892233a85d 281 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "US", dataArray[i].value.asBuffer.length) == 0
terence zhang 4:35892233a85d 282 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "UQS", dataArray[i].value.asBuffer.length) == 0))
terence zhang 4:35892233a85d 283 {
terence zhang 4:35892233a85d 284 strncpy(targetP->binding, (char*)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);
terence zhang 4:35892233a85d 285 result = COAP_204_CHANGED;
terence zhang 4:35892233a85d 286 }
terence zhang 4:35892233a85d 287 else
terence zhang 4:35892233a85d 288 {
terence zhang 4:35892233a85d 289 result = COAP_400_BAD_REQUEST;
terence zhang 4:35892233a85d 290 }
terence zhang 4:35892233a85d 291 break;
terence zhang 4:35892233a85d 292
terence zhang 4:35892233a85d 293 case LWM2M_SERVER_UPDATE_ID:
terence zhang 4:35892233a85d 294 result = COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 295 break;
terence zhang 4:35892233a85d 296
terence zhang 4:35892233a85d 297 default:
terence zhang 4:35892233a85d 298 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 299 }
terence zhang 4:35892233a85d 300 i++;
terence zhang 4:35892233a85d 301 } while (i < numData && result == COAP_204_CHANGED);
terence zhang 4:35892233a85d 302
terence zhang 4:35892233a85d 303 return result;
terencez 0:f9d13e09cf11 304 }
terencez 0:f9d13e09cf11 305
terence zhang 4:35892233a85d 306 static uint8_t prv_server_execute(uint16_t instanceId,
terence zhang 4:35892233a85d 307 uint16_t resourceId,
terence zhang 4:35892233a85d 308 uint8_t * buffer,
terence zhang 4:35892233a85d 309 int length,
terence zhang 4:35892233a85d 310 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 311
terencez 0:f9d13e09cf11 312 {
terence zhang 4:35892233a85d 313 server_instance_t * targetP;
terencez 0:f9d13e09cf11 314
terence zhang 4:35892233a85d 315 targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);
terence zhang 4:35892233a85d 316 if (NULL == targetP) return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 317
terence zhang 4:35892233a85d 318 switch (resourceId)
terence zhang 4:35892233a85d 319 {
terence zhang 4:35892233a85d 320 case LWM2M_SERVER_DISABLE_ID:
terence zhang 4:35892233a85d 321 // executed in core, if COAP_204_CHANGED is returned
terence zhang 4:35892233a85d 322 return COAP_204_CHANGED;
terencez 0:f9d13e09cf11 323
terence zhang 4:35892233a85d 324 case LWM2M_SERVER_UPDATE_ID:
terence zhang 4:35892233a85d 325 // executed in core, if COAP_204_CHANGED is returned
terence zhang 4:35892233a85d 326 return COAP_204_CHANGED;
terencez 0:f9d13e09cf11 327
terencez 0:f9d13e09cf11 328 default:
terencez 0:f9d13e09cf11 329 return COAP_405_METHOD_NOT_ALLOWED;
terencez 0:f9d13e09cf11 330 }
terencez 0:f9d13e09cf11 331 }
terencez 0:f9d13e09cf11 332
terence zhang 4:35892233a85d 333 static uint8_t prv_server_delete(uint16_t id,
terence zhang 4:35892233a85d 334 lwm2m_object_t * objectP)
terencez 0:f9d13e09cf11 335 {
terence zhang 4:35892233a85d 336 server_instance_t * serverInstance;
terencez 0:f9d13e09cf11 337
terence zhang 4:35892233a85d 338 objectP->instanceList = lwm2m_list_remove(objectP->instanceList, id, (lwm2m_list_t **)&serverInstance);
terence zhang 4:35892233a85d 339 if (NULL == serverInstance) return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 340
terence zhang 4:35892233a85d 341 lwm2m_free(serverInstance);
terence zhang 4:35892233a85d 342
terence zhang 4:35892233a85d 343 return COAP_202_DELETED;
terencez 0:f9d13e09cf11 344 }
terencez 0:f9d13e09cf11 345
terence zhang 4:35892233a85d 346 static uint8_t prv_server_create(uint16_t instanceId,
terence zhang 4:35892233a85d 347 int numData,
terence zhang 4:35892233a85d 348 lwm2m_data_t * dataArray,
terence zhang 4:35892233a85d 349 lwm2m_object_t * objectP)
terencez 0:f9d13e09cf11 350 {
terence zhang 4:35892233a85d 351 server_instance_t * serverInstance;
terence zhang 4:35892233a85d 352 uint8_t result;
terence zhang 4:35892233a85d 353
terence zhang 4:35892233a85d 354 serverInstance = (server_instance_t *)lwm2m_malloc(sizeof(server_instance_t));
terence zhang 4:35892233a85d 355 if (NULL == serverInstance) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 356 memset(serverInstance, 0, sizeof(server_instance_t));
terencez 0:f9d13e09cf11 357
terence zhang 4:35892233a85d 358 serverInstance->instanceId = instanceId;
terence zhang 4:35892233a85d 359 objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, serverInstance);
terence zhang 4:35892233a85d 360
terence zhang 4:35892233a85d 361 result = prv_server_write(instanceId, numData, dataArray, objectP);
terencez 0:f9d13e09cf11 362
terence zhang 4:35892233a85d 363 if (result != COAP_204_CHANGED)
terence zhang 4:35892233a85d 364 {
terence zhang 4:35892233a85d 365 (void)prv_server_delete(instanceId, objectP);
terence zhang 4:35892233a85d 366 }
terence zhang 4:35892233a85d 367 else
terence zhang 4:35892233a85d 368 {
terence zhang 4:35892233a85d 369 result = COAP_201_CREATED;
terence zhang 4:35892233a85d 370 }
terence zhang 4:35892233a85d 371
terence zhang 4:35892233a85d 372 return result;
terencez 0:f9d13e09cf11 373 }
terencez 0:f9d13e09cf11 374
terence zhang 4:35892233a85d 375 lwm2m_object_t * get_server_object()
terencez 0:f9d13e09cf11 376 {
terence zhang 4:35892233a85d 377 lwm2m_object_t * serverObj;
terence zhang 4:35892233a85d 378
terence zhang 4:35892233a85d 379 serverObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
terence zhang 4:35892233a85d 380
terence zhang 4:35892233a85d 381 if (NULL != serverObj)
terence zhang 4:35892233a85d 382 {
terence zhang 4:35892233a85d 383 server_instance_t * serverInstance;
terence zhang 4:35892233a85d 384
terence zhang 4:35892233a85d 385 memset(serverObj, 0, sizeof(lwm2m_object_t));
terence zhang 4:35892233a85d 386
terence zhang 4:35892233a85d 387 serverObj->objID = 1;
terencez 0:f9d13e09cf11 388
terence zhang 4:35892233a85d 389 // Manually create an hardcoded server
terence zhang 4:35892233a85d 390 serverInstance = (server_instance_t *)lwm2m_malloc(sizeof(server_instance_t));
terence zhang 4:35892233a85d 391 if (NULL == serverInstance)
terence zhang 4:35892233a85d 392 {
terence zhang 4:35892233a85d 393 lwm2m_free(serverObj);
terence zhang 4:35892233a85d 394 return NULL;
terence zhang 4:35892233a85d 395 }
terencez 0:f9d13e09cf11 396
terence zhang 4:35892233a85d 397 memset(serverInstance, 0, sizeof(server_instance_t));
terence zhang 4:35892233a85d 398 serverInstance->instanceId = 0;
terence zhang 4:35892233a85d 399 serverInstance->shortServerId = 123;
terence zhang 4:35892233a85d 400 serverInstance->lifetime = 300;
terence zhang 4:35892233a85d 401 serverInstance->storing = false;
terence zhang 4:35892233a85d 402 serverInstance->binding[0] = 'U';
terence zhang 4:35892233a85d 403 serverObj->instanceList = LWM2M_LIST_ADD(serverObj->instanceList, serverInstance);
terence zhang 4:35892233a85d 404
terence zhang 4:35892233a85d 405 serverObj->readFunc = prv_server_read;
terence zhang 4:35892233a85d 406 serverObj->writeFunc = prv_server_write;
terence zhang 4:35892233a85d 407 serverObj->createFunc = prv_server_create;
terence zhang 4:35892233a85d 408 serverObj->deleteFunc = prv_server_delete;
terence zhang 4:35892233a85d 409 serverObj->executeFunc = prv_server_execute;
terence zhang 4:35892233a85d 410 serverObj->discoverFunc = prv_server_discover;
terence zhang 4:35892233a85d 411 }
terence zhang 4:35892233a85d 412
terence zhang 4:35892233a85d 413 return serverObj;
terencez 0:f9d13e09cf11 414 }
terencez 0:f9d13e09cf11 415
terence zhang 4:35892233a85d 416 void free_server_object(lwm2m_object_t * object)
terencez 0:f9d13e09cf11 417 {
terence zhang 4:35892233a85d 418 while (object->instanceList != NULL)
terence zhang 4:35892233a85d 419 {
terence zhang 4:35892233a85d 420 server_instance_t * serverInstance = (server_instance_t *)object->instanceList;
terence zhang 4:35892233a85d 421 object->instanceList = object->instanceList->next;
terence zhang 4:35892233a85d 422 lwm2m_free(serverInstance);
terence zhang 4:35892233a85d 423 }
terence zhang 4:35892233a85d 424 lwm2m_free(object);
terencez 0:f9d13e09cf11 425 }