2009年7月3日 星期五

ZigBee之概要原理-2

這部份是要介紹IEEE的部份,大家一定都聽過這個名稱,但後面的802.15.......可能不了解其意思,所以希望能給大家了解 IEEE是什麼。

IEEE(Institute of Electrical&Electronics Engineers),中文意思是電氣與電子工程師協會,提案無線LAN的IEEE 802.11 工作組的標準化活動取得了成功,並受到高度評價,之後便設立了802.15的工作組,從而進行無線PAN的標準
化活動。

IEEE的近距離無線標準化:

1.IEEE 802.15.1︰1Mbps左右的中傳輸速度的PAN技術。

2.IEEE 802.15.2︰Bluetooth和無線LAN共存(在同一場所互不影響地同時使用)的技術事項的研討。

3.IEEE 802.15.3︰高傳輸速度PAN的WiMedia的規格。主要以動畫、聲音等多媒體信號為目標的規範。但是沒有產品化的實效。

4.IEEE 802.15.4︰低傳輸速度的PAN規格。主要以無線感測網路為物件的規範。

5.IEEE 802.15.1a︰提出IEEE 802.15.1的Bluetooth 1.1的改善方案。

6.IEEE 802.15.3a︰提出UWB(Ultra Wide Band)的標準化方案。UWB原本是從美軍事用的雷達技術發展起來的技術,是以低耗電就能進行工作的通信方式。有望成為可以利用USB介面的無線通信。

7.IEEE 802.15.4a︰和以往的IEEE 802.15.4 的實體層完全不同,新的無線感測網路的實體層作為3.1~10.6 GHz頻寬的UWB和2.4 GHz頻率的新調變方式CSS(Chrip Spread Spectrum)被提案。UWB調變方式支援如雷達精準度為1米的位置偵測功能。同樣是採用UWB,但與IEEE 802.15.3a有很大的區別。IEEE 802.15.3a以近距離範圍的高速網路為目標,而IEEE 802.15.4a是以遠距離的低速網路為目標的規範。

8.IEEE 802.15.4b︰相對於以往的IEEE 802.15.4 規格,提出將信標的中繼功能等模糊的部份明確化,新增能在日本中國以及歐洲得以開放的900MHz頻率頻寬的頻道。

9.IEEE 802.15.5︰提出網狀網路所必需的實體層和媒體層相關議案。

*ZigBee是屬於802.15.4

*註解:PAN(Personal Area Network) LAN(Local Area Network)
資料參考自"ZigBee開發手冊 鄭立 著"

ZigBee之概要原理

ZigBee組的分工裡頭我是負責弄清楚ZigBee的通訊原理以及與其它通訊產品比較的優缺點,為了幫助小組的研究我決定從基礎的構造研究起,對ZigBee越熟悉相信對我們的專題更有幫助。

由國際標準化機構(ISO)提案的網路模式結構中,將網路的功能分成七層,分別是實體層、資料連結層、網路層、傳輸層、通話層、表示層、應用層,但這七層是以有線電纜的模式為主,後來開發的實際網路中很多都沒有將這七層全部進行設置,IEEE 802.15.4課題組和zigbee聯盟統合以往的第4層到第7層且定義為應用層,成為以下4層的結構︰



1.實體層(PHY)︰決定無線通訊所需的相關物理性載體。ex︰頻率、頻道、調變方式、基本通信框的構成等。

2.媒體層(MAC)︰資訊應被準確傳輸。ex︰因在電波干擾等原因導致通信發生錯誤的場合,具有檢測錯誤、修改錯誤、再次發送請求的功能。

3.網路層(NWK)︰網路管理、路由管理、網路內的資訊傳輸。

4-1.應用支援子層︰包含在應用層內,確定應用程式之間的邏輯性的通信路徑,應用程式間的資料交換,應用程式間資訊的送達確認以及再次發送請求
4-2.應用層︰使用者的通信應用。

2009年7月2日 星期四

Source Code 分析筆記-4

ZigBee Home Sensor Demonstration(end device code)

AppColdStart()
這個函數是最主要的應用進入位置,在開機載入完畢之後將會呼叫它,此函數找尋網路連結(channel以及Pan ID)之後呼叫起始 function: vInitDemoSystem()

AppWarmStart()
當cpu暖開機或重啟時(ram的資料還保存)會呼叫此函數,在這個範例中這個模式並沒有被使用,所以這個函數只是呼叫AppColdStart() 於非安全機制下

