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.