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智能網關方