再談ZigBee中的繫結機制

2021-07-05 12:41:59 字數 4900 閱讀 2356

這裡主要再討論一下繫結的機制,繫結是

zigbee

中應該是比較重要的乙個部分。前面的幾篇文章也對繫結有了具體的分析,主要分析了兩種繫結方式,介紹了繫結的流程,源**方面。這裡主要是理清整個繫結在組網中的概念。繫結是和

endpoint

緊密聯絡在一起的,其中很多是自己通過看資料,自己的一些理解,當中肯定有不正確的地方,歡迎有興趣的一起討論。

zigbee

中還有乙個重要的概念端點,理解的不是很清楚,現在再一次總結分析一下,端點是應用物件存在的地方,

zigbee

允許多個應用同時位於乙個節點上,例如乙個節點具有控制燈光的功能,又具有感應溫度的功能,又具有收發文字訊息的功能,這種設計有利於複雜

zigbee

裝置的出現。我們可以從

zigbee

的體系結構圖中可以看到可以有

240個應用,也就是說乙個物理的

zigbee

裝置的話,可以有

240個具體的應用,例如上面提到的其中的三種具體的應用。

一共有二個特殊的端點,即端點

0和端點

255。端點

0用於整個

zigbee

裝置的配置和管理。應用程式可以透過端點0與

zigbee

堆疊的其它層通訊,因而實現對這些層的初始化和配置。附屬在端點

0的物件被稱為

zigbee

裝置物件

(zdo)

。端點255

用於向所有端點的廣播。端點

241到

254是保留端點。

所有端點都使用應用支援子層

(aps)

提供的服務。

aps透過網路層和安全服務提供層與端點相接,並為資料傳送、安全和固定服務,因此能夠適配不同但相容的裝置,如帶燈的開關。

下面是終端的描述符的結構體定義。

typedef struct

endpointdesc_t;

//裝置的簡單描述結構

typedef struct

輸入命令列表

輸出命令個數

輸出命令列表

} ******descriptionformat_t;

下面是在

程式中簡單描述符的定義。 ;

;在ti給的例子中都只是定義了乙個端點,猜想是不是每乙個應用中都必須有乙個相應的端點,也就會有乙個相應的端點描述符。例如這裡的三個應用,乙個節點具有控制燈光的功能,又具有感應溫度的功能,又具有收發文字訊息的功能,那麼需要占用三個端點號,也就會需要三個端點的描述符,因為在傳送資料的函式中會用到這個端點的描述符。

在繫結的應用中必須要用到端點的描述符,可不可以這樣理解就是說,在繫結時其實並不是兩個裝置之間的繫結,其實質是在這兩個裝置上兩個端點之間的繫結,再進一步說就是兩個應用之間的繫結,因為在乙個終端中可能有很多的應用,也就是端點,可不以在乙個端點中只和其中的乙個應用進行繫結,也就是只和其中的乙個端點進行繫結,其他的端點可以使用別的位址方式,如直接位址模式,或者是廣播位址的方式,進行資料的處理。雖然和同乙個裝置進行了繫結,但是其中的應用並不相同。描述符匹配是不是就是這個意思。如果兩個裝置沒有相同的描述符是不會繫結成功的。

case match_desc_rsp:

osal_mem_free( prsp ); }

}break;

在下面的函式中是繫結必須要執行乙個處理函式,這個函式就是處理和回應對match_desc_req 訊息。這個函式在繫結的第三篇文章中也有分析到。

void zdo_processmatchdescreq( zdoincomingmsg_t *inmsg )

numinclusters = *msg++;

if ( numinclusters )

numoutclusters = *msg++;

if ( numoutclusters )

/* first count the number of endpoints that match.

typedef struct

eplist_t; */

epdesc = eplist;

while ( epdesc )//

掃瞄本節點的全部ep,看是否有匹配的?這個是乙個鍊錶的形式儲存的。

else

如果profileid相同,這裡也就說明了為什麼會在繫結的時候要求profileid相同了。sdesc不為空的話,

else

if (numoutclusters)

else

osal_msg_send( *epdesc->epdesc->task_id, (uint8 *)prspsent ); }

uint8buf[epcnt++] = sdesc->endpoint;//

匹配endpoint

列表,這個就是

match_desc_rsp

回傳的內容之一 }

}if ( allocated )

osal_mem_free( sdesc ); }

epdesc = epdesc->nextdesc; }

// send the message only if at least one match found. 

