Skip to content

Commit 0562de9

Browse files
Veijo Pesonencarlescufi
authored andcommitted
net: lwm2m: SenML CBOR RW support
* LwM2M v1.1 SenML CBOR content format support. * Composite operations * SEND functionality Signed-off-by: Veijo Pesonen <[email protected]>
1 parent 2ef96e2 commit 0562de9

12 files changed

+1563
-3
lines changed

subsys/net/lib/lwm2m/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ zephyr_library_sources_ifdef(CONFIG_LWM2M_RW_SENML_JSON_SUPPORT
5959
zephyr_library_sources_ifdef(CONFIG_LWM2M_RW_CBOR_SUPPORT
6060
lwm2m_rw_cbor.c
6161
)
62+
# SENML CBOR support
63+
zephyr_library_sources_ifdef(CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT
64+
lwm2m_rw_senml_cbor.c
65+
lwm2m_senml_cbor_decode.c
66+
lwm2m_senml_cbor_encode.c
67+
)
6268

6369
# IPSO Objects
6470
zephyr_library_sources_ifdef(CONFIG_LWM2M_IPSO_TEMP_SENSOR

subsys/net/lib/lwm2m/Kconfig

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,21 @@ config LWM2M_RW_CBOR_SUPPORT
447447
help
448448
Include support for writing CBOR data
449449

450+
config LWM2M_RW_SENML_CBOR_SUPPORT
451+
bool "support for SenML CBOR writer"
452+
depends on ZCBOR
453+
depends on ZCBOR_CANONICAL
454+
help
455+
Include support for writing SenML CBOR data
456+
457+
config LWM2M_RW_SENML_CBOR_RECORDS
458+
int "Maximum # of SenML records packed into a CBOR binary"
459+
depends on LWM2M_RW_SENML_CBOR_SUPPORT
460+
default 30
461+
help
462+
The CBOR library requires you to set an upper limit for the records when encoder
463+
and decoder do get generated.
464+
450465
config LWM2M_DEVICE_PWRSRC_MAX
451466
int "Maximum # of device power source records"
452467
default 5

subsys/net/lib/lwm2m/lwm2m_engine.c

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
5454
#ifdef CONFIG_LWM2M_RW_CBOR_SUPPORT
5555
#include "lwm2m_rw_cbor.h"
5656
#endif
57+
#ifdef CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT
58+
#include "lwm2m_rw_senml_cbor.h"
59+
#endif
5760
#ifdef CONFIG_LWM2M_RD_CLIENT_SUPPORT
5861
#include "lwm2m_rd_client.h"
5962
#endif
@@ -1685,6 +1688,12 @@ static int select_writer(struct lwm2m_output_context *out, uint16_t accept)
16851688
break;
16861689
#endif
16871690

1691+
#ifdef CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT
1692+
case LWM2M_FORMAT_APP_SENML_CBOR:
1693+
out->writer = &senml_cbor_writer;
1694+
break;
1695+
#endif
1696+
16881697
default:
16891698
LOG_WRN("Unknown content type %u", accept);
16901699
return -ENOMSG;
@@ -1730,6 +1739,13 @@ static int select_reader(struct lwm2m_input_context *in, uint16_t format)
17301739
break;
17311740
#endif
17321741

1742+
#ifdef CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT
1743+
case LWM2M_FORMAT_APP_SENML_CBOR:
1744+
in->reader = &senml_cbor_reader;
1745+
break;
1746+
#endif
1747+
1748+
17331749
default:
17341750
LOG_WRN("Unknown content type %u", format);
17351751
return -ENOMSG;
@@ -3799,6 +3815,11 @@ static int do_read_op(struct lwm2m_message *msg, uint16_t content_format)
37993815
return do_read_op_cbor(msg);
38003816
#endif
38013817

3818+
#if defined(CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT)
3819+
case LWM2M_FORMAT_APP_SENML_CBOR:
3820+
return do_read_op_senml_cbor(msg);
3821+
#endif
3822+
38023823
default:
38033824
LOG_ERR("Unsupported content-format: %u", content_format);
38043825
return -ENOMSG;
@@ -3815,6 +3836,11 @@ static int do_composite_read_op(struct lwm2m_message *msg, uint16_t content_form
38153836
return do_composite_read_op_senml_json(msg);
38163837
#endif
38173838

3839+
#if defined(CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT)
3840+
case LWM2M_FORMAT_APP_SENML_CBOR:
3841+
return do_composite_read_op_senml_cbor(msg);
3842+
#endif
3843+
38183844
default:
38193845
LOG_ERR("Unsupported content-format: %u", content_format);
38203846
return -ENOMSG;
@@ -3833,6 +3859,12 @@ static int do_composite_observe_read_path_op(struct lwm2m_message *msg, uint16_t
38333859
lwm2m_path_free_list);
38343860
#endif
38353861

3862+
#if defined(CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT)
3863+
case LWM2M_FORMAT_APP_SENML_CBOR:
3864+
return do_composite_observe_parse_path_senml_cbor(msg, lwm2m_path_list,
3865+
lwm2m_path_free_list);
3866+
#endif
3867+
38363868
default:
38373869
LOG_ERR("Unsupported content-format: %u", content_format);
38383870
return -ENOMSG;
@@ -4350,6 +4382,11 @@ static int do_write_op(struct lwm2m_message *msg,
43504382
return do_write_op_cbor(msg);
43514383
#endif
43524384

4385+
#ifdef CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT
4386+
case LWM2M_FORMAT_APP_SENML_CBOR:
4387+
return do_write_op_senml_cbor(msg);
4388+
#endif
4389+
43534390
default:
43544391
LOG_ERR("Unsupported format: %u", format);
43554392
return -ENOMSG;
@@ -4366,6 +4403,11 @@ static int do_composite_write_op(struct lwm2m_message *msg,
43664403
return do_write_op_senml_json(msg);
43674404
#endif
43684405

4406+
#if defined(CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT)
4407+
case LWM2M_FORMAT_APP_SENML_CBOR:
4408+
return do_write_op_senml_cbor(msg);
4409+
#endif
4410+
43694411
default:
43704412
LOG_ERR("Unsupported format: %u", format);
43714413
return -ENOMSG;
@@ -4523,7 +4565,10 @@ static int lwm2m_engine_default_content_format(uint16_t *accept_format)
45234565
{
45244566
if (IS_ENABLED(CONFIG_LWM2M_VERSION_1_1)) {
45254567
/* Select content format use SenML CBOR when it possible */
4526-
if (IS_ENABLED(CONFIG_LWM2M_RW_SENML_JSON_SUPPORT)) {
4568+
if (IS_ENABLED(CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT)) {
4569+
LOG_DBG("No accept option given. Assume SenML CBOR.");
4570+
*accept_format = LWM2M_FORMAT_APP_SENML_CBOR;
4571+
} else if (IS_ENABLED(CONFIG_LWM2M_RW_SENML_JSON_SUPPORT)) {
45274572
LOG_DBG("No accept option given. Assume SenML Json.");
45284573
*accept_format = LWM2M_FORMAT_APP_SEML_JSON;
45294574
} else if (IS_ENABLED(CONFIG_LWM2M_RW_CBOR_SUPPORT)) {
@@ -6341,6 +6386,11 @@ static int do_send_op(struct lwm2m_message *msg, uint16_t content_format,
63416386
return do_send_op_senml_json(msg, lwm2m_path_list);
63426387
#endif
63436388

6389+
#if defined(CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT)
6390+
case LWM2M_FORMAT_APP_SENML_CBOR:
6391+
return do_send_op_senml_cbor(msg, lwm2m_path_list);
6392+
#endif
6393+
63446394
default:
63456395
LOG_ERR("Unsupported content-format for /dp: %u", content_format);
63466396
return -ENOMSG;
@@ -6404,8 +6454,9 @@ int lwm2m_engine_send(struct lwm2m_ctx *ctx, char const *path_list[], uint8_t pa
64046454
return -E2BIG;
64056455
}
64066456

6407-
/* Select content format use CBOR when it possible */
6408-
if (IS_ENABLED(CONFIG_LWM2M_RW_SENML_JSON_SUPPORT)) {
6457+
if (IS_ENABLED(CONFIG_LWM2M_RW_SENML_CBOR_SUPPORT)) {
6458+
content_format = LWM2M_FORMAT_APP_SENML_CBOR;
6459+
} else if (IS_ENABLED(CONFIG_LWM2M_RW_SENML_JSON_SUPPORT)) {
64096460
content_format = LWM2M_FORMAT_APP_SEML_JSON;
64106461
} else {
64116462
LOG_WRN("SenML CBOR or JSON is not supported");

subsys/net/lib/lwm2m/lwm2m_engine.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#define LWM2M_FORMAT_APP_JSON 50
3030
#define LWM2M_FORMAT_APP_CBOR 60
3131
#define LWM2M_FORMAT_APP_SEML_JSON 110
32+
#define LWM2M_FORMAT_APP_SENML_CBOR 112
3233
#define LWM2M_FORMAT_OMA_PLAIN_TEXT 1541
3334
#define LWM2M_FORMAT_OMA_OLD_TLV 1542
3435
#define LWM2M_FORMAT_OMA_OLD_JSON 1543

subsys/net/lib/lwm2m/lwm2m_object.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,9 @@ struct lwm2m_senml_json_context senml_json_ctx;
428428
uint8_t token[8];
429429
uint8_t tkl;
430430
bool last_block : 1;
431+
uint8_t level; /* 3/4 (4 = resource instance) */
431432
uint16_t res_id;
433+
uint16_t res_inst_id;
432434
};
433435

434436
struct lwm2m_output_context {

0 commit comments

Comments
 (0)