一般來說流程是這樣的:先將一些節點分到一個組裏,然後可以在節點上建立場景。但也可以在沒有組的情況下建立場景,該種情況下是隻支持單播的group是將一些節點分到一個羣組中;
在節點分到一個羣組之後,就可以在節點上建立scene;在建立scene的時候group ID是一個參數,所以必須先有group纔能有scene。ZCL中,scene有add,recall,remove等管理函數,比如你給一個節點發送一個命令讓他add到一個scene中,你在scene的回調函數中就需要填一下存的是哪些個atrribute,然後在recall的回調函數中根據add時候的attribute來設置你被控節點的狀態。
APS組表是由分配的RAM【osal_mem_alloc()】定義得鏈表,因此當組表增加時,OSAL堆也將增加。表定義在nwk_globals.c,通過調整APS_MAX_GROUPS【f8wConfig.cfg】來改變組表的最大大小。用這些API需要包含aps_groups.h頭文件。
組:組是用來將一系列節點集合到一個單地址實體的方式。一個數據請求能夠到達組中的每個節點。在Zigbee協議中組是可選配置,但是在某些剖面中是必選的,比如家庭自動化剖面。組關注的是一系列設備同時執行一個行爲。
組表結構體
typedef struct
{
uint16 ID; // Unique to this table
uint8 name【APS_GROUP_NAME_LEN】; // Human readable name of group
} aps_Group_t;
ID -16位的組ID
name -文本組名(人類語言)APS_GROUP_NAME_LEN爲16且不可更改。
組表入口-apsGroupItem_t
組表記錄(入口)
typedef struct apsGroupItem
{
struct apsGroupItem *next;
uint8 endpoint;
aps_Group_t group;
} apsGroupItem_t;
next -指向組表的下一個入口(組表爲鏈表結構),推薦使用組表查找和維護函數來遍歷組表。
endpoint -接受消息的終端
group -組ID和組名
組表維護函數
ZStatus_t aps_AddGroup( uint8 endpoint, aps_Group_t *group );
往組表中添加一個組。先定義aps_Group_t,然後填充這個結構,最後調用此函數來添加。若NV_RESTORE使能,則函數將更新保存到非易失性儲存。
返回值:成功則返回ZSuccess,否則返回錯誤,錯誤可以是:ZApsDuplicateEntry,ZApsTableFull,ZMemError【ZComDef.h】
uint8 aps_RemoveGroup( uint8 endpoint, uint16 groupID );
移除一個組,若NV_RESTORE使能,則函數將更新保存到非易失性儲存。
void aps_RemoveAllGroup( uint8 endpoint );
按給定的參數,移除終端的所有組。
組表查詢函數
aps_Group_t *aps_FindGroup( uint8 endpoint, uint16 groupID );
endpoint -將接收消息的終端
返回值:指向組元件的指針
uint8 aps_FindGroupForEndpoint( uint16 groupID, uint8 lastEP );
從組ID中查找終端,這個函數用來跳過終端,然後返回下一個終端。
lastEP -返回的終端前要跳過的終端。用APS_GROUPS_FIND_FIRST來指定要查找的第一個終端。
返回終端,或者APS_GROUPS_EP_NOT_FOUND(沒有找到或者找到多個)
uint8 aps_FindAllGroupsForEndpoint( uint8 endpoint, uint16 *groupList );
得到一個屬於一個組的所有終端。
endpoint -要查找的終端
groupList -指向存放終端所有表的空間
uint8 aps_CountGroups( uint8 endpoint );
uint8 aps_CountAllGroups( void );
組表的非易失性儲存
若定義了編譯選項NV_RESTORE,則當組發生改變時會自動儲存。組表的NV初始化和恢復在器件啓動時自動執行。若用戶應用改變了組表的入口,則必須直接調用Aps_GroupsWriteNV()
void aps_GroupsWriteNV( void )
若是通過正常的組添加、移除函數的調用來更改組表,則不必調用此函數。
APS組表是由分配的RAM【osal_mem_alloc()】定義得鏈表,因此當組表增加時,OSAL堆也將增加。表定義在nwk_globals.c,通過調整APS_MAX_GROUPS【f8wConfig.cfg】來改變組表的最大大小。用這些API需要包含aps_groups.h頭文件。
組:組是用來將一系列節點集合到一個單地址實體的方式。一個數據請求能夠到達組中的每個節點。在Zigbee協議中組是可選配置,但是在某些剖面中是必選的,比如家庭自動化剖面。組關注的是一系列設備同時執行一個行爲。
組表結構體
typedef struct
{
uint16 ID; // Unique to this table
uint8 name【APS_GROUP_NAME_LEN】; // Human readable name of group
} aps_Group_t;
ID -16位的組ID
name -文本組名(人類語言)APS_GROUP_NAME_LEN爲16且不可更改
組表入口-apsGroupItem_t
組表記錄(入口)
typedef struct apsGroupItem
{
struct apsGroupItem *next;
uint8 endpoint;
aps_Group_t group;
} apsGroupItem_t;
next -指向組表的下一個入口(組表爲鏈表結構),推薦使用組表查找和維護函數來遍歷組表。
endpoint -接受消息的終端
group -組ID和組名
組表維護函數
ZStatus_t aps_AddGroup( uint8 endpoint, aps_Group_t *group );
往組表中添加一個組。先定義aps_Group_t,然後填充這個結構,最後調用此函數來添加。若NV_RESTORE使能,則函數將更新保存到非易失性儲存。
返回值:成功則返回ZSuccess,否則返回錯誤,錯誤可以是:ZApsDuplicateEntry,ZApsTableFull,ZMemError【ZComDef.h】
uint8 aps_RemoveGroup( uint8 endpoint, uint16 groupID );
移除一個組,若NV_RESTORE使能,則函數將更新保存到非易失性儲存。
void aps_RemoveAllGroup( uint8 endpoint );
按給定的參數,移除終端的所有組。
組表查詢函數
aps_Group_t *aps_FindGroup( uint8 endpoint, uint16 groupID );
endpoint -將接收消息的終端
返回值:指向組元件的指針
uint8 aps_FindGroupForEndpoint( uint16 groupID, uint8 lastEP );
從組ID中查找終端,這個函數用來跳過終端,然後返回下一個終端。
lastEP -返回的終端前要跳過的終端。用APS_GROUPS_FIND_FIRST來指定要查找的第一個終端。 返回終端,或者APS_GROUPS_EP_NOT_FOUND(沒有找到或者找到多個)
uint8 aps_FindAllGroupsForEndpoint( uint8 endpoint, uint16 *groupList );
得到一個屬於一個組的所有終端。 endpoint -要查找的終端
groupList -指向存放終端所有表的空間
uint8 aps_CountGroups( uint8 endpoint );
uint8 aps_CountAllGroups( void );
組表的非易失性儲存
若定義了編譯選項NV_RESTORE,則當組發生改變時會自動儲存。組表的NV初始化和恢復在器件啓動時自動執行。若用戶應用改變了組表的入口,則必須直接調用Aps_GroupsWriteNV()
void aps_GroupsWriteNV( void )
若是通過正常的組添加、移除函數的調用來更改組表,則不必調用此函數。