NCS Mesh: Transferring Composition Data fails

We have relatively big model composition, and reading it via nRF Mesh app fails if it exceeds 21 segment message.

However the limit I assume should be at 32 segments and is set by CONFIG_BT_MESH_TX_SEG_MAX. Also I set CONFIG_BT_MESH_ADV_BUF_COUNT to be larger than TX_SEG_MAX by 3 as specified in its description.

Is there any other limitations for composition size?

I am using nRF Connect SDK v1.7.

Parents Reply Children
  • Hi,

    I have been sick the past week and out of office so there haven't been any progress on this issue yet. Did you try increasing CONFIG_BT_MESH_TX_SEG_MSG_COUNT more than 3? Do you get the same error?

  • Hi, I tried to set it to 5 and 15. However still unable to read Device Composition. Below snippet of the error.

    So error slightly changed, if I do not set this config then I have previously posted error.

  • Hi,

    We have tried to reproduce the issue on our side but didn't succeed. What example are you testing with and have you made any other modifications? 

    Can you give me a step-by-step procedure on how to reproduce this? 

  • Hi, thanks for reply.

    I reproduced the issue with samples/bluetooth/mesh/light project. However I do not always get error from the device, most of the time composition reading fails without anything printed out via RTT.

    I used nrf52840dk board. And made following modifications. In prj.conf added:

    CONFIG_BT_MESH_DK_PROV_OOB_BLINK=n
    CONFIG_BT_MESH_DK_PROV_OOB_BUTTON=n
    
    CONFIG_BT_MESH_LIGHT_CTL_SRV=y
    CONFIG_BT_MESH_LIGHTNESS_SRV=y
    CONFIG_BT_MESH_LIGHT_TEMP_SRV=y
    
    CONFIG_BT_MESH_DTT_SRV=y
    CONFIG_BT_MESH_DTT_SRV_PERSISTENT=y
    CONFIG_BT_MESH_PONOFF_SRV=y
    CONFIG_BT_MESH_SCENE_SRV=y
    CONFIG_BT_MESH_LVL_SRV=y
    CONFIG_BT_MESH_TIME_SRV=y
    CONFIG_BT_MESH_SCHEDULER_SRV=y
    CONFIG_BT_MESH_SENSOR_SRV=y
    CONFIG_BT_MESH_SENSOR_SRV_SENSORS_MAX=6
    CONFIG_BT_MESH_SENSOR_SRV_SETTINGS_MAX=12
    CONFIG_BT_MESH_PROP_SRV=y
    CONFIG_BT_MESH_LIGHT_CTRL_SRV=y
    CONFIG_BT_MESH_LIGHT_HSL_SRV=y
    
    # Set RTT console
    CONFIG_USE_SEGGER_RTT=y
    CONFIG_CONSOLE=y
    CONFIG_RTT_CONSOLE=y
    CONFIG_UART_CONSOLE=n
    
    # Set logging
    CONFIG_LOG=y
    CONFIG_LOG_DEFAULT_LEVEL=4
    
    # Set Mesh Buffer Size
    CONFIG_BT_MESH_ADV_BUF_COUNT=35
    CONFIG_BT_MESH_TX_SEG_MAX=32
    
    # Set Zephyr BT Controller
    CONFIG_BT_LL_SOFTDEVICE=n
    CONFIG_BT_LL_SW_SPLIT=y
    
    # Error Tracing
    CONFIG_RESET_ON_FATAL_ERROR=n
    CONFIG_DEBUG=y
    CONFIG_DEBUG_INFO=y
    CONFIG_DEBUG_OPTIMIZATIONS=n
    CONFIG_ASSERT_NO_MSG_INFO=n
    CONFIG_THREAD_ANALYZER=y
    CONFIG_THREAD_NAME=y

    In model_handler.c added:

    /* Light Lightness Server */
    static void light_set(struct bt_mesh_lightness_srv *srv,
    		      struct bt_mesh_msg_ctx *ctx,
    		      const struct bt_mesh_lightness_set *set,
    		      struct bt_mesh_lightness_status *rsp)
    {
    }
    
    static void light_get(struct bt_mesh_lightness_srv *srv,
    		      struct bt_mesh_msg_ctx *ctx,
    		      struct bt_mesh_lightness_status *rsp)
    {
    }
    
    
    /* Light CTL */
    static void light_ctl_temp_set(struct bt_mesh_light_temp_srv *srv,
    			struct bt_mesh_msg_ctx *ctx,
    			const struct bt_mesh_light_temp_set *set,
    			struct bt_mesh_light_temp_status *rsp)
    {
    }
    
    static void light_ctl_temp_get(struct bt_mesh_light_temp_srv *srv,
    			struct bt_mesh_msg_ctx *ctx,
    			struct bt_mesh_light_temp_status *rsp)
    {	
    }
    
    static void light_ctl_range_update(struct bt_mesh_light_temp_srv *srv,
    			struct bt_mesh_msg_ctx *ctx,
    			const struct bt_mesh_light_temp_range *old_range,
    			const struct bt_mesh_light_temp_range *new_range)
    {	
    }
    static const struct bt_mesh_lightness_srv_handlers ctl_lightness_srv_handlers = {
    	.light_set = light_set,
    	.light_get = light_get,
    };
    
    static const struct bt_mesh_light_temp_srv_handlers ctl_light_temp_handlers = {
    	.set = light_ctl_temp_set,
    	.get = light_ctl_temp_get,
    	.range_update = light_ctl_range_update,
    };
    
    static struct bt_mesh_light_ctl_srv light_ctl_srv = 
    	BT_MESH_LIGHT_CTL_SRV_INIT(&ctl_lightness_srv_handlers, &ctl_light_temp_handlers);
    
    static struct bt_mesh_lightness_srv lightness_srv =
    	BT_MESH_LIGHTNESS_SRV_INIT(&ctl_lightness_srv_handlers);
    
    /* Light LC Server */
    static struct bt_mesh_light_ctrl_srv light_ctrl_srv =
    	BT_MESH_LIGHT_CTRL_SRV_INIT(&light_ctl_srv.lightness_srv);
    
    /* Scene Server */
    static struct bt_mesh_scene_srv scene_srv[7];
    
    /* Generic Property Server */
    static struct bt_mesh_prop prop[2] = {0};
    static struct bt_mesh_prop_srv prop_srv = BT_MESH_PROP_SRV_INIT((struct bt_mesh_prop *const)&prop, 2, NULL, NULL);
    static struct bt_mesh_prop_srv prop_srv1 = BT_MESH_PROP_SRV_INIT((struct bt_mesh_prop *const)&prop, 2, NULL, NULL);
    static struct bt_mesh_prop_srv prop_srv2 = BT_MESH_PROP_SRV_INIT((struct bt_mesh_prop *const)&prop, 2, NULL, NULL);
    static struct bt_mesh_prop_srv prop_srv3 = BT_MESH_PROP_SRV_INIT((struct bt_mesh_prop *const)&prop, 2, NULL, NULL);
    static struct bt_mesh_prop_srv prop_srv4 = BT_MESH_PROP_SRV_INIT((struct bt_mesh_prop *const)&prop, 2, NULL, NULL);
    
    
    
    static struct bt_mesh_elem elements[] = {
    	BT_MESH_ELEM(
    		1, BT_MESH_MODEL_LIST(
    			BT_MESH_MODEL_CFG_SRV,
    			BT_MESH_MODEL_HEALTH_SRV(&health_srv, &health_pub),
    			BT_MESH_MODEL_ONOFF_SRV(&led_ctx[0].srv),
    			BT_MESH_MODEL_LIGHT_CTL_SRV(&light_ctl_srv),
    			BT_MESH_MODEL_SCENE_SRV(&scene_srv[0]),
    			BT_MESH_MODEL_PROP_SRV_USER(&prop_srv),
    			BT_MESH_MODEL_PROP_SRV_MFR(&prop_srv),
    			BT_MESH_MODEL_PROP_SRV_ADMIN(&prop_srv)
    			),
    		BT_MESH_MODEL_NONE),
    
    	BT_MESH_ELEM(
    		2, BT_MESH_MODEL_LIST(
    		BT_MESH_MODEL_ONOFF_SRV(&led_ctx[1].srv),
    		BT_MESH_MODEL_LIGHT_TEMP_SRV(&light_ctl_srv.temp_srv),
    		BT_MESH_MODEL_PROP_SRV_USER(&prop_srv1),
    		BT_MESH_MODEL_PROP_SRV_MFR(&prop_srv1),
    		BT_MESH_MODEL_PROP_SRV_ADMIN(&prop_srv1)
    		),
    		BT_MESH_MODEL_NONE),
    
    	BT_MESH_ELEM(
    		3, BT_MESH_MODEL_LIST(
    		BT_MESH_MODEL_ONOFF_SRV(&led_ctx[2].srv),
    		BT_MESH_MODEL_PROP_SRV_USER(&prop_srv2),
    		BT_MESH_MODEL_PROP_SRV_MFR(&prop_srv2),
    		BT_MESH_MODEL_PROP_SRV_ADMIN(&prop_srv2)
    		),
    		BT_MESH_MODEL_NONE),
    
    	BT_MESH_ELEM(
    		4, BT_MESH_MODEL_LIST(
    		BT_MESH_MODEL_ONOFF_SRV(&led_ctx[3].srv),
    		BT_MESH_MODEL_PROP_SRV_USER(&prop_srv3),
    		BT_MESH_MODEL_PROP_SRV_MFR(&prop_srv3),
    		BT_MESH_MODEL_PROP_SRV_ADMIN(&prop_srv3)
    		),
    		BT_MESH_MODEL_NONE),
    
    	BT_MESH_ELEM(
    		5, BT_MESH_MODEL_LIST(
    		BT_MESH_MODEL_ONOFF_SRV(&led_ctx[3].srv),
    		BT_MESH_MODEL_LIGHT_CTRL_SRV(&light_ctrl_srv),
    		BT_MESH_MODEL_SCENE_SRV(&scene_srv[1])
    		),
    		BT_MESH_MODEL_NONE),
    
    	BT_MESH_ELEM(
    		6, BT_MESH_MODEL_LIST(
    		BT_MESH_MODEL_ONOFF_SRV(&led_ctx[3].srv),
    		BT_MESH_MODEL_PROP_SRV_USER(&prop_srv4),
    		BT_MESH_MODEL_PROP_SRV_MFR(&prop_srv4),
    		BT_MESH_MODEL_PROP_SRV_ADMIN(&prop_srv4)
    		),
    		BT_MESH_MODEL_NONE),
    
    
    
    	BT_MESH_ELEM(
    		7, BT_MESH_MODEL_LIST(
    		BT_MESH_MODEL_ONOFF_SRV(&led_ctx[3].srv),
    		BT_MESH_MODEL_HEALTH_SRV(&health_srv, &health_pub),
    		BT_MESH_MODEL_LIGHTNESS_SRV(&lightness_srv), 
    		BT_MESH_MODEL_SCENE_SRV(&scene_srv[2]),
    		BT_MESH_MODEL_PROP_SRV_USER(&prop_srv),
    		BT_MESH_MODEL_PROP_SRV_MFR(&prop_srv),
    		BT_MESH_MODEL_PROP_SRV_ADMIN(&prop_srv)
    		),
    		BT_MESH_MODEL_NONE),
    
    	BT_MESH_ELEM(
    		8, BT_MESH_MODEL_LIST(
    		BT_MESH_MODEL_ONOFF_SRV(&led_ctx[3].srv),
    		BT_MESH_MODEL_HEALTH_SRV(&health_srv, &health_pub),
    		BT_MESH_MODEL_LIGHTNESS_SRV(&lightness_srv), 
    		BT_MESH_MODEL_SCENE_SRV(&scene_srv[3]),
    		BT_MESH_MODEL_PROP_SRV_USER(&prop_srv),
    		BT_MESH_MODEL_PROP_SRV_MFR(&prop_srv),
    		BT_MESH_MODEL_PROP_SRV_ADMIN(&prop_srv)
    		),
    		BT_MESH_MODEL_NONE),
    
    	BT_MESH_ELEM(
    		9, BT_MESH_MODEL_LIST(
    		BT_MESH_MODEL_ONOFF_SRV(&led_ctx[3].srv),
    		BT_MESH_MODEL_HEALTH_SRV(&health_srv, &health_pub),
    		BT_MESH_MODEL_LIGHTNESS_SRV(&lightness_srv), 
    		BT_MESH_MODEL_SCENE_SRV(&scene_srv[4]),
    		BT_MESH_MODEL_PROP_SRV_USER(&prop_srv),
    		BT_MESH_MODEL_PROP_SRV_MFR(&prop_srv),
    		BT_MESH_MODEL_PROP_SRV_ADMIN(&prop_srv)
    		),
    		BT_MESH_MODEL_NONE),
    
    	BT_MESH_ELEM(
    		10, BT_MESH_MODEL_LIST(
    		BT_MESH_MODEL_ONOFF_SRV(&led_ctx[3].srv),
    		BT_MESH_MODEL_HEALTH_SRV(&health_srv, &health_pub),
    		BT_MESH_MODEL_LIGHTNESS_SRV(&lightness_srv), 
    		BT_MESH_MODEL_SCENE_SRV(&scene_srv[5]),
    		BT_MESH_MODEL_PROP_SRV_USER(&prop_srv),
    		BT_MESH_MODEL_PROP_SRV_MFR(&prop_srv),
    		BT_MESH_MODEL_PROP_SRV_ADMIN(&prop_srv)
    		),
    		BT_MESH_MODEL_NONE),
    
    	BT_MESH_ELEM(
    		11, BT_MESH_MODEL_LIST(
    		BT_MESH_MODEL_ONOFF_SRV(&led_ctx[3].srv),
    		BT_MESH_MODEL_HEALTH_SRV(&health_srv, &health_pub),
    		BT_MESH_MODEL_LIGHTNESS_SRV(&lightness_srv), 
    		BT_MESH_MODEL_SCENE_SRV(&scene_srv[6]),
    		BT_MESH_MODEL_PROP_SRV_USER(&prop_srv),
    		BT_MESH_MODEL_PROP_SRV_MFR(&prop_srv),
    		BT_MESH_MODEL_PROP_SRV_ADMIN(&prop_srv)
    		),
    		BT_MESH_MODEL_NONE),
    };

    For reading composition I used nRF Mesh app.

Related