Skip to content

Commit 140e466

Browse files
SeppoTakalofabiobaltieri
authored andcommitted
samples: net: lwm2m_client: Allow configuration in Kconfig
Allow endpoint name, PSK and TLS tag and server address to be configured in Kconfig. When endpoint name is not defined, use CONFIG_BOARD. Also use endpoint name as a PSK ID instead of hard coded "Client_identity" which would collide if more than one instance is ran against same server. Now we could define different identity for each endpoint. Also, as a mininal refactor, allow DNS names to be used in server address, instead of assuming IP address. Signed-off-by: Seppo Takalo <[email protected]>
1 parent b30ce53 commit 140e466

File tree

5 files changed

+66
-79
lines changed

5 files changed

+66
-79
lines changed

samples/net/lwm2m_client/Kconfig

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Private config options for LwM2M client sample
2+
3+
# Copyright (c) 2023 NordicNordic Semiconductor ASA
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
mainmenu "LwM2M Client sample"
7+
8+
config LWM2M_APP_ID
9+
string "LwM2M Client identity"
10+
default ""
11+
help
12+
This is used as client endpoint name as well as PSK ID.
13+
Leave empty for using CONFIG_BOARD
14+
15+
if LWM2M_DTLS_SUPPORT
16+
config LWM2M_APP_PSK
17+
string "PSK key"
18+
default "000102030405060708090a0b0c0d0e0f"
19+
help
20+
PSK key as a hex string.
21+
Maximum binary size is CONFIG_LWM2M_SECURITY_KEY_SIZE.
22+
23+
config LWM2M_APP_TLS_TAG
24+
int "TLS security tag"
25+
default 1
26+
help
27+
TLS security tag to use when connecting.
28+
endif
29+
30+
config LWM2M_APP_SERVER
31+
string "LwM2M server address"
32+
default "coaps://192.0.2.2:5684" if LWM2M_DTLS_SUPPORT
33+
default "coap://192.0.2.2:5683" if !LWM2M_DTLS_SUPPORT
34+
help
35+
LwM2M server address. Write as a full URI including optional port number.
36+
Only accepted protocols are "coap://" and "coaps://"
37+
When DNS resolver is enabled, DNS domain names could be used as well.
38+
When port number is missing, CONFIG_LWM2M_PEER_PORT is used instead.
39+
IPv6 addresses must be enclosed in square brackets, for example "coap://[fd00::1]".
40+
41+
source "Kconfig.zephyr"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
CONFIG_DNS_RESOLVER=y
2+
CONFIG_DNS_SERVER_IP_ADDRESSES=y
3+
CONFIG_DNS_SERVER1="192.0.2.2"
4+
CONFIG_LWM2M_DNS_SUPPORT=y
5+
CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2"

samples/net/lwm2m_client/overlay-ot.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ CONFIG_OPENTHREAD_NETWORKKEY="00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
3232

3333
CONFIG_NET_CONFIG_MY_IPV6_ADDR="fdde:ad00:beef::1"
3434
CONFIG_NET_CONFIG_PEER_IPV6_ADDR="fdde:ad00:beef::2"
35+
CONFIG_LWM2M_APP_SERVER="coap://[fdde:ad00:beef::2]"
3536

3637
# mbedTLS tweaks
3738
CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=768

samples/net/lwm2m_client/prj.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ CONFIG_LWM2M_SHELL=y
3434
CONFIG_NET_CONFIG_MY_IPV6_ADDR="2001:db8::1"
3535
CONFIG_NET_CONFIG_PEER_IPV6_ADDR="2001:db8::2"
3636
CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1"
37-
CONFIG_NET_CONFIG_PEER_IPV4_ADDR="192.0.2.2"
37+
CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2"
3838

3939
# Longer endpoint name might be returned in a registration reply
4040
CONFIG_COAP_EXTENDED_OPTIONS_LEN=y

samples/net/lwm2m_client/src/lwm2m-client.c

Lines changed: 18 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -20,35 +20,15 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
2020

2121
#define APP_BANNER "Run LWM2M client"
2222

