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.
object_server.c@4:35892233a85d, 2017-04-28 (annotated)
- 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?
| 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; |
| 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 | } |