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.

ZCL_INCOMING_MSG为什么不进?ZCL_CMD_READ/WRITE

zcl_SampleSw_event_loop

{

case ZDO_CB_MSG                  ZDO层数据

case:ZCL_INCOMING_MSG    协调器发送ZCL_CMD_READ/WRITE终端接收到不是应该进这个case吗?现在不进是什么原因呢?

case:KEY_CHANE                     按键处理是会进的

 

}

  • 不是的, Read和Write属于ZCL里面Foundation的命令,直接在底层处理的,因为之前在注册Attribute的时候,底层已经知道了。

    所以协议栈直接处理回复出去了。

  • 是的。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 );

  • 在要向app通知的case中zcl中增加zcl_HandleExternal,则会向app发送通知
  • 您好,我现在也遇到了同样的问题,请问具体方法是怎样的呢?

  • 直接到 zclProcessInReadCmd/zclProcessInWriteCmd 裡面去處理

  • 上面已经写清楚了。需要在zclProcessInWriteCmd 最后面加上zcl_HandleExternal,

    在static void zclSampleSw_ProcessIncomingMsg( zclIncomingMsg_t *pInMsg )
    {增加case ZCL_CMD_WRITE:里面处理

    协议栈默认写属性在zcl里面更新属性表了而没有通知应用层