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.

ZLL 重新上电后不能通信的问题

你好!

请教一个问题!

前提: 有一个遥控器E1和一个路由R1,分别烧录SampleRemote-EB-EndDevice工程和SampleLight-Zlight-RouteDevice工程。我在遥控器中用串口来触发TOUCH_LINK_KEY来与路由R1成功组网。并在遥控器E1中调用zclGeneral_SendOnOff_CmdOn()和zclGeneral_SendOnOff_CmdOff()函数成功 开/关 操作路由R1,表明遥控器E1与路由R1通信OK。

现象: 当我将遥控器E1重新上电后,我在遥控器E1中直接调用zclGeneral_SendOnOff_CmdOn()和zclGeneral_SendOnOff_CmdOff()函数来进行操作路由R1时,发现路由R1没有任何反应。

问题: 怎么遥控器E1重新上电后就不能再与路由R1通信了呢? 谢谢!

注:SampleRemote-EB-EndDevice工程(遥控器E1)添加我自己的串口处理函数,而SampleLight-Zlight-RouteDevice工程(路由R1)的代码没有作任何修改。

   在遥控器E1中获取 linkedTargets值始终保持相同的值。

  • 你好,

    在重启以后,当你再去ON/OFF控制一个灯的时候,调用的是下面程序

    zclGeneral_SendOnOff_CmdOn( SAMPLEBRIDGE_ENDPOINT, &zllSampleBridge_DstAddr, FALSE, sampleBridgeSeqNum++ );

    在上面这个函数里面因为Reset,所以zllSampleBridge_DstAddr被初始化,所以值为0

    在zllSampleBridge_Init被初始化。

    那么这个命令显示是一个无效的命令,因为目的地址不对。

    正确的做法是,需要选择一个合适的灯,选择灯的时候,就把这个目的地址获取到了,之后就可以控制了

    选择灯也是通过按键实现的

    if ( keys == DEV_SEL_UP_KEY )
    {
    if ( linkedAddrNum > 0 )
    {
    if( (linkedAddrSelIdx+1) >= linkedAddrNum )
    {
    linkedAddrSelIdx = 0;
    }
    else
    {
    linkedAddrSelIdx++;
    }
    zllSampleBridge_DstAddr.addrMode = afAddr16Bit;
    zllSampleBridge_DstAddr.addr.shortAddr = linkedTargets.arr[linkedAddrSelIdx].Addr;
    zllSampleBridge_DstAddr.endPoint = linkedTargets.arr[linkedAddrSelIdx].EP;

    zclGeneral_SendIdentify( SAMPLEBRIDGE_ENDPOINT, &zllSampleBridge_DstAddr,
    SAMPLEBRIDGE_CMD_IDENTIFY_TIME, FALSE, sampleBridgeSeqNum++ );

    HalLcdWriteStringValue( "Dev Sel:", zllSampleBridge_DstAddr.addr.shortAddr, 16, HAL_LCD_LINE_3 );
    }
    else
    {
    HalLcdWriteString( "Dev Sel: no trgt", HAL_LCD_LINE_3 );
    }
    }

    if ( keys == DEV_SEL_DN_KEY )

  • VV

      你好,感谢你的回复,谢谢^_^

     你说得很对,遥控器E1 重新上电后,zllSampleBridge_DstAddr会被初始化为0.

    所以我为了避免zllSampleRemote_DstAddr的值被初始化,我在自己的串口函数中直接调用zclGeneral_SendOnOff_CmdOn( SAMPLEREMOTE_ENDPOINT, &zllSampleRemote_DstAddr_mod, FALSE, sampleRemoteSeqNum++ );这个zllSampleRemote_DstAddr_mod值是从串口中获取的网络短地址。这样一来遥控器E1重新上电后,在串口调用时zllSampleRemote_DstAddr_mod值就不会变了,但还是不能通信,现象和原来一样。

    这怎么会这样呀?

     

  • 节点的信息地址保存的是否正确

  • VV

       你好!

      你说的“节点信息地址”是网络地址吗?你说的“保存”在哪里?

      我保证在整个过程中使用的节点网络地址都是正确的,我从linkedTargets变量取到的。

    谢谢!

  • VV

      你好!

       我在这里再次把我的问题重新说一次,请原谅我这么啰嗦哈!

    前提:第一次的实验现象是 有一个遥控器E1和一个路由R1,分别烧录SampleRemote-EB-EndDevice工程和SampleLight-Zlight-RouteDevice工程。我在遥控器中用串口来触发TOUCH_LINK_KEY来与路由R1成功组网。并在遥控器E1中调用zclGeneral_SendOnOff_CmdOn()和zclGeneral_SendOnOff_CmdOff()函数成功 开/关 操作路由R1,表明遥控器E1与路由R1通信OK。为了避免zllSampleRemote_DstAddr的值在重新上电时被初始化,我在自己的串口函数中直接调用zclGeneral_SendOnOff_CmdOn( SAMPLEREMOTE_ENDPOINT, &zllSampleRemote_DstAddr_mod, FALSE, sampleRemoteSeqNum++ );这个zllSampleRemote_DstAddr_mod(这个是我自己定义的)值是从串口中获取的网络短地址(这个地址我是从linkedTargets获取的,我确保在整个环节中使用节点的网络地址是正确的)。这样一来遥控器E1重新上电后,在串口调用时zllSampleRemote_DstAddr_mod值就不会变。

    现象: 第二次实验现象是当我将遥控器E1重新上电后,我同样在遥控器E1的串口函数中直接再次调用zclGeneral_SendOnOff_CmdOn()和zclGeneral_SendOnOff_CmdOff()函数来进行操作路由R1时,发现路由R1没有任何反应。这个过程中什么也没有变,在第一次实验中的设置我都没有变,变的是我给遥控器E1重新上电了就不能通信了。

    问题: 怎么遥控器E1重新上电后就不能再与路由R1通信了呢? 谢谢!

    注:SampleRemote-EB-EndDevice工程(遥控器E1)添加我自己的串口处理函数(这个函数调用TOUCHLINK/开灯/关灯等等命令),而SampleLight-Zlight-RouteDevice工程(路由R1)的代码没有作任何修改。

    在遥控器E1中获取 linkedTargets值始终保持相同的值。

  • 你把zllSampleRemote_DstAddr_mod完整的赋值过程发出来看下,

    另外你能否把整个过程,用Sniffer抓包下来看看!用附件上传抓包文件