zcl_SampleSw_event_loop
{
case ZDO_CB_MSG ZDO层数据
case:ZCL_INCOMING_MSG 协调器发送ZCL_CMD_READ/WRITE终端接收到不是应该进这个case吗?现在不进是什么原因呢?
case:KEY_CHANE 按键处理是会进的
}
VV:
不是的, Read和Write属于ZCL里面Foundation的命令,直接在底层处理的,因为之前在注册Attribute的时候,底层已经知道了。
所以协议栈直接处理回复出去了。
user4381970:
回复 VV:
是的。zcl层通过在static CONST zclCmdItems_t zclCmdTable[] 中都处理掉了。
那zha的例程中为什么在app中还在这个函数中判断在zcl_HandleExternal中给app发送消息呢,在zclSampleSw_ProcessIncomingMsg中主要是一些rsp的处理。
我要用这个功能的原因是通过协调器给终端发送一些私有簇和私有属性后,zcl底层会自动更新属性表。但在终端中希望属性更新后立刻执行相应的动作,所以希望在写属性之后的函数中处理执行。难道只能在app中轮询这些属性是否变化再处理吗?
此外zha规定的一些簇的属性和server received command 不是一一对应的(例如开关簇的cmd (0,1,2)和开关属性id(0000)是对应存在,但多数不是对应的),只有server received command 才能在对应的回调函数中处理(只有存在cmd的才能通过zclGeneral_RegisterCmdCallbacks注册回调函数),那么属性更新后要执行动作应该在哪里处理呢?
static void zclSampleSw_ProcessIncomingMsg( zclIncomingMsg_t *pInMsg ){ switch ( pInMsg->zclHdr.commandID ) {#ifdef ZCL_READ case ZCL_CMD_READ_RSP: zclSampleSw_ProcessInReadRspCmd( pInMsg ); break;#endif#ifdef ZCL_WRITE case ZCL_CMD_WRITE_RSP: zclSampleSw_ProcessInWriteRspCmd( pInMsg );
Lord Over:
回复 user4381970:
您好,我现在也遇到了同样的问题,请问具体方法是怎样的呢?
YiKai Chen:
回复 Lord Over:
直接到 zclProcessInReadCmd/zclProcessInWriteCmd 裡面去處理
user4381970:
回复 Lord Over:
上面已经写清楚了。需要在zclProcessInWriteCmd 最后面加上zcl_HandleExternal,
在static void zclSampleSw_ProcessIncomingMsg( zclIncomingMsg_t *pInMsg ){增加case ZCL_CMD_WRITE:里面处理
协议栈默认写属性在zcl里面更新属性表了而没有通知应用层