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 65 typedef 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 120 typedef struct lwm2m_reader lwm2m_reader_t;
121 typedef struct lwm2m_writer lwm2m_writer_t;
123 typedef struct lwm2m_object_instance lwm2m_object_instance_t;
133 typedef 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;
166 struct lwm2m_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);
179 struct lwm2m_reader {
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);
186 typedef lwm2m_status_t
187 (* lwm2m_write_opaque_callback)(lwm2m_object_instance_t *object,
188 lwm2m_context_t *ctx,
int num_to_write);
190 void lwm2m_engine_set_opaque_callback(lwm2m_context_t *ctx, lwm2m_write_opaque_callback cb);
193 lwm2m_notify_observers(
char *path)
195 coap_notify_observers_sub(NULL, path);
199 lwm2m_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);
205 lwm2m_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);
211 lwm2m_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);
217 lwm2m_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);
223 lwm2m_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;
233 lwm2m_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;
243 lwm2m_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;
253 lwm2m_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;
263 lwm2m_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);
281 lwm2m_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;
293 lwm2m_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;
305 lwm2m_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;
316 lwm2m_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;
327 lwm2m_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;
338 lwm2m_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;
349 lwm2m_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).
Header file for the Contiki OMA LWM2M engine
An implementation of the Constrained Application Protocol (RFC 7252).