51#ifndef LWM2M_OBJECT_H_
52#define LWM2M_OBJECT_H_
58#define LWM2M_RESOURCE_READ 0x10000
59#define LWM2M_RESOURCE_WRITE 0x20000
60#define LWM2M_RESOURCE_EXECUTE 0x40000
61#define LWM2M_RESOURCE_OP_MASK 0x70000
65typedef uint32_t lwm2m_resource_id_t;
68#define RO(x) (x | LWM2M_RESOURCE_READ)
69#define WO(x) (x | LWM2M_RESOURCE_WRITE)
70#define RW(x) (x | LWM2M_RESOURCE_READ | LWM2M_RESOURCE_WRITE)
71#define EX(x) (x | LWM2M_RESOURCE_EXECUTE)
73#define LWM2M_OBJECT_SECURITY_ID 0
74#define LWM2M_OBJECT_SERVER_ID 1
75#define LWM2M_OBJECT_ACCESS_CONTROL_ID 2
76#define LWM2M_OBJECT_DEVICE_ID 3
77#define LWM2M_OBJECT_CONNECTIVITY_MONITORING_ID 4
78#define LWM2M_OBJECT_FIRMWARE_ID 5
79#define LWM2M_OBJECT_LOCATION_ID 6
80#define LWM2M_OBJECT_CONNECTIVITY_STATISTICS_ID 7
99 LWM2M_STATUS_WRITE_ERROR,
101 LWM2M_STATUS_READ_ERROR,
103 LWM2M_STATUS_BAD_REQUEST,
104 LWM2M_STATUS_UNAUTHORIZED,
105 LWM2M_STATUS_FORBIDDEN,
106 LWM2M_STATUS_NOT_FOUND,
107 LWM2M_STATUS_OPERATION_NOT_ALLOWED,
108 LWM2M_STATUS_NOT_ACCEPTABLE,
109 LWM2M_STATUS_UNSUPPORTED_CONTENT_FORMAT,
111 LWM2M_STATUS_NOT_IMPLEMENTED,
112 LWM2M_STATUS_SERVICE_UNAVAILABLE,
116#define WRITER_OUTPUT_VALUE 1
117#define WRITER_RESOURCE_INSTANCE 2
118#define WRITER_HAS_MORE 4
120typedef struct lwm2m_reader lwm2m_reader_t;
121typedef struct lwm2m_writer lwm2m_writer_t;
123typedef struct lwm2m_object_instance lwm2m_object_instance_t;
133typedef struct lwm2m_context {
135 uint16_t object_instance_id;
136 uint16_t resource_id;
137 uint16_t resource_instance_id;
139 uint8_t resource_index;
140 uint8_t resource_instance_index;
142 lwm2m_operation_t operation;
144 coap_message_t *request;
145 coap_message_t *response;
147 unsigned int content_type;
148 lwm2m_buffer_t *outbuf;
149 lwm2m_buffer_t *inbuf;
151 uint8_t out_mark_pos_oi;
152 uint8_t out_mark_pos_ri;
157 uint16_t last_instance;
158 uint16_t last_value_len;
160 uint8_t writer_flags;
161 const lwm2m_reader_t *reader;
162 const lwm2m_writer_t *writer;
167 size_t (* init_write)(lwm2m_context_t *ctx);
168 size_t (* end_write)(lwm2m_context_t *ctx);
170 size_t (* enter_resource_instance)(lwm2m_context_t *ctx);
171 size_t (* exit_resource_instance)(lwm2m_context_t *ctx);
172 size_t (* write_int)(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen, int32_t value);
173 size_t (* write_string)(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen,
const char *value,
size_t strlen);
174 size_t (* write_float32fix)(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen, int32_t value,
int bits);
175 size_t (* write_boolean)(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen,
int value);
176 size_t (* write_opaque_header)(lwm2m_context_t *ctx,
size_t total_size);
180 size_t (* read_int)(lwm2m_context_t *ctx,
const uint8_t *inbuf,
size_t len, int32_t *value);
181 size_t (* read_string)(lwm2m_context_t *ctx,
const uint8_t *inbuf,
size_t len, uint8_t *value,
size_t strlen);
182 size_t (* read_float32fix)(lwm2m_context_t *ctx,
const uint8_t *inbuf,
size_t len, int32_t *value,
int bits);
183 size_t (* read_boolean)(lwm2m_context_t *ctx,
const uint8_t *inbuf,
size_t len,
int *value);
186typedef lwm2m_status_t
187(* lwm2m_write_opaque_callback)(lwm2m_object_instance_t *object,
188 lwm2m_context_t *ctx,
int num_to_write);
190void lwm2m_engine_set_opaque_callback(lwm2m_context_t *ctx, lwm2m_write_opaque_callback cb);
193lwm2m_notify_observers(
char *path)
195 coap_notify_observers_sub(NULL, path);
199lwm2m_object_read_int(lwm2m_context_t *ctx,
const uint8_t *inbuf,
size_t len, int32_t *value)
201 return ctx->reader->read_int(ctx, inbuf, len, value);
205lwm2m_object_read_string(lwm2m_context_t *ctx,
const uint8_t *inbuf,
size_t len, uint8_t *value,
size_t strlen)
207 return ctx->reader->read_string(ctx, inbuf, len, value, strlen);
211lwm2m_object_read_float32fix(lwm2m_context_t *ctx,
const uint8_t *inbuf,
size_t len, int32_t *value,
int bits)
213 return ctx->reader->read_float32fix(ctx, inbuf, len, value, bits);
217lwm2m_object_read_boolean(lwm2m_context_t *ctx,
const uint8_t *inbuf,
size_t len,
int *value)
219 return ctx->reader->read_boolean(ctx, inbuf, len, value);
223lwm2m_object_write_int(lwm2m_context_t *ctx, int32_t value)
226 s = ctx->writer->write_int(ctx, &ctx->outbuf->buffer[ctx->outbuf->len],
227 ctx->outbuf->size - ctx->outbuf->len, value);
228 ctx->outbuf->len += s;
233lwm2m_object_write_string(lwm2m_context_t *ctx,
const char *value,
size_t strlen)
236 s = ctx->writer->write_string(ctx, &ctx->outbuf->buffer[ctx->outbuf->len],
237 ctx->outbuf->size - ctx->outbuf->len, value, strlen);
238 ctx->outbuf->len += s;
243lwm2m_object_write_float32fix(lwm2m_context_t *ctx, int32_t value,
int bits)
246 s = ctx->writer->write_float32fix(ctx, &ctx->outbuf->buffer[ctx->outbuf->len],
247 ctx->outbuf->size - ctx->outbuf->len, value, bits);
248 ctx->outbuf->len += s;
253lwm2m_object_write_boolean(lwm2m_context_t *ctx,
int value)
256 s = ctx->writer->write_boolean(ctx, &ctx->outbuf->buffer[ctx->outbuf->len],
257 ctx->outbuf->size - ctx->outbuf->len, value);
258 ctx->outbuf->len += s;
263lwm2m_object_write_opaque_stream(lwm2m_context_t *ctx,
int size, lwm2m_write_opaque_callback cb)
267 if(ctx->writer->write_opaque_header != NULL) {
268 s = ctx->writer->write_opaque_header(ctx, size);
269 ctx->outbuf->len += s;
274 lwm2m_engine_set_opaque_callback(ctx, cb);
281lwm2m_object_write_enter_ri(lwm2m_context_t *ctx)
283 if(ctx->writer->enter_resource_instance != NULL) {
285 s = ctx->writer->enter_resource_instance(ctx);
286 ctx->outbuf->len += s;
293lwm2m_object_write_exit_ri(lwm2m_context_t *ctx)
295 if(ctx->writer->exit_resource_instance != NULL) {
297 s = ctx->writer->exit_resource_instance(ctx);
298 ctx->outbuf->len += s;
305lwm2m_object_write_int_ri(lwm2m_context_t *ctx, uint16_t
id, int32_t value)
308 ctx->resource_instance_id = id;
309 s = ctx->writer->write_int(ctx, &ctx->outbuf->buffer[ctx->outbuf->len],
310 ctx->outbuf->size - ctx->outbuf->len, value);
311 ctx->outbuf->len += s;
316lwm2m_object_write_string_ri(lwm2m_context_t *ctx, uint16_t
id,
const char *value,
size_t strlen)
319 ctx->resource_instance_id = id;
320 s = ctx->writer->write_string(ctx, &ctx->outbuf->buffer[ctx->outbuf->len],
321 ctx->outbuf->size - ctx->outbuf->len, value, strlen);
322 ctx->outbuf->len += s;
327lwm2m_object_write_float32fix_ri(lwm2m_context_t *ctx, uint16_t
id, int32_t value,
int bits)
330 ctx->resource_instance_id = id;
331 s = ctx->writer->write_float32fix(ctx, &ctx->outbuf->buffer[ctx->outbuf->len],
332 ctx->outbuf->size - ctx->outbuf->len, value, bits);
333 ctx->outbuf->len += s;
338lwm2m_object_write_boolean_ri(lwm2m_context_t *ctx, uint16_t
id,
int value)
341 ctx->resource_instance_id = id;
342 s = ctx->writer->write_boolean(ctx, &ctx->outbuf->buffer[ctx->outbuf->len],
343 ctx->outbuf->size - ctx->outbuf->len, value);
344 ctx->outbuf->len += s;
349lwm2m_object_is_final_incoming(lwm2m_context_t *ctx)
352 if(coap_get_header_block1(ctx->request, NULL, &more, NULL, NULL)) {
CoAP module for observing resources (draft-ietf-core-observe-11).
An implementation of the Constrained Application Protocol (RFC 7252).
Header file for the Contiki OMA LWM2M engine.