谷动谷力

 找回密码
 立即注册
查看: 822|回复: 0
打印 上一主题 下一主题
收起左侧

NXP ZigBee 3.0 软件开发 - 在 EndDevice 使用 Group 和 Scenes Server

[复制链接]
跳转到指定楼层
楼主
发表于 2022-11-25 22:56:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
NXP ZigBee 3.0 软件开发 - 在 EndDevice 使用 Group 和 Scenes Server

调试原因

JN-AN-1219-Zigbee-3-0-Controller-and-Switch 例程是 ZigBee End Device 的 demo 工程,以 DimmerSwitch 为例,一般注册端点会作为 Scenes Client 和 Group Client。
但是也有将 End Device 作为 Scenes Server 和 Group Server 的情况,本文记录如何修改代码,实现这个需求。( Scenes Cluster 一般是绑定 Group Cluster 的,所以放到一起实现 )

代码修改
  • Zcl_options.h
    // 注释掉 scenes client 宏,定义 scenes server 宏
    //#define SCENES_CLIENT
    #define SCENES_SERVER
    // 定义 scenes server option attributes
    #define CLD_SCENES_MAX_NUMBER_OF_SCENES                     16
    #define CLD_SCENES_DISABLE_NAME_SUPPORT
    #define CLD_SCENES_MAX_SCENE_NAME_LENGTH                    0
    #define CLD_SCENES_MAX_SCENE_STORAGE_BYTES                  10
    #define CLD_SCENES_ATTR_LAST_CONFIGURED_BY
    #define CLD_SCENES_TABLE_SUPPORT_TRANSITION_TIME_IN_MS
    #define  CLD_SCENES_CMD_ENHANCED_ADD_SCENE
    #define CLD_SCENES_CMD_ENHANCED_VIEW_SCENE
    #define CLD_SCENES_CMD_COPY_SCENE
    // 注释掉 group client 宏,定义 group server 宏
    //#define GROUPS_CLIENT
    #define GROUPS_SERVER
    // 定义 group server option attributes
    #define CLD_GROUPS_MAX_NUMBER_OF_GROUPS                     16
    #define CLD_GROUPS_DISABLE_NAME_SUPPORT
  • app.zpscfg
  • dimmer_switch.c
    // 在 eZLO_RegisterDimmerSwitchEndPoint() 新增 Group 和 Scenes 的 Cluster Structure
    PUBLIC teZCL_Status eZLO_RegisterDimmerSwitchEndPoint(uint8 u8EndPointIdentifier,
                                                  tfpZCL_ZCLCallBackFunction cbCallBack,
                                                  tsZLO_DimmerSwitchDevice *psDeviceInfo)
    {
        ···
            
        #if (defined CLD_SCENES) && (defined SCENES_SERVER)
            /* Create an instance of a Scenes cluster as a server */
            if(eCLD_ScenesCreateScenes(&psDeviceInfo->sClusterInstance.sScenesServer,
                                  TRUE,
                                  &sCLD_Scenes,
                                  &psDeviceInfo->sScenesServerCluster,
                                  &au8ScenesAttributeControlBits[0],
                                  &psDeviceInfo->sScenesServerCustomDataStructure,
                                  &psDeviceInfo->sEndPoint) != E_ZCL_SUCCESS)
            {
                // Need to convert from cluster specific to ZCL return type so we lose the extra information of the return code
                return E_ZCL_FAIL;
            }
        #endif
       
        #if (defined CLD_GROUPS) && (defined GROUPS_SERVER)
            /* Create an instance of a Groups cluster as a server */
            if(eCLD_GroupsCreateGroups(&psDeviceInfo->sClusterInstance.sGroupsServer,
                                  TRUE,
                                  &sCLD_Groups,
                                  &psDeviceInfo->sGroupsServerCluster,
                                  &au8GroupsAttributeControlBits[0],
                                  &psDeviceInfo->sGroupsServerCustomDataStructure,
                                  &psDeviceInfo->sEndPoint) != E_ZCL_SUCCESS)
            {
                // Need to convert from cluster specific to ZCL return type so we lose the extra information of the return code
                return E_ZCL_FAIL;
            }
        #endif
       
        ···
    }
  • dimmer_switch.h
    /* Holds cluster instances */
    typedef struct
    {


···
      
   /*Recommended Optional client clusters */
   #if (defined CLD_SCENES) && (defined SCENES_CLIENT)
       tsZCL_ClusterInstance sScenesClient;
   #endif

#if (defined CLD_SCENES) && (defined SCENES_SERVER)
       tsZCL_ClusterInstance sScenesServer; //add
#endif

   #if (defined CLD_GROUPS) && (defined GROUPS_CLIENT)
       tsZCL_ClusterInstance sGroupsClient;
   #endif

#if (defined CLD_GROUPS) && (defined GROUPS_SERVER)
       tsZCL_ClusterInstance sGroupsServer; //add
#endif

···

} tsZLO_DimmerSwitchDeviceClusterInstances __attribute__ ((aligned(4)));

