裝置的溝通。圖 4.2 中的 Port Name 可自行輸入 COM1、COM2、COM3、COM4、……
若輸入不正確將無法正常連結。Baud Rate(串列通訊資料傳輸的速率)通常預
b.Device Scan
此功能為掃瞄連結之 Coordinator 上所有的裝置,並提供自動更新資料庫中已 記錄之裝置的 IP,以及針對某裝置連續讀取溫度及電壓感測值記錄於資料庫 中。當有新裝置加入時,可以按下 Sacn Network,此時會列出所有已連線裝
// Port Properties.
int baudRate = Convert.ToInt32(this.portBaudRate.Text); // 38400 int recvBufferSize = 256;
int queueSize = 4096;
// SerialPort
this.DeviceManager.SerialPort_Open(portName, baudRate,
recvBufferSize, queueSize);// Reset connected device(Coordinator) to clear IPs in NV ram.
if (this.resetDevice.Checked)
this.DeviceManager.ResetDevice();
if (this.DeviceManager.SerialPort.IsOpen)
{this.DeviceManager.RemoveAllEvents();
this.DeviceManager.SerialPort.Close();
}
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
置 IP 與 Mac Address,因 IP 可能會因 Coordinator 重新啟動而改變 IP,但 Mac Address 是唯一值,故當作裝置基本資料表(Table)的 Key 值,以利後續 資訊的更新的依據。而 Match Online 功能為:當已定義之裝置未包含在目前 已連上 Coordinator 之裝置,則會以灰色顯示表示該裝置目前是未被連結上 的,在運用上的意義是要去查看該裝置是否已沒電或出問題。另外管理者可選 定某裝設進行感測值的讀取,若設為連續性讀取可指定時間間隔,並設定是否 將感測值寫入資料庫做日誌(Log) 記錄。而若僅做一次性的感測值讀取,可直 接按下 Refresh 按鈕。
圖 4.3 掃瞄 Coordinator 連結之裝置
c.Channel List
每個以 Coordinator 為主的 ZigBee 區域網路即為一個頻道,而通常裝置節點 較多的運用可能需要數個 Coordinator 來分散管理,所以用頻道來區分每個 ZigBee 區域網路。本功能提供整個管理中會用到的頻道,取一貼切的名稱更
便於管理每個節點裝置的所在位置。功能畫面請參考圖 4.4。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
圖 4.4 定義 ZigBee 網路 Channel
d.Device Type
針對每種感測裝置類型做分類定義,便於分辨每種裝置的用途,目前常用的感 測器有數十種,可針對實際所需定義類型即可。功能畫面請參考圖 4.5。
圖 4.5 定義裝置型態
‧
Coordinator IP CoordinatorIP 0000 (16 進位值) 建立者 DataCreator Administrator建立日 DataCreateDate YYYY-MM-DD HH:MM:SS 最近一次感測值 LastSensorValue 數字
最近一次感測值取得日 LastGetSensorDate YYYY-MM-DD HH:MM:SS 最近一次電力值 LastPowerValue 數字
最近一次電力值取得日 LastGetPowerDate YYYY-MM-DD HH:MM:SS 表 4.1 節點裝置註冊自動模式相關屬性
手動註冊模式:
資料項目 欄位名稱 資料內容值
裝置名稱 DeviceName 自行取名
裝置角色 DeviceRole Coordinator/Routor/End Device 裝置類型 DeviceType 各類感測器代碼
最後修改者 LastModifier Administrator
最後修改日 LastModifiedDate YYYY-MM-DD HH:MM:SS 表 4.2 節點裝置註冊手動模式相關屬性
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
另外,針對節點資訊刪除時機,當 Coordinator 中所記錄的裝置與註冊表相互 比較,若不存在資料庫註冊表者表示新的裝置,此時會將裝置節點的 IP 和 Mac Address 先做註冊,後續相關資訊再做維護,而已註冊但未做詳細資訊維護者 可視為無運作之節點,可事後做刪除。清除過多無用的節點註冊資訊,對於眾 多節點的管理是很重要的。
圖 4.6 定義裝置基本屬性
圖 4.6 中,若欲刪除某裝置資訊,可點選資料表中該筆資料,按下 Delete 即 可。若欲進行更新作業,選取裝置資訊後,按下 Read 可直接更改該裝置最新 取得之感測值與取得日,而更改裝置類型、裝置名稱與備註需按下 Update 岸 鈕方可更改之。Refresh 按鈕則為立即更新畫面上資料表的資料顯示。至少 Add 應到的機會不多,因裝置節點資訊主要是自動產生的。
f.Sensor Log
可收集節點裝置之感測值資料於 ZigBee 資料庫中的 ZB_SensorLog 資料表。對 於連續性取得之感測值可依需求做相關之應用與分析。該資料表主要記錄送出
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
感測值之裝置的 MAC Address 和當時的 IP Address,以及取得時的日期時間 與感測值,請參考圖 4.7。
圖 4.7 裝置感測值日誌
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
4.2 ZigBee 裝置控制實作說明
4.2.1 ZigBee 裝置相互控制實作本實作將利用本論文提供之 API,透過裝置 A(主動裝置)取得之感測值判斷 是否觸發裝置 B(被動裝置),並取得其感測值。此 ZigBee 實作可運用在警示方 面的控制機制,以下以溫度感測裝置說明之。
圖 4.8 裝置控制未達警示實作畫面
此範例程式可做一次性或連續性的控制,但其原理均為一樣。圖 4.8 為連續 性取得溫度感測值之控制,每隔一秒主動裝置回報一次溫度,並比較是否超出設 定之溫度,若溫度超出 30 度,則被動裝置亦將進行取得溫度之動作,請參看圖 4.9。畫面中監控溫度與偵測間隔時間是可以彈性設定的,另外裝置 IP 的選擇,
則根據 Coordinator 中目前記錄的所有 IP。以下針對此控制程式的處理流程做 下說明:
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
圖 4.9 裝置控制已達警示實作畫面
a.宣告及引入 DeviceManager 物件參考
b.定義是否打開連續性處理
c.定義讀取裝置感測值之接收事件
d.判斷 Serial Port(COM Port) 是否開通?
e.指定裝置 IP,啟動讀取該裝置感測值的方法(Method)
private ZbDeviceManager DeviceManager;
this.DeviceManager = global::ZigBee.APP.ZBOO.Project.ObjectReference.DeviceManager;
this.DeviceManager.TemperatureReceived += new
EventHandler<TemperatureReceivedEventArgs>(DeviceManager_TemperatureReceived);
if (this.DeviceManager.SerialPort.IsOpen == false) return; //未開通則不進行感測值讀取
this.DeviceManager.ReadTemperatureSensor(ipAddressA);
private byte SensorTriggerOnce_Temper = 0;
‧
均透過 DeviceManager,所以須由 SourceIP 這屬性判斷是由那個 AddressIP 要 求讀取感測值。CommandSender.APP.MT_APP_MSG TEMP = new CommandSender.APP.MT_APP_MSG();
TEMP.AppEndpoint = (byte)ENDPOINT.UARTApp_ENDPOINT;
TEMP.DestAddress = ipAddress;TEMP.DestEndpoint = (byte)ENDPOINT.UARTApp_ENDPOINT;
TEMP.ClusterID = APPCMD_ClusterID.UART_SENSOR_READ_REQUEST_CMD;
TEMP.SENSOR_DATA.SensorTYPE = (byte)SensorType.Temperature;
//SENSOR_TEMPERATURE 0x01 SENSOR_BATTERY 0x02 TEMP.SENSOR_DATA.Status = 0x03;
byte[] sendBytes = TEMP.Message();
void DeviceManager_TemperatureReceived(object sender, TemperatureReceivedEventArgs e) {
this.Invoke((MethodInvoker)delegate() {
string value = string.Format("{0}.{1}", e.Msg.Integral, e.Msg.FloatValue);
this.AlertDevice(value, e.Msg.SourceIp);
});
}
if ((Convert.ToDouble(this.txtTemperValueA.Text).CompareTo(temperAlertValue) >= 0)
&& (temperAlertValue >= 0.0)) {
this.btnZBTemperReadB.PerformClick();
}
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
4.2.2 ZigBee 裝置感測回報實作
此實作之目的為同時傳回 Coordinator 上所有連結裝置之感測值。此乃本論 文最初的研究動機,在實際的應用中,需做所有裝置感測值同時回報者即可使用 此方式。請參看圖 4.10 之執行畫面,同樣以取得溫度感測值為例:一開始需先 掃瞄所有節點 IP,然後再觸發取得所有感測值,此範例僅將取得之結果顯示於 畫面上,可根據需求存在資料庫或寫入檔案中加以應用。
圖 4.10 掃描所有節點
圖 4.11 取得所有節點感測值
‧
a.清除程式中 DeviceManager 變數的所有裝置記錄
b.透過 SearchDevice()方法找出整個網路中的所有的裝置
該 Method 的定義如下:
c.透過裝置 IP 找出所有裝置之 Mac Address
d.顯示結果至指定的表格中
this.DeviceManager.Devices.Clear();
this.DeviceManager.SearchDevice();
public void SearchDevice() {
byte[] sendBytes;
// LocalIP
CommandSender.APP.MT_APP_MSG TEMP = new CommandSender.APP.MT_APP_MSG();
TEMP.AppEndpoint = (byte)ENDPOINT.UARTApp_ENDPOINT;
TEMP.DestEndpoint = (byte)ENDPOINT.UARTApp_ENDPOINT;
TEMP.ClusterID = APPCMD_ClusterID.UART_INFO_GET_LOCAL_IP_REQUEST_CMD;
sendBytes = TEMP.Message();
this.SerialPort.Write(sendBytes, 0, sendBytes.Length);
// Get Broadcast IP.
TEMP.AppEndpoint = (byte)ENDPOINT.UARTApp_ENDPOINT;
TEMP.DestEndpoint = (byte)ENDPOINT.UARTApp_ENDPOINT;
TEMP.ClusterID = APPCMD_ClusterID.UART_INFO_GET_CHILD_IP_REQUEST_CMD;
sendBytes = TEMP.Message();
this.SerialPort.Write(sendBytes, 0, sendBytes.Length);
}
this.DeviceManager.QueryAllDeviceMacByIp();
this.NetworkDevice_List(false)
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
4.2.3 ZigBee 裝置動態感測顯示
最後實作連續感測資料讀取與圖形化顯示即時資料變化,該實作其實是結合 以上兩個實作,所以做法上不再撰述。在此介紹如何立即取得感測值並將內容值 之變化顯示於折線圖。當程式開始執行時,可選定感測之裝置,開始讀取感測資 料時,會依照指定之間隔時間讀取一次,並寫入圖 4.12 之 Vaule List 表中,而 再將每次取得之感測資料透過繪製折線圖之功能(Function),讓折線圖立即產生 變化。
圖 4.12 連續性感測資料之動態顯示 主要相關程式說明如下:
a. 透過計時物件取得感測值