This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2340R5:当多个器件加入或离开网络时、协调器的短地址输出保持不变。

Guru**** 2805935 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1623861/cc2340r5-the-short-address-output-by-the-coordinator-when-multiple-devices-join-or-leave-the-network-remains-unchanged

器件型号: CC2340R5

      case ZB_ZDO_SIGNAL_DEVICE_ANNCE:
      {
        zb_zdo_signal_device_annce_params_t *dev_annce_params = ZB_ZDO_SIGNAL_GET_PARAMS(sg_p, zb_zdo_signal_device_annce_params_t);
        short_addr = dev_annce_params->device_short_addr;
        // zb_ret_t ret = zb_address_ieee_by_short(short_addr, ieee_addr);
        printf("New device commissioned or rejoined short :0x%04hx\r\n",short_addr);
        // ZB_SCHEDULE_APP_ALARM(schedule_send_active_ep_req, 0, 1 * ZB_TIME_ONE_SECOND);
        break;
      }      
     case ZB_ZDO_SIGNAL_LEAVE_INDICATION:
      {
        zb_zdo_signal_leave_indication_params_t *leave_device_params = ZB_ZDO_SIGNAL_GET_PARAMS(sg_p, zb_zdo_signal_leave_indication_params_t);
        // delete_long_by_short(leave_device_params->short_addr);
        printf("leave device short addr = %d\r\n",leave_device_params->short_addr);
        bdb_start_top_level_commissioning(ZB_BDB_NETWORK_STEERING);
        break;
      }

