1. 程式人生 > >1-7 擴充套件和提高1:ZigBee協議中的規範(Profile)和簇(Cluester)的概念

1-7 擴充套件和提高1:ZigBee協議中的規範(Profile)和簇(Cluester)的概念

ZigBee協議中的規範(Profile)和簇(Cluester)的概念

        1、規範(Profile):ZigBee網路中資料的收發是建立應用規範(Application  Profile)的基礎上的。每個應用規範都有 一個ID;應用規範可分為公共規範(Public profile)且ID範圍為0x0000`0x7FFF和製造商特定規範(Manufacturer Specific Profile)且ID範圍為0xbF00~0xFFFF.其實,規範就是說一類建築或場合使用某規範。比如:商業樓宇自動化有他自己的規範,且ID為0x0105,民宅要使用另一個ID號。很簡單的吧。

        2、簇(Cluester):某一應用物件的一個特定物件。比如自動窗簾。(開啟是一個命令、關閉要是另一個命令)。比如實驗2中的點對點通訊中

  1. //Coordinator.h
  2. #define GENERICAPP_MAX_CLUSTERS   1 //定義一個簇的大小,一個簇的大小為N
  3. #define GENERICAPP_CLUSTERID      1 //定義一個簇中的一個一個命令ID
  1. //Coordinator.c
  2. const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=  //GenericApp_ClusterList就是一個簇,他有GENERICAPP_MAX_CLUSTERS條命令,下面一一列出命令的ID號
  3. {  
  4.   GENERICAPP_CLUSTERID   
  5. };  

        3、埠:使用一個節點就有一個網路地址,但在一個節點上可以有很多埠。在規範中使用簡單描述符(SimpleDescriptionFormat_t結構)來描述一個埠。而在因為有很多埠,埠之間必需附加有任務切換使用的引數。結果就用endPointDesc_t結構來表示一個埠。endPointDesc_t定義如下:
//AF.h
typedef struct
{
  byte endPoint;
  byte *task_id;  // Pointer to location of the Application task ID.
  SimpleDescriptionFormat_t *simpleDesc;   //關鍵是這個,見下面的結構體。
  afNetworkLatencyReq_t latencyReq;    //使用預設引數即可
} endPointDesc_t;
SimpleDescriptionFormat_t結構如下:
//Filename:       AF.h
typedef uint16  cId_t;
// Simple Description Format Structure
typedef struct
{
  byte          EndPoint;       //埠號
  uint16        AppProfId;      //應用規範ID
  uint16        AppDeviceId;    //應用裝置ID
  byte          AppDevVer:4;    //應用裝置版本號  4bit 這裡使用的是位域
  byte          Reserved:4;             // AF_V1_SUPPORT uses for AppFlags:4.
  byte          AppNumInClusters;    //輸入簇包含的命令個數
  cId_t         *pAppInClusterList;  //輸入簇列表  可有GENERICAPP_MAX_CLUSTERS個輸入命令
  byte          AppNumOutClusters;   //輸出簇包含的命令個數
  cId_t         *pAppOutClusterList;//輸出簇列表  可有GENERICAPP_MAX_CLUSTERS個輸出命令
} SimpleDescriptionFormat_t;

在協調器和終端節點都有一個SimpleDescripitonFormat_t型別定義的GenericApp_SipleDesc變數。(當然也可以定義多個變數。到底怎樣應用到例項呢?還沒想到)綜合上面的所有,回看程式碼:
//Coordinator.c
//簡單裝置描述符(描述一個ZigBee裝置節點)
const SimpleDescriptionFormat_t GenericApp_SimpleDesc=
{
  GENERICAPP_ENDPOINT,
  GENERICAPP_PROFID,
  GENERICAPP_DEVICEID,
  GENERICAPP_DEVICE_VERSION,
  GENERICAPP_FLAGS,
  GENERICAPP_MAX_CLUSTERS, //輸入簇包含的命令個數
 (cId_t*)GenericApp_ClusterList, //輸入簇列表  可有GENERICAPP_MAX_CLUSTERS個輸入命令
  0,
  (cId_t *)NULL
};
上面的巨集是在下面的程式碼中定義的,這個巨集也被終端節點引用
//Coordinator.h
#define GENERICAPP_ENDPOINT   10  //埠在這裡使用的是埠號10,可用的範圍為(1~240)

#define GENERICAPP_PROFID     0x0F04    //
#define GENERICAPP_DEVICEID   0x0001  //

#define GENERICAPP_DEVICE_VERSION 0 //
#define GENERICAPP_FLAGS          0 /

#define GENERICAPP_MAX_CLUSTERS   1 
#define GENERICAPP_CLUSTERID      1 

終端節點程式碼:
//Enddevice.c
//初始化埠描述符
const SimpleDescriptionFormat_t GenericApp_SimpleDesc=
{
  GENERICAPP_ENDPOINT,
  GENERICAPP_PROFID,
  GENERICAPP_DEVICEID,
  GENERICAPP_DEVICE_VERSION,
  GENERICAPP_FLAGS,
  0,
  (cId_t*)NULL,
  GENERICAPP_MAX_CLUSTERS,         //輸出簇包含的命令個數
  (cId_t*)GenericApp_ClusterList  //輸出簇列表  可有GENERICAPP_MAX_CLUSTERS個輸出命令
};
注意到沒?這個協調器上的簇是輸入命令,而終端節點是輸出命令。對於通訊雙方來說,必須是一方是輸入命令,另一方則是輸出命令。(到底哪一方式輸入,哪一方式輸出則看看在說。對到目前只做過一個節點發送資料,另一個接受資料。都還沒有做過兩節點間的雙向傳送和接受通訊)。 本文參考自:《ZigBee無線感測器網路設計與實現》      王小強等人編著化學工業出版社