Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
share/object_server.c@15:d0f20339c1ad, 2017-05-07 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |