This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

PB Remote + Configuration model fail

Dear Nordic Support,

I am using nRF SDK for Mesh version 3.2.0 with nRF52840-DK. I am making 2 devices like the below:

1. First device: the provisioner, able to do PB Remote and node configuration. I combined the code from the light switch provisioner example and PB remote client example. I only use function

2. Second device: the provisionne, light switch client/server. I combined the code from light switch client and PB remote server.

The code runs but it is not as I expected. After The provisioning steps runs successfully but the software fails to configure the configuration model. The function app_config_client_event_cb is not executed and after testing, I find that the m_client.event_cb in file config_client.c is never called.

Here is the code for prov_evt_handler function:

static void prov_evt_handler(const nrf_mesh_prov_evt_t * p_evt)
{
    switch (p_evt->type)
    {
        case NRF_MESH_PROV_EVT_UNPROVISIONED_RECEIVED:
        {
            if (m_device_state == DEVICE_STATE_PB_ADV_MODE)
            {
                start_provisioning(p_evt->params.unprov.device_uuid, NRF_MESH_PROV_BEARER_ADV);
                m_device_state = DEVICE_STATE_NONE;
            }
            break;
        }

        case NRF_MESH_PROV_EVT_LINK_ESTABLISHED:
        {
            __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Local provisioning link established\n");

            m_current_prov_address = m_next_unprov_address;
            break;
        }

        case NRF_MESH_PROV_EVT_COMPLETE:
        {
            __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Provisioned device addr: 0x%04X net_key_handle: %d\n",
                  p_evt->params.complete.p_prov_data->address, m_netkey_handles[0]);
            __LOG_XB(LOG_SRC_APP, LOG_LEVEL_INFO, "Dev Key", p_evt->params.complete.p_devkey, NRF_MESH_KEY_SIZE);
            
            __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Adding device address, and device keys\n");
            ERROR_CHECK(dsm_address_publish_add(m_next_unprov_address,
                                                &m_device_address_handles[m_next_unprov_index]));
            ERROR_CHECK(dsm_devkey_add(p_evt->params.complete.p_prov_data->address,
                                       m_netkey_handles[0],
                                       p_evt->params.complete.p_devkey,
                                       &m_devkey_handles[1 + m_next_unprov_index]));

            /* Bind the device key to the configuration server and set the new node as the active server. */
            ERROR_CHECK(config_client_server_bind(m_devkey_handles[1 + m_next_unprov_index]));
            ERROR_CHECK(config_client_server_set(m_devkey_handles[1 + m_next_unprov_index],
                                                 m_device_address_handles[m_next_unprov_index]));

            __LOG(LOG_SRC_APP,
                  LOG_LEVEL_INFO,
                  "Provisioning complete! Added 0x%04X as handle %u\n",
                  p_evt->params.complete.p_prov_data->address,
                  m_device_address_handles[m_next_unprov_index]);
            m_next_unprov_index++;
            m_next_unprov_address += m_num_elements_of_last_guy;

            hal_led_blink_ms(LEDS_MASK, LED_BLINK_INTERVAL_MS, LED_BLINK_CNT_PROV);
            break;
        }

        case NRF_MESH_PROV_EVT_LINK_CLOSED:
        {
            store_app_data();
            app_prov_success_cb();

            __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Local provisioning link closed\n");
            node_setup_start(m_current_prov_address, PROVISIONER_RETRY_COUNT,
                            m_nw_state.appkey, APPKEY_INDEX, NETKEY_INDEX, m_nw_state.p_client_uri);
            break;
        }

        case NRF_MESH_PROV_EVT_CAPS_RECEIVED:
        {
            uint32_t status = nrf_mesh_prov_oob_use(p_evt->params.oob_caps_received.p_context,
                                                    NRF_MESH_PROV_OOB_METHOD_STATIC,
                                                    0,
                                                    NRF_MESH_KEY_SIZE);
            if (status != NRF_SUCCESS)
            {
                __LOG(LOG_SRC_APP, LOG_LEVEL_ERROR, "Provisioning OOB selection rejected, error code %d\n",
                      status);
            }
            else
            {
                m_num_elements_of_last_guy = p_evt->params.oob_caps_received.oob_caps.num_elements;
                __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Using static authentication\n");
            }
            break;
        }

        case NRF_MESH_PROV_EVT_STATIC_REQUEST:
        {
            /* Request for static authentication data. This data is used to authenticate the two nodes. */
            uint8_t static_data[16] = STATIC_AUTH_DATA;
            ERROR_CHECK(nrf_mesh_prov_auth_data_provide(p_evt->params.static_request.p_context, static_data, 16));
            __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Static authentication data provided\n");
            break;
        }

        default:
            break;
    }
}

And here is the debug log for the PB client (privisioner) and PB server (light switch - provisionee):

<t:          0>, main.c,  892, ----- BLE Mesh Provisioner + Remote Provisioning Client Demo -----
<t:      13027>, main.c,  818, Initializing and adding models
<t:      13053>, main.c,  225, Unable to add flash manager for app data
<t:      13059>, main.c,  871, Setup defaults: Adding keys, addresses, and bindings 
<t:      13186>, provisioner_helper.c,  414, netkey_handle: 0
<t:      13206>, mesh_app_utils.c,   65, Device UUID (raw): C5E4C95EB78319448F01568565066AAF
<t:      13213>, mesh_app_utils.c,   70, Device UUID : 5EC9E4C5-83B7-4419-8F01-568565066AAF
<t:      13224>, main.c,  936, Next unprovisioned device address: 0x0100
<t:      13230>, main.c,  937, Next unprovisioned device index: 0
<t:      13243>, main.c,  941, 
--------------------------------
1) Provision first available device with PB-ADV
2) Set current client publish handle (corresponding to a known server)
	 2.1) <address handle>
