Hello.
Using the Zigbee messaging cluster, we are writing code for data exchange between ZR and ZED.
(Based on the Zigbee example light_bulb/light_switch/light_coordinator)
I want to send data to all devices within the same network that share the same PAN ID. (broadcast)
Therefore, I applied dst_addr.addr_short = 0xFFFF; in my code, but when I checked with a sniffer, no data was being sent.
(If you enter the device address in dst_addr.addr_short, it will be sent normally.)
Here's my code
< light_bulb code>
static void send_display_msg(zb_bufid_t bufid, zb_uint16_t cmd_id) { LOG_INF("send_display_msg"); zb_uint8_t messages[] = "SEND MESSAGE"; test_disp.extended_message_control = 0x00; test_disp.message_len = sizeof(messages) -1 ; test_disp.message = messages; zb_addr_u dst_addr; dst_addr.addr_short = 0xFFFF; ZB_ZCL_MESSAGING_SEND_DISPLAY_MSG(bufid, &dst_addr , ZB_APS_ADDR_MODE_16_ENDP_PRESENT, ZB_ZCL_BROADCAST_ENDPOINT, DIMMABLE_LIGHT_ENDPOINT, &test_disp); } ... static void zcl_device_cb(zb_bufid_t bufid) { ... case ZB_ZCL_MESSAGING_GET_LAST_MSG_CB_ID: LOG_INF("ZB_ZCL_MESSAGING_GET_LAST_MSG_CB_ID"); zb_uint16_t cmd_id = ZB_ZCL_MESSAGING_SRV_CMD_DISPLAY_MESSAGE; zb_ret_t zb_err_code = zb_buf_get_out_delayed_ext( send_display_msg, cmd_id, 0); ZB_ERROR_CHECK(zb_err_code); break; ... }
<light_switch code>
static void send_get_last_msg(zb_bufid_t bufid, zb_uint16_t cmd_id) { LOG_INF("command: %d", cmd_id); zb_addr_u dst_addr; dst_addr.addr_short = bulb_ctx.short_addr; // zb_uint16_t ZC_addr = 0xFFFF; ZB_ZCL_MESSAGING_SEND_GET_LAST_MSG(bufid, &dst_addr ,ZB_APS_ADDR_MODE_16_ENDP_PRESENT, bulb_ctx.endpoint, LIGHT_SWITCH_ENDPOINT); } ... static void button_handler(uint32_t button_state, uint32_t has_changed) { zb_uint16_t cmd_id; zb_ret_t zb_err_code; /* Inform default signal handler about user input at the device. */ user_input_indicate(); check_factory_reset_button(button_state, has_changed); if (bulb_ctx.short_addr == 0xFFFF) { LOG_DBG("No bulb found yet."); return; } switch (has_changed) { case BUTTON_ON: LOG_DBG("ON - button changed"); cmd_id = ZB_ZCL_CMD_ON_OFF_ON_ID; break; case BUTTON_OFF: LOG_DBG("OFF - button changed"); cmd_id = ZB_ZCL_CMD_ON_OFF_OFF_ID; break; case BUTTON_SLEEPY: cmd_id = ZB_ZCL_MESSAGING_CLI_CMD_GET_LAST_MESSAGE; break; case IDENTIFY_MODE_BUTTON: if (IDENTIFY_MODE_BUTTON & button_state) { /* Button changed its state to pressed */ } else { /* Button changed its state to released */ if (was_factory_reset_done()) { /* The long press was for Factory Reset */ LOG_DBG("After Factory Reset - ignore button release"); } else { /* Button released before Factory Reset */ /* Start identification mode */ ZB_SCHEDULE_APP_CALLBACK(start_identifying, 0); } } return; default: LOG_DBG("Unhandled button"); return; } switch (button_state) { case BUTTON_ON: case BUTTON_OFF: LOG_DBG("Button pressed"); buttons_ctx.state = button_state; /* Alarm can be scheduled only once. Next alarm only resets * counting. */ k_timer_start(&buttons_ctx.alarm, BUTTON_LONG_POLL_TMO, K_NO_WAIT); break; case 0: LOG_DBG("Button released"); k_timer_stop(&buttons_ctx.alarm); if (atomic_set(&buttons_ctx.long_poll, ZB_FALSE) == ZB_FALSE) { /* Allocate output buffer and send on/off command. */ if(has_changed!=BUTTON_SLEEPY) { zb_err_code = zb_buf_get_out_delayed_ext( light_switch_send_on_off, cmd_id, 0); ZB_ERROR_CHECK(zb_err_code); } else { zb_err_code = zb_buf_get_out_delayed_ext( send_get_last_msg, cmd_id, 0); ZB_ERROR_CHECK(zb_err_code); } } break; default: break; } }
May I know where I made the error?