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.

[参考译文] CC2630:网络丢失时的智能重试行为

Guru**** 2540720 points
Other Parts Discussed in Thread: CC2630

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/567013/cc2630-intelligent-retry-behavior-when-network-lost

器件型号:CC2630

将 ZStack 1.2.2a 与 CC2630结合使用、目标是实现超低功耗。

我们的用例:

  • 我们有一个由电池供电的便携式睡眠终端设备
  • 用户可以随时触发 AF 传输。 如果传输不成功、则需要快速反馈
  • 设备会定期发送每个 CA 的状态信息。 4h。 当网络不可用时、不应对所有通道进行全面扫描
  • 该器件由电池供电、电池不应至少更换2年。

如何避免进行详尽的通道扫描并仅在特定条件下允许?  示例:

在用户触发的传输中、

  • 仅每三次尝试执行一次完整的通道扫描
  • 否则、在同一个旧的已知信道上重新加入会执行一次

在自动状态消息上:

  • 在自动状态消息上、不会执行完整的通道扫描。 在同一个旧的已知信道上只试一次

我已经应用了中描述的补丁

https://e2e.ti.com/support/wireless_connectivity/zigbee_6lowpan_802-15-4_mac/f/158/t/498387

这还允许在 DEV_Nwk_backoff 后降低 DEV_NWK_DISC 状态、从而仅对所有通道执行一次完整扫描、这对于我们的用例而言是理想的。 但我也希望避免在某些情况下(如上所述)进行单次扫描。

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

    我在 ZDO_StartDevice()函数中做了一些更改,我获得了您所需的内容,为了尝试它,我刚刚将 endDevice 加入到协调器中, 等待了一段时间并关闭了协调器的电源,然后在终端设备中重新启动 EZ 模式,以重新加入:

    if (startMode =mode_sin_scanCnt++>=2)

    //当 AppsUseExtendedPanID 被委托为非零值时,通过
    //应用特定的方法,设备应执行活动扫描
    //在默认信道列表中,使用相同的方式加入 PAN
    //扩展 PanID。 如果未找到平移、则应完成扫描
    //在所有通道上。
    //当设备重新加入网络并且找不到 PAN 时
    if (runtimeChannel == MAX_CHANNES_24GHz)

    scanCnt = 0;
    runtimeChannel =_NIB.nwkLogicalChannel;
    ZDUPS_StopJoiningCycle ();

    RuntimeChannel = MAX_CHANNES_24GHz;


    替换 ZDObject.c 行343中的条件

    尝试一下、告诉我您的想法。

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

    您好、Jose、

    非常感谢您的建议、听起来很有希望。 但我很难再现这种行为。

    如果我理解正确、则会改变

    if (startMode =mode_sin_scanCnt++>=5) 

    更改为

    if (startMode =mode_sin_scanCnt++>=2) 

    应减少同一信道上的退休人员数量。 但我看不到使用监听器进行的任何更改(是的、我重新编译了 EndDevice 项目)。

    如何确切地重新启动 EZMode? 从 SampleSwitch 原始代码中、通过右键按下完成此操作:

    if (keys== key_right)
    {
    #if defined (ZCL_EZMODE)
    //启动 EZMode 调试
    {
    zclEZMode_InvokeData_t ezModeData;
    //仅绑定到开/关群集
    静态 uint16_t clusterIDs[]=
    {ZCL_CLUSTER_ID_GEN_ON_OFF};
    
    //调用 eZ-Mode
    ezModeData.endpoint = switch_EP;//要调用的端点
    // EZ 模式
    if (savedState == ZStack_DevState_dev_ZB_coord)
    ||(savedState == ZStack_DevState_dev_router)
    ||(savedState == ZStack_DevState_dev_end_device))
    {
    ezModeData.onNetwork = true;//节点已在上
    //网络
    }
    其他
    {
    ezModeData.onNetwork = false;//节点尚未在上
    //网络
    }
    ezModeData.initiator = true; // OnOffSwitch 是启动器
    ezModeData.numActiveOutClusters = 1;//活动输出群集
    ezModeData.pActiveOutClusterID =群集 ID;
    ezModeData.numActiveInClusters = 0;//无活动输入群集
    ezModeData.pActiveInClusterIDs=空;
    zcl_InvokeEZMode (&ezModeData);
    
    LCD_write_string ("EZMode"、LCD_Page2);
    }
    #Elif defed (Zstack_manual_start)(Zstack_manual_start)
    ZSTART_DISCOVERY ();
    #endif // ZCL_EZMODE
    }
    
    //更新显示
    switch_updateLcdDisplay();
    }
    

    因此、我在代码中添加了如下内容:

    if (hdrStatus =ZStack_ZStatusValues_ZSuccess& ReqStatus ==0)
    {
    //确定
    }
    否则{
    //我们已经尝试3次用户通知,请参阅 f8wConfig.cfg 中的 APSC_MAX_FRAME_RETESS
    SOS_STstate = SOS_STACE_SEND_FAILED;
    //避免详尽通道扫描
    
    zclEZMode_InvokeData_t ezModeData;
    
    ezModeData.endpoint = RB4_endpoint_SOS;
    ezModeData.onNetwork = true;//节点已是网络的一部分
    ezModeData.initiator = true;
    ezModeData.numActiveOutClusters = 2;
    ezModeData.pActiveOutClusterID = RB4_g_outputClusters;
    ezModeData.numActiveInClusters = 2;
    ezModeData.pActiveInClusterID = RB4_g_inputClusters;
    zcl_InvokeEZMode (&ezModeData);
    } 

    但我看不到不同信道或原始信道中信标请求的行为发生任何变化。 那么、如何重新启动 EZMode?

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

    尊敬的 Simeon:

    我发布的更改仅在节点处于重新加入模式(以前有网络)且我将按钮保留在应用程序中(如默认示例应用程序中)时可见。 尝试仅使用全新项目、只需添加更改、然后使用协调器启动网络并加入终端设备。 如果您在协调器中执行下电上电、然后按向右按钮再次运行 EZ 模式。 这就是我所做的、如果适合您、请告诉我。 之后、我们可以处理您想要包含的其他更改。

    此致、

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

    好的、我的设置现在:
    将 SmartRF06上的 SampleSwitch 清理为 EndDevice
    将 SmartRF06上的 ZNP 项目清理为协调器、由 Z-Tool 控制
    协调器处于自动保持状态、这意味着在复位后、我必须发送启动请求

    在 SampleSwitch 上、我仅将 ZNWK_DEFAULT_CHANLIST 修改为 ZSTART_MAX_CHANNELS_24GHz

    1:已启动的协调器
    2:在 SampleSwitch 上启动 EZMode
    3:SampleSwitch 加入协调员
    3:复位协调器
    4:在 SampleSwitch 上重新启动 EZMode (按一次右键)


    如果不进行修改、我可以看到 SampleSwitch 在原始信道上发送了许多信标请求、在不同信道上发送了许多信标请求。

    在进行修改后、我可以看到 SampleSwitch 仅在原始信道上执行3次信标请求、在不同信道上不执行信标请求。 这正是我要寻找的。

    接下来的步骤很有趣:如何在 AF 传输后实现这一点?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否详细说明在 AF 传输后您想要实现的目标?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们有两种 AF 传输:

    *每4小时发送一次状态消息
    *用户触发的消息(按钮按压事件)

    我们希望实现极长的电池寿命:大约 3年的纽扣电池寿命。

    我们计算出用户触发的传输每天执行一次、在10种情况中、有1种可能会发生传输失败。

    对于状态消息、我们计算出传输失败2次(由于周末差旅、无法到达两天)。

    因此、我们希望实现以下行为以节省电池寿命:

    在出现状态消息后、不应执行通道扫描、因为这会消耗过多的电池电量。
    在收到用户触发的消息后、允许进行通道扫描。 这应提高用户触发传输的可靠性。

    我们的测试表明、即使在0°C 环境下、我们也可以轻松实现3年的电池寿命、但仅在没有进行通道扫描的理想路径上。 执行通道扫描后、电池寿命将大幅降低至3年以下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Simeon:

    为此,您可以使用 ZDO_RegisterForZdoCB()函数为发送所需消息的应用程序注册回调,并启动4小时计时器以自动重新发送消息:

    ZDO_RegisterForZdoCB (ZDO_Join_CNF_CBID、&YOLE_App_Callback);

    在应用程序初始化期间注册回调,对于回调,您可以执行类似于 MT_ZdoJoinCnfCB()的操作,只需发送消息并在此处启动计时器。 您只需要像以前一样使用右按钮运行 EZ 模式、并且当器件加入网络时、堆栈将触发注册的回调。

    但愿这对您有所帮助。

    此致。

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

    如果我理解正确、这将停止状态消息间隔、直到执行 ZDO_JOIN_CNTF_CBID。 因此、在父设备丢失(超出范围)后、它将停止状态消息、直到终端设备重新加入网络(重新调整?)。 这将需要用户触发按钮。 但是、我们需要每4小时发送一次状态消息、无论器件在之前的传输中丢失还是未丢失父消息。 如果父级设备再次处于可访问范围内、则状态消息应为"仅工作"。

    我们有一个在状态消息接收器后面运行的应用程序。 如果状态消息丢失72小时、则会生成警报。 因此、状态消息必须在没有用户干预的情况下继续。

    我将在 Clean SamplSwitch 项目上尝试您的建议:ZDO_RegisterForZdoCB (ZDO_Join_CNF_CBID、&YOLE_App_Callback)。 也许它能满足我们的需求。 如果没有、请进一步帮助我。 提前感谢您!

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

    您好!

    说实话、我根本不理解 ZDO_RegisterForZdoCB (ZDO_join_CNF_CBID、&YOLE_App_Callback)如何帮助我解决通道扫描问题。 这只是提供了一种发布常规状态消息的机制。 我们已经实施了这样一个机制。 这如何规避我们希望避免的通道扫描?

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

    尊敬的 Simeon:

    如果我正确理解、您的要求是每4小时发送一次状态消息、即使 EndDevice 没有父设备。 该行为不符合 Zigbee 规范、EndDevice 不能像路由器那样向网络广播消息、终端设备只能通过其父设备与网络中的其他设备进行通信、包括广播消息、 因此、要发送状态消息、您必须先搜索父消息。

    此致、

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

    此回调仅在找到父设备并将设备连接到网络后触发状态消息发送。 此回调不会修改在 ZDObject.c 文件中添加的代码的行为、因此您需要保留我给您的最后更改、还需要注册 ZDO_Joine_CNF_CBID 回调、要开始发送消息、只需移动回调中包含的4小时计时器启动指令。