ZigBee HomeAutomation分析


引用請注明出處!聯系郵箱是huhao0126@163.com

 

本例程講解,基於TI CC2530-2.5.1a中的HomeAutomation文件夾中的SampleLight和SampleSwitch例子來講解。

由於使用了ZCL標准簇庫和HA profile,在數據傳輸處理上,相對比較復雜,只要耐心的去看,多和別人溝通交流,搞懂流程是遲早的事。

1. 功能介紹

雙方板子上電后,在Switch的板子上,按下SW_2,會向SampleLight板子發送綁定請求,SampleLight的板子接收此請求后,建立綁定關系。之后,Switch的板子上面,按下SW_1,會向SampleLight的板子發送切換燈狀態的命令,SampleLight收到此命令后,進行相關的操作。

samplesw 規定了三個按鍵:

      SW_1:向燈泡發起開關的命令

      SW_2:初始化終端設備綁定請求(開關只有輸出命令)

      SW_4:初始化匹配描述請求(我給出輸入配置,周圍哪個設備可以接收此輸入配置)

samplelight 定義了一個按鍵的:

       SW_2:初始化終端設備綁定請求

2. ZCL詳細初始化

需要使用ZCL層,必須先把應用程序的簡單描述符注冊到HA profile里面去,zclHA_Init初始化里面,比較重要的一句話是  image

基於ZCL的應用程序,注冊端點信息時,需要將自己接受任務的ID賦予為ZCL_TaskID,這意味着,發向應用程序的消息,會首先被ZCL層接收並且處理,ZCL層處理不了的數據,會轉發到應用層來處理。

image

注冊ZCL通用簇庫的回調函數列表,通用簇庫已經定義好了不同命令處理程序的框架表,我們需要實現什么功能,就填充對於的回調函數處理。

注冊應用程序屬性列表,表明此端點綁定的相關屬性信息,一個簇,可以有多個屬性,每個屬性有屬性ID,數據類型,權限,數據組成。對命令(簇)的操作,實際上是對之前已經和簇建立關系的屬性值的操作,簇屬性由ZCL_samplelight_data.c來定義。

下圖是ZCL簇命令和對於的回調函數列表

image

1. 標准簇ID(ZCL_CLUSTER_ID_GEN_BASIC)下面,可以有硬件版本的屬性、ZCL版本屬性、制造商名稱屬性等。

    當收到ZCL_CLUSTER_ID_GEN_BASIC命令時,會調用zclSampleLight_BasicResetCB來響應,其他的類似。

2. 認證簇(ZCL_CLUSTER_ID_GEN_IDENTIFY)下面,可以有認證時間的屬性。

    當接收到認證簇下面的Identify command命令時,通過zclSampleLight_IdentifyCB來響應

    當接收到認證簇下面的Identify Query Response命令,通過zclSampleLight_IdentifyQueryRspCB來響應。

    當接收到On/Off簇下面的On/Off/Toggle命令時,通過zclSampleLight_OnOffCB來響應。

 

上面是對ZCL層大致處理流程的接收,接下來,是對ZCL如何處理這些流程,進行詳細的分析。

1. 首先是ZCL的初始化,它的初始時是在應用程序初始化之前進行的,主要進行插件和屬性列表的初始化。

image

2.  在應用程序的初始化中,有如下調用

image

image

初始化時,zcl_RegisteredMsgTaskID為0xFF,所以,這條函數執行后,zcl_RegisteredMsgTaskID會為應用程序的TaskID。

在ZCL的事件處理循環中,有如下語句:

image

在ZCL的事件輪訓處理中,當端點接收到發向ZCL或者應用程序的消息時,會觸發SYS_EVENT_MSG消息,在消息列表中取出zcl_TaskID的消息,如果是數據,則由 zclProcessMessageMSG 來處理,如果是其他類型的數據,則向應用程序(zclSampleLight_TaskID)發送SYS_EVENT_MSG事件,並且攜帶msgPtr消息信息。

下面來,分析ZCL的具體事件處理函數 zclProcessMessageMSG。

image

從函數的說明上來說,此函數處理所有到來的數據消息,基於消息中的簇ID來分發消息,執行對於的消息回調函數,下面來看看,具體是怎么個流程。

 image

先把收到的信息進行簡單的解析,然后,根據端點號找到對應的端點描述符(epDesc),

然后根據端點號和簇ID,找到對應的發送選項值。

image

再然后,根據簇ID到合適的處理插件(plugin),具體函數為zclFindPlugin。每一種處理插件,都只針對一定范圍內的簇ID起作用,以下是插件的數據結構:

image

在不同的插件,通過不同的簇ID范圍來區分,針對一個特定的簇ID,獲取對於的回調函數來處理。問題來了,插件的初始化在ZCL_init中是為空的呀?那具體填充簇ID和對於處理函數的操作在哪里呢?跟着這個問題,繼續往下找。

在這里: image

看到沒有,對於每一個插件的注冊,都需要起始簇ID,結束簇ID,他們規定了插件的使用范圍,后面一個參數,就是不同簇對於的回調函數列表了,插件與插件之間,通過鏈表相連。插件的初始化是在

image

image

插件的回調函數統一由zclGeneral_HdlIncoming來處理,這個函數,對收到的命令,進行一些基本的過濾  image

上述函數的下半部分: image

根據傳入進來的回調函數數組指針,賦值為全局ZCL通用回調指針。

 

zclGeneral_HdlInSpecificCommands中,在根據收到信息的端點,在找到對應的回調函數    image

根據端點找對於的回調函數,是在zclGenCBs鏈表中去找,具體函數為zclGeneral_FindCallbacks。問題又來了,zclGenCBs由是在哪里初始化的呢?上文已經提及到了。這里就不再提及的。

后面的處理流程,就比較好理解了,根據簇ID,來調用不同的處理函數,由於是統一的回調處理,不同的處理函數的調用格式是完全一樣的,在這里,就以開關燈來說明。

image

pInMsg為接收到的數據,pCBs為指定端點對於的回調函數列表。

image

處理函數,首先判斷接收到的數據方向和命令ID的有效范圍,如果通過的話,則調用對於的處理函數來處理。從這里面可以看出,不同命令ID和處理函數之間,是人為的指定對應關系。上述的調用,就會跳到:

zclSampleLight_OnOffCB

image

 

上述,從開關的發送命令

zclGeneral_SendOnOff_CmdToggle( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr, false, 0 );

 

到燈光這邊的接收處理,zclSampleLight_OnOffCB

基本上流程,大體上分析清楚了,其他的命令和響應,只需要遵旨一定的操作,就可以完成。

 

                                                                              2014-06-16  浩天之家 完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM