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.

[参考译文] CC2530:为 CC2530实施 ZCL SE 回调

Guru**** 2534260 points
Other Parts Discussed in Thread: Z-STACK, CC2530

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1032588/cc2530-implementing-zcl-se-callback-for-cc2530

器件型号:CC2530
Thread 中讨论的其他器件: Z-stack

嗨、大家好

我´m 实现 ZCL SE 计量、这是我的开/关器件在 将其移植到 CC2530支持的 ZStack 3.0.2之前、对 Z-Stack Home 1.2.2a.44539进行的最后一次更改。

我在器件3端点中使用、专用于 与 ZCL_SE_Metering 服务器配合 使用、另两个用于与 ZCL_CLUSTER_ID_GEN_BASIC 和其他强制集群配合使用。 正如我在下面所描述的:

端点1  ZCL_CLUSTER_ID_GEN_BASIC、 ZCL_CLUSTER_ID_GEN_Identify 和 ZCL_CL_CLUSTER_ID_GEN_ON_OFF  

端点2   ZCL_CLUSTER_ID_GEN_BASIC、 ZCL_CLUSTER_ID_GEN_Identify 和 ZCL_CL_CLUSTER_ID_GEN_ON_OFF 和  ZCL_SE_METERING_SERVER

端点3  ZCL_CLUSTER_ID_GEN_BASIC、 ZCL_CLUSTER_ID_GEN_Identify 和  ZCL_CL_CLUSTER_ID_GEN_ON_OFF  

我在我的应用 MyApp.c 和 MyApp_data.c 中包含了 ZCL_se.c 和 ZCL_se.h

无法成功执行对 ZCL 读取 属性消息- 0x00 (客户端到服务器)的回调、我的设备将回答以下属性:  

提供的电流总和(0x0000)

同步需求(0x0400)

测量单位(0x0300)

我已使用德州仪器(TI)参考设计(TIREX)来实现 ZCL SE 回调:https://dev.ti.com/tirex/explore/node?node=AHbBZxMuyaeDZaCvHJ42MQ__t1zoukP__LATEST

我在背面观察到我的回叫未到达。

有人可以帮助我吗?

我的回叫代码:

void zclAZh0006SE_Init( byte task_id )
{
  zclAZh0006SE1_TaskID = task_id;


  // Set destination address to indirect
 // zclAZh0006_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
 // zclAZh0006_DstAddr.endPoint = 0;
 // zclAZh0006_DstAddr.addr.shortAddr = 0;
 
  /**********************************************************************************************************
 * 											UART Init  -  by ASA
 **********************************************************************************************************/  
	// Set UART Definitions:
	//uartMapPort(1,0);
	initUart0(uart0RxCb);
	
 /**********************************************************************************************************
 * ZCL Addressing Mode  -  by ASA
 efeito através das mensagens originadas a partir deste dispositivo
 **********************************************************************************************************/  
   zclAZh0006_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
   zclAZh0006_DstAddr.addr.shortAddr = 0; // Short Address sent to gateway
   zclAZh0006_DstAddr.endPoint=1; // DST Endpoint sent to Gateway

  // This app is part of the Home Automation Profile
  zclHA_Init(&zclAZh0006SE1_SimpleDesc);

   // Register the ZCL SE Cluster Library callback functions according zcl_se.c
#ifdef ZCL_SE_METERING_SERVER
  zclSE_RegisterCmdCallbacks( AZh0006_ENDPOINT2, &zclAZh0006_SECmdCallbacks );
#endif

  // Register the application's attribute list 
  zcl_registerAttrList( AZh0006_ENDPOINT2,zclAZh0006_NumAttributesSE1, zclAZh0006_AttrsSE1 );

  // Register the Application to receive the unprocessed Foundation command/response messages
  zcl_registerForMsg( zclAZh0006SE1_TaskID );

#ifdef ZCL_DISCOVER
  // Register the application's command list
  zcl_registerCmdList( AZh0006_ENDPOINT2, zclCmdsArraySize, zclAZh0006_Cmds );
#endif

  // Register for all key events - This app will handle all key events
  RegisterForKeys( zclAZh0006SE1_TaskID );

  // Register for a test endpoint
  afRegister( &AZh0006_TestEp2 );

#ifdef ZCL_EZMODE
  // Register EZ-Mode
  zcl_RegisterEZMode( &zclAZh0006_RegisterEZModeDataSE );

  // Register with the ZDO to receive Match Descriptor Responses
  ZDO_RegisterForZDOMsg(task_id, Match_Desc_rsp);
  
  //Register with the ZDO to receive Permit to Join Request
  ZDO_RegisterForZDOMsg(task_id, Mgmt_Permit_Join_req);
  
  //Register with the ZDO to receive Leave Req
  ZDO_RegisterForZDOMsg(task_id, Mgmt_Leave_req);
#endif

#ifdef ZCL_DIAGNOSTIC
  // Register the application's callback function to read/write attribute data.
  // This is only required when the attribute data format is unknown to ZCL.
  zcl_registerReadWriteCB( AZh0006_ENDPOINT2, zclDiagnostic_ReadWriteAttrCB, NULL );

  if ( zclDiagnostic_InitStats() == ZSuccess )
  {
    // Here the user could start the timer to save Diagnostics to NV
  }
#endif

#ifdef ZGP_AUTO_TT
  zgpTranslationTable_RegisterEP ( &zclAZh0006SE1_SimpleDesc );
#endif
}


/*********************************************************************
 * ZCL SE Profile Callback table for EP2
 */ // Client-to-Server Callbacks
 
 static const zclSE_MeteringServerCBs_t zclAZh0006_MeteringServerCBs =
{
  zclAZh0006_MeteringGetProfileCB,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL
};

