ZigBee四種綁定 在TI Z-Stack協(xié)議棧中應(yīng)用
BindingTable
綁定表
1.綁定表存放的位置是內(nèi)存中預(yù)先定義的塊,如果編譯選項(xiàng)NV_RESTORE被激活,也能保存在Flash里。
2.綁定表放置在源節(jié)點(diǎn)(需要激活編譯選項(xiàng)REFLECTOR)。
3.綁定表的條目把需要發(fā)送的消息映射到它們的目標(biāo)地址上。
4.綁定表中每個(gè)條目包括以下內(nèi)容:
5.綁定表?xiàng)l目結(jié)構(gòu)體的定義
typedefstruct
{
uint16srcIdx;//源地址索引
uint8srcEP;//源端點(diǎn)
uint8dstGroupMode;//指定尋址模式
uint16dstIdx;//目標(biāo)地址索引或者分組號(hào)
uint8dstEP;//目標(biāo)端點(diǎn)
uint8numClusterIds;//在簇標(biāo)識(shí)符表中簇標(biāo)識(shí)符的個(gè)數(shù)
uint16clusterIdList[MAX_BINDING_CLUSTER_IDS];//簇標(biāo)識(shí)符表
}BindingEntry_t;
SimpleDescription---Howtobinddevices
概述---怎樣綁定節(jié)點(diǎn)
綁定指的是兩個(gè)節(jié)點(diǎn)在應(yīng)用層上建立起來(lái)的一條邏輯鏈路。在同一個(gè)節(jié)點(diǎn)上可以建立多個(gè)綁定服務(wù),分別對(duì)應(yīng)不同種類的數(shù)據(jù)包。此外,綁定也允許有多個(gè)目標(biāo)節(jié)點(diǎn)(一對(duì)多綁定)。
舉個(gè)例子,在一個(gè)燈光網(wǎng)絡(luò)中,有多個(gè)開關(guān)和燈光設(shè)備,每一個(gè)開關(guān)可以控制一個(gè)或以上的燈光設(shè)備。在這種情況下,需要在每個(gè)開關(guān)中建立綁定服務(wù)。這使得開關(guān)中的應(yīng)用服務(wù)在不知道燈光設(shè)備確切的目標(biāo)地址時(shí),可以順利地向燈光設(shè)備發(fā)送數(shù)據(jù)包。
一旦在源節(jié)點(diǎn)上建立了綁定,其應(yīng)用服務(wù)即可向目標(biāo)節(jié)點(diǎn)發(fā)送數(shù)據(jù),而不需指定目標(biāo)地址了(調(diào)用zb_SendDataRequest(),目標(biāo)地址可用一個(gè)無(wú)效值0xFFFE代替)。這樣,協(xié)議棧將會(huì)根據(jù)數(shù)據(jù)包的命令標(biāo)識(shí)符,通過(guò)自身的綁定表查找到所對(duì)應(yīng)的目標(biāo)設(shè)備地址。
在綁定表的條目中,有時(shí)會(huì)有多個(gè)目標(biāo)端點(diǎn)。這使得協(xié)議棧自動(dòng)地重復(fù)發(fā)送數(shù)據(jù)包到綁定表指定的各個(gè)目標(biāo)地址。同時(shí),如果在編譯目標(biāo)文件時(shí),編譯選項(xiàng)NV_RESTORE被打開,協(xié)議棧將會(huì)把綁定條目保存在非易失性存儲(chǔ)器里。因此當(dāng)意外重啟(或者節(jié)點(diǎn)電池耗盡需要更換)等突發(fā)情況的發(fā)生時(shí),節(jié)點(diǎn)能自動(dòng)恢復(fù)到掉電前的工作狀態(tài),而不需要用戶重新設(shè)置綁定服務(wù)。
配置設(shè)備綁定服務(wù),有兩種機(jī)制可供選擇。如果目標(biāo)設(shè)備的擴(kuò)展地址(64位地址)已知,可通過(guò)調(diào)用zb_BindDeviceRequest()建立綁定條目。如果目標(biāo)設(shè)備的擴(kuò)展地址未知,可實(shí)施一個(gè)“按鍵”策略實(shí)現(xiàn)綁定。這時(shí),目標(biāo)設(shè)備將首先進(jìn)入一個(gè)允許綁定的狀態(tài),并通過(guò)zb_AllowBindResponse()對(duì)配對(duì)請(qǐng)求作出響應(yīng)。然后,在源節(jié)點(diǎn)中執(zhí)行zb_BindDeviceRequest()(目標(biāo)地址設(shè)為無(wú)效)可實(shí)現(xiàn)綁定。
此外,使用節(jié)點(diǎn)外部的委托工具(通常是協(xié)調(diào)器)也可實(shí)現(xiàn)綁定服務(wù)。請(qǐng)注意,綁定服務(wù)只能在“互補(bǔ)”設(shè)備之間建立。那就是,只有分別在兩個(gè)節(jié)點(diǎn)的簡(jiǎn)單描述結(jié)構(gòu)體(simpledescriptorstructure)中,同時(shí)注冊(cè)了相同的命令標(biāo)識(shí)符(command_id)并且方向相反(一個(gè)屬于輸出指令“output”,另一個(gè)屬于輸入指令“input”),才能成功建立綁定。
Thereare4waystobuildabindingtable:
建立一個(gè)綁定表格有四種方法可供選擇:
自動(dòng)綁定
一、負(fù)責(zé)發(fā)送消息的設(shè)備在網(wǎng)絡(luò)上廣播帶有如下參數(shù)的“個(gè)人公告”(PersonalAdvertisement):
(1)地址,配置文件標(biāo)識(shí)符,簇集合列表;
(2)描述符匹配請(qǐng)求-ZDP_MatchDescReq()。
二、匹配的設(shè)備會(huì)作出響應(yīng)。
三、由ZDO處理和驗(yàn)證響應(yīng)
四、負(fù)責(zé)發(fā)送消息的設(shè)備建立綁定表并保存綁定記錄。
五、這種方法有時(shí)也稱“服務(wù)發(fā)現(xiàn)”,“自動(dòng)找尋”或者“自動(dòng)匹配”。
ZigBee設(shè)備對(duì)象綁定請(qǐng)求-一種告訴目標(biāo)設(shè)備建立綁定記錄的委托工具,也稱輔助綁定。
任何一個(gè)設(shè)備或應(yīng)用服務(wù),都能通過(guò)無(wú)線信道向網(wǎng)絡(luò)上的另一個(gè)設(shè)備發(fā)送一個(gè)ZDO消息,幫助其建立一個(gè)綁定記錄。這稱為輔助綁定,在消息發(fā)向的設(shè)備上會(huì)建立一個(gè)綁定條目。
委托綁定的申請(qǐng):
任一個(gè)應(yīng)用服務(wù),通過(guò)向ZDP_BindReq()[definedinZDProfile.h]提供綁定記錄所需要的應(yīng)用服務(wù)入口參數(shù)(地址和端點(diǎn))以及簇標(biāo)識(shí)號(hào)(clusterID),即可啟動(dòng)委托綁定的申請(qǐng)。第一個(gè)參數(shù)(消息發(fā)送目標(biāo)地址)是綁定源節(jié)點(diǎn)的短地址(即保存綁定記錄的節(jié)點(diǎn)地址,這是因?yàn)閆DP需委托應(yīng)用框架AF輔助實(shí)現(xiàn)綁定,如果節(jié)點(diǎn)本身是REFLECTOR,并且希望保存綁定記錄,則此消息發(fā)送的目標(biāo)地址就是本地的AF,這與目標(biāo)節(jié)點(diǎn)的地址DestinationAddrofReceivingdevice不同)。
注意事項(xiàng):
確保[ZDConfig.h]中ZDO_BIND_UNBIND_REQUEST特性已經(jīng)打開!
你可以通過(guò)ZDP_UnbindReq()(使用相同參數(shù))來(lái)移除綁定記錄。
被請(qǐng)求輔助綁定的目標(biāo)設(shè)備會(huì)返回的ZDO申請(qǐng)綁定或者解除綁定的應(yīng)答消息。此ZDO消息會(huì)被解析并通過(guò)調(diào)用ZDApp_BindRsp()或ZDApp_UnbindRsp()告知ZDApp.c此次請(qǐng)求的結(jié)果。
對(duì)于申請(qǐng)綁定的應(yīng)答消息,從協(xié)調(diào)器返回的狀態(tài)可能有ZDP_SUCCESS,ZDP_TABLE_FULLorZDP_NOT_SUPPORTED。
對(duì)于解除綁定的應(yīng)答消息,從協(xié)調(diào)器返回的狀態(tài)可能有ZDP_SUCCESS,ZDP_NO_ENTRYorZDP_NOT_SUPPORTED。
綁定是由外部的設(shè)備發(fā)起(“外部”的意思是發(fā)起綁定的不是綁定的對(duì)象之一)。
外部設(shè)備應(yīng)用程序以兩個(gè)應(yīng)用服務(wù)(地址和端點(diǎn))和簇標(biāo)識(shí)符作為參數(shù)調(diào)用ZDP_BindReq()發(fā)起綁定。第一個(gè)參數(shù)就是綁定記錄保存的設(shè)備地址。
確保編譯選項(xiàng)REFLECTOR已經(jīng)打開!
函數(shù)解析:
ZDP_BindReq()實(shí)際上是調(diào)用ZDP_BindUnbindReq()的一個(gè)宏。這一調(diào)用會(huì)產(chǎn)生并發(fā)送一個(gè)綁定的請(qǐng)求,使得ZigBee協(xié)調(diào)器根據(jù)簇標(biāo)識(shí)號(hào)clusterID對(duì)相應(yīng)的應(yīng)用服務(wù)實(shí)施綁定。
函數(shù)原型:
afStatus_tZDP_BindReq(zAddrType_t*dstAddr,byte*SourceAddr,byteSrcEPIntf,byteClusterID,byte*DestinationAddr
,byteDstEPIntf,byteSecuritySuite)
參數(shù)細(xì)節(jié):
DstAddr-消息發(fā)送地址(負(fù)責(zé)綁定的設(shè)備地址)
SourceAddr–源節(jié)點(diǎn)的64位IEEE地址
SrcEPIntf–源節(jié)點(diǎn)應(yīng)用服務(wù)的端點(diǎn)
ClusterID–需要綁定的簇標(biāo)識(shí)符
DestinationAddr–目標(biāo)節(jié)點(diǎn)的64位IEEE地址
DstEPIntf–目標(biāo)節(jié)點(diǎn)應(yīng)用服務(wù)的端點(diǎn)
SecuritySuite-安全機(jī)制模式
返回值:afStatus_t–此函數(shù)需要借助AF發(fā)送(AF_DataRequest())生成的消息,因此返回值是AF狀態(tài)值。
ZigBee設(shè)備對(duì)象終端節(jié)點(diǎn)綁定請(qǐng)求-兩個(gè)設(shè)備可向協(xié)調(diào)器告知他們想建立一個(gè)綁定表記錄。協(xié)調(diào)器通過(guò)安排配對(duì)并分別在這兩個(gè)設(shè)備上建立綁定表?xiàng)l目,也稱集中式綁定。
這一機(jī)制規(guī)定在指定的時(shí)限內(nèi),通過(guò)按鍵或者其他類似動(dòng)作對(duì)指定的設(shè)備實(shí)施綁定。在規(guī)定的時(shí)限內(nèi),協(xié)調(diào)器負(fù)責(zé)收集終端設(shè)備綁定請(qǐng)求消息,然后根據(jù)相同的配置文件標(biāo)識(shí)號(hào)和簇標(biāo)識(shí)號(hào)建立相應(yīng)的綁定表格條目。默認(rèn)的終端節(jié)點(diǎn)綁定時(shí)限(APS_DEFAULT_MAXBINDING_TIME)是16秒(在nwk_globals.h中定義),若要修改可在f8wConfig.cfg中新增數(shù)值。
所有例子的應(yīng)用服務(wù)中都有一個(gè)響應(yīng)按鍵事件的函數(shù)(例如,TransmitApp.c中的TransmitApp_HandleKeys())。這一響應(yīng)函數(shù)調(diào)用ZDApp_SendEndDeviceBindReq()[在ZDApp.c中]收集該應(yīng)用服務(wù)端點(diǎn)的所有信息,然后再調(diào)用ZDP_EndDeviceBindReq()[在ZDProfile.c中]把信息發(fā)送給協(xié)調(diào)器?;蛘?,像SampleLight和SampleSwitch例程中,按鍵后直接調(diào)用ZDP_EndDeviceBindReq(),僅把與開關(guān)燈函數(shù)相關(guān)的簇標(biāo)識(shí)號(hào)發(fā)送出去。
這一消息將會(huì)被協(xié)調(diào)器接收[ZDP_IncomingData()inZDProfile.c]和解析[ZDO_ProcessEndDeviceBindReq()inZDObject.c],然后讓回調(diào)函數(shù)ZDApp_EndDeviceBindReqCB()[inZDApp.c]調(diào)用ZDO_MatchEndDeviceBind()[ZDObject.c]處理這一請(qǐng)求。
當(dāng)協(xié)調(diào)器接收到第一個(gè)綁定請(qǐng)求時(shí),他會(huì)在一定的時(shí)限內(nèi)保留這一請(qǐng)求并等待第二個(gè)請(qǐng)求的出現(xiàn)。(默認(rèn)的最長(zhǎng)時(shí)間間隔是16秒)。
一旦協(xié)調(diào)器接收到兩個(gè)需要匹配的終端設(shè)備綁定請(qǐng)求時(shí),它就會(huì)啟動(dòng)綁定過(guò)程,為發(fā)出請(qǐng)求的設(shè)備建立源綁定條目。假設(shè)在ZDO終端設(shè)備綁定請(qǐng)求中找到匹配,協(xié)調(diào)器將采取以下步驟:
1.協(xié)調(diào)器發(fā)送一個(gè)ZDO解除綁定請(qǐng)求給第一個(gè)設(shè)備。終端設(shè)備綁定是一個(gè)切換過(guò)程,所以解除綁定請(qǐng)求需要發(fā)送給第一個(gè)設(shè)備,以便移除一個(gè)已有的綁定條目。
2.等待ZDO解除綁定的應(yīng)答,如果返回的狀態(tài)是ZDP_NO_ENTRY,協(xié)調(diào)器可以發(fā)送一個(gè)ZDO綁定請(qǐng)求,在源設(shè)備(ZDP_EndDeviceBindReq()第一個(gè)參數(shù)指定的地址)中建立綁定條目。假如此時(shí)返回的狀態(tài)是ZDP_SUCCESS,可繼續(xù)處理第一個(gè)設(shè)備的簇標(biāo)識(shí)符(解除綁定指令已經(jīng)移除了綁定條目,即已經(jīng)切換完成)。
3.等待ZDO綁定應(yīng)答。收到以后,繼續(xù)處理第一個(gè)設(shè)備的下一個(gè)簇標(biāo)識(shí)符。
4.等第一個(gè)設(shè)備完成了以后,在第二個(gè)設(shè)備上實(shí)行同樣的過(guò)程。
5.等第二個(gè)設(shè)備也完成了,協(xié)調(diào)器向兩個(gè)設(shè)備發(fā)送ZDO終端設(shè)備綁定應(yīng)答消息。
注意打開編譯選項(xiàng):REFLECTOR和ZDO_COORDINATOR
ZDApp_SendEndDeviceBindReq()
優(yōu)點(diǎn):
1.綁定信息保存在網(wǎng)絡(luò)反射設(shè)備(例如協(xié)調(diào)器、路由器)中,可以節(jié)省目標(biāo)設(shè)備的內(nèi)存空間。
2.網(wǎng)絡(luò)反射設(shè)備總是處于監(jiān)聽網(wǎng)絡(luò)的狀態(tài)。所以,如果其中一個(gè)被綁定的節(jié)點(diǎn)廣播網(wǎng)絡(luò)地址改變的消息,網(wǎng)絡(luò)反射設(shè)備就可以馬上更新相應(yīng)的綁定表?xiàng)l目。這樣,其他被綁定的節(jié)點(diǎn)即使處于休眠狀態(tài)(沒有收到該節(jié)點(diǎn)網(wǎng)絡(luò)地址改變的消息),隨后向該節(jié)點(diǎn)(網(wǎng)絡(luò)地址已改變)發(fā)送的消息,(在)網(wǎng)絡(luò)反射設(shè)備(協(xié)助下)仍能準(zhǔn)確定位。
缺點(diǎn):
1.一個(gè)與多個(gè)設(shè)備綁定的節(jié)點(diǎn)不能只向一個(gè)或若干個(gè)配對(duì)的設(shè)備發(fā)送消息。網(wǎng)絡(luò)反射設(shè)備會(huì)向全部已綁定的設(shè)備本別發(fā)送單播消息。
2.發(fā)送消息的設(shè)備無(wú)法收到目標(biāo)設(shè)備接收情況的通告。(沒有像AF_ACK_REQUEST標(biāo)志位那樣返回接收情況的功能?。?/p>
3.所有的消息必須經(jīng)過(guò)網(wǎng)絡(luò)反射設(shè)備傳輸,降低了網(wǎng)絡(luò)的帶寬。
進(jìn)一步分析:
與六個(gè)設(shè)備綁定的某個(gè)設(shè)備,向網(wǎng)絡(luò)反射器發(fā)送一個(gè)消息后,會(huì)導(dǎo)致反射器發(fā)送六個(gè)單播消息。假設(shè)一個(gè)網(wǎng)絡(luò)被分成兩個(gè)相等的地理區(qū)域A和B,網(wǎng)絡(luò)反射器在兩區(qū)之間的中央。如果發(fā)送消息的設(shè)備在A區(qū)的深處,接收消息的(六個(gè))設(shè)備在B區(qū)的深處,那么每次通過(guò)綁定(向反射器)發(fā)送一個(gè)消息,A區(qū)的網(wǎng)絡(luò)流量將會(huì)是對(duì)六個(gè)接收設(shè)備分別發(fā)送消息時(shí)的六分之一。(這是優(yōu)點(diǎn)?。┑绻l(fā)送和接收的設(shè)備都鄰近在一個(gè)區(qū)的深處(假設(shè)離反射器很遠(yuǎn)),那么(其中一個(gè)設(shè)備通過(guò)反射器的綁定功能想其他設(shè)備發(fā)送一個(gè)消息)該區(qū)的網(wǎng)絡(luò)流量將會(huì)是對(duì)六個(gè)接收設(shè)備分別發(fā)送單跳消息的許多倍。(這是缺點(diǎn)!)
設(shè)備的應(yīng)用服務(wù)-設(shè)備上的一個(gè)應(yīng)用服務(wù)可以建立或者維護(hù)一個(gè)綁定表。進(jìn)入設(shè)備上綁定條目的另一種方法是由應(yīng)用服務(wù)本身去管理綁定表。
這意味著應(yīng)用服務(wù)通過(guò)調(diào)用以下的綁定表管理函數(shù),可以在本地進(jìn)入或者移除綁定表的條目。
管理綁定表使用的API:
bindAddEntry()–綁定表中加條目
bindRemoveEntry()–綁定表中移除條目
bindRemoveClusterIdFromList()–從一個(gè)已有的綁定表?xiàng)l目中移除一個(gè)簇標(biāo)識(shí)符
bindAddClusterIdToList()–在一個(gè)已有的綁定表?xiàng)l目中加入一個(gè)簇標(biāo)識(shí)符
bindRemoveDev()–移除某目標(biāo)地址的所有條目
bindRemoveSrcDev()–移除某源地址的所有條目
bindUpdateAddr()–更新條目到新的地址
bindFindExisting()–查找一個(gè)綁定條目
bindIsClusterIDinList()–在綁定條目中查找一個(gè)已有的簇標(biāo)識(shí)符
bindNumBoundTo()–某一地址(源地址或目標(biāo)地址)綁定條目的個(gè)數(shù)
bindNumOfEntries()–綁定表?xiàng)l目的個(gè)數(shù)
bindCapacity()–允許的最大綁定條目數(shù)
BindWriteNV()–在NV中保存新的綁定表
WhichBindingMethodToUse?
我們應(yīng)該選擇哪一種綁定方式?
Automatic
+nouserinteractionrequired
+notoolcost
-developmenttimeknowledge
-non-configurable
Assisted
+install-timedecisions(site-specificknowledge)
+analysis,maintenance,modification,visualization
canbeunderinstallerscontrol
-costoftool
Centralized
+allowsusertodecide
+costoftoolminimal
-few,ifany,configurableparameters
-requiresauserinterfaceoneachdevice
Application
+maximumflexibility
-youmustwriteallthecode
【編輯推薦】
- ZigBee協(xié)議棧網(wǎng)絡(luò)層的研究與實(shí)現(xiàn)
- ZigBee無(wú)線技術(shù)的新展望
- ZigBee應(yīng)用的小介紹
- 簡(jiǎn)要分析ZigBee無(wú)線網(wǎng)絡(luò)的設(shè)計(jì)及應(yīng)用