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

Dependencies:   C12832 LM75B

Committer:
terencez
Date:
Sun May 07 03:00:16 2017 +0000
Revision:
15:d0f20339c1ad
Parent:
14:ec9e195830ff
Fix the "Get" operation fail issue, tested get information from device.

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;
terencez 15:d0f20339c1ad 49 uint32_t defaultMinPeriod;
terencez 15:d0f20339c1ad 50 uint32_t defaultMaxPeriod;
terencez 15:d0f20339c1ad 51 uint32_t disableTimeout;
terence zhang 4:35892233a85d 52 bool storing;
terence zhang 4:35892233a85d 53 char binding[4];
terence zhang 4:35892233a85d 54 } server_instance_t;
terence zhang 4:35892233a85d 55
terence zhang 4:35892233a85d 56 static uint8_t prv_get_value(lwm2m_data_t * dataP,
terence zhang 4:35892233a85d 57 server_instance_t * targetP)
terence zhang 4:35892233a85d 58 {
terence zhang 4:35892233a85d 59 switch (dataP->id)
terence zhang 4:35892233a85d 60 {
terence zhang 4:35892233a85d 61 case LWM2M_SERVER_SHORT_ID_ID:
terence zhang 4:35892233a85d 62 lwm2m_data_encode_int(targetP->shortServerId, dataP);
terence zhang 4:35892233a85d 63 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 64
terence zhang 4:35892233a85d 65 case LWM2M_SERVER_LIFETIME_ID:
terence zhang 4:35892233a85d 66 lwm2m_data_encode_int(targetP->lifetime, dataP);
terence zhang 4:35892233a85d 67 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 68
terencez 15:d0f20339c1ad 69 case LWM2M_SERVER_MIN_PERIOD_ID:
terencez 15:d0f20339c1ad 70 lwm2m_data_encode_int(targetP->defaultMinPeriod, dataP);
terencez 15:d0f20339c1ad 71 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 72
terencez 15:d0f20339c1ad 73 case LWM2M_SERVER_MAX_PERIOD_ID:
terencez 15:d0f20339c1ad 74 lwm2m_data_encode_int(targetP->defaultMaxPeriod, dataP);
terencez 15:d0f20339c1ad 75 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 76
terence zhang 4:35892233a85d 77 case LWM2M_SERVER_DISABLE_ID:
terence zhang 4:35892233a85d 78 return COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 79
terencez 15:d0f20339c1ad 80 case LWM2M_SERVER_TIMEOUT_ID:
terencez 15:d0f20339c1ad 81 lwm2m_data_encode_int(targetP->disableTimeout, dataP);
terencez 15:d0f20339c1ad 82 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 83
terence zhang 4:35892233a85d 84 case LWM2M_SERVER_STORING_ID:
terence zhang 4:35892233a85d 85 lwm2m_data_encode_bool(targetP->storing, dataP);
terence zhang 4:35892233a85d 86 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 87
terence zhang 4:35892233a85d 88 case LWM2M_SERVER_BINDING_ID:
terence zhang 4:35892233a85d 89 lwm2m_data_encode_string(targetP->binding, dataP);
terence zhang 4:35892233a85d 90 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 91
terence zhang 4:35892233a85d 92 case LWM2M_SERVER_UPDATE_ID:
terence zhang 4:35892233a85d 93 return COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 94
terence zhang 4:35892233a85d 95 default:
terence zhang 4:35892233a85d 96 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 97 }
terence zhang 4:35892233a85d 98 }
terence zhang 4:35892233a85d 99
terence zhang 4:35892233a85d 100 static uint8_t prv_server_read(uint16_t instanceId,
terence zhang 4:35892233a85d 101 int * numDataP,
terence zhang 4:35892233a85d 102 lwm2m_data_t ** dataArrayP,
terence zhang 4:35892233a85d 103 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 104 {
terence zhang 4:35892233a85d 105 server_instance_t * targetP;
terence zhang 4:35892233a85d 106 uint8_t result;
terence zhang 4:35892233a85d 107 int i;
terence zhang 4:35892233a85d 108
terence zhang 4:35892233a85d 109 targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);
terence zhang 4:35892233a85d 110 if (NULL == targetP) return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 111
terence zhang 4:35892233a85d 112 // is the server asking for the full instance ?
terence zhang 4:35892233a85d 113 if (*numDataP == 0)
terence zhang 4:35892233a85d 114 {
terence zhang 4:35892233a85d 115 uint16_t resList[] = {
terencez 15:d0f20339c1ad 116 LWM2M_SERVER_SHORT_ID_ID,
terencez 15:d0f20339c1ad 117 LWM2M_SERVER_LIFETIME_ID,
terencez 15:d0f20339c1ad 118 LWM2M_SERVER_MIN_PERIOD_ID,
terencez 15:d0f20339c1ad 119 LWM2M_SERVER_MAX_PERIOD_ID,
terencez 15:d0f20339c1ad 120 LWM2M_SERVER_TIMEOUT_ID,
terencez 15:d0f20339c1ad 121 LWM2M_SERVER_STORING_ID,
terencez 15:d0f20339c1ad 122 LWM2M_SERVER_BINDING_ID
terence zhang 4:35892233a85d 123 };
terence zhang 4:35892233a85d 124 int nbRes = sizeof(resList)/sizeof(uint16_t);
terence zhang 4:35892233a85d 125
terence zhang 4:35892233a85d 126 *dataArrayP = lwm2m_data_new(nbRes);
terence zhang 4:35892233a85d 127 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 128 *numDataP = nbRes;
terence zhang 4:35892233a85d 129 for (i = 0 ; i < nbRes ; i++)
terence zhang 4:35892233a85d 130 {
terence zhang 4:35892233a85d 131 (*dataArrayP)[i].id = resList[i];
terence zhang 4:35892233a85d 132 }
terence zhang 4:35892233a85d 133 }
terence zhang 4:35892233a85d 134
terence zhang 4:35892233a85d 135 i = 0;
terence zhang 4:35892233a85d 136 do
terence zhang 4:35892233a85d 137 {
terence zhang 4:35892233a85d 138 result = prv_get_value((*dataArrayP) + i, targetP);
terence zhang 4:35892233a85d 139 i++;
terence zhang 4:35892233a85d 140 } while (i < *numDataP && result == COAP_205_CONTENT);
terence zhang 4:35892233a85d 141
terence zhang 4:35892233a85d 142 return result;
terence zhang 4:35892233a85d 143 }
terencez 0:f9d13e09cf11 144
terence zhang 4:35892233a85d 145 static uint8_t prv_server_discover(uint16_t instanceId,
terence zhang 4:35892233a85d 146 int * numDataP,
terence zhang 4:35892233a85d 147 lwm2m_data_t ** dataArrayP,
terence zhang 4:35892233a85d 148 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 149 {
terence zhang 4:35892233a85d 150 uint8_t result;
terence zhang 4:35892233a85d 151 int i;
terence zhang 4:35892233a85d 152
terence zhang 4:35892233a85d 153 result = COAP_205_CONTENT;
terencez 0:f9d13e09cf11 154
terence zhang 4:35892233a85d 155 // is the server asking for the full object ?
terence zhang 4:35892233a85d 156 if (*numDataP == 0)
terencez 0:f9d13e09cf11 157 {
terence zhang 4:35892233a85d 158 uint16_t resList[] = {
terence zhang 4:35892233a85d 159 LWM2M_SERVER_SHORT_ID_ID,
terence zhang 4:35892233a85d 160 LWM2M_SERVER_LIFETIME_ID,
terence zhang 4:35892233a85d 161 LWM2M_SERVER_MIN_PERIOD_ID,
terence zhang 4:35892233a85d 162 LWM2M_SERVER_MAX_PERIOD_ID,
terence zhang 4:35892233a85d 163 LWM2M_SERVER_DISABLE_ID,
terence zhang 4:35892233a85d 164 LWM2M_SERVER_TIMEOUT_ID,
terence zhang 4:35892233a85d 165 LWM2M_SERVER_STORING_ID,
terence zhang 4:35892233a85d 166 LWM2M_SERVER_BINDING_ID,
terence zhang 4:35892233a85d 167 LWM2M_SERVER_UPDATE_ID
terence zhang 4:35892233a85d 168 };
terencez 15:d0f20339c1ad 169 int nbRes = sizeof(resList) / sizeof(uint16_t);
terence zhang 4:35892233a85d 170
terence zhang 4:35892233a85d 171 *dataArrayP = lwm2m_data_new(nbRes);
terence zhang 4:35892233a85d 172 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 173 *numDataP = nbRes;
terencez 15:d0f20339c1ad 174 for (i = 0; i < nbRes; i++)
terence zhang 4:35892233a85d 175 {
terence zhang 4:35892233a85d 176 (*dataArrayP)[i].id = resList[i];
terence zhang 4:35892233a85d 177 }
terencez 0:f9d13e09cf11 178 }
terencez 0:f9d13e09cf11 179 else
terencez 0:f9d13e09cf11 180 {
terence zhang 4:35892233a85d 181 for (i = 0; i < *numDataP && result == COAP_205_CONTENT; i++)
terence zhang 4:35892233a85d 182 {
terence zhang 4:35892233a85d 183 switch ((*dataArrayP)[i].id)
terence zhang 4:35892233a85d 184 {
terence zhang 4:35892233a85d 185 case LWM2M_SERVER_SHORT_ID_ID:
terence zhang 4:35892233a85d 186 case LWM2M_SERVER_LIFETIME_ID:
terence zhang 4:35892233a85d 187 case LWM2M_SERVER_MIN_PERIOD_ID:
terence zhang 4:35892233a85d 188 case LWM2M_SERVER_MAX_PERIOD_ID:
terence zhang 4:35892233a85d 189 case LWM2M_SERVER_DISABLE_ID:
terence zhang 4:35892233a85d 190 case LWM2M_SERVER_TIMEOUT_ID:
terence zhang 4:35892233a85d 191 case LWM2M_SERVER_STORING_ID:
terence zhang 4:35892233a85d 192 case LWM2M_SERVER_BINDING_ID:
terence zhang 4:35892233a85d 193 case LWM2M_SERVER_UPDATE_ID:
terence zhang 4:35892233a85d 194 break;
terence zhang 4:35892233a85d 195 default:
terence zhang 4:35892233a85d 196 result = COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 197 }
terence zhang 4:35892233a85d 198 }
terence zhang 4:35892233a85d 199 }
terencez 0:f9d13e09cf11 200
terence zhang 4:35892233a85d 201 return result;
terence zhang 4:35892233a85d 202 }
terencez 0:f9d13e09cf11 203
terencez 15:d0f20339c1ad 204 static uint8_t prv_set_int_value(lwm2m_data_t * dataArray, uint32_t * data) {
terence zhang 4:35892233a85d 205 uint8_t result;
terence zhang 4:35892233a85d 206 int64_t value;
terence zhang 4:35892233a85d 207
terence zhang 4:35892233a85d 208 if (1 == lwm2m_data_decode_int(dataArray, &value))
terence zhang 4:35892233a85d 209 {
terence zhang 4:35892233a85d 210 if (value >= 0 && value <= 0xFFFFFFFF)
terencez 0:f9d13e09cf11 211 {
terence zhang 4:35892233a85d 212 *data = value;
terence zhang 4:35892233a85d 213 result = COAP_204_CHANGED;
terencez 0:f9d13e09cf11 214 }
terencez 0:f9d13e09cf11 215 else
terencez 0:f9d13e09cf11 216 {
terence zhang 4:35892233a85d 217 result = COAP_406_NOT_ACCEPTABLE;
terence zhang 4:35892233a85d 218 }
terence zhang 4:35892233a85d 219 }
terence zhang 4:35892233a85d 220 else
terence zhang 4:35892233a85d 221 {
terence zhang 4:35892233a85d 222 result = COAP_400_BAD_REQUEST;
terence zhang 4:35892233a85d 223 }
terence zhang 4:35892233a85d 224 return result;
terence zhang 4:35892233a85d 225 }
terence zhang 4:35892233a85d 226
terence zhang 4:35892233a85d 227 static uint8_t prv_server_write(uint16_t instanceId,
terence zhang 4:35892233a85d 228 int numData,
terence zhang 4:35892233a85d 229 lwm2m_data_t * dataArray,
terence zhang 4:35892233a85d 230 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 231 {
terence zhang 4:35892233a85d 232 server_instance_t * targetP;
terence zhang 4:35892233a85d 233 int i;
terence zhang 4:35892233a85d 234 uint8_t result;
terence zhang 4:35892233a85d 235
terence zhang 4:35892233a85d 236 targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);
terence zhang 4:35892233a85d 237 if (NULL == targetP)
terence zhang 4:35892233a85d 238 {
terence zhang 4:35892233a85d 239 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 240 }
terence zhang 4:35892233a85d 241
terence zhang 4:35892233a85d 242 i = 0;
terence zhang 4:35892233a85d 243 do
terence zhang 4:35892233a85d 244 {
terence zhang 4:35892233a85d 245 switch (dataArray[i].id)
terence zhang 4:35892233a85d 246 {
terence zhang 4:35892233a85d 247 case LWM2M_SERVER_SHORT_ID_ID:
terencez 0:f9d13e09cf11 248 {
terencez 15:d0f20339c1ad 249 uint32_t value = targetP->shortServerId;
terencez 15:d0f20339c1ad 250 result = prv_set_int_value(dataArray + i, &value);
terencez 15:d0f20339c1ad 251 if (COAP_204_CHANGED == result)
terencez 0:f9d13e09cf11 252 {
terencez 15:d0f20339c1ad 253 if (0 < value && 0xFFFF >= value)
terencez 15:d0f20339c1ad 254 {
terencez 15:d0f20339c1ad 255 targetP->shortServerId = value;
terencez 15:d0f20339c1ad 256 }
terencez 15:d0f20339c1ad 257 else
terencez 15:d0f20339c1ad 258 {
terencez 15:d0f20339c1ad 259 result = COAP_406_NOT_ACCEPTABLE;
terencez 15:d0f20339c1ad 260 }
terencez 0:f9d13e09cf11 261 }
terence zhang 4:35892233a85d 262 }
terencez 15:d0f20339c1ad 263 break;
terencez 0:f9d13e09cf11 264
terence zhang 4:35892233a85d 265 case LWM2M_SERVER_LIFETIME_ID:
terence zhang 4:35892233a85d 266 result = prv_set_int_value(dataArray + i, (uint32_t *)&(targetP->lifetime));
terence zhang 4:35892233a85d 267 break;
terencez 0:f9d13e09cf11 268
terencez 15:d0f20339c1ad 269 case LWM2M_SERVER_MIN_PERIOD_ID:
terencez 15:d0f20339c1ad 270 result = prv_set_int_value(dataArray + i, &(targetP->defaultMinPeriod));
terencez 15:d0f20339c1ad 271 break;
terencez 15:d0f20339c1ad 272
terencez 15:d0f20339c1ad 273 case LWM2M_SERVER_MAX_PERIOD_ID:
terencez 15:d0f20339c1ad 274 result = prv_set_int_value(dataArray + i, &(targetP->defaultMaxPeriod));
terencez 15:d0f20339c1ad 275 break;
terencez 15:d0f20339c1ad 276
terence zhang 4:35892233a85d 277 case LWM2M_SERVER_DISABLE_ID:
terence zhang 4:35892233a85d 278 result = COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 279 break;
terence zhang 4:35892233a85d 280
terencez 15:d0f20339c1ad 281 case LWM2M_SERVER_TIMEOUT_ID:
terencez 15:d0f20339c1ad 282 result = prv_set_int_value(dataArray + i, &(targetP->disableTimeout));
terencez 15:d0f20339c1ad 283 break;
terencez 15:d0f20339c1ad 284
terence zhang 4:35892233a85d 285 case LWM2M_SERVER_STORING_ID:
terence zhang 4:35892233a85d 286 {
terence zhang 4:35892233a85d 287 bool value;
terence zhang 4:35892233a85d 288
terence zhang 4:35892233a85d 289 if (1 == lwm2m_data_decode_bool(dataArray + i, &value))
terence zhang 4:35892233a85d 290 {
terence zhang 4:35892233a85d 291 targetP->storing = value;
terence zhang 4:35892233a85d 292 result = COAP_204_CHANGED;
terence zhang 4:35892233a85d 293 }
terence zhang 4:35892233a85d 294 else
terence zhang 4:35892233a85d 295 {
terence zhang 4:35892233a85d 296 result = COAP_400_BAD_REQUEST;
terencez 0:f9d13e09cf11 297 }
terencez 0:f9d13e09cf11 298 }
terence zhang 4:35892233a85d 299 break;
terence zhang 4:35892233a85d 300
terence zhang 4:35892233a85d 301 case LWM2M_SERVER_BINDING_ID:
terence zhang 4:35892233a85d 302 if ((dataArray[i].type == LWM2M_TYPE_STRING || dataArray[i].type == LWM2M_TYPE_OPAQUE)
terence zhang 4:35892233a85d 303 && dataArray[i].value.asBuffer.length > 0 && dataArray[i].value.asBuffer.length <= 3
terencez 15:d0f20339c1ad 304 && (strncmp((char*)dataArray[i].value.asBuffer.buffer, "U", dataArray[i].value.asBuffer.length) == 0
terencez 15:d0f20339c1ad 305 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "UQ", dataArray[i].value.asBuffer.length) == 0
terencez 15:d0f20339c1ad 306 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "S", dataArray[i].value.asBuffer.length) == 0
terencez 15:d0f20339c1ad 307 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "SQ", dataArray[i].value.asBuffer.length) == 0
terencez 15:d0f20339c1ad 308 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "US", dataArray[i].value.asBuffer.length) == 0
terence zhang 4:35892233a85d 309 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "UQS", dataArray[i].value.asBuffer.length) == 0))
terence zhang 4:35892233a85d 310 {
terence zhang 4:35892233a85d 311 strncpy(targetP->binding, (char*)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);
terence zhang 4:35892233a85d 312 result = COAP_204_CHANGED;
terence zhang 4:35892233a85d 313 }
terence zhang 4:35892233a85d 314 else
terence zhang 4:35892233a85d 315 {
terence zhang 4:35892233a85d 316 result = COAP_400_BAD_REQUEST;
terence zhang 4:35892233a85d 317 }
terence zhang 4:35892233a85d 318 break;
terence zhang 4:35892233a85d 319
terence zhang 4:35892233a85d 320 case LWM2M_SERVER_UPDATE_ID:
terence zhang 4:35892233a85d 321 result = COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 322 break;
terence zhang 4:35892233a85d 323
terence zhang 4:35892233a85d 324 default:
terence zhang 4:35892233a85d 325 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 326 }
terence zhang 4:35892233a85d 327 i++;
terence zhang 4:35892233a85d 328 } while (i < numData && result == COAP_204_CHANGED);
terence zhang 4:35892233a85d 329
terence zhang 4:35892233a85d 330 return result;
terencez 0:f9d13e09cf11 331 }
terencez 0:f9d13e09cf11 332
terence zhang 4:35892233a85d 333 static uint8_t prv_server_execute(uint16_t instanceId,
terence zhang 4:35892233a85d 334 uint16_t resourceId,
terence zhang 4:35892233a85d 335 uint8_t * buffer,
terence zhang 4:35892233a85d 336 int length,
terence zhang 4:35892233a85d 337 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 338
terencez 0:f9d13e09cf11 339 {
terence zhang 4:35892233a85d 340 server_instance_t * targetP;
terencez 0:f9d13e09cf11 341
terence zhang 4:35892233a85d 342 targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);
terence zhang 4:35892233a85d 343 if (NULL == targetP) return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 344
terence zhang 4:35892233a85d 345 switch (resourceId)
terence zhang 4:35892233a85d 346 {
terence zhang 4:35892233a85d 347 case LWM2M_SERVER_DISABLE_ID:
terence zhang 4:35892233a85d 348 // executed in core, if COAP_204_CHANGED is returned
terencez 15:d0f20339c1ad 349 if (0 < targetP->disableTimeout) return COAP_204_CHANGED;
terencez 15:d0f20339c1ad 350 else return COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 351 case LWM2M_SERVER_UPDATE_ID:
terence zhang 4:35892233a85d 352 // executed in core, if COAP_204_CHANGED is returned
terence zhang 4:35892233a85d 353 return COAP_204_CHANGED;
terencez 0:f9d13e09cf11 354 default:
terencez 0:f9d13e09cf11 355 return COAP_405_METHOD_NOT_ALLOWED;
terencez 0:f9d13e09cf11 356 }
terencez 0:f9d13e09cf11 357 }
terencez 0:f9d13e09cf11 358
terence zhang 4:35892233a85d 359 static uint8_t prv_server_delete(uint16_t id,
terence zhang 4:35892233a85d 360 lwm2m_object_t * objectP)
terencez 0:f9d13e09cf11 361 {
terence zhang 4:35892233a85d 362 server_instance_t * serverInstance;
terencez 0:f9d13e09cf11 363
terence zhang 4:35892233a85d 364 objectP->instanceList = lwm2m_list_remove(objectP->instanceList, id, (lwm2m_list_t **)&serverInstance);
terence zhang 4:35892233a85d 365 if (NULL == serverInstance) return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 366
terence zhang 4:35892233a85d 367 lwm2m_free(serverInstance);
terence zhang 4:35892233a85d 368
terence zhang 4:35892233a85d 369 return COAP_202_DELETED;
terencez 0:f9d13e09cf11 370 }
terencez 0:f9d13e09cf11 371
terence zhang 4:35892233a85d 372 static uint8_t prv_server_create(uint16_t instanceId,
terence zhang 4:35892233a85d 373 int numData,
terence zhang 4:35892233a85d 374 lwm2m_data_t * dataArray,
terence zhang 4:35892233a85d 375 lwm2m_object_t * objectP)
terencez 0:f9d13e09cf11 376 {
terence zhang 4:35892233a85d 377 server_instance_t * serverInstance;
terence zhang 4:35892233a85d 378 uint8_t result;
terence zhang 4:35892233a85d 379
terence zhang 4:35892233a85d 380 serverInstance = (server_instance_t *)lwm2m_malloc(sizeof(server_instance_t));
terence zhang 4:35892233a85d 381 if (NULL == serverInstance) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 382 memset(serverInstance, 0, sizeof(server_instance_t));
terencez 0:f9d13e09cf11 383
terence zhang 4:35892233a85d 384 serverInstance->instanceId = instanceId;
terence zhang 4:35892233a85d 385 objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, serverInstance);
terence zhang 4:35892233a85d 386
terence zhang 4:35892233a85d 387 result = prv_server_write(instanceId, numData, dataArray, objectP);
terencez 0:f9d13e09cf11 388
terence zhang 4:35892233a85d 389 if (result != COAP_204_CHANGED)
terence zhang 4:35892233a85d 390 {
terence zhang 4:35892233a85d 391 (void)prv_server_delete(instanceId, objectP);
terence zhang 4:35892233a85d 392 }
terence zhang 4:35892233a85d 393 else
terence zhang 4:35892233a85d 394 {
terence zhang 4:35892233a85d 395 result = COAP_201_CREATED;
terence zhang 4:35892233a85d 396 }
terence zhang 4:35892233a85d 397
terence zhang 4:35892233a85d 398 return result;
terencez 0:f9d13e09cf11 399 }
terencez 0:f9d13e09cf11 400
terencez 15:d0f20339c1ad 401 void copy_server_object(lwm2m_object_t * objectDest, lwm2m_object_t * objectSrc)
terencez 15:d0f20339c1ad 402 {
terencez 15:d0f20339c1ad 403 memcpy(objectDest, objectSrc, sizeof(lwm2m_object_t));
terencez 15:d0f20339c1ad 404 objectDest->instanceList = NULL;
terencez 15:d0f20339c1ad 405 objectDest->userData = NULL;
terencez 15:d0f20339c1ad 406 server_instance_t * instanceSrc = (server_instance_t *)objectSrc->instanceList;
terencez 15:d0f20339c1ad 407 server_instance_t * previousInstanceDest = NULL;
terencez 15:d0f20339c1ad 408 while (instanceSrc != NULL)
terencez 15:d0f20339c1ad 409 {
terencez 15:d0f20339c1ad 410 server_instance_t * instanceDest = (server_instance_t *)lwm2m_malloc(sizeof(server_instance_t));
terencez 15:d0f20339c1ad 411 if (NULL == instanceDest)
terencez 15:d0f20339c1ad 412 {
terencez 15:d0f20339c1ad 413 return;
terencez 15:d0f20339c1ad 414 }
terencez 15:d0f20339c1ad 415 memcpy(instanceDest, instanceSrc, sizeof(server_instance_t));
terencez 15:d0f20339c1ad 416 // not sure it's necessary:
terencez 15:d0f20339c1ad 417 strcpy(instanceDest->binding, instanceSrc->binding);
terencez 15:d0f20339c1ad 418 instanceSrc = (server_instance_t *)instanceSrc->next;
terencez 15:d0f20339c1ad 419 if (previousInstanceDest == NULL)
terencez 15:d0f20339c1ad 420 {
terencez 15:d0f20339c1ad 421 objectDest->instanceList = (lwm2m_list_t *)instanceDest;
terencez 15:d0f20339c1ad 422 }
terencez 15:d0f20339c1ad 423 else
terencez 15:d0f20339c1ad 424 {
terencez 15:d0f20339c1ad 425 previousInstanceDest->next = instanceDest;
terencez 15:d0f20339c1ad 426 }
terencez 15:d0f20339c1ad 427 previousInstanceDest = instanceDest;
terencez 15:d0f20339c1ad 428 }
terencez 15:d0f20339c1ad 429 }
terencez 15:d0f20339c1ad 430
terencez 15:d0f20339c1ad 431 void display_server_object(lwm2m_object_t * object)
terencez 15:d0f20339c1ad 432 {
terencez 15:d0f20339c1ad 433 #ifdef WITH_LOGS
terencez 15:d0f20339c1ad 434 fprintf(stdout, " /%u: Server object, instances:\r\n", object->objID);
terencez 15:d0f20339c1ad 435 server_instance_t * serverInstance = (server_instance_t *)object->instanceList;
terencez 15:d0f20339c1ad 436 while (serverInstance != NULL)
terencez 15:d0f20339c1ad 437 {
terencez 15:d0f20339c1ad 438 fprintf(stdout, " /%u/%u: instanceId: %u, shortServerId: %u, lifetime: %u, storing: %s, binding: %s\r\n",
terencez 15:d0f20339c1ad 439 object->objID, serverInstance->instanceId,
terencez 15:d0f20339c1ad 440 serverInstance->instanceId, serverInstance->shortServerId, serverInstance->lifetime,
terencez 15:d0f20339c1ad 441 serverInstance->storing ? "true" : "false", serverInstance->binding);
terencez 15:d0f20339c1ad 442 serverInstance = (server_instance_t *)serverInstance->next;
terencez 15:d0f20339c1ad 443 }
terencez 15:d0f20339c1ad 444 #endif
terencez 15:d0f20339c1ad 445 }
terencez 15:d0f20339c1ad 446
terencez 15:d0f20339c1ad 447 lwm2m_object_t * get_server_object(int serverId,
terencez 15:d0f20339c1ad 448 const char* binding,
terencez 15:d0f20339c1ad 449 int lifetime,
terencez 15:d0f20339c1ad 450 bool storing)
terencez 0:f9d13e09cf11 451 {
terence zhang 4:35892233a85d 452 lwm2m_object_t * serverObj;
terence zhang 4:35892233a85d 453
terence zhang 4:35892233a85d 454 serverObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
terence zhang 4:35892233a85d 455
terence zhang 4:35892233a85d 456 if (NULL != serverObj)
terence zhang 4:35892233a85d 457 {
terence zhang 4:35892233a85d 458 server_instance_t * serverInstance;
terence zhang 4:35892233a85d 459
terence zhang 4:35892233a85d 460 memset(serverObj, 0, sizeof(lwm2m_object_t));
terence zhang 4:35892233a85d 461
terence zhang 4:35892233a85d 462 serverObj->objID = 1;
terencez 0:f9d13e09cf11 463
terence zhang 4:35892233a85d 464 // Manually create an hardcoded server
terence zhang 4:35892233a85d 465 serverInstance = (server_instance_t *)lwm2m_malloc(sizeof(server_instance_t));
terence zhang 4:35892233a85d 466 if (NULL == serverInstance)
terence zhang 4:35892233a85d 467 {
terence zhang 4:35892233a85d 468 lwm2m_free(serverObj);
terence zhang 4:35892233a85d 469 return NULL;
terence zhang 4:35892233a85d 470 }
terencez 0:f9d13e09cf11 471
terence zhang 4:35892233a85d 472 memset(serverInstance, 0, sizeof(server_instance_t));
terence zhang 4:35892233a85d 473 serverInstance->instanceId = 0;
terencez 15:d0f20339c1ad 474 serverInstance->shortServerId = serverId;
terencez 15:d0f20339c1ad 475 serverInstance->lifetime = lifetime;
terencez 15:d0f20339c1ad 476 serverInstance->storing = storing;
terencez 15:d0f20339c1ad 477 memcpy (serverInstance->binding, binding, strlen(binding)+1);
terence zhang 4:35892233a85d 478 serverObj->instanceList = LWM2M_LIST_ADD(serverObj->instanceList, serverInstance);
terence zhang 4:35892233a85d 479
terence zhang 4:35892233a85d 480 serverObj->readFunc = prv_server_read;
terencez 15:d0f20339c1ad 481 serverObj->discoverFunc = prv_server_discover;
terence zhang 4:35892233a85d 482 serverObj->writeFunc = prv_server_write;
terence zhang 4:35892233a85d 483 serverObj->createFunc = prv_server_create;
terence zhang 4:35892233a85d 484 serverObj->deleteFunc = prv_server_delete;
terence zhang 4:35892233a85d 485 serverObj->executeFunc = prv_server_execute;
terence zhang 4:35892233a85d 486 }
terence zhang 4:35892233a85d 487
terence zhang 4:35892233a85d 488 return serverObj;
terencez 0:f9d13e09cf11 489 }
terencez 0:f9d13e09cf11 490
terencez 15:d0f20339c1ad 491 void clean_server_object(lwm2m_object_t * object)
terencez 0:f9d13e09cf11 492 {
terence zhang 4:35892233a85d 493 while (object->instanceList != NULL)
terence zhang 4:35892233a85d 494 {
terence zhang 4:35892233a85d 495 server_instance_t * serverInstance = (server_instance_t *)object->instanceList;
terence zhang 4:35892233a85d 496 object->instanceList = object->instanceList->next;
terence zhang 4:35892233a85d 497 lwm2m_free(serverInstance);
terence zhang 4:35892233a85d 498 }
terencez 0:f9d13e09cf11 499 }