/* Holds everything required to create an instance of a dimmer switch */
typedef struct
{
···
   
   /* Recommended Optional client clusters */
   #if (defined CLD_SCENES) && (defined SCENES_CLIENT)
       /* Scenes Cluster - Client */
       tsCLD_Scenes sScenesClientCluster;
       tsCLD_ScenesCustomDataStructure sScenesClientCustomDataStructure;
   #endif

#if (defined CLD_SCENES) && (defined SCENES_SERVER) //add
       /* Scenes Cluster - Server */
       tsCLD_Scenes sScenesServerCluster;
       tsCLD_ScenesCustomDataStructure sScenesServerCustomDataStructure;
   #endif

   #if (defined CLD_GROUPS) && (defined GROUPS_CLIENT)
       /* Groups Cluster - Client */
       tsCLD_Groups sGroupsClientCluster;
       tsCLD_GroupsCustomDataStructure sGroupsClientCustomDataStructure;
   #endif

#if (defined CLD_GROUPS) && (defined GROUPS_SERVER) //add
       /* Groups Cluster - Server */
       tsCLD_Groups sGroupsServerCluster;
       tsCLD_GroupsCustomDataStructure sGroupsServerCustomDataStructure;
#endif
   
   ···
      
} tsZLO_DimmerSwitchDevice;
App_scenes.c 和 App_scenes.h
复制 JN-AN-1218-Zigbee-3-0-Light-Bulb\Common_Light\Source\app_scenes.c 和 app_scenes.h 到 JN-AN-1219-Zigbee-3-0-Controller-and-Switch\Common\Source 目录
// 将所有 sLight 替换成 sSwitch
PDM_IDs.h
// 定义保存 scenes data 的 pdm id
#define PDM_ID_APP_SCENES_DATA      (0xA101)
App_zlo_switch_node.c
// 新增 include
#include "app_scenes.h"

PUBLIC void APP_vInitialiseNode(void)
{
    ···
        
    #ifdef CLD_OTA
        vLoadOTAPersistedData();
    #endif

    /* Restore any application data previously saved to flash */
    uint16 u16ByteRead;
    PDM_eReadDataFromRecord(PDM_ID_APP_ZLO_SWITCH,
                            &sDeviceDesc,
                            sizeof(tsDeviceDesc),
                            &u16ByteRead);

    PDM_eReadDataFromRecord(PDM_ID_APP_CONVERT,
                            &sConvertR21toR22,
                            sizeof(tsConvertR21toR22),
                            &u16ByteRead);

    vLoadScenesNVM();   // 在 APP_vInitialiseNode 中调用 vLoadScenesNVM();
   
    ···
}
makefile
# Application Source files
···
# 新增编译 app_scenes.c
APPSRC += app_scenes.c
···




+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-12-27 14:14 , Processed in 0.086799 second(s), 43 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表