如果發現至少有乙個匹配的以後,傳送匹配訊息

if ( epcnt )

} else

if ( inclusters )

osal_mem_free( inclusters );

if ( outclusters )

osal_mem_free( outclusters ); }

從上面的**內容中也可以看到,當兩個節點繫結時,進行的匹配實質是描述符之間的匹配。當然繫結時可能有多個的描述符的匹配,不知道我這樣的理解是否正確,如果網友有這方面的經驗歡迎討論一下!!

這裡還有一點就是繫結服務只能在「互補

」裝置之間建立。那就是,只有分別在兩個節點的簡單描述結構體(

****** descriptor structure

)中,同時註冊了相同的命令識別符號(

command_id

)並且方向相反(乙個屬於輸出指令

「output

」,另乙個屬於輸入指令

「input

」),才能成功建立繫結。

通過檢視

ti給我例子程式中,只有開頭的例程才算是真正意義上的乙個是輸出,乙個是輸入。

對於燈結點是輸入,

const cid_t zb_incmdlist[num_in_cmd_controller] =

;// define ******descriptor for switch device

const ******descriptionformat_t zb_******desc =

;對於開關結點是輸出。

const cid_t zb_outcmdlist[num_out_cmd_switch] =

;// define ******descriptor for switch device

const ******descriptionformat_t zb_******desc =

;可以在

和的例程中看到,並沒有嚴格的按照這樣的命令來。例如下面的

例程中,當然這樣也是兩個裝置中的命令也是相反的,只是沒有開關那個例程中更加直觀,;;

aps繫結表是在靜態

ram中定義的一張表,定義在

nwk_globals.c

中。表的大小可以通過

f8wconfig.cfg

中的/* maximum number of entries in the binding table. */

-dnwk_max_binding_entries=10

/* maximum number of cluster ids for each binding table entry. */

-dmax_binding_cluster_ids=5

只有定義了

reflector

或者coordinator_binding

才能包含此表,用

reflector

編譯選項來支援

aps層的源繫結。

邦定表結構

– bindingentry_t

typedef struct

bindingentry_t;

srcidx –

源位址(繫結記錄的源位址)的位址管理器索引,位址管理器儲存著源位址的

ieee

位址和短位址。

srcep -

源終端dstgroupmode    -

目的位址型別。

0   

普通位址

1   

組位址dstidx  -

若dstgroupmode為0

,則包含目的位址的位址管理器索引,若

dstgroupmode為1

,則包含目的組位址

dstep   -

目的終端

numclusterids   -clusteridlist

中的入口數目

clusteridlist   -簇id

列表。列表的最大數目定義由

max_binding_cluster_ids [f8wconfig.cfg]

指定還有一點就是繫結裝置之間的通訊方式更加的靈活,這主要體現在那裡呢我想可能有下面幾個原因,一是在前面也有介紹繫結有四種方式,主要介紹了兩種一種是通過協調器,另一種是不通過協調器的繫結,這樣可選擇性多,但使用點對點的通訊時,必須要通過

ieee位址得到網路中的短位址,也必須借助協調器進行,協調器的短位址是知道。第二個原因時:繫結也可以實現一對多的繫結,也就是相當於了組廣播了,第三,繫結有較多的api操作進行,當終端結點離開或者有乙個新的裝置加入網路時,可以主動完成繫結過程,

繫結的分析就到這裡吧。如果有什麼不對的地方,歡迎一起討論。

再談Java的Thread機制 3

同步出現的原因是當執行緒中使用共享資源時候,為了資源的獨占性。這樣可以避免獲得結果是不正確的。如果,不是使用共享資源,不建議使用同步!因為這會使多執行緒變成單執行緒!而且處理不當,會引起死鎖!比如我們所寫執行緒程式要的結果是 count value is 1 count value is 2 cou...

再談Java的Thread機制 3

同步出現的原因是當執行緒中使用共享資源時候,為了資源的獨占性。這樣可以避免獲得結果是不正確的。如果,不是使用共享資源,不建議使用同步!因為這會使多執行緒變成單執行緒!而且處理不當,會引起死鎖!比如我們所寫執行緒程式要的結果是 count value is 1 count value is 2 cou...

WPF 中雙向繫結通知機制

inotifypropertychanged實現 inotifypropertychanged會向客戶端發出某一屬性值已更改的通知。當元素屬性值改變時,會通知後台model 前台 不變,我們讓後台students model實現inotifypropertychanged介面。通過dataconte...