而再依各介面指令的運作需求不同將指令與資料透過 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;
}