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.

基于ZHA的代码有没有可能作为initiator进行touchLink?



在试着往ZHA的coordinator 端移植zll bridge的功能,现在可以通过调用zllInitiator_StartDevDisc开始touchLink,用packet sniffer也可以看到的确已经在各个信道去发现target了,但是程序始终进不到 initiatorScanRspCB,也就是说收不到来自target 的回应。

跟代码发现没有进入 zclLL_HdlIncoming,再继续往上,发现开始touchlink之后,连zcl_event_loop 也没进过,也就是,来自target 的回应没有进入zcl 处理,似乎是被扔掉了。

所以我想问一下:ZHA的代码里面,是不是把 touchlink 中设备发现阶段来自target 的响应扔掉了?有办法基于ZHA的代码来实现跟ZLL的设备进行touchlink吗?

先谢谢了。

  • 首先scan req的数据有没有发送出来的,另外对方scan rsp的消息有回应出来对吧,

    然后关于callback函数有没有注册

    // Register for ZLL Initiator callbacks (for Inter-PAN commands)
    zclLL_RegisterInterPANCmdCallbacks( &zllInitiator_CmdCBs );

  • @VV 大神出现~感谢!

    VV 说:

    首先scan req的数据有没有发送出来的,另外对方scan rsp的消息有回应出来对吧,

    scan request 是发出来的,packet sniffer 抓取的结果在附件,前5包是烧zll bridge 发出来的scan request,后5包数据是烧zha coordinator 发出来的scan request,看起来一模一样。

    scan rsp 我不知道怎么用packet sniffer 抓取,我设的channel 是2405M Hz,response 好像是在其他信道,两者都没抓到,但zll bridge实际上是能正确完成touch link 的,所以我猜light 对 scan request 作出的 response 是正确的。

    VV 说:

    然后关于callback函数有没有注册

    // Register for ZLL Initiator callbacks (for Inter-PAN commands)
    zclLL_RegisterInterPANCmdCallbacks( &zllInitiator_CmdCBs );

    callback 函数是注册了的,在zllInitiator_Init()中已经调用了
    zclLL_RegisterInterPANCmdCallbacks( &zllInitiator_CmdCBs );


    注册以后,inter-PAN的消息就会通过调用zllInitiator_CmdCBs 中的这些callback 函数来处理,具体是在

    static ZStatus_t zclLL_ProcessInLLInterPANCmds( zclIncoming_t *pInMsg ) 中,根据inter-PAN message中不同的command ID来调用,

    如果是 scan reponse,就会调用

    static ZStatus_t zclLL_ProcessInCmd_ScanRsp( zclIncoming_t *pInMsg ) ,然后就跑到刚才注册的回调函数中了。

    但我注册的回调函数从未被调用,我就继续往上看,它如果被调用,顺序应该是这样的:

    uint16 zcl_event_loop( uint8 task_id, uint16 events ) -->

    void zcl_ProcessMessageMSG( afIncomingMSGPacket_t *pkt ) -->

    static ZStatus_t zclLL_HdlIncoming( zclIncoming_t *pInMsg ) -->

    static ZStatus_t zclLL_HdlInInterPANCommands( zclIncoming_t *pInMsg ) -->

    static ZStatus_t zclLL_ProcessInLLInterPANCmds( zclIncoming_t *pInMsg ) -->

    static ZStatus_t zclLL_ProcessInCmd_ScanRsp( zclIncoming_t *pInMsg ) -->

    static ZStatus_t initiatorScanRspCB( afAddrType_t *srcAddr, zclLLScanRsp_t *pRsp )


    然而,实际上在发送scan request 之后,连最上面的 zcl_event_loop 都没有进去过,所以,后面也不就可能对response 进行正确的处理了。再往上,我就不知道怎么跟了。

    请问,ZLL bridge 能对scan response 正确处理,它的消息是谁发给 zcl_event_loop 的?我应该怎么继续跟踪调试代码?

    感谢任何帮助。

    ZLL_TOUCHLINK_151023.psd