JZA_boAppStart()
此函數在初始化後會呼叫ZigBee的堆疊,並設置對profile的資訊以及敘述之後呼叫ZigBee堆疊中的函數開始以End device加入網路位置

JZA_vAppDefineTasks()
這個函數可用來增加應用項目,在這個應用示範中並沒有使用到這個函數

JZA_eAfKvpObject()
當接收到KVP協定訊息時此函數將會被呼叫,其中的資訊將被用來控制 LED 0

JZA_vAfKvpResponse()
當KVP協定先前的請求被確認時,此函數將會被呼叫並且接收回應,這個應用範例並沒有使用到這個函數

JZA_pu8AfMsgObject()
當接受MSG協定時此函數將被呼叫,這個應用範例並沒有使用到這個函數

JZA_vZdpResponse()
當接受到ZDP響應時此函數將被呼叫,這個應用範例並沒有使用到這個函數

JZA_vAppEventHandler()
ZigBee堆疊將會定期的呼叫此函數,是用來處理硬體的中斷序列

wake timer 是用來開始讀取simple state machine的sensor DIO pin 的中斷可發展state machine,溼度溫度sensor完成讀取操將控制它

DIO pin的中斷連結到sensor板子上的按鈕,是用來設置通過用來控制Coordinator上LED的值

JZA_vPeripheralEvent()
當硬體周邊產生中斷,處理器處理中斷程序內容時,此函數將會被呼叫
此外為了讓動作量達到最小值,關於中斷的資訊將會被置於FIFO queue,JZA_vAppEventHandler() 函數之後將會讀取這些資訊

vInitDemoSystem()
此函數將會呼叫ZigBee堆疊的初始化函數,並且初始化將會用到的硬體使其可作用

20-Hz脈波的Wake-up timer在這裡將會被校準並且啟用,但是並不會開始動作

函數的最後動作是啟動BOS,在這個函數並不會有回傳的動作

vSendData()
此函數製造協定KVP的傳輸請求,用來傳送sensor的資訊以及控制Coordinator的LED

vStartReadSensors()
此函數開始讀取溫度sensor並且在下一秒啟動wake timer,它設置了溫度sensor的DIO pin的中斷

vReadSensor2()
此函數開始讀取溫度數值並且開始讀取溼度sensor,它設置了溫度sensor的DIO pin的中斷

vReadSensor3()
此函數開始讀取溼度數值並且開始讀取光感sensor,讀取光感時並不會有延遲產生,在稍後會呼叫函數vSendData() 並且傳送一個包含讀取sensor的frame

vInitEndpoint()
此函數設置了內部的變量

u8FindMin()
此函數回傳了兩個量值中最小的




上述的資料說明請參閱JN-UG-3033-ZigBee-HomeSensorDemo-1v3.pdf

Source Code 分析筆記-3

接續昨天的內容

ZigBee Home Sensor Demonstration(router code)


AppColdStart()
這個函數是最主要的應用進入位置,在開機載入完畢之後將會呼叫它,此函數找尋網路連結(channel以及Pan ID)之後呼叫起始 function: vInitDemoSystem()

AppWarmStart()
當cpu暖開機或重啟時(ram的資料還保存)會呼叫此函數,在這個範例中這個模式並沒有被使用,所以這個函數只是呼叫AppColdStart() 於非安全機制下

JZA_boAppStart()
此函數在初始化後會呼叫ZigBee的堆疊,並設置對profile的資訊以及敘述之後呼叫ZigBee堆疊中的函數開始建立起Router的網路位置

JZA_vAppDefineTasks()
這個函數可用來增加應用項目,在這個應用示範中並沒有使用到這個函數

JZA_eAfKvpObject()
當接收到KVP協定訊息時此函數將會被呼叫,其中的資訊將被用來控制 LED 0

JZA_vAfKvpResponse()
當KVP協定先前的請求被確認時,此函數將會被呼叫並且接收回應,這個應用範例並沒有使用到這個函數

JZA_pu8AfMsgObject()
當接受MSG協定時此函數將被呼叫,這個應用範例並沒有使用到這個函數

JZA_vZdpResponse()
當接受到ZDP響應時此函數將被呼叫,這個應用範例並沒有使用到這個函數

JZA_vAppEventHandler()
ZigBee堆疊將會定期的呼叫此函數,是用來處理硬體的中斷序列

wake timer 是用來開始讀取simple state machine的sensor DIO pin 的中斷可發展state machine,溼度溫度sensor完成讀取操將控制它

DIO pin的中斷連結到sensor板子上的按鈕,是用來設置通過用來控制Coordinator上LED的值

