用SampleSwitch例子做了个route 和coord 。route定时向coord发送数据。
从dongle看来coord是收到数据,但是coord并没有进入zclSampleSw_ProcessIncomingMsg( zclIncomingMsg_t *pInMsg )
请问是哪里没有配置好吗?
Switch_coord.rar
Alvin Chen:
如果你用的是zcl并且注册回调会直接进入zcl回调。
juson wu:
回复 Alvin Chen:
请问zcl的回调函数是哪一个?
Alvin Chen:
回复 juson wu:
看了一下你的code, 你用的是AF_DataRequest发送的。建议你直接参考GenericApp.
juson wu:
回复 Alvin Chen:
GenericApp还是从这个函数zclGenericApp_ProcessIncomingMsg( (zclIncomingMsg_t *)MSGpkt ); 吗
juson wu:
回复 Alvin Chen:
按ZCL回调,coord并没有进入
if ( *msgPtr == AF_INCOMING_MSG_CMD ){zcl_ProcessMessageMSG( (afIncomingMSGPacket_t *)msgPtr );}请问有解决的方法吗?
或是分享一个能通讯的code例子给我,谢谢
miffy:
回复 juson wu:
是这样的,给你打个比方,绝对让你明白zigbee这鸟玩意到底是怎么通讯一回事:
假如节点0x1234要发送信息给0x5678,怎么做呢?
我们知道,首先0x1234和0x5678两边都要注册endpoint,不注册是不行的,用的是afRegister这个函数注册的,假如0x1234这边注册的endpoint是14,0x5678那边注册的是18
我们就实现给0x5678发送一个开灯的指令,并问候一句"你是猪吗":
uint8 srcEndpoint=14;//指定我们(0x1234)的endpoint uint8 dstEndpoint=18;//指定对方(0x5678)的endpointuint8 pBuf[]={"Are you pig?"}; uint8 msgLen=sizeof(pBuf); uint8 seqNum=0;afAddrType_t dstAddr; dstAddr.addrMode = Addr16Bit; dstAddr.addr.shortAddr = 0x5678; dstAddr.endPoint=dstEndpoint; zcl_SendCommand( srcEndpoint, &dstAddr, ZCL_CLUSTER_ID_GEN_ON_OFF,COMMAND_ON, TRUE, ZCL_FRAME_CLIENT_SERVER_DIR,TRUE, 0, seqNum, msgLen, pBuf);
juson wu:
回复 miffy:
在init里面有注册过endpoint的
void zclSampleSw_Init( byte task_id ){ zclSampleSw_TaskID = task_id; P1DIR |= 0x03; // Set destination address to indirect zclSampleSw_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; //AddrNotPresent; zclSampleSw_DstAddr.endPoint = 18; zclSampleSw_DstAddr.addr.shortAddr = 0x0000;
zclSampleSw_epDesc.endPoint = 10; zclSampleSw_epDesc.task_id = &zclSampleSw_TaskID; zclSampleSw_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&zclSampleSw_SimpleDesc; // Register the Simple Descriptor for this application bdb_RegisterSimpleDescriptor( &zclSampleSw_SimpleDesc );
// Register the ZCL General Cluster Library callback functions zclGeneral_RegisterCmdCallbacks( SAMPLESW_ENDPOINT, &zclSampleSw_CmdCallbacks );
现在的问题是coord收到了router发过来的 {"Are you pig?"};
coord收到了,但不知道放在哪里了。
Aries Lord:
回复 juson wu:
你调用了bdb_RegisterSimpleDescriptor,注册的Endpoint就在ZCL_TaskID上了,数据放在zcl_event_loop的if ( *msgPtr == AF_INCOMING_MSG_CMD )里面。这个地方交给ZCL处理,你用zclGeneral_RegisterCmdCallbacks注册了每条ZCL控制指令,ZCL会自动把你收到的控制指令对应到你注册的执行函数上。“你是猪吗”不是正确指令,所以ZCL给你滤掉了。
Aries Lord:
回复 juson wu:
你的zclSampleSw_epDesc是多此一举,bdb_RegisterSimpleDescriptor已经给你分配了一个epDesc了
miffy:
回复 Aries Lord:
这个不怪Juson,这个是TI SampleLight代码的问题,一言以蔽之:脱裤子放屁—多此一举。
的确是在bdb_RegisterSimpleDescriptor里面已经调用afRegister注册了endpoint,后面又接着调用afRegister注册同一个endpoint,不是多此一举是什么?
的确是要检查一下AF_INCOMING_MSG_CMD消息的处理,一般很多时候都是在这里根据clusterId和command以及client-server方向等等来判断,给滤除了。