From 84cd7a4e9211c091f532f58c7a3877a83de49861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Tue, 24 May 2016 19:16:33 +0200 Subject: [PATCH 1/2] oma-lwm2m: Add functionality to send object instance list as core link format --- apps/oma-lwm2m/lwm2m-engine.c | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/apps/oma-lwm2m/lwm2m-engine.c b/apps/oma-lwm2m/lwm2m-engine.c index e2f6bba7c..ffdacb0e1 100644 --- a/apps/oma-lwm2m/lwm2m-engine.c +++ b/apps/oma-lwm2m/lwm2m-engine.c @@ -585,6 +585,37 @@ get_resource(const lwm2m_instance_t *instance, lwm2m_context_t *context) return NULL; } /*---------------------------------------------------------------------------*/ +/** + * @brief Write a list of object instances as a CoRE Link-format list + */ +static int +write_object_instances_link(const lwm2m_object_t *object, + char *buffer, size_t size) +{ + const lwm2m_instance_t *instance; + int len, rdlen, i; + + PRINTF("", object->id); + rdlen = snprintf(buffer, size, "", + object->id); + if(rdlen < 0 || rdlen >= size) { + return -1; + } + + for(i = 0; i < object->count; i++) { + instance = &object->instances[i]; + PRINTF(",", object->id, instance->id); + + len = snprintf(&buffer[rdlen], size - rdlen, + ",<%d/%d>", object->id, instance->id); + rdlen += len; + if(len < 0 || rdlen >= size) { + return -1; + } + } + return rdlen; +} +/*---------------------------------------------------------------------------*/ static int write_rd_link_data(const lwm2m_object_t *object, const lwm2m_instance_t *instance, @@ -992,6 +1023,23 @@ lwm2m_engine_handler(const lwm2m_object_t *object, REST.set_header_content_type(response, REST.type.APPLICATION_JSON); } } + } else if(depth == 1) { + /* produce a list of instances */ + if(method != METHOD_GET) { + REST.set_response_status(response, METHOD_NOT_ALLOWED_4_05); + } else { + int rdlen; + PRINTF("Sending instance list for object %u\n", object->id); + /* TODO: if(accept == APPLICATION_LINK_FORMAT) { */ + rdlen = write_object_instances_link(object, (char *)buffer, preferred_size); + if(rdlen < 0) { + PRINTF("Failed to generate object response\n"); + REST.set_response_status(response, SERVICE_UNAVAILABLE_5_03); + return; + } + REST.set_header_content_type(response, REST.type.APPLICATION_LINK_FORMAT); + REST.set_response_payload(response, buffer, rdlen); + } } } /*---------------------------------------------------------------------------*/ From 14cdb3088682cca6dccaa70c4f46da0c6f606291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Tue, 24 May 2016 19:28:17 +0200 Subject: [PATCH 2/2] oma-lwm2m: Only send active instances --- apps/oma-lwm2m/lwm2m-engine.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/oma-lwm2m/lwm2m-engine.c b/apps/oma-lwm2m/lwm2m-engine.c index ffdacb0e1..d12f712f3 100644 --- a/apps/oma-lwm2m/lwm2m-engine.c +++ b/apps/oma-lwm2m/lwm2m-engine.c @@ -603,6 +603,9 @@ write_object_instances_link(const lwm2m_object_t *object, } for(i = 0; i < object->count; i++) { + if((object->instances[i].flag & LWM2M_INSTANCE_FLAG_USED) == 0) { + continue; + } instance = &object->instances[i]; PRINTF(",", object->id, instance->id);