• 沒有找到結果。

ZDO_AREQ_ZDO_IEEE_ADDR_RSP MSG = new ZDO_AREQ_ZDO_IEEE_ADDR_RSP();

而再依各介面指令的運作需求不同將指令與資料透過 CommandSender.cs 組成規 範之 Frame Format,再透過 CommandParser.cs 定義解析指令方式與判斷傳輸之 指令與格式是否正確。而 ZbDeviceManager.cs 中再針對目標裝置 IP,判斷該裝 置各控制指令的行為,其利用 CommandParser 類別中相對指令解析之,以下列示 ZbDeviceManager.cs 片段程式說明之:

switch (e.Frame.Command1)

{

/* AREQ to host */

case ZDOCommand.CMD_MT_ZDO_NWK_ADDR_RSP:

{

ZDO_AREQ_ZDO_NWK_ADDR_RSP MSG =

new ZDO_AREQ_ZDO_NWK_ADDR_RSP();

RESULT = CommandParser.PASER_ZDO_AREQ_ZDO_NWK_ADDR_RSP(ref MSG, e.Frame.Data);

if (RESULT != REV_RESULT.SUCCESS) return;

} break;

case ZDOCommand.CMD_MT_ZDO_IEEE_ADDR_RSP:

{

ZDO_AREQ_ZDO_IEEE_ADDR_RSP MSG = new ZDO_AREQ_ZDO_IEEE_ADDR_RSP();

RESULT = CommandParser.PASER_ZDO_AREQ_ZDO_IEEE_ADDR_RSP(ref MSG, e.Frame.Data);

if (RESULT != REV_RESULT.SUCCESS) return;

}

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

3.2.5 類別庫介紹

此章節將分為三部份來介紹類別庫。a.資料存取類別;b.裝置控制指令類 別;c.裝置操作類別。專案架構圖 3.10 如下:

圖 3.12 Visual Studio 2010 專案開發程式架構

便於開發 API 之管理,類別庫專案的取名原則以 LIB 開頭;運用實作之專案 以 APP 為開頭來區之。

LIB_ZBCC2530 : ZigBee 指令類別專案,以晶片版本命名之,若晶片換版可對該 版本定義新類別專案,如:LIB_ZBCC2550,類別名稱可不變樣。

LIB_ZBDevice : 裝置操作管理類別專案,主要定義 ZbDeviceManager 類別。

LIB_ZBDatabase : 與資料庫檔案(Table)有關的存取類別定義均歸類於此。

只要是與 ZigBee 資料庫有關的存取,均可利用 BLL(Business Logic Layer,

商業邏輯層)下所自訂的類別方法或是 DAL(Data Access Layer,資料存取層)下 微軟 ADO.NET Entity Framework 所產生之實體資料模型 XML 檔(edmx)中的資料 類別屬性與方法操作。以下介紹 BLL 下 ZB_Device 這資料表(Table)自訂之類別:

該類別方法之定義主要是將該資料表常用的存取操作定義好,讓引用此類別 之程式只要引入該類別namespace即可使用物件導向之方式來操作資料。而類別 中,方法的操作法語是使用微軟在C# 3.0中提供的LinQ技術來實作,使用此語法

public class CZB_DeviceDataAccess

{

//

由資料存取層的資料實體定義,將欄位設為該類別之屬性

public IQueryable<ZB_Device> GetAllData()

//

顯示所有資料:不排序

public static IQueryable<ZB_Device> GetAllTable()

//

By Key 查詢某筆資料

public IQueryable<ZB_Device> GetOneByKey(Int64 _MacAddress)

//

By UID 查詢某筆資料 (UID:每筆資料自動付予之唯一值)

public IQueryable<ZB_Device> GetOneByUID(Guid _UID)

//

顯示所有資料,含Foreign Key名稱:依Key值排序

public IQueryable GetAllWithName() }

到。所以未來資料庫系統可以不一定要使用MS SQL Server 2008,如可以改用 MySQL,只要實體資料模型檔(edmx檔)根據MySQL資料庫來產生即可。

當然存取資料可不使用上述自行定義的類別方式,可使用微軟 ADO.NET Entity Framework 技術所產生的實體資料模型檔(edmx 檔),利用 LinQ 技術直接 對資料做存取 。以下列出幾種資料庫的基本操作方式,更詳細的 LinQ 操作請參 考相關書籍。

New 一個 Entity(實體):

新增資料:

修改資料:

ZigBeeEntities _Entity = new ZigBeeEntities();

var _data = new ZB_DeviceType {

UID = Guid.NewGuid(),

TypeID = Convert.ToInt32(txtTypeID.Text.ToString().Trim()), TypeName = txtTypeName.Text.ToString().Trim(),

ZB_DeviceType _data =

_Entity.ZB_DeviceType.First<ZB_DeviceType>(item => item.UID == _keyUID) _Entity.SaveChanges()

引用,若是一般小型專案直接引用 ADO.NET Entity Framework 本身定義的實體 操作方法即可。本專案考慮到擴充性,是將常用的資料表操作方法定義在商業邏 輯層。

b. 裝置控制指令類別

主要利用三類別檔定義相關類別:1.Command.cs(裝置控制指令定義檔) , 此部份根據各 ZigBee 晶片製造商的不同定義會有差異,本研究主要以目前 TI(德 州儀器)ZigBee C2530-ZNP 晶片為主,日後若有更換更新的晶片,可重新定義該 類別定義檔,達到升級的效果;2. CommandSender.cs(控制指令傳輸定義檔),

組合或拆解 ZigBee 控制收發指令,其中定義細部之每道傳送指令的實際內容,

並下指令給 endpoint(可指裝置點);3. CommandParser.cs (控制指令解析定義 檔) ,分析 ZigBee 控制指令是否符合 ZigBee 通訊協定規範,其可將細部之每道 接收資料的解析內容轉為常數指令。以下針對這三個類別定義檔做說明。

var _data = from c in Entity.ZB_DeviceType orderby c.TypeID

select c;

dataGridView1.DataSource = _ data;

ZB_DeviceType _data =

Entity.ZB_DeviceType.First<ZB_DeviceType>(item => item.UID == _UID);

_Entity.DeleteObject(_data);

_Entity.SaveChanges();

General Frame Format – Command0 - Type:

public struct GENERAL

{

public Byte SOP;

public MTCMD MT_CMD;

public Byte FCS;

}

public struct MTCMD

{