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

nRF Mesh self provision on client

Dear all,

I try to self provision device by it self following steps below:

Step 1 : Bind key

void app_common_self_provision(access_model_handle_t handle, bool is_client, uint16_t unicast_addr, uint8_t * netkey, uint8_t * appkey)
{
    dsm_handle_t netkey_handle, devkey_handle;
    dsm_local_unicast_address_t local_address;
    local_address.address_start = unicast_addr;
    local_address.count = ACCESS_ELEMENT_COUNT;
    uint32_t status;

    /* Store received provisioning data in the DSM */
    status = dsm_local_unicast_addresses_set(&local_address);
    ERROR_CHECK(status);

    status = dsm_subnet_add(0, netkey, &netkey_handle);
    ERROR_CHECK(status);

//    NRF_MESH_ERROR_CHECK(net_state_iv_index_set(0, 0));
    
    dsm_handle_t app_handle;
    dsm_handle_t network_handle = dsm_net_key_index_to_subnet_handle(0);
    status = dsm_appkey_add(0, network_handle, appkey, &app_handle);
    ERROR_CHECK(status);

//    ERROR_CHECK(dsm_devkey_add(unicast_addr, netkey_handle, m_provisioner.p_nw_data->self_devkey, &m_provisioner.p_dev_data->m_self_devkey_handle));

    /* Bind config server to the device key */
    if (!is_client)
        status = config_server_bind(devkey_handle);

    ERROR_CHECK(status);

    status = access_model_application_bind(handle, app_handle);
    ERROR_CHECK(status);

    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "provision_by_my_self done\r\n");
    
    ERROR_CHECK(access_default_ttl_set(NRF_MESH_TTL_MAX));
}


Step 2 : Subscribe to topic

void subscribe_default_topic()
{
      __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Add default subscribe topic\r\n");
      dsm_handle_t subscription_address_handle;
      uint32_t status;
      status = dsm_address_subscription_add(m_dev_info.info.topic_all, &subscription_address_handle);
      NRF_MESH_ERROR_CHECK(status);
      status = access_model_subscription_add(m_custom_server_0.server.model_handle, subscription_address_handle);   
      NRF_MESH_ERROR_CHECK(status);   

      status = dsm_address_subscription_add(m_dev_info.info.topic_control, &subscription_address_handle);
      NRF_MESH_ERROR_CHECK(status);
      status = access_model_subscription_add(m_custom_server_0.server.model_handle, subscription_address_handle);   
      NRF_MESH_ERROR_CHECK(status);
}


Step3 : Set publication topic

static void add_default_publication_topic(void)
{
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Add default publication topic\r\n");
    dsm_handle_t publish_address_handle;
    ERROR_CHECK(dsm_address_publish_add(m_dev_info.info.topic_report, &publish_address_handle));
    ERROR_CHECK(access_model_publish_address_set(m_custom_server_0.server.model_handle, publish_address_handle));
    ERROR_CHECK(access_model_publish_application_set(m_custom_server_0.server.model_handle, publish_address_handle));              
}

Step 4 The main code to config device

#if 1
                    custom_application_server_t *p_server = &m_custom_server_0;

                    app_common_self_provision(p_server->server.model_handle, 
                                              false, 
                                              m_dev_info.info.exchange_pair_addr, 
                                              m_dev_info.info.key.netkey,
                                              m_dev_info.info.key.appkey);
                    
                    subscribe_default_topic();
                    add_default_publication_topic();

                    uint8_t id = PAIR_ID_PROCESS_DONE;
                    mesh_central_data_t msg;
                    msg.len = 1;
                    msg.data = &id;
                    mesh_device_central_send(&msg);
#endif  


The problem is, after self provisioned and reboot device, when message publish from client in other node always return error 5 (NRF_ERROR_NOT_FOUND)
But when i comment out function subscribe_default_topic, device publish message without error.

Could you please give me your suggestion?

Thank you

Parents
  • Hi

    Which Mesh SDK and device are you using here? The provisioning data should be stored in Flash for the device to automatically join the network when powering up. The NRF_ERROR_NOT_FOUND point towards that the data can't be found, so it seems like it isn't stored properly.

    I suggest you give the provisioning section of the Mesh specification a read to get a better understanding of how the self-provisioning process is working.

    Best regards,

    Simon

Reply
  • Hi

    Which Mesh SDK and device are you using here? The provisioning data should be stored in Flash for the device to automatically join the network when powering up. The NRF_ERROR_NOT_FOUND point towards that the data can't be found, so it seems like it isn't stored properly.

    I suggest you give the provisioning section of the Mesh specification a read to get a better understanding of how the self-provisioning process is working.

    Best regards,

    Simon

Children
Related