NXP JN5169 ZigBee3.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 ···
编译方法,参考:
NXP Zigbee JN516X JN517x JN518X 用vsCode studio 环境开发搭建及编译_技术专栏_SUNSHINE SILICON
【技术专栏】NXP Zigbee JN516X JN517x JN518X 用vsCode studio 环境开发搭建及编译
Zigbee应用实例
我们有智能家居完整方案:
用我们zigbee模块可以免开发(零代码), 快速实现zigbee网关智能开关、智能调光灯、智能门锁、语音精灵等zigbee设备。有现成云服务(可以私有化部署)、APP(可定制)。
zigbee模块
SUN-JN5169-PA-V1.0 Zigbee模块 加PA (sunsili.com)
zigbee网关方案
【应用方案】基于MT7628 JN5169 和SUN724的4G-Zigbee智能网关方案 (sunsili.com)
智能离线语音识别全屋智能语音控制方案
智能离线语音识别全屋智能语音控制方案 (sunsili.com)
参考资料
- 【技术专栏】Zigbee JN5169低功耗设置2024-08-30
- 【电子元件】JN5169/001Z/001X/001Y NXP Zigbee 32位 RISC Soc 芯片IC2024-08-30
- 【资料下载】NXP Zigbee JN51XX 量产烧录工具SUN_JN51XX_Programer下载2025-03-18
- 【资料下载】NXP Zigbee JN5169 开发环境软件 文档和支持资源打包下载2024-08-02
- 【技术专栏】智能家居 Zigbee 与 BLE Mesh 技术对比2024-07-08
- 【技术专栏】NXP ZigBee JN516X开发环境搭建 BeyondStudio IDE 安装2024-07-08
- 【技术专栏】NXP Zigbee JN516X JN517x JN518X 用vsCode studio 环境开发搭建及编译2024-07-05
- 【技术专栏】基于Wireshark和TiWsPC(Wireshark Packet Converter)的Zigbee抓包2024-06-23
- 【资料下载】基于Wireshark和TiWsPC(Wireshark Packet Converter)的Zigbee抓包工具下载2024-06-22
- 【智能安防】Zigbee智能物联网门锁指纹锁密码锁2024-06-15
- 【技术专栏】NXP JN516x Zigbee模块硬件参考设计简介2024-05-25
- 【无线模块】SUN-JN5169-PA-V1.0 Zigbee模块 加PA2024-09-04
- 【应用方案】【应用方案】基于MT7628 JN5169 和SUN724的4G-Zigbee智能网关方