JZA_vPeripheralEvent()
當硬體周邊產生中斷,處理器處理中斷程序內容時,此函數將會被呼叫
此外為了讓動作量達到最小值,關於中斷的資訊將會被置於FIFO queue,JZA_vAppEventHandler() 函數之後將會讀取這些資訊


vInitDemoSystem()
此函數將會呼叫ZigBee堆疊的初始化函數,並且初始化將會用到的硬體使其可作用

20-Hz脈波的Wake-up timer在這裡將會被校準並且啟用,但是並不會開始動作

函數的最後動作是啟動BOS,在這個函數並不會有回傳的動作

vSendData()
此函數製造協定KVP的傳輸請求,用來傳送sensor的資訊以及控制Coordinator的LED

vStartReadSensors()

此函數開始讀取溫度sensor並且在下一秒啟動wake timer,它設置了溫度sensor的DIO pin的中斷

vReadSensor2()
此函數開始讀取溫度數值並且開始讀取溼度sensor,它設置了溫度sensor的DIO pin的中斷

vReadSensor3()
此函數開始讀取溼度數值並且開始讀取光感sensor,讀取光感時並不會有延遲產生,在稍後會呼叫函數vSendData() 並且傳送一個包含讀取sensor的frame

vInitEndpoint()
此函數設置了內部的變量

u8FindMin()
此函數回傳了兩個量值中最小的




上述的資料說明請參閱JN-UG-3033-ZigBee-HomeSensorDemo-1v3.pdf

2009年7月1日 星期三

Source Code 分析筆記-2

最近研究的Jennic公司提供的範例(ZigBee Home Sensor Demonstration)

今日的筆記是將每個函數的定義翻譯完成,了解每個函數的定義,日後研究內部寫法能夠提供一些靈感

coordinator code

ZigBee Home Sensor Demonstration(coordinator code)


AppColdStart()
這個函數是最主要的應用進入位置,在開機載入完畢之後將會呼叫它,此函數設置了channel以及Pan ID之後呼叫起始 function: vInitDemoSystem()

AppWarmStart()
當cpu暖開機或重啟時(ram的資料還保存)會呼叫此函數,在這個範例中這個模式並沒有被使用,所以這個函數只是呼叫AppColdStart() 於非安全機制下

JZA_boAppStart
此函數在初始化後會呼叫ZigBee的堆疊,並設置對profile的資訊以及敘述之後呼叫ZigBee堆疊中的函數開始建立起網路

JZA_vAppEventHandler()
ZigBee堆疊將會定期的呼叫此函數,是用來處理硬體的中斷序列,以這邊的例子而言只有一個每50ms觸發一次的wake timer,是用來讀取按鈕的讀取時間以及更新顯示

JZA_vPeripheralEvent()
當硬體周邊產生中斷,處理器處理中斷程序內容時,此函數將會被呼叫
此外為了縮減花在中斷程序的時間,關於中斷的資訊將會被置於FIFO queue,JZA_vAppEventHandler() 函數之後將會讀取這些資訊

JZA_vStackEvent()
這個函數被呼叫用來處理堆疊低層的雜項事件,例如APS層的資料傳輸確認,在這個應用示範中並沒有使用到這個函數

JZA_vAppDefineTasks()
這個函數可用來增加應用項目,在這個應用示範中並沒有使用到這個函數

JZA_eAfKvpObject()
當接收到KVP協定訊息時此函數將會被呼叫,同時也用來存取sensor node所傳送的資訊,它支援4個node並且從裝置的address確認裝置,若裝置的address並不在已知的裝置清單上頭,裝置將會被視為是新的node並且新增在清單上,同時螢幕也會更新

事實上,這個函數是用來切換 splash 畫面到 Network Display 畫面


JZA_vAfKvpResponse()
當KVP協定先前的請求被確認時,此函數將會被呼叫並且接收回應,這個應用範例並沒有使用到這個函數

JZA_pu8AfMsgObject()
當接受MSG協定時此函數將被呼叫,這個應用範例並沒有使用到這個函數

JZA_vZdpResponse()
當接受ZDP響應時此函數將被呼叫,這個應用範例並沒有使用到這個函數

vInitDemoSystem()
此函數將會呼叫ZigBee堆疊的初始化函數,並且初始化將會用到的硬體以及設置 Splash 螢幕畫面

20-Hz脈波的Wake-up timer在這裡將會被校準並且啟用,但是並不會開始動作

函數的最後動作是啟動BOS,當BOS啟動失敗時函數將會回傳

