Re: BLE Nano 2 - LWM2M DTLS demo example

Christos Vasilakis

Hi Michael,

Thank you for the detailed step-by-step, greatly appreciated!

It’s working :) 

You are correct, modifying the CONFIG_MBEDTLS_HEAP_SIZE caused the demo to stop working. 

Further, just to point out for other devs coming to this thread, you need to be carefully to issue both of the following commands, one after the other, without a long time gap between them. In my case, I issued the first command, and then notice in the serial logs that I was getting out of memory error. So started to modify the config and eventually modifying also the CONFIG_MBEDTLS_HEAP_SIZE (which further crippled the demo). For reference, a working DTLS config file that I have used, can be found here [1]

$ echo "connect E0:0F:F1:29:76:01 2" > /sys/kernel/debug/bluetooth/6lowpan_control
$ ip address add 2001:db8::2/64 dev bt0

Regarding the suggested changes of moving DTLS and Bluetooth specific settings from "prj.conf" into several config files, makes sense, especially for a newcomer like me.



On 24 Apr 2018, at 00:16, Michael Scott <michael@...> wrote:

Hi again Christos,

On 04/23/2018 09:34 AM, Christos Vasilakis wrote:
Hi there,

I have recently purchased a BLE Nano 2 kit and I am trying to run the LWM2M client example found here [1]. I have successfully installed and run the simple (non-DTLS) example and works just fine (using a Raspberry PI  6lowpan BLE network as described in [2]). That is, I can successfully ping the Nano node as well as having it register with the Leshan LWM2M server and query it’s objects.

Now I am trying to setup the DTLS example and for this I have done the following:

- setup the pre-shared key on the Leshan server (as suggested in [3])
- enable the dlls configuration in the prj_dtls.conf. A dump of this configuration file can be found here [4]. 

>> Please note that I have lowered the CONFIG_MBEDTLS_HEAP_SIZE from 8192 to 4096 cause I got the following error printed in the console which resulted in a none working BT connection.

I think changing the CONFIG_MBEDTLS_HEAP_SIZE is what's causing the issues you're seeing.  I didn't get the "Unable to get TX packet, not enough memory." error when leaving the CONFIG_MBEDTLS_HEAP_SIZE and using the following changes:

1. Add the following CONFIG lines to the bottom of the prj_dtls.conf:

2. Build the sample for BLENano2 like so:
$ cd samples/net/lwm2m_client
$ mkdir build && cd build
$ cmake -GNinja -DBOARD=nrf52_blenano2 -DCONF_FILE="prj_dtls.conf" ..
$ ninja
$ pyocd-flashtool -ce -t nrf52 zephyr/zephyr.bin

3. NOTE: The host machine where I connect the BLENano2 via 6lowpan has a Leshan server connected to 2001:db8::2.  I'm assuming you have this running on your RPi.

4. I added the following information to the Leshan security settings:
Client endpoint: nrf52_blenano2
Security mode: Pre-Shared Key (already set by default)
Identity: Client_identity
Key: 000102030405060708090a0b0c0d0e0f

5. When monitoring the BLENano2 via UART, it should spew just a few lines like the Zephyr version and some initialization regaring LwM2M objects and then wait until joined via 6lowpan before attempting to connect to the Leshan server.  Also, you use the "net iface" shell command to see detailed information about the bluetooth network interface.

6. NOTE: Almost all of the RAM on BLENano2 is used by the sample when DTLS enabled (using the default configs).  If you were to enable almost ANY debug CONFIG at all, you would most certainly hit RAM issues.  To help with, you could consider disabling some of the following CONFIG items in prj_dtls.conf:

Or tone down the logging output of the sample or disabling the command shell:
CONFIG_SYS_LOG_NET_LEVEL <lowering the # would reduce logging output>
CONFIG_SYS_LOG_NET_BUF_LEVEL <lowering the # would reduce logging output>
CONFIG_SYS_LOG_LWM2M_LEVEL <lowering the # would reduce logging output>

Let me know how this works on your end.

One last note: I think your experience proves it's too difficult to configure the LwM2M client for extended use-cases (DTLS + Bluetooth networking).  I'm going to submit some patches keeping just the primary "prj.conf" file, move just the DTLS specific settings from "prj_dtls.conf" into "overlay-dtls.conf" and having the Bluetooth enabling configs in "overlay-bt.conf".

