ZHA设备report问题?
将自己的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.shortAddr和zcl_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;