這裡主要再討論一下繫結的機制,繫結是
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...