InitCoord()
涉及endpoint sensor的資訊在這裡將會被初始化

vSetTimer()
此函數使用Integrated Peripherals API 啟動1600循環的wake-up timer ,大約是1/20秒

vProcessCurrentTimeBlock()
此函數執行state machine,只有一個動作,就是更新顯示

vProcessKeys()
在正在顯示的畫面中這個函數傳達按鈕的表現給適當的函數,按鈕都是 soft 的,對應的函數根據不同的畫面有所不同

vUpdateTimeBlock()
如果Coordinator在正確的狀態下,此函數會增量state machine,state machine在某些螢幕顯示時將不會有作用



vSendData()
此函數製造協定KVP的傳輸請求,用來控制sensor node的LED

vProcessUpdateBlock()
此函數更新所有node的圖形量表,在相對應的螢幕下,縮放適合的資料然後更新顯示

Keypresses
vProcessSplashKeyPress
vProcessNetworkKeyPress
vProcessNodeKeyPress
這些函數的作用都是一樣的,對按鈕的表現調整數值,設置數據或是切換到其他螢幕

vUpdateNetworkSensor()
當 Network 螢幕畫面更新時,此函數將被呼叫,用來同時顯示所有node的相同sensor type

LCD screens
vBuildNetworkScreen()
vBuildNodeScreen()
這些函數都演示了LCD即時螢幕的創造物(字?),使用Board API,注意字體的定義需要odd 字元才能使用,如 \ 代表 + , ] 代表 –

通常呼叫vLcdRefreshAll() 是用來在LCD上產生一個新的顯示,但是在所有的案例中相關更新的函數會先被呼叫,然後才是呼叫vLcdRefreshAll()

廣泛使用的類型諸如vLcdWriteText()、vBuildSetChannelScreen()都是使用vLcdWriteBitmap() ,使用的是點陣圖,其定義在 JennicLogo.c 這個檔案裡頭

vUpdateSetChannelScreen()
vUpdateNetworkScreen()
vLcdUpdateElement()
vUpdateNodeScreen()
vUpdateNodeControlScreen()
vUpdateSetupScreen()
這些函數是用來更新即時的LCD螢幕,同時保留之前的資訊,注意空白字元是用來刪除不要的文字

vDrawGraph()
此函數在0到13的範圍製造出32值的陣列,並且製造出點陣圖型,可使用預設的點陣圖型或是允許沒有複雜演算法的簡單圖型

每個圖型都是由兩行資料所組成的陣列,一個常數陣列的定義包含了由每個必須在0到13之間的數值所組成的數值,陣列將會充滿適當的數據

點陣圖的結構是由一個占33列寬以及兩個字元行高的項目組成



上述的資料說明請參閱JN-UG-3033-ZigBee-HomeSensorDemo-1v3.pdf

2009年6月28日 星期日

Source Code 分析筆記

這次我們研究ZigBee內部程式碼
由於每個廠商的Source Code都長得不太一樣,也因此對於程式的指令碼的用法小組採用多方嘗試,猜測並測試來試著了解每個指令代表的意義

今日筆記:
分析coordinator、Router、End Device code當中,前頭有 Type Definitions

例如:



這些程式很像是一層包著一層例如 teState 底下就包含 E_STATE_READY_TO_READ_SENSORS,
E_STATE_READING_S1,
E_STATE_READING_S2
以此類推

而下指令的方式有如之前寫過的C#,先下最外圍的指令加入"."後接下一層的指令,根據在coordinator中的這行指令

vSendData(sDemoData.sNode.asNodeData[sDemoData.sGui.u8CurrentNode].u16ShortAdr, (u8KeyMap == E_KEY_2) ? 0 : 1);


這行指令是寫在coordinator的SW0~SW3之中,由於coordinator的顯示幕上可切換連接中的Node所有的感測資訊,而按下指定的SW,相對應的Node板上的Led將會做亮滅的動作,藉此可實際判定當時coordinator顯示的數據是由作LED亮滅動作的Node所發送。



指令的組成大部分都可在 Type Definitions(如上圖)找到,而指令的意義據我們小組理解的解釋它是個傳送資料指令(vSendData) 而傳送類型的是包含在 sDemoData 中的 asNodeData,而sDemoData.sGui.u8CurrentNode 這行指令推測指的是連接當時 coordinator 的感測數據畫面正在連接的 Node,u16ShortAdr 指的可能是發送的資料位元大小,而0、1所代表的意義則是指LED的亮滅(1代表亮、0代表滅)