zigbee协议栈学习(二)
生活随笔
收集整理的這篇文章主要介紹了
zigbee协议栈学习(二)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
協(xié)議棧規(guī)范的 ID號可以通過查詢設(shè)備發(fā)送的 beacon 幀獲得。在設(shè)備加入網(wǎng)絡(luò)之前,首先
需要確認協(xié)議棧規(guī)范的 ID。“特定網(wǎng)絡(luò)”規(guī)范 ID號為0; ZigBee協(xié)議棧規(guī)范的 ID號為1; ZigBee
RO 協(xié)議棧規(guī)范的 ID 號為 2。協(xié)議棧規(guī)范的 ID(STACK_PROFILE_ID)在 nwk_globals.h 中
// Controls the operational mode of network
#define NWK_MODE_STAR ? ? ? ? 0
#define NWK_MODE_TREE ? ? ? ? 1
#define NWK_MODE_MESH ? ? ? ? 2
// Controls various stack parameter settings ?id
#define NETWORK_SPECIFIC ? ? ?0
#define HOME_CONTROLS ? ? ? ? 1
#define ZIGBEEPRO_PROFILE ? ? 2
#define GENERIC_STAR ? ? ? ? ?3
#define GENERIC_TREE ? ? ? ? ?4
地址定義:
ZigBee 設(shè)備有兩種類型的地址。一種是 64 位 IEEE 地址,即 MAC 地址,另一種是 16 位網(wǎng)絡(luò)地址。?
16 位網(wǎng)絡(luò)地址是當(dāng)設(shè)備加入網(wǎng)絡(luò)后分配的。它在網(wǎng)絡(luò)中是唯一的,用來在網(wǎng)絡(luò)中鑒別設(shè)備
和發(fā)送數(shù)據(jù)。其中,協(xié)調(diào)器的網(wǎng)絡(luò)地址為 0x00?
#define NWK_PAN_COORD_ADDR 0x0000?
地址的的分配:ZigBee 2007 PRO ?使用的隨機地址分配機制,對新加入的節(jié)點使用隨機地址分配
當(dāng)一個節(jié)點加入時,將接收到父節(jié)點的隨機分配地址,然后產(chǎn)生“設(shè)備聲明”(包含分配到的網(wǎng)絡(luò)地
址和 IEEE 地址)發(fā)送至網(wǎng)絡(luò)中的其余節(jié)點。“設(shè)備聲明”檢測新的網(wǎng)絡(luò)地址是否沖突。
在每個路由加入網(wǎng)絡(luò)之前,尋址方案需要知道和配臵一些參數(shù)。這些參數(shù)是 MAX_DEPTH
最大網(wǎng)絡(luò)深度) 、MAX_ROUTERS(最多路由數(shù))和 MAX_CHILDREN(最多子節(jié)點數(shù)) 。
這些參數(shù)是棧配臵的一部分,ZigBee2007 協(xié)議棧已經(jīng)規(guī)定了這些參數(shù)的值:
MAX_DEPTH 決定了網(wǎng)絡(luò)的最大深度。協(xié)調(diào)器(Coordinator)位于深度 0,它的兒子位于深
度1,他的兒子的的兒子位于深度 2,以此類推。MAX_DEPTH 參數(shù)限制了網(wǎng)絡(luò)在物理上的長度。 ? ?
MAX_CHILDREN 決定了一個路由(Router)或者一個協(xié)調(diào)器節(jié)點可以處理的兒子節(jié)點的最大個數(shù)。?
MAX_ROUTER 決定了一個路由(Router)或者一個協(xié)調(diào)器(Coordinator)節(jié)點可以處理的具有
路由功能的兒子節(jié)點的最大個數(shù)。這個參數(shù)是 MAX_CHILDREN 的一個子集,終端節(jié)點使用
(MAX_CHILDREN – MAX_ROUTER)剩下的地址空間。?
還必須設(shè)臵 nwk_globals.c 文件中的 Cskipchldrn 數(shù)組和 CskipRtrs 數(shù)組這些數(shù)組的
值由MAX_CHILDREN 和MAX_ROUTER 構(gòu)成
為了向一個在 ZigBee 網(wǎng)絡(luò)中的設(shè)備發(fā)送數(shù)據(jù),應(yīng)用程序通常使用 AF_DataRequest()函數(shù)
數(shù)據(jù)包將要發(fā)送給一個 afAddrType_t(在ZComDef.h 中定義)類型的目標(biāo)設(shè)備。?
typedef struct?
{?
? ?union?
? ?{?
? ? ? ? uint16 ? ? ? ? ? ?shortAddr;?
? ? ? ? ZLongAddr_t extAddr;?
? ?} addr;?
? ?afAddrMode_t addrMode;?
? ?byte endPoint;?
? ?uint16 panId; ? ?// used for the INTER_PAN feature?
} afAddrType_t;?
注意,除了網(wǎng)路地址之外,還要指定地址模式參數(shù)。目的地址模式可以設(shè)臵為以下幾個值:
typedef enum?
{?
? ?afAddrNotPresent = AddrNotPresent,?
? ?afAddr16Bit ? ? ? ? ? ?= Addr16Bit,?
? ?afAddr64Bit ? ? ? ? ? ?= Addr64Bit,?
? ?afAddrGroup ? ? ? ? ? ?= AddrGroup,?
? ?afAddrBroadcast ? ?= AddrBroadcast?
} afAddrMode_t;?
發(fā)送方式有數(shù)據(jù)包可以單點傳送(unicast),多點傳送(multicast)或者廣播傳送
一單點傳送(Unicast)?
Uicast 是標(biāo)準(zhǔn)尋址模式,它將數(shù)據(jù)包發(fā)送給一個已經(jīng)知道網(wǎng)絡(luò)地址的網(wǎng)絡(luò)設(shè)備。將
afAddrMode 設(shè)置為 Addr16Bit 并且在數(shù)據(jù)包中攜帶目標(biāo)設(shè)備地址。?
二間接傳送(Indirect)
當(dāng)應(yīng)用程序不知道數(shù)據(jù)包的目標(biāo)設(shè)備在哪里的時候使用的模式。將模式設(shè)臵為
AddrNotPresent并且目標(biāo)地址沒有指定。取代它的是從發(fā)送設(shè)備的棧的綁定表中查找目標(biāo)設(shè)備。
這種特點稱之為源綁定。?
三 廣播傳送(broadcast)?
當(dāng)應(yīng)用程序需要將數(shù)據(jù)包發(fā)送給網(wǎng)絡(luò)的每一個設(shè)備時,使用這種模式。地址模式設(shè)臵為
AddrBroadcast。目標(biāo)地址可以設(shè)臵為下面廣播地址的一種:?
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所有設(shè)
備,包括睡眠中的設(shè)備。對于睡眠中的設(shè)備,數(shù)據(jù)包將被保留在其父親節(jié)點直到查詢到它,或
者消息超時(NWK_INDIRECT_MSG_TIMEOUT 在f8wConifg.cfg 中)。?
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所
有在空閑時打開接收的設(shè)備(RXONWHENIDLE),也就是說,除了睡眠中的所有設(shè)備。?
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——數(shù)據(jù)包發(fā)送給所有的路由器,包
括協(xié)調(diào)器。
需要確認協(xié)議棧規(guī)范的 ID。“特定網(wǎng)絡(luò)”規(guī)范 ID號為0; ZigBee協(xié)議棧規(guī)范的 ID號為1; ZigBee
RO 協(xié)議棧規(guī)范的 ID 號為 2。協(xié)議棧規(guī)范的 ID(STACK_PROFILE_ID)在 nwk_globals.h 中
// Controls the operational mode of network
#define NWK_MODE_STAR ? ? ? ? 0
#define NWK_MODE_TREE ? ? ? ? 1
#define NWK_MODE_MESH ? ? ? ? 2
// Controls various stack parameter settings ?id
#define NETWORK_SPECIFIC ? ? ?0
#define HOME_CONTROLS ? ? ? ? 1
#define ZIGBEEPRO_PROFILE ? ? 2
#define GENERIC_STAR ? ? ? ? ?3
#define GENERIC_TREE ? ? ? ? ?4
地址定義:
ZigBee 設(shè)備有兩種類型的地址。一種是 64 位 IEEE 地址,即 MAC 地址,另一種是 16 位網(wǎng)絡(luò)地址。?
16 位網(wǎng)絡(luò)地址是當(dāng)設(shè)備加入網(wǎng)絡(luò)后分配的。它在網(wǎng)絡(luò)中是唯一的,用來在網(wǎng)絡(luò)中鑒別設(shè)備
和發(fā)送數(shù)據(jù)。其中,協(xié)調(diào)器的網(wǎng)絡(luò)地址為 0x00?
#define NWK_PAN_COORD_ADDR 0x0000?
地址的的分配:ZigBee 2007 PRO ?使用的隨機地址分配機制,對新加入的節(jié)點使用隨機地址分配
當(dāng)一個節(jié)點加入時,將接收到父節(jié)點的隨機分配地址,然后產(chǎn)生“設(shè)備聲明”(包含分配到的網(wǎng)絡(luò)地
址和 IEEE 地址)發(fā)送至網(wǎng)絡(luò)中的其余節(jié)點。“設(shè)備聲明”檢測新的網(wǎng)絡(luò)地址是否沖突。
在每個路由加入網(wǎng)絡(luò)之前,尋址方案需要知道和配臵一些參數(shù)。這些參數(shù)是 MAX_DEPTH
最大網(wǎng)絡(luò)深度) 、MAX_ROUTERS(最多路由數(shù))和 MAX_CHILDREN(最多子節(jié)點數(shù)) 。
這些參數(shù)是棧配臵的一部分,ZigBee2007 協(xié)議棧已經(jīng)規(guī)定了這些參數(shù)的值:
MAX_DEPTH 決定了網(wǎng)絡(luò)的最大深度。協(xié)調(diào)器(Coordinator)位于深度 0,它的兒子位于深
度1,他的兒子的的兒子位于深度 2,以此類推。MAX_DEPTH 參數(shù)限制了網(wǎng)絡(luò)在物理上的長度。 ? ?
MAX_CHILDREN 決定了一個路由(Router)或者一個協(xié)調(diào)器節(jié)點可以處理的兒子節(jié)點的最大個數(shù)。?
MAX_ROUTER 決定了一個路由(Router)或者一個協(xié)調(diào)器(Coordinator)節(jié)點可以處理的具有
路由功能的兒子節(jié)點的最大個數(shù)。這個參數(shù)是 MAX_CHILDREN 的一個子集,終端節(jié)點使用
(MAX_CHILDREN – MAX_ROUTER)剩下的地址空間。?
還必須設(shè)臵 nwk_globals.c 文件中的 Cskipchldrn 數(shù)組和 CskipRtrs 數(shù)組這些數(shù)組的
值由MAX_CHILDREN 和MAX_ROUTER 構(gòu)成
為了向一個在 ZigBee 網(wǎng)絡(luò)中的設(shè)備發(fā)送數(shù)據(jù),應(yīng)用程序通常使用 AF_DataRequest()函數(shù)
數(shù)據(jù)包將要發(fā)送給一個 afAddrType_t(在ZComDef.h 中定義)類型的目標(biāo)設(shè)備。?
typedef struct?
{?
? ?union?
? ?{?
? ? ? ? uint16 ? ? ? ? ? ?shortAddr;?
? ? ? ? ZLongAddr_t extAddr;?
? ?} addr;?
? ?afAddrMode_t addrMode;?
? ?byte endPoint;?
? ?uint16 panId; ? ?// used for the INTER_PAN feature?
} afAddrType_t;?
注意,除了網(wǎng)路地址之外,還要指定地址模式參數(shù)。目的地址模式可以設(shè)臵為以下幾個值:
typedef enum?
{?
? ?afAddrNotPresent = AddrNotPresent,?
? ?afAddr16Bit ? ? ? ? ? ?= Addr16Bit,?
? ?afAddr64Bit ? ? ? ? ? ?= Addr64Bit,?
? ?afAddrGroup ? ? ? ? ? ?= AddrGroup,?
? ?afAddrBroadcast ? ?= AddrBroadcast?
} afAddrMode_t;?
發(fā)送方式有數(shù)據(jù)包可以單點傳送(unicast),多點傳送(multicast)或者廣播傳送
一單點傳送(Unicast)?
Uicast 是標(biāo)準(zhǔn)尋址模式,它將數(shù)據(jù)包發(fā)送給一個已經(jīng)知道網(wǎng)絡(luò)地址的網(wǎng)絡(luò)設(shè)備。將
afAddrMode 設(shè)置為 Addr16Bit 并且在數(shù)據(jù)包中攜帶目標(biāo)設(shè)備地址。?
二間接傳送(Indirect)
當(dāng)應(yīng)用程序不知道數(shù)據(jù)包的目標(biāo)設(shè)備在哪里的時候使用的模式。將模式設(shè)臵為
AddrNotPresent并且目標(biāo)地址沒有指定。取代它的是從發(fā)送設(shè)備的棧的綁定表中查找目標(biāo)設(shè)備。
這種特點稱之為源綁定。?
三 廣播傳送(broadcast)?
當(dāng)應(yīng)用程序需要將數(shù)據(jù)包發(fā)送給網(wǎng)絡(luò)的每一個設(shè)備時,使用這種模式。地址模式設(shè)臵為
AddrBroadcast。目標(biāo)地址可以設(shè)臵為下面廣播地址的一種:?
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所有設(shè)
備,包括睡眠中的設(shè)備。對于睡眠中的設(shè)備,數(shù)據(jù)包將被保留在其父親節(jié)點直到查詢到它,或
者消息超時(NWK_INDIRECT_MSG_TIMEOUT 在f8wConifg.cfg 中)。?
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所
有在空閑時打開接收的設(shè)備(RXONWHENIDLE),也就是說,除了睡眠中的所有設(shè)備。?
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——數(shù)據(jù)包發(fā)送給所有的路由器,包
括協(xié)調(diào)器。
總結(jié)
以上是生活随笔為你收集整理的zigbee协议栈学习(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gallery简单应用
- 下一篇: 大小端的判断