static zclSE_AppCallbacks_t zclAZh0006_SECmdCallbacks =
{
  NULL,               					// zclSE_DRLC_ServerCBs_t
  NULL,               					// zclSE_DRLC_ClientCBs_t
  &zclAZh0006_MeteringServerCBs,        // zclSE_MeteringServerCBs_t
  NULL,               					// zclSE_MeteringClientCBs_t
  NULL,               					// zclSE_PriceServerCBs_t
  NULL,               					// zclSE_PriceClientCBs_t
  NULL,               					// zclSE_MessagingServerCBs_t
  NULL,               					// zclSE_MessagingClientCBs_t
  NULL,               					// zclSE_TunnelingServerCBs_t
  NULL,               					// zclSE_TunnelingClientCBs_t
  NULL,               					// zclSE_PrepaymentServerCBs_t
  NULL,               					// zclSE_PrepaymentClientCBs_t
  NULL,               					// zclSE_EnergyMgmtServerCBs_t
  NULL,               					// zclSE_EnergyMgmtClientCBs_t
  NULL,               					// zclSE_CalendarServerCBs_t
  NULL,               					// zclSE_CalendarClientCBs_t
  NULL,               					// zclSE_DeviceMgmtServerCBs_t
  NULL,               					// zclSE_DeviceMgmtClientCBs_t
  NULL,               					// zclSE_EventsServerCBs_t
  NULL,               					// zclSE_EventsClientCBs_t
  NULL,               					// zclSE_MDUPairingServerCBs_t
  NULL                					// zclSE_MDUPairingClientCBs_t
};


static void zclAZh0006_MeteringGetProfileCB( zclIncoming_t *pInMsg,zclSE_MeteringGetProfile_t *pCmd )
{ 
	switch ( pInMsg->hdr.commandID )
	{

    case COMMAND_SE_METERING_GET_PROFILE:
     //zclAZh0006_ProcessInReadRspCmd( pInMsg );
     break;
  }

  if ( pInMsg->attrCmd )
    osal_mem_free( pInMsg->attrCmd );
}

