51 #ifndef LWM2M_OBJECT_H_
52 #define LWM2M_OBJECT_H_
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
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
75 #define LWM2M_SECURITY_MODE_PSK 0
77 #define LWM2M_SECURITY_MODE_RPK 1
79 #define LWM2M_SECURITY_MODE_CERTIFICATE 2
81 #define LWM2M_SECURITY_MODE_NOSEC 3
83 #define LWM2M_OBJECT_STR_HELPER(x) (uint8_t *) #x
84 #define LWM2M_OBJECT_STR(x) LWM2M_OBJECT_STR_HELPER(x)
86 #define LWM2M_OBJECT_PATH_STR_HELPER(x) #x
87 #define LWM2M_OBJECT_PATH_STR(x) LWM2M_OBJECT_PATH_STR_HELPER(x)
92 typedef struct lwm2m_context {
94 uint16_t object_instance_id;
96 uint8_t object_instance_index;
97 uint8_t resource_index;
100 const struct lwm2m_reader *reader;
101 const struct lwm2m_writer *writer;
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);
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);
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;
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
143 typedef struct lwm2m_resource {
149 const uint8_t *value;
196 lwm2m_value_callback_t callback;
201 #define LWM2M_INSTANCE_FLAG_USED 1
203 typedef struct lwm2m_instance {
207 const lwm2m_resource_t *resources;
210 typedef struct lwm2m_object {
214 resource_t *coap_resource;
215 lwm2m_instance_t *instances;
218 #define LWM2M_RESOURCES(name, ...) \
219 static const lwm2m_resource_t name[] = { __VA_ARGS__ }
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 }
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) }
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 }
230 #define LWM2M_RESOURCE_INTEGER(id, v) \
231 { id, LWM2M_RESOURCE_TYPE_INT_VALUE, .value.integer.value = (v) }
233 #define LWM2M_RESOURCE_INTEGER_VAR(id, v) \
234 { id, LWM2M_RESOURCE_TYPE_INT_VARIABLE, .value.integervar.var = (v) }
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) }
239 #define LWM2M_RESOURCE_FLOATFIX(id, v) \
240 { id, LWM2M_RESOURCE_TYPE_FLOATFIX_VALUE, .value.floatfix.value = (v) }
242 #define LWM2M_RESOURCE_FLOATFIX_VAR(id, v) \
243 { id, LWM2M_RESOURCE_TYPE_FLOATFIX_VARIABLE, .value.floatfixvar.var = (v) }
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) }
248 #define LWM2M_RESOURCE_BOOLEAN(id, v) \
249 { id, LWM2M_RESOURCE_TYPE_BOOLEAN_VALUE, .value.boolean.value = (v) }
251 #define LWM2M_RESOURCE_BOOLEAN_VAR(id, v) \
252 { id, LWM2M_RESOURCE_TYPE_BOOLEAN_VARIABLE, .value.booleanvar.var = (v) }
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) }
257 #define LWM2M_RESOURCE_CALLBACK(id, ...) \
258 { id, LWM2M_RESOURCE_TYPE_CALLBACK, .value.callback = __VA_ARGS__ }
260 #define LWM2M_INSTANCE(id, resources) \
261 { id, sizeof(resources)/sizeof(lwm2m_resource_t), LWM2M_INSTANCE_FLAG_USED, resources }
263 #define LWM2M_INSTANCE_UNUSED(id, resources) \
264 { id, sizeof(resources)/sizeof(lwm2m_resource_t), 0, resources }
266 #define LWM2M_INSTANCES(name, ...) \
267 static lwm2m_instance_t name[] = { __VA_ARGS__ }
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); }
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);
293 lwm2m_object_is_resource_callback(
const lwm2m_resource_t *resource)
295 return resource !=
NULL && resource->type == LWM2M_RESOURCE_TYPE_CALLBACK;
299 lwm2m_object_get_resource_string(
const lwm2m_resource_t *resource,
300 const lwm2m_context_t *
context);
303 lwm2m_object_get_resource_strlen(
const lwm2m_resource_t *resource,
304 const lwm2m_context_t *
context);
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);
312 lwm2m_object_get_resource_int(
const lwm2m_resource_t *resource,
313 const lwm2m_context_t *
context,
317 lwm2m_object_set_resource_int(
const lwm2m_resource_t *resource,
318 const lwm2m_context_t *
context,
322 lwm2m_object_get_resource_floatfix(
const lwm2m_resource_t *resource,
323 const lwm2m_context_t *
context,
327 lwm2m_object_set_resource_floatfix(
const lwm2m_resource_t *resource,
328 const lwm2m_context_t *
context,
332 lwm2m_object_get_resource_boolean(
const lwm2m_resource_t *resource,
333 const lwm2m_context_t *
context,
337 lwm2m_object_set_resource_boolean(
const lwm2m_resource_t *resource,
338 const lwm2m_context_t *
context,
341 static inline resource_t *
342 lwm2m_object_get_coap_resource(
const lwm2m_object_t *
object)
344 return (resource_t *)
object->coap_resource;
348 lwm2m_object_notify_observers(
const lwm2m_object_t *
object,
char *path)
350 coap_notify_observers_sub(lwm2m_object_get_coap_resource(
object), path);
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.
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...