Contiki 3.x
lwm2m-object.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015, Yanzi Networks AB.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the copyright holder nor the names of its
14  * contributors may be used to endorse or promote products derived
15  * from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
18  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28  * OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 /**
32  * \addtogroup apps
33  * @{
34  */
35 
36 /**
37  * \defgroup oma-lwm2m An implementation of OMA LWM2M
38  * @{
39  *
40  * This application is an implementation of OMA Lightweight M2M.
41  */
42 
43 /**
44  * \file
45  * Header file for the Contiki OMA LWM2M object API
46  * \author
47  * Joakim Eriksson <joakime@sics.se>
48  * Niclas Finne <nfi@sics.se>
49  */
50 
51 #ifndef LWM2M_OBJECT_H_
52 #define LWM2M_OBJECT_H_
53 
54 #include "rest-engine.h"
55 #include "er-coap-observe.h"
56 
57 #define LWM2M_OBJECT_SECURITY_ID 0
58 #define LWM2M_OBJECT_SERVER_ID 1
59 #define LWM2M_OBJECT_ACCESS_CONTROL_ID 2
60 #define LWM2M_OBJECT_DEVICE_ID 3
61 #define LWM2M_OBJECT_CONNECTIVITY_MONITORING_ID 4
62 #define LWM2M_OBJECT_FIRMWARE_ID 5
63 #define LWM2M_OBJECT_LOCATION_ID 6
64 #define LWM2M_OBJECT_CONNECTIVITY_STATISTICS_ID 7
65 
66 #define LWM2M_SECURITY_SERVER_URI 0
67 #define LWM2M_SECURITY_BOOTSTRAP_SERVER 1
68 #define LWM2M_SECURITY_MODE 2
69 #define LWM2M_SECURITY_CLIENT_PKI 3
70 #define LWM2M_SECURITY_SERVER_PKI 4
71 #define LWM2M_SECURITY_KEY 5
72 #define LWM2M_SECURITY_SHORT_SERVER_ID 10
73 
74 /* Pre-shared key mode */
75 #define LWM2M_SECURITY_MODE_PSK 0
76 /* Raw Public Key mode */
77 #define LWM2M_SECURITY_MODE_RPK 1
78 /* Certificate mode */
79 #define LWM2M_SECURITY_MODE_CERTIFICATE 2
80 /* NoSec mode */
81 #define LWM2M_SECURITY_MODE_NOSEC 3
82 
83 #define LWM2M_OBJECT_STR_HELPER(x) (uint8_t *) #x
84 #define LWM2M_OBJECT_STR(x) LWM2M_OBJECT_STR_HELPER(x)
85 
86 #define LWM2M_OBJECT_PATH_STR_HELPER(x) #x
87 #define LWM2M_OBJECT_PATH_STR(x) LWM2M_OBJECT_PATH_STR_HELPER(x)
88 
89 struct lwm2m_reader;
90 struct lwm2m_writer;
91 /* Data model for OMA LWM2M objects */
92 typedef struct lwm2m_context {
93  uint16_t object_id;
94  uint16_t object_instance_id;
95  uint16_t resource_id;
96  uint8_t object_instance_index;
97  uint8_t resource_index;
98  /* TODO - add uint16_t resource_instance_id */
99 
100  const struct lwm2m_reader *reader;
101  const struct lwm2m_writer *writer;
102 } lwm2m_context_t;
103 
104 /* LWM2M format writer for the various formats supported */
105 typedef struct lwm2m_writer {
106  size_t (* write_int)(const lwm2m_context_t *ctx, uint8_t *outbuf, size_t outlen, int32_t value);
107  size_t (* write_string)(const lwm2m_context_t *ctx, uint8_t *outbuf, size_t outlen, const char *value, size_t strlen);
108  size_t (* write_float32fix)(const lwm2m_context_t *ctx, uint8_t *outbuf, size_t outlen, int32_t value, int bits);
109  size_t (* write_boolean)(const lwm2m_context_t *ctx, uint8_t *outbuf, size_t outlen, int value);
110 } lwm2m_writer_t;
111 
112 typedef struct lwm2m_reader {
113  size_t (* read_int)(const lwm2m_context_t *ctx, const uint8_t *inbuf, size_t len, int32_t *value);
114  size_t (* read_string)(const lwm2m_context_t *ctx, const uint8_t *inbuf, size_t len, uint8_t *value, size_t strlen);
115  size_t (* read_float32fix)(const lwm2m_context_t *ctx, const uint8_t *inbuf, size_t len, int32_t *value, int bits);
116  size_t (* read_boolean)(const lwm2m_context_t *ctx, const uint8_t *inbuf, size_t len, int *value);
117 } lwm2m_reader_t;
118 
119 typedef struct lwm2m_value_callback {
120  int (* read)(lwm2m_context_t *ctx, uint8_t *outbuf, size_t outlen);
121  int (* write)(lwm2m_context_t *ctx,
122  const uint8_t *buffer, size_t len,
123  uint8_t *outbuf, size_t outlen);
124  int (* exec)(lwm2m_context_t *ctx, const uint8_t *arg, size_t len,
125  uint8_t *outbuf, size_t outlen);
126 } lwm2m_value_callback_t;
127 
128 #define LWM2M_RESOURCE_TYPE_STR_VALUE 1
129 #define LWM2M_RESOURCE_TYPE_STR_VARIABLE 2
130 #define LWM2M_RESOURCE_TYPE_STR_VARIABLE_ARRAY 3
131 #define LWM2M_RESOURCE_TYPE_INT_VALUE 4
132 #define LWM2M_RESOURCE_TYPE_INT_VARIABLE 5
133 #define LWM2M_RESOURCE_TYPE_INT_VARIABLE_ARRAY 6
134 #define LWM2M_RESOURCE_TYPE_FLOATFIX_VALUE 7
135 #define LWM2M_RESOURCE_TYPE_FLOATFIX_VARIABLE 8
136 #define LWM2M_RESOURCE_TYPE_FLOATFIX_VARIABLE_ARRAY 9
137 #define LWM2M_RESOURCE_TYPE_BOOLEAN_VALUE 10
138 #define LWM2M_RESOURCE_TYPE_BOOLEAN_VARIABLE 11
139 #define LWM2M_RESOURCE_TYPE_BOOLEAN_VARIABLE_ARRAY 12
140 #define LWM2M_RESOURCE_TYPE_CALLBACK 16
141 #define LWM2M_RESOURCE_TYPE_INSTANCES 17
142 
143 typedef struct lwm2m_resource {
144  uint16_t id;
145  uint8_t type; /* indicate value type and multi-instance resource */
146  union {
147  struct {
148  uint16_t len;
149  const uint8_t *value;
150  } string;
151  struct {
152  uint16_t size;
153  uint16_t *len;
154  uint8_t **var;
155  } stringvar;
156  struct {
157  uint16_t count;
158  uint16_t size;
159  /* string var array with counting entries */
160  uint16_t *len;
161  uint8_t *var;
162  } stringvararr;
163  struct {
164  int32_t value;
165  } integer;
166  struct {
167  int32_t *var;
168  } integervar;
169  struct {
170  /* used for multiple instances (dynamic) NOTE: this is an index into
171  the instance so having two instances means that there is need for
172  allocation of two ints here */
173  uint16_t count;
174  int32_t *var; /* used as an array? */
175  } integervararr;
176  struct {
177  int32_t value;
178  } floatfix;
179  struct {
180  int32_t *var;
181  } floatfixvar;
182  struct {
183  uint16_t count;
184  int32_t *var;
185  } floatfixvararr;
186  struct {
187  int value;
188  } boolean;
189  struct {
190  int *var;
191  } booleanvar;
192  struct {
193  uint16_t count;
194  int *var;
195  } booleanvararr;
196  lwm2m_value_callback_t callback;
197  /* lwm2m_resource *resources[]; TO BE ADDED LATER*/
198  } value;
199 } lwm2m_resource_t;
200 
201 #define LWM2M_INSTANCE_FLAG_USED 1
202 
203 typedef struct lwm2m_instance {
204  uint16_t id;
205  uint16_t count;
206  uint16_t flag;
207  const lwm2m_resource_t *resources;
208 } lwm2m_instance_t;
209 
210 typedef struct lwm2m_object {
211  uint16_t id;
212  uint16_t count;
213  const char *path;
214  resource_t *coap_resource;
215  lwm2m_instance_t *instances;
216 } lwm2m_object_t;
217 
218 #define LWM2M_RESOURCES(name, ...) \
219  static const lwm2m_resource_t name[] = { __VA_ARGS__ }
220 
221 #define LWM2M_RESOURCE_STRING(id, s) \
222  { id, LWM2M_RESOURCE_TYPE_STR_VALUE, .value.string.len = sizeof(s) - 1, .value.string.value = (uint8_t *) s }
223 
224 #define LWM2M_RESOURCE_STRING_VAR(id, s, l, v) \
225  { id, LWM2M_RESOURCE_TYPE_STR_VARIABLE, .value.stringvar.size = (s), .value.stringvar.len = (l), .value.stringvar.var = (v) }
226 
227 #define LWM2M_RESOURCE_STRING_VAR_ARR(id, c, s, l, v) \
228  { id, LWM2M_RESOURCE_TYPE_STR_VARIABLE_ARRAY, .value.stringvararr.count = c, .value.stringvararr.size = s, .value.stringvararr.len = l, .value.stringvararr.var = (uint8_t *) v }
229 
230 #define LWM2M_RESOURCE_INTEGER(id, v) \
231  { id, LWM2M_RESOURCE_TYPE_INT_VALUE, .value.integer.value = (v) }
232 
233 #define LWM2M_RESOURCE_INTEGER_VAR(id, v) \
234  { id, LWM2M_RESOURCE_TYPE_INT_VARIABLE, .value.integervar.var = (v) }
235 
236 #define LWM2M_RESOURCE_INTEGER_VAR_ARR(id, c, v) \
237  { id, LWM2M_RESOURCE_TYPE_INT_VARIABLE_ARRAY, .value.integervararr.count = (c), .value.integervararr.var = (v) }
238 
239 #define LWM2M_RESOURCE_FLOATFIX(id, v) \
240  { id, LWM2M_RESOURCE_TYPE_FLOATFIX_VALUE, .value.floatfix.value = (v) }
241 
242 #define LWM2M_RESOURCE_FLOATFIX_VAR(id, v) \
243  { id, LWM2M_RESOURCE_TYPE_FLOATFIX_VARIABLE, .value.floatfixvar.var = (v) }
244 
245 #define LWM2M_RESOURCE_FLOATFIX_VAR_ARR(id, c, v) \
246  { id, LWM2M_RESOURCE_TYPE_FLOATFIX_VARIABLE_ARRAY, .value.floatfixvararr.count = (c), .value.floatfixvararr.var = (v) }
247 
248 #define LWM2M_RESOURCE_BOOLEAN(id, v) \
249  { id, LWM2M_RESOURCE_TYPE_BOOLEAN_VALUE, .value.boolean.value = (v) }
250 
251 #define LWM2M_RESOURCE_BOOLEAN_VAR(id, v) \
252  { id, LWM2M_RESOURCE_TYPE_BOOLEAN_VARIABLE, .value.booleanvar.var = (v) }
253 
254 #define LWM2M_RESOURCE_BOOLEAN_VAR_ARR(id, c, v) \
255  { id, LWM2M_RESOURCE_TYPE_BOOLEAN_VARIABLE_ARRAY, .value.booleanvararr.count = (c), .value.booleanvararr.var = (v) }
256 
257 #define LWM2M_RESOURCE_CALLBACK(id, ...) \
258  { id, LWM2M_RESOURCE_TYPE_CALLBACK, .value.callback = __VA_ARGS__ }
259 
260 #define LWM2M_INSTANCE(id, resources) \
261  { id, sizeof(resources)/sizeof(lwm2m_resource_t), LWM2M_INSTANCE_FLAG_USED, resources }
262 
263 #define LWM2M_INSTANCE_UNUSED(id, resources) \
264  { id, sizeof(resources)/sizeof(lwm2m_resource_t), 0, resources }
265 
266 #define LWM2M_INSTANCES(name, ...) \
267  static lwm2m_instance_t name[] = { __VA_ARGS__ }
268 
269 #define LWM2M_OBJECT(name, id, instances) \
270  static void lwm2m_get_h_##name(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset); \
271  static void lwm2m_put_h_##name(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset); \
272  static void lwm2m_post_h_##name(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset); \
273  static void lwm2m_delete_h_##name(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset); \
274  static resource_t rest_rsc_##name = { NULL, NULL, HAS_SUB_RESOURCES | IS_OBSERVABLE, NULL, lwm2m_get_h_##name, lwm2m_post_h_##name, lwm2m_put_h_##name, lwm2m_delete_h_##name, { NULL } }; \
275  static const lwm2m_object_t name = { id, sizeof(instances)/sizeof(lwm2m_instance_t), LWM2M_OBJECT_PATH_STR(id), &rest_rsc_##name, instances}; \
276  static void lwm2m_get_h_##name(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { \
277  lwm2m_engine_handler(&name, request, response, buffer, preferred_size, offset); } \
278  static void lwm2m_put_h_##name(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { \
279  lwm2m_engine_handler(&name, request, response, buffer, preferred_size, offset); } \
280  static void lwm2m_post_h_##name(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { \
281  lwm2m_engine_handler(&name, request, response, buffer, preferred_size, offset); } \
282  static void lwm2m_delete_h_##name(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { \
283  lwm2m_engine_delete_handler(&name, request, response, buffer, preferred_size, offset); }
284 
285 /* how do we register attributes in the above resource here ??? */
286 
287 int lwm2m_object_is_resource_string(const lwm2m_resource_t *resource);
288 int lwm2m_object_is_resource_int(const lwm2m_resource_t *resource);
289 int lwm2m_object_is_resource_floatfix(const lwm2m_resource_t *resource);
290 int lwm2m_object_is_resource_boolean(const lwm2m_resource_t *resource);
291 
292 static inline int
293 lwm2m_object_is_resource_callback(const lwm2m_resource_t *resource)
294 {
295  return resource != NULL && resource->type == LWM2M_RESOURCE_TYPE_CALLBACK;
296 }
297 
298 const uint8_t *
299 lwm2m_object_get_resource_string(const lwm2m_resource_t *resource,
300  const lwm2m_context_t *context);
301 
302 uint16_t
303 lwm2m_object_get_resource_strlen(const lwm2m_resource_t *resource,
304  const lwm2m_context_t *context);
305 
306 int
307 lwm2m_object_set_resource_string(const lwm2m_resource_t *resource,
308  const lwm2m_context_t *context,
309  uint16_t len, const uint8_t *string);
310 
311 int
312 lwm2m_object_get_resource_int(const lwm2m_resource_t *resource,
313  const lwm2m_context_t *context,
314  int32_t *value);
315 
316 int
317 lwm2m_object_set_resource_int(const lwm2m_resource_t *resource,
318  const lwm2m_context_t *context,
319  int32_t value);
320 
321 int
322 lwm2m_object_get_resource_floatfix(const lwm2m_resource_t *resource,
323  const lwm2m_context_t *context,
324  int32_t *value);
325 
326 int
327 lwm2m_object_set_resource_floatfix(const lwm2m_resource_t *resource,
328  const lwm2m_context_t *context,
329  int32_t value);
330 
331 int
332 lwm2m_object_get_resource_boolean(const lwm2m_resource_t *resource,
333  const lwm2m_context_t *context,
334  int *value);
335 
336 int
337 lwm2m_object_set_resource_boolean(const lwm2m_resource_t *resource,
338  const lwm2m_context_t *context,
339  int value);
340 
341 static inline resource_t *
342 lwm2m_object_get_coap_resource(const lwm2m_object_t *object)
343 {
344  return (resource_t *)object->coap_resource;
345 }
346 
347 static inline void
348 lwm2m_object_notify_observers(const lwm2m_object_t *object, char *path)
349 {
350  coap_notify_observers_sub(lwm2m_object_get_coap_resource(object), path);
351 }
352 
353 #include "lwm2m-engine.h"
354 
355 #endif /* LWM2M_OBJECT_H_ */
356 /**
357  * @}
358  * @}
359  */
CoAP module for observing resources (draft-ietf-core-observe-11).
An abstraction layer for RESTful Web services (Erbium).
static struct sicslowpan_addr_context * context
Addresses contexts for IPHC.
Definition: sicslowpan.c:501
Header file for the Contiki OMA LWM2M engine
#define NULL
The null pointer.
static volatile clock_time_t count
These routines define the AVR-specific calls declared in /core/sys/clock.h CLOCK_SECOND is the number...
Definition: clock.c:80