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.

ZHA设备report问题?

Other Parts Discussed in Thread: Z-STACK

 将自己的ZHA设备连接别人的协调器抓包数据附件所示:

① 这里的抓到simple Descriptor Respons 后为什么后面隔一段时间发Identify Query的包
② 我在线发报告

看他返回值为0, 是不是就是说发出去了,但是我这抓包工具(各个通道)没有抓到相关的report数据; 
  • 这个应该是EZ-Mode的过程

  •        你好,VV:

                    (1) 我用设备连上自己的协调器,可以正常抓到report的数据,而且用EZ_MODE不会出现后面隔一段时间发Identify Query的;

                     (2)我用的是协议栈Z-Stack Home 1.2.2a.44539的SimpleSw例程上添加report的,设备只是report数据需要知道协调器的相关的簇信息吗,还是说直接就可以report的? 如果用绑定的方式的话直接去掉ZCL_EZMODE就可以了么?

                      (3)在线调试的report,如附件:能帮我看下我这report对么! 

  •           你好,VV:

                       (1)  我用该设备连接自己的协调器可以抓到report数据,而且用EZ_MODE也没有出现抓到simple Descriptor Respons 后为什么后面隔一段时间发Identify Query的包;

                      (2)我想问下,设备只是report数据需要匹配协调器的簇等相关信息吗?

                     (3)我的在report函数,在线调试的 status的返回值为0 ,是不是说report成功了,但是用抓包工具就是没有抓到数据

         

    static void zclSampleSw_ModeId( void )
    {
      zclReportCmd_t *pReportCmd;
      uint8 statuss;     
      pReportCmd = osal_mem_alloc( 2*(sizeof(zclReportCmd_t) + sizeof(zclReport_t)) );
      if ( pReportCmd != NULL )
      {
        pReportCmd->numAttr = 2;
        pReportCmd->attrList[0].attrID   = ATTRID_BASIC_MODEL_ID;        //MODEL属性ID;
        pReportCmd->attrList[0].dataType = ZCL_DATATYPE_CHAR_STR;
        pReportCmd->attrList[0].attrData = (void *)(&zclSampleSw_ModelId);
    
    	pReportCmd->attrList[1].attrID   = ATTRID_BASIC_MANUFACTURER_NAME;  //厂家属性ID;
        pReportCmd->attrList[1].dataType = ZCL_DATATYPE_CHAR_STR;
        pReportCmd->attrList[1].attrData = (void *)(&zclSampleSw_ManufacturerName);
    	
        status = zcl_SendReportCmd( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr,
    								ZCL_CLUSTER_ID_GEN_BASIC,
    								pReportCmd, ZCL_FRAME_CLIENT_SERVER_DIR, TRUE, zclSampleSwSeqNum++);
      }
    
      osal_mem_free( pReportCmd );
    }
  •         你好,VV:

                     如果不采用EZ_MODE的话,采用其他绑定的方式的话怎么将协调器直接与设备相连?

  • 就直接用Match Descriptor Request .将需要和别人match的 cluster放上去。

  •   我去掉ZCL_EZMODE编译后,在按键里添加

    #define ZCLSAMPLESW_BINDINGLIST 2
    static cId_t bindingOutClusters[ZCLSAMPLESW_BINDINGLIST] =
    { 
    ZCL_CLUSTER_ID_GEN_BASIC,
    ZCL_CLUSTER_ID_GEN_ON_OFF,
    };

       zAddrType_t dstAddr;
    	 
          //描述符匹配请求 这也是两不同匹配方式,使用的按键不同
          // Initiate a Match Description Request (Service Discovery)
    
          dstAddr.addrMode = AddrBroadcast; //广播地址
          dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
    	  
    	  status_s = ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
    								  ZCL_HA_PROFILE_ID,
    								  ZCLSAMPLESW_BINDINGLIST, bindingOutClusters,
    								  0, NULL,
    								  FALSE );
    
    
      发现问题
                    ①.抓包发现设备没有入网(网络里就一个协调器),怎么将设备加入网络,然后直接与协调器通信?
                   
  • 你把协议栈的宏定义的HOLD_AUTO_START去掉了吗?

  •   在线调试发现 pData->pIdentifyQueryRsp->srcAddr->addr.shortAddrzcl_EZModeGetNwkAddr() 获取的值第一次就是一样的,就是没有执行以下的代码,所以会一直发送Identify : Identify Query, 请问下这个是为什么,正常情况下是pData->pIdentifyQueryRsp->srcAddr->addr.shortAddr的第一次获取的值应该是0才对!

    static void zclSampleSw_IdentifyQueryRspCB(  zclIdentifyQueryRsp_t *pRsp )
    {
      (void)pRsp;
    #ifdef ZCL_EZMODE
      {
        zclEZMode_ActionData_t data;
        data.pIdentifyQueryRsp = pRsp;
    
        zcl_EZModeAction ( EZMODE_ACTION_IDENTIFY_QUERY_RSP, &data );
      }
    #endif
    }
    
    void zcl_EZModeAction(zclEzMode_Action_t action, zclEZMode_ActionData_t *pData)
    {
      ZDO_MatchDescRsp_t *pMatchDescRsp;
      zAddrType_t dstAddr;
      
     ......
        // received identify query response
        case EZMODE_ACTION_IDENTIFY_QUERY_RSP:
    
          if ( pData->pIdentifyQueryRsp->srcAddr->addr.shortAddr
              != zcl_EZModeGetNwkAddr() )
          {
            // remember the node we found via identify query
         zclEZModeQueryRspNwkAddr = pData->pIdentifyQueryRsp->srcAddr->addr.shortAddr;
            zclEZModeQueryRspEP = pData->pIdentifyQueryRsp->srcAddr->endPoint;
    
            // initiate match descriptor request on the remote node
            dstAddr.addrMode = Addr16Bit;
            dstAddr.addr.shortAddr = zclEZModeQueryRspNwkAddr;
            zcl_EZModeSendMatchDescReq( *zclEZModeRegisterData.pTaskID,
                              &dstAddr,
                              zclEZModeQueryRspNwkAddr,
                              zclEZModeInvokeData.numActiveOutClusters,
                              zclEZModeInvokeData.pActiveOutClusterIDs,
                              zclEZModeInvokeData.numActiveInClusters,
                              zclEZModeInvokeData.pActiveInClusterIDs );
            zcl_SetEZModeState( EZMODE_STATE_WAITING_MATCHDESCRSP );
          }
        break;
    
        ......
    
    }
  •   我把协议栈的宏定义的HOLD_AUTO_START和ZCL_EZMODE去掉后,现在可以入网, 但是还是上报不了数据!这里上报数据还需要先绑定相关的簇么?

  •          将发送的地址模式改成如下就可以上报数据了(之前一直用(afAddrMode_t)AddrNotPresent)

             zclSampleHuman_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;

  • 请问 您用的抓包工具是什么啊
  • 抓包工具可以參考 e2e.ti.com/.../699648
  • 我用的是Ubiqua