有两种器件加入和离开协调器。 输出短地址相同。 为什么会这样? 这种情况在以前的版本中没有发生。 我当前使用的版本是 9.14.0.41。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bin:

    您在 SDK v9.14 之前使用的之前版本是什么?  您是否尝试过对器件进行出厂编程或在重新编程之前擦除所有闪存?  您是否有要共享的监听器或打印日志?  我假设您并不意味着两个不同的器件具有相同的短地址、因此如果器件在保留时启用了重新连接位、它们将在重新连接时收到相同的短地址分配。  没有足够的信息可用于确定您的实例中发生了什么。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    CORTEX_M0P:未知信号 47

    CORTEX_M0P:未知信号 53

    CORTEX_M0P:未知信号 48

    CORTEX_M0P:新器件已启动或重新连接、简称:0x8119

    CORTEX_M0P:未知信号 53

    CORTEX_M0P:未知信号 59

    CORTEX_M0P:命令 ID:0x01

    CORTEX_M0P:未知信号 47

    CORTEX_M0P:未知信号 53

    CORTEX_M0P:未知信号 48

    CORTEX_M0P:新器件已启动或重新连接、简称:0x8119

    CORTEX_M0P:未知信号 59

    CORTEX_M0P:未知信号 53

    CORTEX_M0P:命令 ID:0x01
    将两个设备连接到网络后、它们都打印相同的短地址 0x8119。 重新安装协调器器件程序后、除了第一个不同的器件外、其他器件都显示与第一个器件相同的短地址。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用 F2 SDK v9.14 将三个 ZED 加入 ZR、没有观察到任何重叠的短地址分配。  我也没有听到其他开发人员的类似报告。  我担心您的代码未正确解析应用信号以获取正确的 数据。  您可以使用 监听器观察 所报告的短地址是否与网络中的设备地址分配相同。  以下是固件的使用示例:

    void zboss_signal_handler(zb_uint8_t param)
    {
      zb_zdo_app_signal_hdr_t *sg_p = NULL;
      zb_zdo_app_signal_type_t sig = zb_get_app_signal(param, &sg_p);
      zb_ret_t status = ZB_GET_APP_SIGNAL_STATUS(param);
    
      if (status == RET_OK)
      {
        switch(sig)
        {
          //...
            break;
          }
          case ZB_ZDO_SIGNAL_DEVICE_ANNCE:
          {
            zb_zdo_signal_device_annce_params_t *dev_annce_params = ZB_ZDO_SIGNAL_GET_PARAMS(sg_p, zb_zdo_signal_device_annce_params_t);
            short_addr = dev_annce_params->device_short_addr;
            // zb_ret_t ret = zb_address_ieee_by_short(short_addr, ieee_addr);
            Display_print1(handle, 0, 0, "New device commissioned or rejoined short :0x%04x\r\n",short_addr);
            // ZB_SCHEDULE_APP_ALARM(schedule_send_active_ep_req, 0, 1 * ZB_TIME_ONE_SECOND);
            break;
          }     

    也可能会影响您的其他 E2E 主题、因此请仔细评估。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 ZB_ZDO_SIGNAL_DEVICE_ANNCE 中、使用 ZB_ret_t ret = ZB_ADDRESS_IEEE-by_short (short_addr、IEEE-addr);我也无法获得 IEEE-addr 的值。 这是正确的吗? 此问题仅在 zbosis_signal_handler 函数中发生。 在 zb_uint8_t zcl_specific cluster_cmd_handler (zb_uint8_t param) 函数中、可以看到每个连接的器件的短地址和长地址。 ZB_ADDRESS_IEEE-by_short (short_addr、IEEE-addr) 函数也可以读取相应的数据。 我使用的版本是 SimpleLink 低功耗 F3 SDK 9.14.2.16。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bin:

    我也在使用 F3 SDK v9.14、在 ZB_ZDO_SIGNAL_DEVICE_ANNCE 期间向 ZB_ADDRESS_IEEE-BY_SHORT 提供 SHORT_addr 时 、我能够读取 IEEE-addr。  这可能与我之前的消息或初始化 IEEE-addr 的方式有关。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    void zboss_signal_handler(zb_uint8_t param)
    {
      zb_zdo_app_signal_hdr_t *sg_p = NULL;
      zb_zdo_app_signal_type_t sig = zb_get_app_signal(param, NULL);
    
      if (ZB_GET_APP_SIGNAL_STATUS(param) == 0)
      {
        switch(sig)
        {
    #ifndef ZB_MACSPLIT_HOST
          case ZB_ZDO_SIGNAL_SKIP_STARTUP:
    #else
          case ZB_MACSPLIT_DEVICE_BOOT:
    #endif /* ZB_MACSPLIT_HOST */
    
    #ifdef TEST_USE_INSTALLCODE
            zb_secur_ic_str_add(g_ed_addr, g_installcode, NULL);
    #endif
            set_tx_power(DEFAULT_TX_PWR);
            zboss_start_continue();
            break;
    
          case ZB_BDB_SIGNAL_DEVICE_FIRST_START:
          case ZB_BDB_SIGNAL_DEVICE_REBOOT:
          {
            zb_nwk_device_type_t device_type = ZB_NWK_DEVICE_TYPE_NONE;
            device_type = zb_get_device_type();
            ZVUNUSED(device_type);
            Log_printf(LogModule_Zigbee_App, Log_INFO, "Device (%d) STARTED OK", device_type);
            printf("Device (%d) STARTED OK\r\n", device_type);
            if (perform_factory_reset)
            {
              Log_printf(LogModule_Zigbee_App, Log_INFO, "Performing a factory reset.");
              zb_bdb_reset_via_local_action(0);
              perform_factory_reset = ZB_FALSE;
            }
            else if(ZB_BDB_SIGNAL_DEVICE_REBOOT == sig)
            {
              ZB_SCHEDULE_APP_ALARM_CANCEL(off_network_attention, ZB_ALARM_ANY_PARAM);
              zb_osif_led_off(1);
            }
            set_tx_power(DEFAULT_TX_PWR);
            bdb_start_top_level_commissioning(ZB_BDB_NETWORK_STEERING);
    
    #ifdef ZB_USE_BUTTONS
            zb_button_register_handler(0, 0, button_press_handler);
    #endif
            break;
          }
          case ZB_COMMON_SIGNAL_CAN_SLEEP:
          {
    #ifdef ZB_USE_SLEEP
            Log_printf(LogModule_Zigbee_App, Log_INFO, "Sleeping now");
            zb_sleep_now();
    #endif
            break;
          }
          case ZB_ZDO_SIGNAL_DEVICE_ANNCE:
          {
            zb_zdo_signal_device_annce_params_t *dev_annce_params = ZB_ZDO_SIGNAL_GET_PARAMS(sg_p, zb_zdo_signal_device_annce_params_t);
            short_addr = dev_annce_params->device_short_addr;
            Bin_printf("New device commissioned or rejoined short :0x%04hx\r\n",short_addr);
            zb_ret_t ret = zb_address_ieee_by_short(short_addr, ieee_addr);
            printf("long_addr : %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\r\n",ieee_addr[0],ieee_addr[1],ieee_addr[2],ieee_addr[3],ieee_addr[4],ieee_addr[5],ieee_addr[6],ieee_addr[7]);
            // ZB_SCHEDULE_APP_ALARM(schedule_send_active_ep_req, 0, 1 * ZB_TIME_ONE_SECOND);
            break;
          }
          case ZB_BDB_SIGNAL_STEERING:
            Log_printf(LogModule_Zigbee_App, Log_INFO, "Successful steering, start f&b target");
            printf("Successful steering, start f&b target\r\n");
            zb_bdb_finding_binding_target(ZB_OUTPUT_ENDPOINT);
            ZB_SCHEDULE_APP_ALARM_CANCEL(off_network_attention, ZB_ALARM_ANY_PARAM);
            zb_af_set_data_indication(data_indication);
            // zb_osif_led_off(1);
            break;
          case ZB_ZDO_SIGNAL_LEAVE_INDICATION:
          {
            zb_zdo_signal_leave_indication_params_t *leave_device_params = ZB_ZDO_SIGNAL_GET_PARAMS(sg_p, zb_zdo_signal_leave_indication_params_t);
            printf("leave device short addr = %d\r\n",leave_device_params->short_addr);
            bdb_start_top_level_commissioning(ZB_BDB_NETWORK_STEERING);
            break;
          }
         case ZB_ZDO_DEVICE_UNAVAILABLE:
          {
            zb_zdo_device_unavailable_params_t *unavailable_params = ZB_ZDO_SIGNAL_GET_PARAMS(sg_p, zb_zdo_device_unavailable_params_t);
            uint16_t unavailable_short_addr = unavailable_params->short_addr;
            printf("unavailable_short_addr = 0x%04hx\r\n",unavailable_short_addr);
            zdo_leave_end_req(param,unavailable_short_addr);
            break;
          }
          case ZB_NLME_STATUS_INDICATION:
          {
            zb_zdo_signal_nlme_status_indication_params_t *nlme_status_ind = ZB_ZDO_SIGNAL_GET_PARAMS(sg_p, zb_zdo_signal_nlme_status_indication_params_t);
            printf("Network operation %02x,nwk_addr = %02x\r\n", nlme_status_ind->nlme_status.status,nlme_status_ind->nlme_status.network_addr);
            break;
          }
          case ZB_BDB_SIGNAL_FINDING_AND_BINDING_TARGET_FINISHED:
          {
            bdb_start_top_level_commissioning(ZB_BDB_NETWORK_STEERING);
            break;
          }
          default:
            Log_printf(LogModule_Zigbee_App, Log_WARNING, "Unknown signal %d", (zb_uint16_t)sig);
        }
      }
      else
      {
        switch(sig)
        {
          case ZB_BDB_SIGNAL_DEVICE_FIRST_START:
            Log_printf(LogModule_Zigbee_App, Log_WARNING, "Device can not find any network on start, so try to perform network steering");
            ZB_SCHEDULE_APP_ALARM(restart_commissioning, 0, 10 * ZB_TIME_ONE_SECOND);
            break; /* ZB_BDB_SIGNAL_DEVICE_FIRST_START */
    
          case ZB_ZDO_SIGNAL_PRODUCTION_CONFIG_READY:
            Log_printf(LogModule_Zigbee_App, Log_INFO, "Production config is not present or invalid");
            break;
    
          case ZB_BDB_SIGNAL_STEERING:
            Log_printf(LogModule_Zigbee_App, Log_WARNING, "Steering failed, retrying again in 10 seconds");
            ZB_SCHEDULE_APP_ALARM(restart_commissioning, 0, 10 * ZB_TIME_ONE_SECOND);
            break; /* ZB_BDB_SIGNAL_STEERING */
    
          default:
            Log_printf(LogModule_Zigbee_App, Log_INFO, "Device started FAILED status %d sig %d", ZB_GET_APP_SIGNAL_STATUS(param), sig);
        }
      }
    
      /* Free the buffer if it is not used */
      if (param)
      {
        zb_buf_free(param);
      }
    }

    我尝试创建 onoff_light 的新示例、但结果仍然相同。 printf 语句“LONG_addr:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\r\n“中、其中 IEEE-addr[0]到 IEEE-addr[7]被打印、全部显示为 0。 当连接多个设备时、short_addr = dev_annce_params->device_short_addr 的值也是固定的。 只有当我尝试使用以前创建的 onoff_light 程序时、它才能正常工作。 我观察到这两个程序的 void zbosis_signal_handler (zB_uint8_t param) 部分、没有发现任何差异。 即使我使用“属性“->"依赖“依赖关系“修改了 SDK 版本、它仍然无法更改此现象。
    哪个程序在任何位置都可能影响函数“ZB_ADDRESS_IEEE-by_short (short_addr、IEEE-addr)“;和 ZB_zdo_signal_device_annce_params_t *DEV_annce_params = ZB_ZDO_SIGNAL_GET_PARAMS (SG_p、ZB_zdo_signal_device_device_anne_params_annce_params),我认为我的两个程序值不会影响这两个修改,我应该返回我的值)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ZB_GET_APP_SIGNAL 应使用 SG_p 作为第二个参数、因为应用程序将其用于 ZB_ZDO_SIGNAL_GET_PARAMS。
    zb_zdo_app_signal_type_t sig = zb_get_app_signal(param, &sg_p);
     
    下面是如何初始化地址 变量
    zb_uint16_t short_addr;
    zb_uint8_t ieee_addr[8];
    此致、
    Ryan