基于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 的?我应该怎么继续跟踪调试代码?
感谢任何帮助。
