ZigBee中Profile(規範),Cluster(簇)
在zigbee規範中,引入了profile, cluster的概念。profile和cluster的翻譯沒有統一的標準,這裡暫時定為規範和簇。個人認為,ZigBee引入profile,cluster的概念,是為了統一應用,使不同廠家、不同設計者的產品可以相容使用。
Profile說明
ZigBee網路進行資料傳輸都是建立在應用規範的基礎上。規範profile可以理解成一套規定,每個應用應該是對應一個profile ID,每個profile ID可以應用於某項具體的應用,例如自動家居、樓宇自動化等。。
ZigBee聯盟已經規定了profile的使用,整個應用規範可以分為公共規範(Public profile)和製造商規範(Manufacturer Specific profile)。公共規範的ID號為:0x0000-0x7FFF,製造商的為:0xBF00-0xFFFF。
其中公共規範已經規定了常見的各種應用,以下是摘錄的部分公共規範。
Profile ID | Profile Name | 應用名稱(翻譯) |
0101 | Industial Plant Monitoring(IPM) | 工業用植物檢測 |
0104 | Home Automation(HA) | 家居自動化 |
0105 | Commercial Building Automation(CBA) | 商業樓宇自動化 |
0107 | Telecom Applications(TA) | 電信應用 |
0108 | Personal Home&hospital Care(PHHC) | 個人家庭醫院護理 |
0109 | Advanced Metering Initiative(AMI) |
先進的計量倡議?? |
比如home automation public profile就規定了智慧家居都要做什麼,當然使用者也可以規定一個自己的profile。
協議棧本身也有一個profile,就是Zigbee Device Profile,也就是ZDP了,這裡規範了一個zigbee節點都要具備那些功能,比如路由能力啊,網路發現能力啊,各個協議層都要做什麼啊。——摘抄
Cluster說明
ZigBee在一個profile的規範下,又提出了cluster的概念。
綜合profile和cluster,可以這樣理解,一個具體的應用(例如智慧家居系統)有大量細節上的小規範(例如電燈的控制:開燈、關燈等),這個規範即成為簇(cluster)。
舉例說明,home automation 的public profile已經規定了調光器應該有哪些cluster,如:Color Control Cluster,Ballast Configuration Cluster 等。不同的cluster有不同的命令:
- /*****************************************/
- /* Color Control Cluster Commands */
- /*****************************************/
- #define COMMAND_LIGHTING_MOVE_TO_HUE 0x00
- #define COMMAND_LIGHTING_MOVE_HUE 0x01
- #define COMMAND_LIGHTING_STEP_HUE 0x02
- #define COMMAND_LIGHTING_MOVE_TO_SATURATION 0x03
- #define COMMAND_LIGHTING_MOVE_SATURATION 0x04
- #define COMMAND_LIGHTING_STEP_SATURATION 0x05
- #define COMMAND_LIGHTING_MOVE_TO_HUE_AND_SATURATION <span style="white-space:pre"> </span>0x06
- #define COMMAND_LIGHTING_MOVE_TO_COLOR 0x07
- #define COMMAND_LIGHTING_MOVE_COLOR 0x08
- #define COMMAND_LIGHTING_STEP_COLOR 0x09
- #define COMMAND_LIGHTING_MOVE_TO_COLOR_TEMPERATURE <span style="white-space:pre"> </span>0x0a
除了命令之外,每一個cluster還會定義一些屬性,比如color control cluster有一下屬性:
- #define ATTRID_LIGHTING_COLOR_CONTROL_CURRENT_HUE 0x0000
- #define ATTRID_LIGHTING_COLOR_CONTROL_CURRENT_SATURATION 0x0001
- #define ATTRID_LIGHTING_COLOR_CONTROL_REMAINING_TIME 0x0002
- #define ATTRID_LIGHTING_COLOR_CONTROL_CURRENT_X 0x0003
- #define ATTRID_LIGHTING_COLOR_CONTROL_CURRENT_Y 0x0004
- #define ATTRID_LIGHTING_COLOR_CONTROL_DRIFT_COMPENSATION 0x0005
- #define ATTRID_LIGHTING_COLOR_CONTROL_COMPENSATION_TEXT 0x0006
- #define ATTRID_LIGHTING_COLOR_CONTROL_COLOR_TEMPERATURE 0x0007
- #define ATTRID_LIGHTING_COLOR_CONTROL_COLOR_MODE 0x0008
而Ballast Configuration Cluster 則有一下屬性:
- // Ballast Information attribute set
- #define ATTRID_LIGHTING_BALLAST_CONFIG_PHYSICAL_MIN_LEVEL 0x0000
- #define ATTRID_LIGHTING_BALLAST_CONFIG_PHYSICAL_MAX_LEVEL 0x0001
- #define ATTRID_LIGHTING_BALLAST_BALLAST_STATUS 0x0002
這些屬性反映了這個cluster下裝置的狀態,可以通過讀寫這些屬性來改變其值。
總結說來,Profile規範了應該包括哪些cluster,一個cluster會有一個ID,在一個cluster下又會有很多command,也會有很多attibute,在一個cluster下面command 和attribute的ID要唯一,不同的cluster下可以重複,不同的profile下clusterID也可以重複。
ZCL的使用
假設我們要控制一個LED,有一個遠端節點(發命令控制led ),一個本地節點(接受命令並真正的讓led 亮起來),那麼如果引入ZCL的概念,你可以設定這個操作led 的事情是一個cluster,其下包含三個命令,
一個open,一個close,一個read attribute,燈還有一個attribute,那就是當前的status,
遠端節點可以用ZCL的函式發open和close命令,也可以隨時發一個read attibute命令讀取本地節點led 的狀態。這麼做的好處是不需要再自己設計一個規定(比如:一個數據包的第幾個位元組表示什麼。。。),而是直接呼叫ZCL即可實現,這對於command和attribute數量很少的應用不見得有多大好處,但是當command和attribute數量很多的時候,引入ZCL會讓事情變得簡單。
再延伸一點兒,zigbee聯盟在協議棧之外又增加了一部分操作cluster的函式,那就是zigbee cluster library,(ZCL),這裡邊已經以原始碼的形式提供了操作聯盟規範的那些public profile下的函式,主要功能包括一些command的transmit,response,indicate以及confirm等,還有讀寫attribute的一些操作函式。所以在理解了ZCL的工作機制基礎上,通過呼叫ZCL的函式實際上會讓應用程式設計變得簡單