This should be easier to maintain over time, *and* hopefully allow more build combinations using the -DCONF_FILE command line option which can take several filenames.
Building and flashing the DTLS-enabled client for BLENano2 would then look something like:
$ cd samples/net/lwm2m_client
$ mkdir build && cd build
$ cmake -GNinja -DBOARD=nrf52_blenano2 -DCONF_FILE="prj.conf overlay-bt.conf overlay-dtls.conf" ..
$ ninja
$ pyocd-flashtool -ce -t nrf52 zephyr/zephyr.bin

- Mike

'[lib/lwm2m_engine] [ERR] lwm2m_init_message: Unable to get TX packet, not enough memory."

Unfortunately the DTLS version doesn’t seem to work. In particular during bootstrap I get error (-72). Here is a dump of the console:

***** Booting Zephyr OS v1.11.0-758-g541c3cb18 *****
[lib/lwm2m_engine] [DBG] lwm2m_engine_init: LWM2M engine thread started
[lwm2m_obj_security] [DBG] security_create: Create LWM2M security instance: 0
[lwm2m_obj_server] [DBG] server_create: Create LWM2M server instance: 0
[lwm2m_obj_device] [DBG] device_create: Create LWM2M device instance: 0
[lwm2m_obj_firmware] [DBG] firmware_create: Create LWM2M firmware instance: 0
[bt] [INF] hci_vs_init: HW Platform: Nordic Semiconductor (0x0002)
[bt] [INF] hci_vs_init: HW Variant: nRF52x (0x0002)
[bt] [INF] hci_vs_init: Firmware: Standard Bluetooth controller (0x00) Version 1.11 Build 99
[bt] [INF] show_dev_info: Identity: e0:0f:f1:29:76:01 (random)
[bt] [INF] show_dev_info: HCI: version 5.0 (0x09) revision 0x0000, manufacturer 0x05f1
[bt] [INF] show_dev_info: LMP: version 5.0 (0x09) subver 0xffff
[bt] [WRN] bt_pub_key_gen: ECC HCI commands not available
[lwm2m-client] [INF] main: Run LWM2M client
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3/0/0, value:0x0002f852, len:6
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3/0/1, value:0x0002f85f, len:23
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3/0/2, value:0x0002f87d, len:9
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3/0/3, value:0x0002f88d, len:3
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3/0/9, value:0x2000c2f7, len:1
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3/0/10, value:0x2000c2f4, len:4
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3/0/17, value:0x0002f8b0, len:16
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3/0/18, value:0x0002f8c8, len:5
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3/0/20, value:0x2000c2f7, len:1
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3/0/21, value:0x2000c2f4, len:4
[lib/lwm2m_engine] [DBG] lwm2m_engine_create_obj_inst: path:3303/0
[ipso_temp_sensor] [DBG] temp_sensor_create: Create IPSO Temperature Sensor instance: 0
[lib/lwm2m_engine] [DBG] lwm2m_engine_set: path:3303/0/5700, value:0x2000c310, len:8
[lib/lwm2m_engine] [DBG] lwm2m_engine_create_obj_inst: path:3311/0
[ipso_light_control] [DBG] light_control_create: Create IPSO Light Control instance: 0
prio recv thread stack (real size 748): unused 488      usage 260 / 748 (34 %)
recv thread stack (real size 1324):     unused 424      usage 900 / 1324 (67 %)
[lib/lwm2m_engine] [ERR] lwm2m_engine_start: Cannot connect UDP (-72)
[lib/lwm2m_rd_client] [ERR] lwm2m_rd_client_start: Cannot init LWM2M engine (-72)
[lwm2m-client] [ERR] main: LWM2M init LWM2M RD client error (-72)

From the Raspberry PI I can successfully ping the node which implies that connectivity exists and is working.

root@raspberrypi:/home/pi# ping 2001:db8::1. <— BLE Nano 2 
PING 2001:db8::1(2001:db8::1) 56 data bytes
64 bytes from 2001:db8::1: icmp_seq=1 ttl=64 time=221 ms
64 bytes from 2001:db8::1: icmp_seq=2 ttl=64 time=194 ms
--- 2001:db8::1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 194.834/208.153/221.472/13.319 ms

I would be grateful if someone can help me to debug the issue.

Thank you in advance


Join to automatically receive all group messages.