23-
#if !defined(CONFIG_NET_CONFIG_PEER_IPV4_ADDR)
24-
#define CONFIG_NET_CONFIG_PEER_IPV4_ADDR ""
25-
#endif
26-
27-
#if !defined(CONFIG_NET_CONFIG_PEER_IPV6_ADDR)
28-
#define CONFIG_NET_CONFIG_PEER_IPV6_ADDR ""
29-
#endif
30-
31-
#if defined(CONFIG_NET_IPV6)
32-
#define SERVER_ADDR CONFIG_NET_CONFIG_PEER_IPV6_ADDR
33-
#elif defined(CONFIG_NET_IPV4)
34-
#define SERVER_ADDR CONFIG_NET_CONFIG_PEER_IPV4_ADDR
35-
#else
36-
#error LwM2M requires either IPV6 or IPV4 support
37-
#endif
38-
39-
4023
#define WAIT_TIME K_SECONDS(10)
4124
#define CONNECT_TIME K_SECONDS(10)
4225

4326
#define CLIENT_MANUFACTURER "Zephyr"
4427
#define CLIENT_MODEL_NUMBER "OMA-LWM2M Sample Client"
4528
#define CLIENT_SERIAL_NUMBER "345000123"
4629
#define CLIENT_FIRMWARE_VER "1.0"
47-
#define CLIENT_DEVICE_TYPE "OMA-LWM2M Client"
4830
#define CLIENT_HW_VER "1.0.1"
4931

50-
#define ENDPOINT_LEN 32
51-
5232
static uint8_t bat_idx = LWM2M_DEVICE_PWR_SRC_TYPE_BAT_INT;
5333
static int bat_mv = 3800;
5434
static int bat_ma = 125;
@@ -62,17 +42,8 @@ static int mem_total = 25;
6242

6343
static struct lwm2m_ctx client;
6444

65-
#if defined(CONFIG_LWM2M_DTLS_SUPPORT)
66-
#define TLS_TAG 1
67-
68-
/* "000102030405060708090a0b0c0d0e0f" */
69-
static unsigned char client_psk[] = {
70-
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
71-
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
72-
};
73-
74-
static const char client_psk_id[] = "Client_identity";
75-
#endif /* CONFIG_LWM2M_DTLS_SUPPORT */
45+
static const char *endpoint =
46+
(sizeof(CONFIG_LWM2M_APP_ID) > 1 ? CONFIG_LWM2M_APP_ID : CONFIG_BOARD);
7647

7748
static struct k_sem quit_lock;
7849

