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

Some troubles in creating groups

I'm trying to create more groups in mesh.We know that all the nodes(servers) are  divided into two groups called ODD and EVEN,so I want to create more groups.

I have changed some codes in the provisioner and client.

In the provisioner node_step.c,the changes as follows,

add the     NODE_SETUP_CONFIG_PUBLICATION_ONOFF_CLIENT3,  in config_steps_t,

in the function of config_step_execute(),


}

static void config_step_execute(void)
{
   ......

    switch (*mp_config_step)
    {
      ......

    

        
        case NODE_SETUP_CONFIG_PUBLICATION_ONOFF_SERVER:
        {
            config_publication_state_t pubstate = {0};
            pubstate.element_address = m_current_node_addr;
            pubstate.publish_address.type = NRF_MESH_ADDRESS_TYPE_UNICAST;
            if ((m_current_node_addr % 3) == 1)
            {
                pubstate.publish_address.value = UNPROV_START_ADDRESS + ELEMENT_IDX_ONOFF_CLIENT1;
            }
            else if ((m_current_node_addr % 3) == 2)
            {
                pubstate.publish_address.value = UNPROV_START_ADDRESS + ELEMENT_IDX_ONOFF_CLIENT2;
            }
            else
            {
                pubstate.publish_address.value = UNPROV_START_ADDRESS + ELEMENT_IDX_ONOFF_CLIENT3;            
            }
            ......
        }

        /* Configure subscription address for the On/Off server */
        case NODE_SETUP_CONFIG_SUBSCRIPTION_ONOFF_SERVER:
        {
            __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Adding subscription\n");
            uint16_t element_address = m_current_node_addr;
            nrf_mesh_address_t address = {NRF_MESH_ADDRESS_TYPE_INVALID, 0, NULL};
            address.type = NRF_MESH_ADDRESS_TYPE_GROUP;
            if (m_current_node_addr % 0x03 ==1)//
            {
                address.value  = GROUP_ADDRESS_111;
            }
            else if (m_current_node_addr % 0x03 ==2)
            {
                address.value  = GROUP_ADDRESS_222;
            }
            else
            {
                address.value  = GROUP_ADDRESS_333;
            }
           ......
            
            break;
        }

        case NODE_SETUP_CONFIG_PUBLICATION_ONOFF_CLIENT1:
        {
            config_publication_state_t pubstate = {0};
            client_pub_state_set(&pubstate,
                                 m_current_node_addr + ELEMENT_IDX_ONOFF_CLIENT1,
                                 GROUP_ADDRESS_111);
            retry_on_fail(config_client_model_publication_set(&pubstate));

            static const access_status_t exp_status[] = {ACCESS_STATUS_SUCCESS};
            expected_status_set(CONFIG_OPCODE_MODEL_PUBLICATION_STATUS, ARRAY_SIZE(exp_status), exp_status);
            break;
        }

        case NODE_SETUP_CONFIG_PUBLICATION_ONOFF_CLIENT2:
        {
            config_publication_state_t pubstate = {0};
            client_pub_state_set(&pubstate,
                                 m_current_node_addr + ELEMENT_IDX_ONOFF_CLIENT2,
                                 GROUP_ADDRESS_222);
            retry_on_fail(config_client_model_publication_set(&pubstate));

            static const access_status_t exp_status[] = {ACCESS_STATUS_SUCCESS};
            expected_status_set(CONFIG_OPCODE_MODEL_PUBLICATION_STATUS, ARRAY_SIZE(exp_status), exp_status);
            break;
        }
//add
        case NODE_SETUP_CONFIG_PUBLICATION_ONOFF_CLIENT3:
        {
            config_publication_state_t pubstate = {0};
            client_pub_state_set(&pubstate,
                                 m_current_node_addr + ELEMENT_IDX_ONOFF_CLIENT3,
                                 GROUP_ADDRESS_333);
            retry_on_fail(config_client_model_publication_set(&pubstate));

            static const access_status_t exp_status[] = {ACCESS_STATUS_SUCCESS};
            expected_status_set(CONFIG_OPCODE_MODEL_PUBLICATION_STATUS, ARRAY_SIZE(exp_status), exp_status);
            break;
        }

        default:
            ERROR_CHECK(NRF_ERROR_NOT_FOUND);
            break;
    }
}

I added #define GROUP_ADDRESS_333  (0xC004); and #define ELEMENT_IDX_ONOFF_CLIENT3       (3)    in example_network_config.h.