BR、

Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alex:

    如何在   MyApp_data.c 中配置 Ach0006_ENDPOINT2?   zclSE_RegisterCmdCallback 是否返回成功状态?  您是否能够调试项目以遵循 zclSE_HdlInforing -> zclSE_HdlSpecificCmd -> zclSE_HdlSpecServerCmd -> zclSE_MeteringHdlServerCmd?  您是否能够在监听器日志中从客户端设备捕获获取配置文件 ZCL SE 命令?

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ryan、非常感谢您的奇谈回答。

    在 IAR EWB 中设置 ZCL_SE 回调中的断点时遇到了一些问题、例如  、在 zclAch0006_MeteringGetProfileCB 中、zclAch0006_MeteringServerCBs 内。 我观察到这种行为与两个回调(开/关)的行为不同、这种情况很好。

    我´ll 介绍所有这些配置和无线网格。

    1...."您 在  MyApp_data.c 中配置了 Ach0006_ENDPOINT2?"

    我的 AGZ0006_Endpoint 2 配置:

    /*********************************************************************
     * EndPoint 2 - Metering Device
     */
    #ifdef ZCL_SE_METERING_SERVER
    
    #define AZh0006_ENDPOINT2	2 		// EndPoint 2 - EP2 - Metering Cluster
    
    #endif // ZCL_SE_METERING_SERVER
    
    /*********************************************************************

    有关通过 EP2测量器件属性的其他信息

    /*********************************************************************
     * EndPoint 2 - EP2 SE Cluster Attributes
     attributes:
    			0x0000 - ATTRID_SE_METERING_CURR_SUMM_DLVD
    			0x0006 - ATTRID_SE_METERING_PWR_FACTOR
    			0x0200 - ATTRID_SE_METERING_STATUS
    			0x0300 - ATTRID_SE_METERING_UOM - Unit of measurement
    			0x0301 - ATTRID_SE_METERING_MULT
    			0x0302 - ATTRID_SE_METERING_DIV
    			0x0303 - ATTRID_SE_METERING_SUMM_FMTG - Summation formatting
    			0x0304 - ATTRID_SE_METERING_DMD_FMTG  - Demanding formatting
    			0x0306 - ATTRID_SE_METERING_DEVICE_TYPE
    			0x0400 - ATTRID_SE_METERING_INST_DMD
    			
     */
     
     /******************************************************************************
     *
     *  *************************** Metering Device Attributes *********************
     *
     ******************************************************************************/
    CONST zclAttrRec_t zclAZh0006_AttrsSE1[] =
    {
    
    
    #ifdef ZCL_IDENTIFY
      // *** Identify Cluster Attribute ***
      {
        ZCL_CLUSTER_ID_GEN_IDENTIFY,
        { // Attribute record
          ATTRID_IDENTIFY_TIME,
          ZCL_DATATYPE_UINT16,
          (ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE),
          (void *)&zclAZh0006_IdentifyTime
        }
      },
     #ifdef ZCL_EZMODE
      // *** Identify Cluster Attribute ***
      {
        ZCL_CLUSTER_ID_GEN_IDENTIFY,
        { // Attribute record
          ATTRID_IDENTIFY_COMMISSION_STATE,
          ZCL_DATATYPE_UINT8,
          (ACCESS_CONTROL_READ),
          (void *)&zclAZh0006_IdentifyCommissionState
        }
      },
     #endif // ZCL_EZMODE 
    #endif
    
    // *** Smart Energy Metering Server Cluster Attributes ***
    #ifdef ZCL_SE_METERING_SERVER
      {
       ZCL_CLUSTER_ID_SE_METERING,				// Cluster IDs - defined in the foundation (ie. zcl.h) - Smart Energy (SE) Clusters
        { // Attribute record
          ATTRID_SE_METERING_CURR_SUMM_DLVD,	// Attribute ID - Found in Cluster Library header (ie. zcl_se.h)
          ZCL_DATATYPE_UINT48,					// Data Type - found in zcl.h
          ACCESS_CONTROL_READ,					// Variable access control - found in zcl.h
          (void *)&zclAZh0006_CurrentSummationDelivered // Pointer to attribute variable
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_PWR_FACTOR,
    	  ZCL_DATATYPE_UINT8,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_Power_Factor
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_STATUS,
          ZCL_DATATYPE_BITMAP8,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_Metering_Status
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_UOM,
          ZCL_DATATYPE_ENUM8,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_UnitofMeasure
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_MULT,
    	  ZCL_DATATYPE_UINT24,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_MeasureMult
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_DIV,
    	  ZCL_DATATYPE_UINT24,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_MeasureDiv
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_SUMM_FMTG,
          ZCL_DATATYPE_BITMAP8,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_Summation_Formatting
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_DMD_FMTG,
    	  ZCL_DATATYPE_BITMAP8,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_Demand_Formatting
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_DEVICE_TYPE,
          ZCL_DATATYPE_BITMAP8,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_Metering_DeviceType
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_INST_DMD,
    	  ZCL_DATATYPE_UINT24,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_Instantaneous_Demand
        }
      },
    #endif 
      // *** On/Off Cluster Attributes ***
      {
        ZCL_CLUSTER_ID_GEN_ON_OFF,
        { // Attribute record
          ATTRID_ON_OFF,
          ZCL_DATATYPE_BOOLEAN,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_OnOffC1
        }
      }
    
    #ifdef ZCL_LEVEL_CTRL
      , {
        ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL,
        { // Attribute record
          ATTRID_LEVEL_CURRENT_LEVEL,
          ZCL_DATATYPE_UINT8,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_LevelCurrentLevel
        }
      },
      {
        ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL,
        { // Attribute record
          ATTRID_LEVEL_REMAINING_TIME,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          (void *)&zclAZh0006_LevelRemainingTime
        }
      },
      {
        ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL,
        { // Attribute record
          ATTRID_LEVEL_ON_OFF_TRANSITION_TIME,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE,
          (void *)&zclAZh0006_LevelOnOffTransitionTime
        }
      },
      {
        ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL,
        { // Attribute record
          ATTRID_LEVEL_ON_LEVEL,
          ZCL_DATATYPE_UINT8,
          ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE,
          (void *)&zclAZh0006_LevelOnLevel
        }
      },
      {
        ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL,
        { // Attribute record
          ATTRID_LEVEL_ON_TRANSITION_TIME,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE,
          (void *)&zclAZh0006_LevelOnTransitionTime
        }
      },
      {
        ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL,
        { // Attribute record
          ATTRID_LEVEL_OFF_TRANSITION_TIME,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE,
          (void *)&zclAZh0006_LevelOffTransitionTime
        }
      },
      {
        ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL,
        { // Attribute record
          ATTRID_LEVEL_DEFAULT_MOVE_RATE,
          ZCL_DATATYPE_UINT8,
          ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE,
          (void *)&zclAZh0006_LevelDefaultMoveRate
        }
      }
    #endif
     #ifdef ZCL_DIAGNOSTIC
      , {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_NUMBER_OF_RESETS,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_PERSISTENT_MEMORY_WRITES,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_MAC_RX_BCAST,
          ZCL_DATATYPE_UINT32,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_MAC_TX_BCAST,
          ZCL_DATATYPE_UINT32,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_MAC_RX_UCAST,
          ZCL_DATATYPE_UINT32,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_MAC_TX_UCAST,
          ZCL_DATATYPE_UINT32,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_MAC_TX_UCAST_RETRY,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_MAC_TX_UCAST_FAIL,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_APS_RX_BCAST,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_APS_TX_BCAST,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_APS_RX_UCAST,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_APS_TX_UCAST_SUCCESS,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_APS_TX_UCAST_RETRY,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_APS_TX_UCAST_FAIL,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_ROUTE_DISC_INITIATED,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_NEIGHBOR_ADDED,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_NEIGHBOR_REMOVED,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_NEIGHBOR_STALE,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_JOIN_INDICATION,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_CHILD_MOVED,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_NWK_FC_FAILURE,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_APS_FC_FAILURE,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_APS_UNAUTHORIZED_KEY,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_NWK_DECRYPT_FAILURES,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_APS_DECRYPT_FAILURES,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_PACKET_BUFFER_ALLOCATE_FAILURES,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_RELAYED_UCAST,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_PHY_TO_MAC_QUEUE_LIMIT_REACHED,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_PACKET_VALIDATE_DROP_COUNT,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_AVERAGE_MAC_RETRY_PER_APS_MESSAGE_SENT,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_LAST_MESSAGE_LQI,
          ZCL_DATATYPE_UINT8,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
      {
        ZCL_CLUSTER_ID_HA_DIAGNOSTIC,
        {  // Attribute record
          ATTRID_DIAGNOSTIC_LAST_MESSAGE_RSSI,
          ZCL_DATATYPE_INT8,
          ACCESS_CONTROL_READ,
          NULL // Use application's callback to Read this attribute
        }
      },
    #endif // ZCL_DIAGNOSTIC
    
     
    };
    /*********************************************************************
     * EndPoint 1 NumAttributes
     */
    uint8 CONST zclAZh0006_NumAttributesC1 = ( sizeof(zclAZh0006_AttrsC1) / sizeof(zclAZh0006_AttrsC1[0]) );
    
    /*********************************************************************
     * EndPoint 2 NumAttributes
     */
    uint8 CONST zclAZh0006_NumAttributesC2 = ( sizeof(zclAZh0006_AttrsC2) / sizeof(zclAZh0006_AttrsC2[0]) );
    
    /*********************************************************************
     * EndPoint 3 NumAttributes
     */
    uint8 CONST zclAZh0006_NumAttributesSE1 = ( sizeof(zclAZh0006_AttrsSE1) / sizeof(zclAZh0006_AttrsSE1[0]) );
    
    

    2...."   zclSE_RegisterCmdCallbacks 是否返回成功状态"。

    我通过 ZDO Simples DESC Response 和 ZCL 消息器上的 Wireshark 监听器获得了该功能:

    3..."您是否能够调试项目以遵循 zclSE_HdlInforing -> zclSE_HdlificCmd -> zclSE_HdlSpecServerCmd -> zclSE_MeteringHdlServerCmd? "

    调试时遇到问题、我尝试启动、IAR EWB 不是通过 ZCL_SE 代码启动。 如果我更改编译器>优化以将优化级别降低到低、那么在尝试编译工程时会出现错误。 在我的应用程序中、当在我的代码中添加了其他行以改进 ZCL_SE 回调过程时、这种情况就开始发生了。  n´t 我注释掉函数 zclAZh0006_MeteringGetProfileCB、则不会发生错误!

    "-Z (code) ZIGNV_address_space=_ZIGNV_address_space_start-_ZIGNV_address_space_end"、其中放置时可用

    4 -我尝试获取 ZCL 读取 属性消息- 0x00以处理 这些属性当前已传送的求和(0x0000)、 同步需求(0x0400)和 计量单位(0x0300)。 ´m 我尝试使用 ZCL 类型结构来捕获它是错误的。 我在 zlc_se.c 结构类型中找不到与 ZCL SE 计量参数(0x0000、0x0400和0x0300)完全匹配的结构类型。

    我不知道如何解决它。

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您提供更多信息。  您是否也可以提供输入/输出群集列表和简单的描述符代码?  关于简单描述符响应、我建议使用不同的 OTA 端点并将基本内容添加到 OUT 群集列表中。  您确定是否需要将计量作为输出仪表组?  我还希望智能插头的应用器件 ID 为0x0051。  您是否可以尝试按顺序列出属性(即 ZCL_CLUSTER_ID_GEN_ON_OFF、ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL、ZCL_CLUSTER_ID_SE_MEASING_DETLINGAL 和 ZCL_CL_CLUSTER_ID_HA_DIAGNOSTIC)?

    注释掉  zclAch0006_MeteringGetProfileCB 中的代码是否 可以解决构建问题?  或考虑使用 Zigbee 3.0或独立项目(即仅计量端点)来进一步隔离问题?   

    ATTRID_SE_Metering CURR_SUMM_DLVD、 ATTRID_SE_Metering UOM 和 ATTRID_SE_Metering INST_DMD 在 zcl_se.h 中定义、但未在 zcl_se.c 中使用、因此您需要出于自己的目的修改此 ZCL 层。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ryan、正如您问我的那样。

    1...."  您能否提供输入/输出群集列表和简单的描述符代码?..."

    这是我的每个 EP 的集群列表和简单描述。

    /*********************************************************************
     * EndPoint 1 NumAttributes
     */
    uint8 CONST zclAZh0006_NumAttributesC1 = ( sizeof(zclAZh0006_AttrsC1) / sizeof(zclAZh0006_AttrsC1[0]) );
    
    /*********************************************************************
     * EndPoint 2 NumAttributes
     */
    uint8 CONST zclAZh0006_NumAttributesC2 = ( sizeof(zclAZh0006_AttrsC2) / sizeof(zclAZh0006_AttrsC2[0]) );
    
    /*********************************************************************
     * EndPoint 3 NumAttributes
     */
    uint8 CONST zclAZh0006_NumAttributesSE1 = ( sizeof(zclAZh0006_AttrsSE1) / sizeof(zclAZh0006_AttrsSE1[0]) );
    
    
    /*********************************************************************
     * SIMPLE DESCRIPTOR FOR CIRCUIT1 - EP1 and EP3
     */
    // This is the Cluster ID List and should be filled with Application
    // specific cluster IDs.
    const cId_t zclAZh0006_InClusterList[] =
    {
       ZCL_CLUSTER_ID_GEN_BASIC,  		 	//0x0000
       ZCL_CLUSTER_ID_GEN_IDENTIFY, 		//0x0003
       ZCL_CLUSTER_ID_GEN_GROUPS,   		//0x0004
       ZCL_CLUSTER_ID_GEN_SCENES,		 	//0x0005
       ZCL_CLUSTER_ID_GEN_ON_OFF,  			//0x0006
    #ifdef ZCL_LEVEL_CTRL
       ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL		//0x0008
    #endif
    };
    // work-around for compiler bug... IAR can't calculate size of array with #if options.
    #ifdef ZCL_LEVEL_CTRL
     #define ZCLAZh0006_MAX_INCLUSTERS   6
    #else
     #define ZCLAZh0006_MAX_INCLUSTERS   5
    #endif
    
    const cId_t zclAZh0006_OutClusterList[] =
    {
      ZCL_CLUSTER_ID_OTA				//0x00019
    
    };
    #define ZCLAZh0006_MAX_OUTCLUSTERS  (sizeof(zclAZh0006_OutClusterList) / sizeof(zclAZh0006_OutClusterList[0]))
    
    
    /*********************************************************************
     * SIMPLE DESCRIPTOR FOR METERING DEVICE - EP2
     */
    // This is the Cluster ID List and should be filled with Application
    // specific cluster IDs.
    const cId_t zclAZh0006_InClusterListSE1[] =
    {  
       ZCL_CLUSTER_ID_GEN_BASIC,  		 	//0x0000
       ZCL_CLUSTER_ID_GEN_IDENTIFY, 		//0x0003
       ZCL_CLUSTER_ID_GEN_GROUPS,   		//0x0004
       ZCL_CLUSTER_ID_GEN_SCENES,		 	//0x0005
       ZCL_CLUSTER_ID_GEN_ON_OFF,  			//0x0006
       ZCL_CLUSTER_ID_SE_METERING,		 	//0x0702
    #ifdef ZCL_LEVEL_CTRL
       ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL
    #endif
    };
    // work-around for compiler bug... IAR can't calculate size of array with #if options.
    #ifdef ZCL_LEVEL_CTRL
     #define ZCLAZh0006_MAX_INCLUSTERSSE1   7
    #else
     #define ZCLAZh0006_MAX_INCLUSTERSSE1   6
    #endif
    
    const cId_t zclAZh0006_OutClusterListSE1[] =
    {
      ZCL_CLUSTER_ID_OTA,					//0x0019
      ZCL_CLUSTER_ID_SE_METERING
      
    };
    #define ZCLAZh0006_MAX_OUTCLUSTERSSE1  (sizeof(zclAZh0006_OutClusterListSE1) / sizeof(zclAZh0006_OutClusterListSE1[0]))
    
    
    /*********************************************************************
     * EndPoint 1 SimpleDescription Format Circuito FOR EP 1 and 3
     */
    
    SimpleDescriptionFormat_t	zclAZh0006C1_SimpleDesc	=
    {
      AZh0006_ENDPOINT1,                  		//  int Endpoint circuit 1;
      ZCL_HA_PROFILE_ID,                     	//  uint16 AppProfId  as 0x0104 - Home Automation
    #ifdef ZCL_LEVEL_CTRL
      ZCL_HA_DEVICEID_DIMMABLE_LIGHT,        	//  uint16 AppDeviceId as 0x0101 in Lighting Device IDs - zcl_ha.h, visto na mensagem Simple Description Response
    #else 
      ZCL_HA_DEVICEID_ON_OFF_LIGHT,          	//  uint16 AppDeviceId as 0x0100 in Lighting Device IDs - zcl_ha.h, visto na mensagem Simple Description Response
    #endif
      AZh0006_DEVICE_VERSION,            		//  int   AppDevVer:4;
      AZh0006_FLAGS,                     		//  int   AppFlags:0;
      ZCLAZh0006_MAX_INCLUSTERS,         		//  byte  AppNumInClusters;
      (cId_t *)zclAZh0006_InClusterList, 		//  byte *pAppInClusterList;
      ZCLAZh0006_MAX_OUTCLUSTERS,        		//  byte  AppNumInClusters;
      (cId_t *)zclAZh0006_OutClusterList 		//  byte *pAppInClusterList;
    };
    
    /*********************************************************************
     * EndPoint 3  SimpleDescription Format for FOR EP 1 and 3
     */
    
    SimpleDescriptionFormat_t zclAZh0006C2_SimpleDesc =
    {
      AZh0006_ENDPOINT3,                  		//  int Endpoint circuit 2;
      ZCL_HA_PROFILE_ID,                     	//  uint16 AppProfId as 0x0104 - Home Automation
    #ifdef ZCL_LEVEL_CTRL
      ZCL_HA_DEVICEID_DIMMABLE_LIGHT,        	//  uint16 AppDeviceId as 0x0101 in Lighting Device IDs - zcl_ha.h, visto na mensagem Simple Description Response
    #else 
      ZCL_HA_DEVICEID_ON_OFF_LIGHT,          	//  uint16 AppDeviceId as 0x0100 in Lighting Device IDs - zcl_ha.h, visto na mensagem Simple Description Response
    #endif
      AZh0006_DEVICE_VERSION,            		//  int   AppDevVer:4;
      AZh0006_FLAGS,                     		//  int   AppFlags:0;
      ZCLAZh0006_MAX_INCLUSTERS,         		//  byte  AppNumInClusters;
      (cId_t *)zclAZh0006_InClusterList, 		//  byte *pAppInClusterList;
      ZCLAZh0006_MAX_OUTCLUSTERS,        		//  byte  AppNumOutClusters;
      (cId_t *)zclAZh0006_OutClusterList 		//  byte *pAppInClusterList;
    };
    
    /*********************************************************************
     * EndPoint 2 SimpleDescription for SE - Metering Device EP 2
     */
    
    SimpleDescriptionFormat_t	zclAZh0006SE1_SimpleDesc	=
    {
      AZh0006_ENDPOINT2,                 		//  int Endpoint Metering Device
      ZCL_HA_PROFILE_ID,                 		//  uint16 AppProfId  as 0x0104 - Home Automation
      //ZCL_HA_DEVICEID_SMART_PLUG,        		//  uint16 AppDeviceId (APP id 0x51) or DeviceID de acordo com a zcl_ha.h, visto na mensagem Simple Description Response
      //ZCL_HA_DEVICEID_ON_OFF_OUTPUT,			//  uint16 AppDeviceId (APP id 0x0002) or DeviceID de acordo com a zcl_ha.h, visto na mensagem Simple Description Response. 
      ZCL_SE_DEVICEID_METERING,					//  uint16 AppDeviceId (APP id 0x0501) or DeviceID de acordo com a zcl_se.h,visto na mensagem Simple Description Response
      AZh0006_DEVICE_VERSION,            		//  int   AppDevVer:4;
      AZh0006_FLAGS,                     		//  int   AppFlags:0;
      ZCLAZh0006_MAX_INCLUSTERSSE1,         	//  byte  AppNumInClusters;
      (cId_t *)zclAZh0006_InClusterListSE1, 	//  byte *pAppInClusterList;
      ZCLAZh0006_MAX_OUTCLUSTERSSE1,        	//  byte  AppNumInClusters;
      (cId_t *)zclAZh0006_OutClusterListSE1 	//  byte *pAppOutClusterList;
    };
    

    2.".  我建议使用不同的端点进行 OTA、并将基本内容添加到 OUT 集群列表中..."

    我不会´ll 更改、很快就会与您分享!

    3."...  您确定是否需要将计量作为输出仪表组? "

    我不´m´ll,我不敢相信,很快就会与大家分享!

    4." 我还希望智能插头的应用器件 ID 为0x0051"

    我´ll 同意您的意见、我在上次测试中使用过它、我已将应用程序 ID 明确更改为0x0051!

    5;"...您是否可以尝试按顺序列出属性(即 ZCL_CLUSTER_ID_GEN_ON_OFF、ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL、ZCL_CLUSTER_ID_SE_MEDIAGNOTLING_ZCL_CLUSTER_ID_HA_DIAGNOSTIC)? "

    ´ll 进行更改并将很快与您分享!

    6. "ATTRID_SE_Metering CURR_SUMM_DLVD、 ATTRID_SE_Metering UOM 和 ATTRID_SE_Metering INST_DMD 在 zcl_se.h 中定义、但未在 zcl_se.c 中使用、因此您需要出于自己的目的修改此 ZCL 层..."

    我´ll 了这件事、很快就会告诉您!

    非常感谢 Ryan 的帮助!

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ryan、

     我´m 成功地实施了您提出的几乎所有更改、我尝试解析 ZCL 读取属性请求和 ZCL SE 属性(项目6)  

    ATTRID_SE_Metering CURR_SUMM_DLVD、 ATTRID_SE_Metering UOM 和 ATTRID_SE_Metering INST_DMD。

    我使用 zclAch0006_OnOffCB 作为在 ZCL_se.C、ZCL_se.h 和 MyApp.c 上编写代码的参考、可能不是最好的方法、我对如何编写代码有几个疑问。 您是否有文章或德州应用手册与我分享?

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alex:

    我不知道任何涉及采用 Z-Stack HA 1.2.2a 的安全计量 ZCL 的文章或 TI 应用手册。  然而,它应遵循为普通法/医管局 ZCL 实施的基本程序。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Ryan、我在 zcl_general.c、zcl_general.h 和 zcl.h 上映射了所有 ZCL 基本程序中的参数

    我´ll 继续保持这篇文章的开放状态、在这里分享我的进展。 你同意我的说法吗?

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alex:

    我建议您调试 zclSE_RegisterCmdCallback、并确保它以 与 zclGeneral_RegisterCmdCallback 相同的方式执行 zcl_registerPlugin、但对于 zclSE_HdlInforing 而不是 zclGeneral_HdlInforing。  您还可以参考 OTA 示例(以及端点注册和回调)。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ryan、

    我在这里取得了一些进展:

    1、在 EP2上包含了 ZCL SE 集群寄存器、

    2. ZclSE_Hdlinforing 过程、 我添加了 ZCL 插件集群 ID 作为 ZCL_CLUSTER_ID_SE_MEASING_MEDICRACing

    在我将设备视为默认值(成功)后、在没有更改1和2之前、在 ZCL 读取属性 esponse 消息中观察到一个无法识别的属性。

    但我注意 到消息 ZCL 属性消息继续在"zclProcessInReadCmd"函数中的 ZCL.C 上处理、原因是 zclSE_AppCallbacks_t 类型上不存在的 CB 过程。 我已经使用了一个现有代码来处理 ZCL_CLUSTER_ID_SE_MEASING_MEASING_MEASING_MEASING_MEASING_REGIBRACASE 、但未预接线以使用 SE 属性处理 ZCL 读取属性消息 我认为我需要创建一个过程类型(_t)来解析它、并且需要将其包含在  zclSE_AppCallbacks_t 中

    请、您能帮我准备/解析上述 SE 参数吗?

    我 的 zclSE_AppCallbacks_t:

    *********************************************************************
     * ZCL SE Profile Callback table for EP2 */
    
    
    static zclSE_AppCallbacks_t zclAZh0006_CmdCallbacksSE =
    {
      NULL,       
      NULL,       
      NULL,     
      NULL,    
      NULL,        
      NULL,     
      NULL,   
      NULL,   
      NULL,   
      NULL,   
      NULL,  
      NULL,  
      NULL, 
      //const zclSE_EnergyMgmtClientCBs_t  *pEnergyMgmtClientCBs;
      NULL,
      NULL,    
      NULL,    
      NULL,  
      NULL,  
      NULL,     
      NULL,       
      NULL,   
      NULL,   
    };
    

    我的应用程序 SE 初始化、具有 RegisterCalback 和应用程序属性参数列表

    void zclAZh0006SE_Init( byte task_id )
    {
      zclAZh0006SE1_TaskID = task_id;
    
    
      // Set destination address to indirect
     // zclAZh0006_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
     // zclAZh0006_DstAddr.endPoint = 0;
     // zclAZh0006_DstAddr.addr.shortAddr = 0;
     
      /**********************************************************************************************************
     * 											UART Init  -  by ASA
     **********************************************************************************************************/  
    	// Set UART Definitions:
    	//uartMapPort(1,0);
    	initUart0(uart0RxCb);
    	
     /**********************************************************************************************************
     * ZCL Addressing Mode  -  by ASA
     efeito através das mensagens originadas a partir deste dispositivo
     **********************************************************************************************************/  
       zclAZh0006_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
       zclAZh0006_DstAddr.addr.shortAddr = 0; // Short Address sent to gateway
       zclAZh0006_DstAddr.endPoint=1; // DST Endpoint sent to Gateway
    
      // This app is part of the Home Automation Profile
      zclHA_Init(&zclAZh0006SE1_SimpleDesc);
    
       // Register the ZCL SE Cluster Library callback functions according zcl_se.c
    #ifdef ZCL_SE_METERING_SERVER
      zclSE_RegisterCmdCallbacks( AZh0006_ENDPOINT2, &zclAZh0006_CmdCallbacksSE ); //using the same callback as circuit 2
    #endif
    
      // Register the application's attribute list 
      zcl_registerAttrList( AZh0006_ENDPOINT2,zclAZh0006_NumAttributesSE1, zclAZh0006_AttrsSE1 );
    
      // Register the Application to receive the unprocessed Foundation command/response messages
      zcl_registerForMsg( zclAZh0006SE1_TaskID );
    
    #ifdef ZCL_DISCOVER
      // Register the application's command list
      zcl_registerCmdList( AZh0006_ENDPOINT2, zclCmdsArraySize, zclAZh0006_Cmds );
    #endif
    
      // Register for all key events - This app will handle all key events
      RegisterForKeys( zclAZh0006SE1_TaskID );
    
      // Register for a test endpoint
      afRegister( &AZh0006_TestEp2 );
    
    #ifdef ZCL_EZMODE
      // Register EZ-Mode
      zcl_RegisterEZMode( &zclAZh0006_RegisterEZModeDataSE );
    
      // Register with the ZDO to receive Match Descriptor Responses
      ZDO_RegisterForZDOMsg(task_id, Match_Desc_rsp);
      
      //Register with the ZDO to receive Permit to Join Request
      ZDO_RegisterForZDOMsg(task_id, Mgmt_Permit_Join_req);
      
      //Register with the ZDO to receive Leave Req
      ZDO_RegisterForZDOMsg(task_id, Mgmt_Leave_req);
    #endif
    
    #ifdef ZCL_DIAGNOSTIC
      // Register the application's callback function to read/write attribute data.
      // This is only required when the attribute data format is unknown to ZCL.
      zcl_registerReadWriteCB( AZh0006_ENDPOINT2, zclDiagnostic_ReadWriteAttrCB, NULL );
    
      if ( zclDiagnostic_InitStats() == ZSuccess )
      {
        // Here the user could start the timer to save Diagnostics to NV
      }
    #endif
    
    #ifdef ZGP_AUTO_TT
      zgpTranslationTable_RegisterEP ( &zclAZh0006SE1_SimpleDesc );
    #endif
    }
    

    我的 ZCL_SE.C 更改:

    /**************************************************************************************************
     * @fn      zclSE_HdlIncoming
     *
     * @brief   Callback from ZCL to process incoming Commands specific
     *          to this cluster library or Profile commands for attributes
     *          that aren't in the attribute list
     *
     * @param   pInMsg - incoming message to process
     *
     * @return  ZStatus_t
     */
    static ZStatus_t zclSE_HdlIncoming( zclIncoming_t *pInMsg )
    {
      ZStatus_t status = ZCL_STATUS_SUCCESS;
    
    #if defined ( INTER_PAN )
      if ( StubAPS_InterPan( pInMsg->msg->srcAddr.panId, pInMsg->msg->srcAddr.endPoint ) &&
           !( pInMsg->msg->clusterId == ZCL_CLUSTER_ID_SE_METERING ||							//ZCL_CLUSTER_ID_SE_PRICE original value by ASA
              pInMsg->msg->clusterId == ZCL_CLUSTER_ID_SE_MESSAGING )                       )
      {
        return status; // Cluster not supported thru Inter-PAN
      }
    #endif
      if ( zcl_ClusterCmd( pInMsg->hdr.fc.type ) )
      {
        // Check for manufacturer specific command
        if ( pInMsg->hdr.fc.manuSpecific == 0 )
        {
          status = zclSE_HdlSpecificCmdHook( pInMsg );
        }
        else
        {
          // Manufacturer specific command not handled
          status = ZCL_STATUS_FAILURE;
        }
      }
      else
      {
        //Handle all the normal (Read, Write...) commands -- should never get here
        status = ZCL_STATUS_FAILURE;
      }
    
      return status;
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您不需要更改 zclSE_HdlInforing、因为我认为您使用的不是 InterPan 消息。  您能否提供监听器日志、说明您认为应输入回调的命令?  由于您的设置意味着计量服务器、我希望已定义 ZCL_SE_Metering 服务器、并且 应该为传入 的客户端到服务器 计量命令处理 zclSE_MeteringHdlServerCmd。  有几个独特的命令可以支持、这就是为什么在 zclSE_MeteringServerCBs_t 中使用辅助结构的原因  但是、基本的读取属性命令仍由 zcl_[application].c 文件内的 ZCL 基础层(*_处理 IncomingMsg ->*_处理 InReadRspCmd)处理。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ryan、感谢您的支持! 我在下面´ll 您的问题:

    1."您不需要更改 zclSE_HdlInforing、因为我认为您使用的不是 InterPan 消息"

    我完全同意您的意见、我将其更改为默认参数!

    2."您能否提供监听器日志、说明您认为应输入回调的命令"

    您是否会看到我的 Wireshark 日志已附加。

    您可以在此日志中看到从网关到我的设备的消息#290 - ZCL 读取属性以及我需要在设备中处理的属性:

    属性:提供的当前总和(0x0000)

    属性:瞬时需求(0x0400)

    属性:度量单位(0x0300)

    属性:乘法器(0x0301)

    属性:除数(0x0302)

    注意:我的计量服务器设备具有:EP =2、短地址为0x9ca6

    我需要在回叫中包含上述从 ZCL 读取属性和发送 ZCL 读取属性响应中获取的属性的处理、其中代理值存储在设备中、然后发送到网关。  

    ´s 是否可以偏离 ZCL 读取属性来处理 ZCL_[Appilation].c  文件中的加载属性?

    3. 我希望已定义 ZCL_SE_Metering 服务器,并 应为传入 的客户端到服务器 计量命令处理 zclSE_MeteringHdlServerCmd

    我 的断点在 zclSE_MeteringHdlServerCmd 中未命中、我只能在 "zclProcessInReadCmd "中的 ZCL.C 中看到它。

    当我的器件收到消息#290、ZCL 读取属性时、未达到上面的堆栈点。

    4. 可以支持多个唯一命令,这就是为什么在 zclSE_MeteringServerCBs_t 中使用辅助结构的原因

    我知道我需要在  zclSE_MeteringServerCBs_t 上添加一个新结构 、为我需要在设备中处理的每一个或五个属性提供特定回调、并将其发送到网关。 但根据 ZCL.C、网关使用基本 ZCL 属性、通过 ZCL 读取属性消息、并且我没有一个特定的 CMD、正如我们在  zclSE_MeteringServerCBs (COMMAND_SE_METERING_GET_PROFILE、COMMAND_METERING_REQ_mirror_RSP 等)上看到的那样。

    我不知道如何包括或在必要时处理负载控制事件(瞬时需求、提供的电流总和等)。

    我想 在我 的 ZCL_[Appilation].c 上处理负载控制分配!

    不过 、基本读取属性命令仍由 zcl_[application].c 文件内的 ZCL 基础层(*_处理器组通信消息->*_处理器组读取 RspCmd)处理

    抱歉、我之前忘记解释过它、我 在 ZCL_[Appilation].c 文件中的 ProcessInReadRspCmd 上添加了断点、并且在到达消息 ZCL 读取属性(我附加的日志中的 msg #290)时从未看到实现。 我再次复制它以尝试找到消息#290。  但我没有成功、正如您在下面和日志中看到的那样。

    当我的器件收到消息#290、ZCL 读取属性时、未达到上面的堆栈点。

    BR

    Alex

    e2e.ti.com/.../rayanLOG20210911.zip

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ryan、

    我的工作方式不对。 正如您在之前告诉我的、ZCL Read Attributes 可与 "但是、基本读取属性命令仍由 ZCL 基础层处理"搭配使用 、与我之前尝试过的一样、无需实现 Calback!!!

    我刚刚创建了一个链接在应用属性列表中的 ZCL SE Attribute 中的外部变量、并根据通过 UART 发送到我的器件的传感器数据在 ZCL_[Application].c 文件中更新了该变量。 我将在下面的代码部分对其进行描述:

    SE 集群 ID 及其各自的属性 CSMD。

    // *** Smart Energy Metering Server Cluster Attributes ***
    #ifdef ZCL_SE_METERING_SERVER
      ,{
       ZCL_CLUSTER_ID_SE_METERING,				// Cluster IDs - defined in the foundation (ie. zcl.h) - Smart Energy (SE) Clusters
        { // Attribute record
          ATTRID_SE_METERING_CURR_SUMM_DLVD,	// Attribute ID - Found in Cluster Library header (ie. zcl_se.h)
          ZCL_DATATYPE_UINT48,					// Data Type - found in zcl.h
          ACCESS_CONTROL_READ,					// Variable access control - found in zcl.h
          (void *)&zclAZh0006_CurrentSummationDelivered // Pointer to attribute variable
        }
      },

    SE 默认值变量。  

    // in the zc_myapp_data.c
    
     * EndPoint 2 - EP2 - Metering Cluster
     */
     #ifdef ZCL_SE_METERING_SERVER
    uint24 zclAZh0006_MeasureMult = DEFAULT_METERING_MULT_VALUE;
    uint24 zclAZh0006_MeasureDiv  = DEFAULT_METERING_DIV_VALUE;
    uint32 zclAZh0006_CurrentSummationDelivered = DEFAULT_CURR_SUMM_DLVD_VALUE;
    #endif //ZCL_SE_METERING_SERVER
    
    // in the zc_myapp.h
    
    // to persist external - ZCL_SE_METERING_SERVER - Metering Measurement Cluster 
    extern uint32 zclAZh0006_CurrentSummationDelivered;
    
    #ifdef ZCL_SE_METERING_SERVER
    // *** Smart Energy Metering Server Cluster Attributes -default value ***
    #define DEFAULT_CURR_SUMM_DLVD_VALUE   0;
    #define DEFAULT_INSTANTANEOUS_DEMAND   0
    #define DEFAULT_METERING_STATUS        0
    #define DEFAULT_UOM_VALUE              0
    #define DEFAULT_SUMM_FMTG_VALUE        0
    #define DEFAULT_METERING_DEVICE_TYPE   0
    #define DEFAULT_METERING_MULT_VALUE	   0x000001 // new one ASA - 24-bits unsigned integer - dec.      1
    #define DEFAULT_METERING_DIV_VALUE	   0x0186A0 // new one ASA - 24-bits unsigned integer - dec. 100000
    #endif // ZCL_SE_METERING_SERVER

    3.我的器件用 te ZCL 读取属性响应:提供的电流总和(0x0000)  

    Ryan、非常感谢您的帮助!!!

    BR、

    Alex