TI中文支持网
TI专业的中文技术问题搜集分享网站

Z-satack3.0.1数据收发问题

用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方向等等来判断,给滤除了。

赞(0)
未经允许不得转载:TI中文支持网 » Z-satack3.0.1数据收发问题
分享到: 更多 (0)