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
Child:
16:31c387e94b6d
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 15:d0f20339c1ad 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 * domedambrosio - Please refer to git log
terencez 0:f9d13e09cf11 16 * Fabien Fleutot - Please refer to git log
terencez 0:f9d13e09cf11 17 * Axel Lorente - Please refer to git log
terence zhang 4:35892233a85d 18 * Bosch Software Innovations GmbH - Please refer to git log
terence zhang 4:35892233a85d 19 * Pascal Rieux - Please refer to git log
terencez 0:f9d13e09cf11 20 *
terencez 0:f9d13e09cf11 21 *******************************************************************************/
terencez 0:f9d13e09cf11 22
terencez 0:f9d13e09cf11 23 /*
terencez 0:f9d13e09cf11 24 Copyright (c) 2013, 2014 Intel Corporation
terencez 0:f9d13e09cf11 25
terencez 0:f9d13e09cf11 26 Redistribution and use in source and binary forms, with or without modification,
terencez 0:f9d13e09cf11 27 are permitted provided that the following conditions are met:
terencez 0:f9d13e09cf11 28
terencez 0:f9d13e09cf11 29 * Redistributions of source code must retain the above copyright notice,
terencez 0:f9d13e09cf11 30 this list of conditions and the following disclaimer.
terencez 0:f9d13e09cf11 31 * Redistributions in binary form must reproduce the above copyright notice,
terencez 0:f9d13e09cf11 32 this list of conditions and the following disclaimer in the documentation
terencez 0:f9d13e09cf11 33 and/or other materials provided with the distribution.
terencez 0:f9d13e09cf11 34 * Neither the name of Intel Corporation nor the names of its contributors
terencez 0:f9d13e09cf11 35 may be used to endorse or promote products derived from this software
terencez 0:f9d13e09cf11 36 without specific prior written permission.
terencez 0:f9d13e09cf11 37
terencez 0:f9d13e09cf11 38 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
terencez 0:f9d13e09cf11 39 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
terencez 0:f9d13e09cf11 40 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
terencez 0:f9d13e09cf11 41 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
terencez 0:f9d13e09cf11 42 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
terencez 0:f9d13e09cf11 43 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
terencez 0:f9d13e09cf11 44 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
terencez 0:f9d13e09cf11 45 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
terencez 0:f9d13e09cf11 46 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
terencez 0:f9d13e09cf11 47 THE POSSIBILITY OF SUCH DAMAGE.
terencez 0:f9d13e09cf11 48
terencez 0:f9d13e09cf11 49 David Navarro <david.navarro@intel.com>
terencez 0:f9d13e09cf11 50
terencez 0:f9d13e09cf11 51 */
terencez 0:f9d13e09cf11 52
terencez 0:f9d13e09cf11 53 /*
terencez 0:f9d13e09cf11 54 * This object is single instance only, and is mandatory to all LWM2M device as it describe the object such as its
terencez 0:f9d13e09cf11 55 * manufacturer, model, etc...
terencez 0:f9d13e09cf11 56 */
terencez 0:f9d13e09cf11 57
terencez 0:f9d13e09cf11 58 #include "liblwm2m.h"
terencez 15:d0f20339c1ad 59 //#include "lwm2mclient.h"
terencez 0:f9d13e09cf11 60
terencez 0:f9d13e09cf11 61 #include <stdio.h>
terencez 0:f9d13e09cf11 62 #include <stdlib.h>
terencez 0:f9d13e09cf11 63 #include <string.h>
terencez 0:f9d13e09cf11 64 #include <ctype.h>
terencez 15:d0f20339c1ad 65 #include <time.h>
terencez 0:f9d13e09cf11 66
terencez 0:f9d13e09cf11 67
terencez 0:f9d13e09cf11 68 #define PRV_MANUFACTURER "Open Mobile Alliance"
terencez 0:f9d13e09cf11 69 #define PRV_MODEL_NUMBER "Lightweight M2M Client"
terencez 15:d0f20339c1ad 70 #define PRV_SERIAL_NUMBER "345000123"
terencez 15:d0f20339c1ad 71 #define PRV_FIRMWARE_VERSION "1.0"
terencez 15:d0f20339c1ad 72 #define PRV_POWER_SOURCE_1 1
terencez 15:d0f20339c1ad 73 #define PRV_POWER_SOURCE_2 5
terencez 15:d0f20339c1ad 74 #define PRV_POWER_VOLTAGE_1 3800
terencez 15:d0f20339c1ad 75 #define PRV_POWER_VOLTAGE_2 5000
terencez 15:d0f20339c1ad 76 #define PRV_POWER_CURRENT_1 125
terencez 15:d0f20339c1ad 77 #define PRV_POWER_CURRENT_2 900
terencez 15:d0f20339c1ad 78 #define PRV_BATTERY_LEVEL 100
terencez 15:d0f20339c1ad 79 #define PRV_MEMORY_FREE 15
terencez 15:d0f20339c1ad 80 #define PRV_ERROR_CODE 0
terencez 15:d0f20339c1ad 81 #define PRV_TIME_ZONE "Europe/Berlin"
terencez 0:f9d13e09cf11 82 #define PRV_BINDING_MODE "U"
terencez 0:f9d13e09cf11 83
terencez 15:d0f20339c1ad 84 #define PRV_OFFSET_MAXLEN 7 //+HH:MM\0 at max
terencez 15:d0f20339c1ad 85 #define PRV_TLV_BUFFER_SIZE 128
terencez 15:d0f20339c1ad 86
terence zhang 4:35892233a85d 87 // Resource Id's:
terence zhang 4:35892233a85d 88 #define RES_O_MANUFACTURER 0
terence zhang 4:35892233a85d 89 #define RES_O_MODEL_NUMBER 1
terence zhang 4:35892233a85d 90 #define RES_O_SERIAL_NUMBER 2
terence zhang 4:35892233a85d 91 #define RES_O_FIRMWARE_VERSION 3
terence zhang 4:35892233a85d 92 #define RES_M_REBOOT 4
terence zhang 4:35892233a85d 93 #define RES_O_FACTORY_RESET 5
terence zhang 4:35892233a85d 94 #define RES_O_AVL_POWER_SOURCES 6
terence zhang 4:35892233a85d 95 #define RES_O_POWER_SOURCE_VOLTAGE 7
terence zhang 4:35892233a85d 96 #define RES_O_POWER_SOURCE_CURRENT 8
terence zhang 4:35892233a85d 97 #define RES_O_BATTERY_LEVEL 9
terence zhang 4:35892233a85d 98 #define RES_O_MEMORY_FREE 10
terence zhang 4:35892233a85d 99 #define RES_M_ERROR_CODE 11
terence zhang 4:35892233a85d 100 #define RES_O_RESET_ERROR_CODE 12
terence zhang 4:35892233a85d 101 #define RES_O_CURRENT_TIME 13
terence zhang 4:35892233a85d 102 #define RES_O_UTC_OFFSET 14
terence zhang 4:35892233a85d 103 #define RES_O_TIMEZONE 15
terence zhang 4:35892233a85d 104 #define RES_M_BINDING_MODES 16
terencez 15:d0f20339c1ad 105 // since TS 20141126-C:
terence zhang 4:35892233a85d 106 #define RES_O_DEVICE_TYPE 17
terence zhang 4:35892233a85d 107 #define RES_O_HARDWARE_VERSION 18
terence zhang 4:35892233a85d 108 #define RES_O_SOFTWARE_VERSION 19
terence zhang 4:35892233a85d 109 #define RES_O_BATTERY_STATUS 20
terence zhang 4:35892233a85d 110 #define RES_O_MEMORY_TOTAL 21
terencez 0:f9d13e09cf11 111
terencez 0:f9d13e09cf11 112
terencez 15:d0f20339c1ad 113 typedef struct
terencez 15:d0f20339c1ad 114 {
terencez 15:d0f20339c1ad 115 int64_t free_memory;
terencez 15:d0f20339c1ad 116 int64_t error;
terencez 15:d0f20339c1ad 117 int64_t time;
terencez 15:d0f20339c1ad 118 uint8_t battery_level;
terencez 15:d0f20339c1ad 119 char time_offset[PRV_OFFSET_MAXLEN];
terencez 15:d0f20339c1ad 120 } device_data_t;
terencez 15:d0f20339c1ad 121
terencez 15:d0f20339c1ad 122
terencez 15:d0f20339c1ad 123 // basic check that the time offset value is at ISO 8601 format
terencez 15:d0f20339c1ad 124 // bug: +12:30 is considered a valid value by this function
terencez 15:d0f20339c1ad 125 static int prv_check_time_offset(char * buffer,
terencez 15:d0f20339c1ad 126 int length)
terencez 15:d0f20339c1ad 127 {
terencez 15:d0f20339c1ad 128 int min_index;
terencez 15:d0f20339c1ad 129
terencez 15:d0f20339c1ad 130 if (length != 3 && length != 5 && length != 6) return 0;
terencez 15:d0f20339c1ad 131 if (buffer[0] != '-' && buffer[0] != '+') return 0;
terencez 15:d0f20339c1ad 132 switch (buffer[1])
terencez 15:d0f20339c1ad 133 {
terencez 15:d0f20339c1ad 134 case '0':
terencez 15:d0f20339c1ad 135 if (buffer[2] < '0' || buffer[2] > '9') return 0;
terencez 15:d0f20339c1ad 136 break;
terencez 15:d0f20339c1ad 137 case '1':
terencez 15:d0f20339c1ad 138 if (buffer[2] < '0' || buffer[2] > '2') return 0;
terencez 15:d0f20339c1ad 139 break;
terencez 15:d0f20339c1ad 140 default:
terencez 15:d0f20339c1ad 141 return 0;
terencez 15:d0f20339c1ad 142 }
terencez 15:d0f20339c1ad 143 switch (length)
terencez 15:d0f20339c1ad 144 {
terencez 15:d0f20339c1ad 145 case 3:
terencez 15:d0f20339c1ad 146 return 1;
terencez 15:d0f20339c1ad 147 case 5:
terencez 15:d0f20339c1ad 148 min_index = 3;
terencez 15:d0f20339c1ad 149 break;
terencez 15:d0f20339c1ad 150 case 6:
terencez 15:d0f20339c1ad 151 if (buffer[3] != ':') return 0;
terencez 15:d0f20339c1ad 152 min_index = 4;
terencez 15:d0f20339c1ad 153 break;
terencez 15:d0f20339c1ad 154 default:
terencez 15:d0f20339c1ad 155 // never happen
terencez 15:d0f20339c1ad 156 return 0;
terencez 15:d0f20339c1ad 157 }
terencez 15:d0f20339c1ad 158 if (buffer[min_index] < '0' || buffer[min_index] > '5') return 0;
terencez 15:d0f20339c1ad 159 if (buffer[min_index+1] < '0' || buffer[min_index+1] > '9') return 0;
terencez 15:d0f20339c1ad 160
terencez 15:d0f20339c1ad 161 return 1;
terencez 15:d0f20339c1ad 162 }
terencez 15:d0f20339c1ad 163
terencez 15:d0f20339c1ad 164 static uint8_t prv_set_value(lwm2m_data_t * dataP,
terencez 15:d0f20339c1ad 165 device_data_t * devDataP)
terencez 0:f9d13e09cf11 166 {
terencez 0:f9d13e09cf11 167 // a simple switch structure is used to respond at the specified resource asked
terence zhang 4:35892233a85d 168 switch (dataP->id)
terencez 0:f9d13e09cf11 169 {
terence zhang 4:35892233a85d 170 case RES_O_MANUFACTURER:
terence zhang 4:35892233a85d 171 lwm2m_data_encode_string(PRV_MANUFACTURER, dataP);
terencez 0:f9d13e09cf11 172 return COAP_205_CONTENT;
terencez 0:f9d13e09cf11 173
terence zhang 4:35892233a85d 174 case RES_O_MODEL_NUMBER:
terence zhang 4:35892233a85d 175 lwm2m_data_encode_string(PRV_MODEL_NUMBER, dataP);
terencez 0:f9d13e09cf11 176 return COAP_205_CONTENT;
terencez 0:f9d13e09cf11 177
terencez 15:d0f20339c1ad 178 case RES_O_SERIAL_NUMBER:
terencez 15:d0f20339c1ad 179 lwm2m_data_encode_string(PRV_SERIAL_NUMBER, dataP);
terencez 15:d0f20339c1ad 180 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 181
terencez 15:d0f20339c1ad 182 case RES_O_FIRMWARE_VERSION:
terencez 15:d0f20339c1ad 183 lwm2m_data_encode_string(PRV_FIRMWARE_VERSION, dataP);
terencez 15:d0f20339c1ad 184 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 185
terence zhang 4:35892233a85d 186 case RES_M_REBOOT:
terence zhang 4:35892233a85d 187 return COAP_405_METHOD_NOT_ALLOWED;
terencez 15:d0f20339c1ad 188
terencez 15:d0f20339c1ad 189 case RES_O_FACTORY_RESET:
terencez 15:d0f20339c1ad 190 return COAP_405_METHOD_NOT_ALLOWED;
terencez 15:d0f20339c1ad 191
terencez 15:d0f20339c1ad 192 case RES_O_AVL_POWER_SOURCES:
terencez 15:d0f20339c1ad 193 {
terencez 15:d0f20339c1ad 194 lwm2m_data_t * subTlvP;
terencez 15:d0f20339c1ad 195
terencez 15:d0f20339c1ad 196 subTlvP = lwm2m_data_new(2);
terencez 15:d0f20339c1ad 197
terencez 15:d0f20339c1ad 198 subTlvP[0].id = 0;
terencez 15:d0f20339c1ad 199 lwm2m_data_encode_int(PRV_POWER_SOURCE_1, subTlvP);
terencez 15:d0f20339c1ad 200 subTlvP[1].id = 1;
terencez 15:d0f20339c1ad 201 lwm2m_data_encode_int(PRV_POWER_SOURCE_2, subTlvP + 1);
terencez 15:d0f20339c1ad 202
terencez 15:d0f20339c1ad 203 lwm2m_data_encode_instances(subTlvP, 2, dataP);
terencez 15:d0f20339c1ad 204
terencez 15:d0f20339c1ad 205 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 206 }
terencez 15:d0f20339c1ad 207
terencez 15:d0f20339c1ad 208 case RES_O_POWER_SOURCE_VOLTAGE:
terencez 15:d0f20339c1ad 209 {
terencez 15:d0f20339c1ad 210 lwm2m_data_t * subTlvP;
terencez 15:d0f20339c1ad 211
terencez 15:d0f20339c1ad 212 subTlvP = lwm2m_data_new(2);
terencez 15:d0f20339c1ad 213
terencez 15:d0f20339c1ad 214 subTlvP[0].id = 0;
terencez 15:d0f20339c1ad 215 lwm2m_data_encode_int(PRV_POWER_VOLTAGE_1, subTlvP);
terencez 15:d0f20339c1ad 216 subTlvP[1].id = 1;
terencez 15:d0f20339c1ad 217 lwm2m_data_encode_int(PRV_POWER_VOLTAGE_2, subTlvP + 1);
terencez 15:d0f20339c1ad 218
terencez 15:d0f20339c1ad 219 lwm2m_data_encode_instances(subTlvP, 2, dataP);
terencez 15:d0f20339c1ad 220
terencez 15:d0f20339c1ad 221 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 222 }
terencez 15:d0f20339c1ad 223
terencez 15:d0f20339c1ad 224 case RES_O_POWER_SOURCE_CURRENT:
terencez 15:d0f20339c1ad 225 {
terencez 15:d0f20339c1ad 226 lwm2m_data_t * subTlvP;
terencez 15:d0f20339c1ad 227
terencez 15:d0f20339c1ad 228 subTlvP = lwm2m_data_new(2);
terencez 15:d0f20339c1ad 229
terencez 15:d0f20339c1ad 230 subTlvP[0].id = 0;
terencez 15:d0f20339c1ad 231 lwm2m_data_encode_int(PRV_POWER_CURRENT_1, &subTlvP[0]);
terencez 15:d0f20339c1ad 232 subTlvP[1].id = 1;
terencez 15:d0f20339c1ad 233 lwm2m_data_encode_int(PRV_POWER_CURRENT_2, &subTlvP[1]);
terencez 15:d0f20339c1ad 234
terencez 15:d0f20339c1ad 235 lwm2m_data_encode_instances(subTlvP, 2, dataP);
terencez 15:d0f20339c1ad 236
terencez 15:d0f20339c1ad 237 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 238 }
terencez 15:d0f20339c1ad 239
terencez 15:d0f20339c1ad 240 case RES_O_BATTERY_LEVEL:
terencez 15:d0f20339c1ad 241 lwm2m_data_encode_int(devDataP->battery_level, dataP);
terencez 15:d0f20339c1ad 242 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 243
terencez 15:d0f20339c1ad 244 case RES_O_MEMORY_FREE:
terencez 15:d0f20339c1ad 245 lwm2m_data_encode_int(devDataP->free_memory, dataP);
terencez 15:d0f20339c1ad 246 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 247
terencez 15:d0f20339c1ad 248 case RES_M_ERROR_CODE:
terencez 15:d0f20339c1ad 249 {
terencez 15:d0f20339c1ad 250 lwm2m_data_t * subTlvP;
terencez 15:d0f20339c1ad 251
terencez 15:d0f20339c1ad 252 subTlvP = lwm2m_data_new(1);
terencez 15:d0f20339c1ad 253
terencez 15:d0f20339c1ad 254 subTlvP[0].id = 0;
terencez 15:d0f20339c1ad 255 lwm2m_data_encode_int(devDataP->error, subTlvP);
terencez 15:d0f20339c1ad 256
terencez 15:d0f20339c1ad 257 lwm2m_data_encode_instances(subTlvP, 1, dataP);
terencez 15:d0f20339c1ad 258
terencez 15:d0f20339c1ad 259 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 260 }
terencez 15:d0f20339c1ad 261 case RES_O_RESET_ERROR_CODE:
terencez 15:d0f20339c1ad 262 return COAP_405_METHOD_NOT_ALLOWED;
terencez 15:d0f20339c1ad 263
terencez 15:d0f20339c1ad 264 case RES_O_CURRENT_TIME:
terencez 15:d0f20339c1ad 265 lwm2m_data_encode_int(time(NULL) + devDataP->time, dataP);
terencez 15:d0f20339c1ad 266 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 267
terencez 15:d0f20339c1ad 268 case RES_O_UTC_OFFSET:
terencez 15:d0f20339c1ad 269 lwm2m_data_encode_string(devDataP->time_offset, dataP);
terencez 15:d0f20339c1ad 270 return COAP_205_CONTENT;
terencez 15:d0f20339c1ad 271
terencez 15:d0f20339c1ad 272 case RES_O_TIMEZONE:
terencez 15:d0f20339c1ad 273 lwm2m_data_encode_string(PRV_TIME_ZONE, dataP);
terencez 15:d0f20339c1ad 274 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 275
terence zhang 4:35892233a85d 276 case RES_M_BINDING_MODES:
terence zhang 4:35892233a85d 277 lwm2m_data_encode_string(PRV_BINDING_MODE, dataP);
terencez 0:f9d13e09cf11 278 return COAP_205_CONTENT;
terencez 0:f9d13e09cf11 279
terencez 0:f9d13e09cf11 280 default:
terencez 0:f9d13e09cf11 281 return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 282 }
terencez 0:f9d13e09cf11 283 }
terencez 0:f9d13e09cf11 284
terencez 0:f9d13e09cf11 285 static uint8_t prv_device_read(uint16_t instanceId,
terencez 0:f9d13e09cf11 286 int * numDataP,
terence zhang 4:35892233a85d 287 lwm2m_data_t ** dataArrayP,
terencez 0:f9d13e09cf11 288 lwm2m_object_t * objectP)
terencez 0:f9d13e09cf11 289 {
terencez 0:f9d13e09cf11 290 uint8_t result;
terencez 0:f9d13e09cf11 291 int i;
terencez 15:d0f20339c1ad 292 printf(" TERENCE:%s, %d,instanceId = %d\n",__FUNCTION__, __LINE__,instanceId);
terencez 0:f9d13e09cf11 293 // this is a single instance object
terencez 0:f9d13e09cf11 294 if (instanceId != 0)
terencez 0:f9d13e09cf11 295 {
terencez 0:f9d13e09cf11 296 return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 297 }
terencez 15:d0f20339c1ad 298 printf(" TERENCE:%s, %d: numDataP = %d\n",__FUNCTION__, __LINE__, *numDataP);
terencez 0:f9d13e09cf11 299 // is the server asking for the full object ?
terencez 0:f9d13e09cf11 300 if (*numDataP == 0)
terencez 0:f9d13e09cf11 301 {
terencez 15:d0f20339c1ad 302 printf(" TERENCE:%s, %d: \n",__FUNCTION__, __LINE__);
terence zhang 4:35892233a85d 303 uint16_t resList[] = {
terence zhang 4:35892233a85d 304 RES_O_MANUFACTURER,
terence zhang 4:35892233a85d 305 RES_O_MODEL_NUMBER,
terencez 15:d0f20339c1ad 306 RES_O_SERIAL_NUMBER,
terencez 15:d0f20339c1ad 307 RES_O_FIRMWARE_VERSION,
terencez 15:d0f20339c1ad 308 //E: RES_M_REBOOT,
terencez 15:d0f20339c1ad 309 //E: RES_O_FACTORY_RESET,
terencez 15:d0f20339c1ad 310 RES_O_AVL_POWER_SOURCES,
terencez 15:d0f20339c1ad 311 RES_O_POWER_SOURCE_VOLTAGE,
terencez 15:d0f20339c1ad 312 RES_O_POWER_SOURCE_CURRENT,
terencez 15:d0f20339c1ad 313 RES_O_BATTERY_LEVEL,
terencez 15:d0f20339c1ad 314 RES_O_MEMORY_FREE,
terencez 15:d0f20339c1ad 315 RES_M_ERROR_CODE,
terencez 15:d0f20339c1ad 316 //E: RES_O_RESET_ERROR_CODE,
terencez 15:d0f20339c1ad 317 RES_O_CURRENT_TIME,
terencez 15:d0f20339c1ad 318 RES_O_UTC_OFFSET,
terencez 15:d0f20339c1ad 319 RES_O_TIMEZONE,
terence zhang 4:35892233a85d 320 RES_M_BINDING_MODES
terence zhang 4:35892233a85d 321 };
terencez 0:f9d13e09cf11 322 int nbRes = sizeof(resList)/sizeof(uint16_t);
terencez 0:f9d13e09cf11 323
terence zhang 4:35892233a85d 324 *dataArrayP = lwm2m_data_new(nbRes);
terencez 0:f9d13e09cf11 325 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terencez 0:f9d13e09cf11 326 *numDataP = nbRes;
terencez 15:d0f20339c1ad 327 printf(" TERENCE:%s, %d: \n",__FUNCTION__, __LINE__);
terencez 0:f9d13e09cf11 328 for (i = 0 ; i < nbRes ; i++)
terencez 0:f9d13e09cf11 329 {
terencez 0:f9d13e09cf11 330 (*dataArrayP)[i].id = resList[i];
terencez 0:f9d13e09cf11 331 }
terencez 0:f9d13e09cf11 332 }
terencez 15:d0f20339c1ad 333
terencez 15:d0f20339c1ad 334 printf(" TERENCE:%s, %d: \n",__FUNCTION__, __LINE__);
terencez 0:f9d13e09cf11 335 i = 0;
terencez 0:f9d13e09cf11 336 do
terencez 0:f9d13e09cf11 337 {
terencez 15:d0f20339c1ad 338 result = prv_set_value((*dataArrayP) + i, (device_data_t*)(objectP->userData));
terencez 0:f9d13e09cf11 339 i++;
terencez 0:f9d13e09cf11 340 } while (i < *numDataP && result == COAP_205_CONTENT);
terencez 0:f9d13e09cf11 341
terencez 0:f9d13e09cf11 342 return result;
terencez 0:f9d13e09cf11 343 }
terencez 0:f9d13e09cf11 344
terence zhang 4:35892233a85d 345 static uint8_t prv_device_discover(uint16_t instanceId,
terence zhang 4:35892233a85d 346 int * numDataP,
terence zhang 4:35892233a85d 347 lwm2m_data_t ** dataArrayP,
terence zhang 4:35892233a85d 348 lwm2m_object_t * objectP)
terencez 0:f9d13e09cf11 349 {
terence zhang 4:35892233a85d 350 uint8_t result;
terencez 0:f9d13e09cf11 351 int i;
terencez 0:f9d13e09cf11 352
terencez 0:f9d13e09cf11 353 // this is a single instance object
terencez 0:f9d13e09cf11 354 if (instanceId != 0)
terencez 0:f9d13e09cf11 355 {
terencez 0:f9d13e09cf11 356 return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 357 }
terencez 0:f9d13e09cf11 358
terence zhang 4:35892233a85d 359 result = COAP_205_CONTENT;
terencez 0:f9d13e09cf11 360
terence zhang 4:35892233a85d 361 // is the server asking for the full object ?
terence zhang 4:35892233a85d 362 if (*numDataP == 0)
terencez 0:f9d13e09cf11 363 {
terence zhang 4:35892233a85d 364 uint16_t resList[] = {
terencez 15:d0f20339c1ad 365 RES_O_MANUFACTURER,
terencez 15:d0f20339c1ad 366 RES_O_MODEL_NUMBER,
terencez 15:d0f20339c1ad 367 RES_O_SERIAL_NUMBER,
terencez 15:d0f20339c1ad 368 RES_O_FIRMWARE_VERSION,
terencez 15:d0f20339c1ad 369 RES_M_REBOOT,
terencez 15:d0f20339c1ad 370 RES_O_FACTORY_RESET,
terencez 15:d0f20339c1ad 371 RES_O_AVL_POWER_SOURCES,
terencez 15:d0f20339c1ad 372 RES_O_POWER_SOURCE_VOLTAGE,
terencez 15:d0f20339c1ad 373 RES_O_POWER_SOURCE_CURRENT,
terencez 15:d0f20339c1ad 374 RES_O_BATTERY_LEVEL,
terencez 15:d0f20339c1ad 375 RES_O_MEMORY_FREE,
terencez 15:d0f20339c1ad 376 RES_M_ERROR_CODE,
terencez 15:d0f20339c1ad 377 RES_O_RESET_ERROR_CODE,
terencez 15:d0f20339c1ad 378 RES_O_CURRENT_TIME,
terencez 15:d0f20339c1ad 379 RES_O_UTC_OFFSET,
terencez 15:d0f20339c1ad 380 RES_O_TIMEZONE,
terencez 15:d0f20339c1ad 381 RES_M_BINDING_MODES
terence zhang 4:35892233a85d 382 };
terencez 15:d0f20339c1ad 383 int nbRes = sizeof(resList) / sizeof(uint16_t);
terencez 0:f9d13e09cf11 384
terence zhang 4:35892233a85d 385 *dataArrayP = lwm2m_data_new(nbRes);
terence zhang 4:35892233a85d 386 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 387 *numDataP = nbRes;
terencez 15:d0f20339c1ad 388 for (i = 0; i < nbRes; i++)
terence zhang 4:35892233a85d 389 {
terence zhang 4:35892233a85d 390 (*dataArrayP)[i].id = resList[i];
terence zhang 4:35892233a85d 391 }
terence zhang 4:35892233a85d 392 }
terence zhang 4:35892233a85d 393 else
terence zhang 4:35892233a85d 394 {
terence zhang 4:35892233a85d 395 for (i = 0; i < *numDataP && result == COAP_205_CONTENT; i++)
terence zhang 4:35892233a85d 396 {
terence zhang 4:35892233a85d 397 switch ((*dataArrayP)[i].id)
terencez 0:f9d13e09cf11 398 {
terence zhang 4:35892233a85d 399 case RES_O_MANUFACTURER:
terence zhang 4:35892233a85d 400 case RES_O_MODEL_NUMBER:
terencez 15:d0f20339c1ad 401 case RES_O_SERIAL_NUMBER:
terencez 15:d0f20339c1ad 402 case RES_O_FIRMWARE_VERSION:
terencez 15:d0f20339c1ad 403 case RES_M_REBOOT:
terencez 15:d0f20339c1ad 404 case RES_O_FACTORY_RESET:
terencez 15:d0f20339c1ad 405 case RES_O_AVL_POWER_SOURCES:
terencez 15:d0f20339c1ad 406 case RES_O_POWER_SOURCE_VOLTAGE:
terencez 15:d0f20339c1ad 407 case RES_O_POWER_SOURCE_CURRENT:
terencez 15:d0f20339c1ad 408 case RES_O_BATTERY_LEVEL:
terencez 15:d0f20339c1ad 409 case RES_O_MEMORY_FREE:
terencez 15:d0f20339c1ad 410 case RES_M_ERROR_CODE:
terencez 15:d0f20339c1ad 411 case RES_O_RESET_ERROR_CODE:
terencez 15:d0f20339c1ad 412 case RES_O_CURRENT_TIME:
terencez 15:d0f20339c1ad 413 case RES_O_UTC_OFFSET:
terencez 15:d0f20339c1ad 414 case RES_O_TIMEZONE:
terence zhang 4:35892233a85d 415 case RES_M_BINDING_MODES:
terence zhang 4:35892233a85d 416 break;
terence zhang 4:35892233a85d 417 default:
terence zhang 4:35892233a85d 418 result = COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 419 }
terencez 0:f9d13e09cf11 420 }
terence zhang 4:35892233a85d 421 }
terencez 0:f9d13e09cf11 422
terencez 0:f9d13e09cf11 423 return result;
terencez 0:f9d13e09cf11 424 }
terencez 0:f9d13e09cf11 425
terencez 15:d0f20339c1ad 426 static uint8_t prv_device_write(uint16_t instanceId,
terencez 15:d0f20339c1ad 427 int numData,
terencez 15:d0f20339c1ad 428 lwm2m_data_t * dataArray,
terencez 15:d0f20339c1ad 429 lwm2m_object_t * objectP)
terencez 15:d0f20339c1ad 430 {
terencez 15:d0f20339c1ad 431 int i;
terencez 15:d0f20339c1ad 432 uint8_t result;
terencez 15:d0f20339c1ad 433
terencez 15:d0f20339c1ad 434 // this is a single instance object
terencez 15:d0f20339c1ad 435 if (instanceId != 0)
terencez 15:d0f20339c1ad 436 {
terencez 15:d0f20339c1ad 437 return COAP_404_NOT_FOUND;
terencez 15:d0f20339c1ad 438 }
terencez 15:d0f20339c1ad 439
terencez 15:d0f20339c1ad 440 i = 0;
terencez 15:d0f20339c1ad 441
terencez 15:d0f20339c1ad 442 do
terencez 15:d0f20339c1ad 443 {
terencez 15:d0f20339c1ad 444 switch (dataArray[i].id)
terencez 15:d0f20339c1ad 445 {
terencez 15:d0f20339c1ad 446 case RES_O_CURRENT_TIME:
terencez 15:d0f20339c1ad 447 if (1 == lwm2m_data_decode_int(dataArray + i, &((device_data_t*)(objectP->userData))->time))
terencez 15:d0f20339c1ad 448 {
terencez 15:d0f20339c1ad 449 ((device_data_t*)(objectP->userData))->time -= time(NULL);
terencez 15:d0f20339c1ad 450 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 451 }
terencez 15:d0f20339c1ad 452 else
terencez 15:d0f20339c1ad 453 {
terencez 15:d0f20339c1ad 454 result = COAP_400_BAD_REQUEST;
terencez 15:d0f20339c1ad 455 }
terencez 15:d0f20339c1ad 456 break;
terencez 15:d0f20339c1ad 457
terencez 15:d0f20339c1ad 458 case RES_O_UTC_OFFSET:
terencez 15:d0f20339c1ad 459 if (1 == prv_check_time_offset((char*)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length))
terencez 15:d0f20339c1ad 460 {
terencez 15:d0f20339c1ad 461 strncpy(((device_data_t*)(objectP->userData))->time_offset, (char*)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);
terencez 15:d0f20339c1ad 462 ((device_data_t*)(objectP->userData))->time_offset[dataArray[i].value.asBuffer.length] = 0;
terencez 15:d0f20339c1ad 463 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 464 }
terencez 15:d0f20339c1ad 465 else
terencez 15:d0f20339c1ad 466 {
terencez 15:d0f20339c1ad 467 result = COAP_400_BAD_REQUEST;
terencez 15:d0f20339c1ad 468 }
terencez 15:d0f20339c1ad 469 break;
terencez 15:d0f20339c1ad 470
terencez 15:d0f20339c1ad 471 case RES_O_TIMEZONE:
terencez 15:d0f20339c1ad 472 //ToDo IANA TZ Format
terencez 15:d0f20339c1ad 473 result = COAP_501_NOT_IMPLEMENTED;
terencez 15:d0f20339c1ad 474 break;
terencez 15:d0f20339c1ad 475
terencez 15:d0f20339c1ad 476 default:
terencez 15:d0f20339c1ad 477 result = COAP_405_METHOD_NOT_ALLOWED;
terencez 15:d0f20339c1ad 478 }
terencez 15:d0f20339c1ad 479
terencez 15:d0f20339c1ad 480 i++;
terencez 15:d0f20339c1ad 481 } while (i < numData && result == COAP_204_CHANGED);
terencez 15:d0f20339c1ad 482
terencez 15:d0f20339c1ad 483 return result;
terencez 15:d0f20339c1ad 484 }
terencez 15:d0f20339c1ad 485
terencez 0:f9d13e09cf11 486 static uint8_t prv_device_execute(uint16_t instanceId,
terencez 0:f9d13e09cf11 487 uint16_t resourceId,
terence zhang 4:35892233a85d 488 uint8_t * buffer,
terencez 0:f9d13e09cf11 489 int length,
terencez 0:f9d13e09cf11 490 lwm2m_object_t * objectP)
terencez 0:f9d13e09cf11 491 {
terencez 0:f9d13e09cf11 492 // this is a single instance object
terencez 0:f9d13e09cf11 493 if (instanceId != 0)
terencez 0:f9d13e09cf11 494 {
terencez 0:f9d13e09cf11 495 return COAP_404_NOT_FOUND;
terencez 0:f9d13e09cf11 496 }
terencez 0:f9d13e09cf11 497
terencez 0:f9d13e09cf11 498 if (length != 0) return COAP_400_BAD_REQUEST;
terencez 0:f9d13e09cf11 499
terencez 15:d0f20339c1ad 500 switch (resourceId)
terencez 0:f9d13e09cf11 501 {
terencez 15:d0f20339c1ad 502 case RES_M_REBOOT:
terencez 15:d0f20339c1ad 503 fprintf(stdout, "\n\t REBOOT not implemented yet!\r\n\n");
terencez 15:d0f20339c1ad 504 //g_reboot = 1;
terencez 15:d0f20339c1ad 505 return COAP_204_CHANGED;
terencez 15:d0f20339c1ad 506 case RES_O_FACTORY_RESET:
terencez 15:d0f20339c1ad 507 fprintf(stdout, "\n\t FACTORY RESET\r\n\n");
terencez 15:d0f20339c1ad 508 return COAP_204_CHANGED;
terencez 15:d0f20339c1ad 509 case RES_O_RESET_ERROR_CODE:
terencez 15:d0f20339c1ad 510 fprintf(stdout, "\n\t RESET ERROR CODE\r\n\n");
terencez 15:d0f20339c1ad 511 ((device_data_t*)(objectP->userData))->error = 0;
terencez 0:f9d13e09cf11 512 return COAP_204_CHANGED;
terencez 15:d0f20339c1ad 513 default:
terencez 15:d0f20339c1ad 514 return COAP_405_METHOD_NOT_ALLOWED;
terencez 0:f9d13e09cf11 515 }
terencez 15:d0f20339c1ad 516 }
terence zhang 4:35892233a85d 517
terencez 15:d0f20339c1ad 518 void display_device_object(lwm2m_object_t * object)
terencez 15:d0f20339c1ad 519 {
terencez 15:d0f20339c1ad 520 #ifdef WITH_LOGS
terencez 15:d0f20339c1ad 521 device_data_t * data = (device_data_t *)object->userData;
terencez 15:d0f20339c1ad 522 fprintf(stdout, " /%u: Device object:\r\n", object->objID);
terencez 15:d0f20339c1ad 523 if (NULL != data)
terencez 15:d0f20339c1ad 524 {
terencez 15:d0f20339c1ad 525 fprintf(stdout, " time: %lld, time_offset: %s\r\n",
terencez 15:d0f20339c1ad 526 (long long) data->time, data->time_offset);
terencez 15:d0f20339c1ad 527 }
terencez 15:d0f20339c1ad 528 #endif
terencez 0:f9d13e09cf11 529 }
terencez 0:f9d13e09cf11 530
terencez 0:f9d13e09cf11 531 lwm2m_object_t * get_object_device()
terencez 0:f9d13e09cf11 532 {
terencez 0:f9d13e09cf11 533 /*
terencez 0:f9d13e09cf11 534 * The get_object_device function create the object itself and return a pointer to the structure that represent it.
terencez 0:f9d13e09cf11 535 */
terencez 0:f9d13e09cf11 536 lwm2m_object_t * deviceObj;
terencez 0:f9d13e09cf11 537
terence zhang 4:35892233a85d 538 deviceObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
terencez 0:f9d13e09cf11 539
terencez 0:f9d13e09cf11 540 if (NULL != deviceObj)
terencez 0:f9d13e09cf11 541 {
terencez 0:f9d13e09cf11 542 memset(deviceObj, 0, sizeof(lwm2m_object_t));
terencez 0:f9d13e09cf11 543
terencez 0:f9d13e09cf11 544 /*
terence zhang 4:35892233a85d 545 * It assigns his unique ID
terencez 0:f9d13e09cf11 546 * The 3 is the standard ID for the mandatory object "Object device".
terencez 0:f9d13e09cf11 547 */
terence zhang 4:35892233a85d 548 deviceObj->objID = LWM2M_DEVICE_OBJECT_ID;
terencez 0:f9d13e09cf11 549
terencez 0:f9d13e09cf11 550 /*
terence zhang 4:35892233a85d 551 * and its unique instance
terence zhang 4:35892233a85d 552 *
terence zhang 4:35892233a85d 553 */
terence zhang 4:35892233a85d 554 deviceObj->instanceList = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t));
terence zhang 4:35892233a85d 555 if (NULL != deviceObj->instanceList)
terence zhang 4:35892233a85d 556 {
terence zhang 4:35892233a85d 557 memset(deviceObj->instanceList, 0, sizeof(lwm2m_list_t));
terence zhang 4:35892233a85d 558 }
terence zhang 4:35892233a85d 559 else
terence zhang 4:35892233a85d 560 {
terence zhang 4:35892233a85d 561 lwm2m_free(deviceObj);
terence zhang 4:35892233a85d 562 return NULL;
terence zhang 4:35892233a85d 563 }
terence zhang 4:35892233a85d 564
terence zhang 4:35892233a85d 565 /*
terencez 0:f9d13e09cf11 566 * And the private function that will access the object.
terencez 0:f9d13e09cf11 567 * Those function will be called when a read/write/execute query is made by the server. In fact the library don't need to
terencez 0:f9d13e09cf11 568 * know the resources of the object, only the server does.
terencez 0:f9d13e09cf11 569 */
terence zhang 4:35892233a85d 570 deviceObj->readFunc = prv_device_read;
terencez 15:d0f20339c1ad 571 deviceObj->discoverFunc = prv_device_discover;
terencez 15:d0f20339c1ad 572 deviceObj->writeFunc = prv_device_write;
terence zhang 4:35892233a85d 573 deviceObj->executeFunc = prv_device_execute;
terencez 15:d0f20339c1ad 574 deviceObj->userData = lwm2m_malloc(sizeof(device_data_t));
terencez 0:f9d13e09cf11 575
terencez 15:d0f20339c1ad 576 /*
terencez 15:d0f20339c1ad 577 * Also some user data can be stored in the object with a private structure containing the needed variables
terencez 15:d0f20339c1ad 578 */
terencez 15:d0f20339c1ad 579 if (NULL != deviceObj->userData)
terencez 15:d0f20339c1ad 580 {
terencez 15:d0f20339c1ad 581 ((device_data_t*)deviceObj->userData)->battery_level = PRV_BATTERY_LEVEL;
terencez 15:d0f20339c1ad 582 ((device_data_t*)deviceObj->userData)->free_memory = PRV_MEMORY_FREE;
terencez 15:d0f20339c1ad 583 ((device_data_t*)deviceObj->userData)->error = PRV_ERROR_CODE;
terencez 15:d0f20339c1ad 584 ((device_data_t*)deviceObj->userData)->time = 1367491215;
terencez 15:d0f20339c1ad 585 strcpy(((device_data_t*)deviceObj->userData)->time_offset, "+01:00");
terencez 15:d0f20339c1ad 586 }
terencez 15:d0f20339c1ad 587 else
terencez 15:d0f20339c1ad 588 {
terencez 15:d0f20339c1ad 589 lwm2m_free(deviceObj->instanceList);
terencez 15:d0f20339c1ad 590 lwm2m_free(deviceObj);
terencez 15:d0f20339c1ad 591 deviceObj = NULL;
terencez 15:d0f20339c1ad 592 }
terencez 15:d0f20339c1ad 593 }
terencez 0:f9d13e09cf11 594
terencez 0:f9d13e09cf11 595 return deviceObj;
terencez 0:f9d13e09cf11 596 }
terence zhang 4:35892233a85d 597
terence zhang 4:35892233a85d 598 void free_object_device(lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 599 {
terence zhang 4:35892233a85d 600 if (NULL != objectP->userData)
terence zhang 4:35892233a85d 601 {
terence zhang 4:35892233a85d 602 lwm2m_free(objectP->userData);
terence zhang 4:35892233a85d 603 objectP->userData = NULL;
terence zhang 4:35892233a85d 604 }
terence zhang 4:35892233a85d 605 if (NULL != objectP->instanceList)
terence zhang 4:35892233a85d 606 {
terence zhang 4:35892233a85d 607 lwm2m_free(objectP->instanceList);
terence zhang 4:35892233a85d 608 objectP->instanceList = NULL;
terence zhang 4:35892233a85d 609 }
terence zhang 4:35892233a85d 610
terence zhang 4:35892233a85d 611 lwm2m_free(objectP);
terence zhang 4:35892233a85d 612 }
terencez 15:d0f20339c1ad 613
terencez 15:d0f20339c1ad 614 uint8_t device_change(lwm2m_data_t * dataArray,
terencez 15:d0f20339c1ad 615 lwm2m_object_t * objectP)
terencez 15:d0f20339c1ad 616 {
terencez 15:d0f20339c1ad 617 uint8_t result;
terencez 15:d0f20339c1ad 618
terencez 15:d0f20339c1ad 619 switch (dataArray->id)
terencez 15:d0f20339c1ad 620 {
terencez 15:d0f20339c1ad 621 case RES_O_BATTERY_LEVEL:
terencez 15:d0f20339c1ad 622 {
terencez 15:d0f20339c1ad 623 int64_t value;
terencez 15:d0f20339c1ad 624 if (1 == lwm2m_data_decode_int(dataArray, &value))
terencez 15:d0f20339c1ad 625 {
terencez 15:d0f20339c1ad 626 if ((0 <= value) && (100 >= value))
terencez 15:d0f20339c1ad 627 {
terencez 15:d0f20339c1ad 628 ((device_data_t*)(objectP->userData))->battery_level = value;
terencez 15:d0f20339c1ad 629 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 630 }
terencez 15:d0f20339c1ad 631 else
terencez 15:d0f20339c1ad 632 {
terencez 15:d0f20339c1ad 633 result = COAP_400_BAD_REQUEST;
terencez 15:d0f20339c1ad 634 }
terencez 15:d0f20339c1ad 635 }
terencez 15:d0f20339c1ad 636 else
terencez 15:d0f20339c1ad 637 {
terencez 15:d0f20339c1ad 638 result = COAP_400_BAD_REQUEST;
terencez 15:d0f20339c1ad 639 }
terencez 15:d0f20339c1ad 640 }
terencez 15:d0f20339c1ad 641 break;
terencez 15:d0f20339c1ad 642 case RES_M_ERROR_CODE:
terencez 15:d0f20339c1ad 643 if (1 == lwm2m_data_decode_int(dataArray, &((device_data_t*)(objectP->userData))->error))
terencez 15:d0f20339c1ad 644 {
terencez 15:d0f20339c1ad 645 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 646 }
terencez 15:d0f20339c1ad 647 else
terencez 15:d0f20339c1ad 648 {
terencez 15:d0f20339c1ad 649 result = COAP_400_BAD_REQUEST;
terencez 15:d0f20339c1ad 650 }
terencez 15:d0f20339c1ad 651 break;
terencez 15:d0f20339c1ad 652 case RES_O_MEMORY_FREE:
terencez 15:d0f20339c1ad 653 if (1 == lwm2m_data_decode_int(dataArray, &((device_data_t*)(objectP->userData))->free_memory))
terencez 15:d0f20339c1ad 654 {
terencez 15:d0f20339c1ad 655 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 656 }
terencez 15:d0f20339c1ad 657 else
terencez 15:d0f20339c1ad 658 {
terencez 15:d0f20339c1ad 659 result = COAP_400_BAD_REQUEST;
terencez 15:d0f20339c1ad 660 }
terencez 15:d0f20339c1ad 661 break;
terencez 15:d0f20339c1ad 662 default:
terencez 15:d0f20339c1ad 663 result = COAP_405_METHOD_NOT_ALLOWED;
terencez 15:d0f20339c1ad 664 break;
terencez 15:d0f20339c1ad 665 }
terencez 15:d0f20339c1ad 666
terencez 15:d0f20339c1ad 667 return result;
terencez 15:d0f20339c1ad 668 }