Also in the cient , I set 0,1 to control the 1st group;2,3 to control 2nd group;4,5 to control 3rd group,

static void button_event_handler(uint32_t button_number)
{
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Button %u pressed\n", button_number);

    ......

    switch(button_number)
    {
        case 0:
        case 2:
        case 4:
            set_params.on_off = APP_STATE_ON;
            break;

        case 1:
        case 3:
        case 5:
            set_params.on_off = APP_STATE_OFF;
            break;
    }

......
    switch (button_number)
    {
        case 0:
        case 1:
            /* Demonstrate acknowledged transaction, using 1st client model instance */
            /* In this examples, users will not be blocked if the model is busy */
            (void)access_model_reliable_cancel(m_clients[0].model_handle);
            status = generic_onoff_client_set(&m_clients[0], &set_params, &transition_params);
            hal_led_pin_set(BSP_LED_0, set_params.on_off);
            break;

        case 2:
        case 3:
            /* Demonstrate un-acknowledged transaction, using 2nd client model instance */
            status = generic_onoff_client_set_unack(&m_clients[1], &set_params,
                                                    &transition_params, APP_UNACK_MSG_REPEAT_COUNT);
            hal_led_pin_set(BSP_LED_1, set_params.on_off);
            break;

        case 4:
        case 5:
            /* Demonstrate un-acknowledged transaction, using 3nd client model instance */
            status = generic_onoff_client_set_unack(&m_clients[2], &set_params,
                                                    &transition_params, APP_UNACK_MSG_REPEAT_COUNT);
            hal_led_pin_set(BSP_LED_2, set_params.on_off);
            break;
    }

  ......
    }
}

I changed #define CLIENT_MODEL_INSTANCE_COUNT  (3); and #define GROUP_ADDR_COUNT       (3)    in light_switch_example_common.h.

After I finished these work,I found that the servers can react to two groups and the 3rd group without any reaction,the log of debug in client:

0> <t:          0>, main.c,  309, ----- BLE Mesh Light Switch Client Demo -----
 0> <t:          0>, mesh_softdevice_init.c,  117, Initializing SoftDevice...
 0> <t:          0>, mesh_softdevice_init.c,   75, Enabling BLE...
 0> <t:         16>, mesh_softdevice_init.c,  109, sd_ble_enable: app_ram_base should be adjusted to 0x20002DA0
 0> <t:        531>, main.c,  276, Initializing and adding models
 0> <t:        566>, main.c,  341, Device UUID : 0059CCAA000000000D10EC4F9C0BA8D1
  < 0
 0> <t:      59538>, main.c,  177, Button 0 pressed
 0> <t:      59540>, main.c,  206, Sending msg: ONOFF SET 1
 0> <t:      60437>, main.c,  124, Acknowledged transfer success.
 0> <t:      60440>, main.c,  150, OnOff server: 0x0106, Present OnOff: 0, Target OnOff: 1, Remaining Time: 100 ms
 0> <t:      62174>, main.c,  150, OnOff server: 0x0106, Present OnOff: 1, Target OnOff: 1, Remaining Time: 100 ms
 0> <t:      65625>, main.c,  155, OnOff server: 0x0106, Present OnOff: 1
  < 1
 0> <t:      95574>, main.c,  177, Button 1 pressed
 0> <t:      95576>, main.c,  206, Sending msg: ONOFF SET 0
 0> <t:      96149>, main.c,  124, Acknowledged transfer success.
 0> <t:      96151>, main.c,  150, OnOff server: 0x0106, Present OnOff: 1, Target OnOff: 0, Remaining Time: 100 ms
 0> <t:     101202>, main.c,  155, OnOff server: 0x0106, Present OnOff: 0
  < 2
 0> <t:     125058>, main.c,  177, Button 2 pressed
 0> <t:     125060>, main.c,  206, Sending msg: ONOFF SET 1
 0> <t:     127633>, main.c,  150, OnOff server: 0x0104, Present OnOff: 1, Target OnOff: 1, Remaining Time: 100 ms
 0> <t:     131199>, main.c,  155, OnOff server: 0x0104, Present OnOff: 1
  < 3
 0> <t:     151266>, main.c,  177, Button 3 pressed
 0> <t:     151268>, main.c,  206, Sending msg: ONOFF SET 0

any help i'll appreciate very much.

nrf52832, nrf5 SDK for Mesh v2.2.0, nrf5 SDK 15.0.

Parents Reply Children
No Data
Related