3) Start remote scanning
4) Cancel the remote scanning
5) Start remote provisioning
	 5.1) Device number
<t:      13687>, main.c,  171, Flash write complete
<t:      13692>, main.c,  904, Starting application ...
<t:      13698>, main.c,  906, Provisoned Nodes: 0, Configured Nodes: 0 Next Address: 0x0100
<t:      13706>, main.c,  907, Dev key : D2B4BB5BAC3E71C12B87FFC12B2CC8F1
<t:      13712>, main.c,  908, Net key : 3A202F2696D640FD5C38543DE8780D52
<t:      13719>, main.c,  909, App key : 3643DA45CF8A74A070617A9C9588AD3A
<t:      13725>, main.c,  910, Press Button 1 to start provisioning and configuration process. 
1
<t:     247870>, main.c,  608, Local provisioning link established
<t:     249692>, main.c,  664, Using static authentication
<t:     262559>, main.c,  674, Static authentication data provided
<t:     276000>, main.c,  617, Provisioned device addr: 0x0100 net_key_handle: 0
<t:     276007>, main.c,  618, Dev Key: DB050AA7770E1779E8C8509403A23001
<t:     276013>, main.c,  620, Adding device address, and device keys
<t:     276022>, main.c,  631, Provisioning complete! Added 0x0100 as handle 0
<t:     279659>, main.c,  360, Provisioning successful
<t:     279665>, main.c,  644, Local provisioning link closed
<t:     279671>, node_setup.c,  729, Configuring Node: 0x0100
<t:     279679>, node_setup.c,  617, Config client setup: devkey_handle:2 addr_handle:0
<t:     279687>, node_setup.c,  355, Getting composition data

(If flash writing is not disable, there will be 2 of these lines)
<t:     279745>, main.c,  171, Flash write complete
<t:     279811>, main.c,  171, Flash write complete

<t:          0>, main.c,  568, ----- BLE Mesh Light Switch Client Demo -----
<t:      14021>, main.c,  525, Initializing and adding models
<t:      20514>, mesh_app_utils.c,   65, Device UUID (raw): 9BE5201B8630204C8E73991513B2CA0B
<t:      20521>, mesh_app_utils.c,   70, Device UUID : 1B20E59B-3086-4C20-8E73-991513B2CA0B
<t:    1255333>, main.c,  175, Successfully provisioned
<t:    1255338>, main.c,  178, Node Address: 0x1337 

(There should be something like this)
<t:     700915>, config_server.c,  629, dsm_appkey_add(appkey_handle:0 appkey_index:0)
<t:     705220>, config_server.c, 2441, Access  Info:
		element_index=0		model_id = 2-FFFF		model_handle=1
<t:     716239>, config_server.c, 2441, Access  Info:
		element_index=1		model_id = 1001-FFFF		model_handle=2
<t:     717114>, config_server.c, 2441, Access  Info:
		element_index=2		model_id = 1001-FFFF		model_handle=3

Can you give me some advices where to start debugging this, or the reasons which causes this issue? I would really appreciate that.

Thank you and best regards,

                   Duy

  • Hi,

    I think you might misunderstanding something. Not sure why you need to combine the two examples in device 1, The PB remote client example already contains Remote provisioning client model that acts as provisioner and provisions remote devices. While the PB remote server example acts as provisionees until they are included in the network, after which they will be able to act as servers that are relays to help provision new devices that are out of reach for the client.

    Could you give me a bit more details on why you are trying to combine the two examples in device 1 and device 2?

    What are your use-case/trying to do? Have you read through this

  • Hello ,

    Thank you for your feedback. Sorry not making it clear enough and please correct me if I am wrong.

    What I am doing now is to configure the provisionees as the light switch clients or light switch servers, and I have been adding these features in the PB Remote examples.

    The provisioning process works fine for provisioner and provisionees. However, for the node setup (configuration) process, I have not made it work yet. The Provisioner in the Light Switch examples can configure the using functions in the node_setup.c file and this file call functions in config_client.c.

    I use the same node_setup.c to put into the PB Provisioner with some small modifications to make it run, however I think I may have misused or misuderstood something so the Provisionee does not received the request to add the appkey although I do call it in function prov_evt_handler.

                /* Bind the device key to the configuration server and set the new node as the active server. */
                ERROR_CHECK(config_client_server_bind(m_devkey_handles[1 + m_next_unprov_index]));
                ERROR_CHECK(config_client_server_set(m_devkey_handles[1 + m_next_unprov_index],
                                                     m_device_address_handles[m_next_unprov_index]));

    I hope that this is clear enough for you.

    Best regards,

         Duy

  • Hello ,

    Do you need any further information? Thanks.

    Best regards,

        Duy

  • Hi, 

    Its more clear what you are trying to do. I will have a closer look at the issue and see if I can figure out what is going wrong.

  • Hi,

    The configuration phase doesn't need PB Remote, it can be done as a normal mesh packet. A suggestion from one of my colleauge is that you can implement a configuration client on the PB Remote provisioner, and send it as a normal mesh packet.

Related