1-7 擴充套件和提高1:ZigBee協議中的規範(Profile)和簇(Cluester)的概念
阿新 • • 發佈:2019-02-09
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中的點對點通訊中
- //Coordinator.h
- #define GENERICAPP_MAX_CLUSTERS 1 //定義一個簇的大小,一個簇的大小為N
- #define GENERICAPP_CLUSTERID 1 //定義一個簇中的一個一個命令ID
- //Coordinator.c
- const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]= //GenericApp_ClusterList就是一個簇,他有GENERICAPP_MAX_CLUSTERS條命令,下面一一列出命令的ID號
- {
-
GENERICAPP_CLUSTERID
- };
3、埠:使用一個節點就有一個網路地址,但在一個節點上可以有很多埠。在規範中使用簡單描述符(SimpleDescriptionFormat_t結構)來描述一個埠。而在因為有很多埠,埠之間必需附加有任務切換使用的引數。結果就用endPointDesc_t結構來表示一個埠。endPointDesc_t定義如下:
//AF.h
SimpleDescriptionFormat_t結構如下:typedef struct { byte endPoint; byte *task_id; // Pointer to location of the Application task ID. SimpleDescriptionFormat_t *simpleDesc; //關鍵是這個,見下面的結構體。 afNetworkLatencyReq_t latencyReq; //使用預設引數即可 } endPointDesc_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無線感測器網路設計與實現》 王小強等人編著化學工業出版社