@@ -103,32 +74,25 @@ static int device_factory_default_cb(uint16_t obj_inst_id,
10374

10475
static int lwm2m_setup(void)
10576
{
106-
int ret;
107-
char *server_url;
108-
uint16_t server_url_len;
109-
11077
/* setup SECURITY object */
11178

11279
/* Server URL */
113-
ret = lwm2m_get_res_buf(&LWM2M_OBJ(0, 0, 0), (void **)&server_url, &server_url_len, NULL,
114-
NULL);
115-
if (ret < 0) {
116-
return ret;
117-
}
118-
119-
server_url_len = snprintk(server_url, server_url_len, "coap%s//%s%s%s",
120-
IS_ENABLED(CONFIG_LWM2M_DTLS_SUPPORT) ? "s:" : ":",
121-
strchr(SERVER_ADDR, ':') ? "[" : "", SERVER_ADDR,
122-
strchr(SERVER_ADDR, ':') ? "]" : "");
123-
124-
lwm2m_set_res_data_len(&LWM2M_OBJ(0, 0, 0), server_url_len + 1);
80+
lwm2m_set_string(&LWM2M_OBJ(0, 0, 0), CONFIG_LWM2M_APP_SERVER);
12581

12682
/* Security Mode */
12783
lwm2m_set_u8(&LWM2M_OBJ(0, 0, 2), IS_ENABLED(CONFIG_LWM2M_DTLS_SUPPORT) ? 0 : 3);
12884
#if defined(CONFIG_LWM2M_DTLS_SUPPORT)
129-
lwm2m_set_string(&LWM2M_OBJ(0, 0, 3), (char *)client_psk_id);
130-
lwm2m_set_opaque(&LWM2M_OBJ(0, 0, 5),
131-
(void *)client_psk, sizeof(client_psk));
85+
lwm2m_set_string(&LWM2M_OBJ(0, 0, 3), endpoint);
86+
if (sizeof(CONFIG_LWM2M_APP_PSK) > 1) {
87+
char psk[1 + sizeof(CONFIG_LWM2M_APP_PSK) / 2];
88+
/* Need to skip the nul terminator from string */
89+
size_t len = hex2bin(CONFIG_LWM2M_APP_PSK, sizeof(CONFIG_LWM2M_APP_PSK) - 1, psk,
90+
sizeof(psk));
91+
if (len <= 0) {
92+
return -EINVAL;
93+
}
94+
lwm2m_set_opaque(&LWM2M_OBJ(0, 0, 5), (void *)psk, len);
95+
}
13296
#endif /* CONFIG_LWM2M_DTLS_SUPPORT */
13397

13498
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP)
@@ -161,8 +125,8 @@ static int lwm2m_setup(void)
161125
lwm2m_register_exec_callback(&LWM2M_OBJ(3, 0, 5), device_factory_default_cb);
162126
lwm2m_set_res_buf(&LWM2M_OBJ(3, 0, 9), &bat_level, sizeof(bat_level), sizeof(bat_level), 0);
163127
lwm2m_set_res_buf(&LWM2M_OBJ(3, 0, 10), &mem_free, sizeof(mem_free), sizeof(mem_free), 0);
164-
lwm2m_set_res_buf(&LWM2M_OBJ(3, 0, 17), CLIENT_DEVICE_TYPE, sizeof(CLIENT_DEVICE_TYPE),
165-
sizeof(CLIENT_DEVICE_TYPE), LWM2M_RES_DATA_FLAG_RO);
128+
lwm2m_set_res_buf(&LWM2M_OBJ(3, 0, 17), CONFIG_BOARD, sizeof(CONFIG_BOARD),
129+
sizeof(CONFIG_BOARD), LWM2M_RES_DATA_FLAG_RO);
166130
lwm2m_set_res_buf(&LWM2M_OBJ(3, 0, 18), CLIENT_HW_VER, sizeof(CLIENT_HW_VER),
167131
sizeof(CLIENT_HW_VER), LWM2M_RES_DATA_FLAG_RO);
168132
lwm2m_set_res_buf(&LWM2M_OBJ(3, 0, 20), &bat_status, sizeof(bat_status),
@@ -307,35 +271,11 @@ void main(void)
307271

308272
(void)memset(&client, 0x0, sizeof(client));
309273
#if defined(CONFIG_LWM2M_DTLS_SUPPORT)
310-
client.tls_tag = TLS_TAG;
274+
client.tls_tag = CONFIG_LWM2M_APP_TLS_TAG;
311275
#endif
312276

313-
#if defined(CONFIG_HWINFO)
314-
uint8_t dev_id[16];
315-
char dev_str[33];
316-
ssize_t length;
317-
int i;
318-
319-
(void)memset(dev_id, 0x0, sizeof(dev_id));
320-
321-
/* Obtain the device id */
322-
length = hwinfo_get_device_id(dev_id, sizeof(dev_id));
323-
324-
/* If this fails for some reason, use all zeros instead */
325-
if (length <= 0) {
326-
length = sizeof(dev_id);
327-
}
328-
329-
/* Render the obtained serial number in hexadecimal representation */
330-
for (i = 0 ; i < length ; i++) {
331-
sprintf(&dev_str[i*2], "%02x", dev_id[i]);
332-
}
333-
334-
lwm2m_rd_client_start(&client, dev_str, flags, rd_client_event, observe_cb);
335-
#else
336277
/* client.sec_obj_inst is 0 as a starting point */
337-
lwm2m_rd_client_start(&client, CONFIG_BOARD, flags, rd_client_event, observe_cb);
338-
#endif
278+
lwm2m_rd_client_start(&client, endpoint, flags, rd_client_event, observe_cb);
339279

340280
k_sem_take(&quit_lock, K_FOREVER);
341281
}

0 commit comments

Comments
 (0)