Crossbow Sensor Project

Preview:

Citation preview

智慧型居家看護系統

專題研究報告

指導教授:蘇宗安學 生:李維澤

林政元 王永貴

Outline

專題內容說明 工時分配 Crossbow 軟、硬體介紹 系統設計與實作

架構與流程 資料接收處理 系統功能 網站與資料庫

實際 DEMO

情境描述

本專題實做的是針對安養院的體溫監控管理系統。

系統必須在使用者體溫過於正常 時,通知看護前往值處理。

採用作法

讓使用者佩戴傳送端的 sensor

在系統安裝 base 端的 sensor

Base 端的 sensor 持續監控傳送端的 sensor 所傳回的,若使用者體溫超出條件 ,便發出警示訊息通知值 值

看護

工作分配功 能 姓 名

李維澤 林政元 王永貴

系統需求與分析 V V V

實驗平台 V V V

MYSQL V V

資料庫系統 V

網站架設 V

系統整合 V V

解碼 V

專題文件製作 V

時程規劃 V V V

視窗介面 V

體溫偵測子系統 V V

體溫通知子系統 V

審核監督 V V

軟硬體整合測試 V V

環境架設 V

Crossbow硬體介紹

MTS300

- 電壓 - 溫度 - 光照度 - 聲音

Crossbow硬體介紹

IRIS

- 超低耗功- 電池壽命長- 多跳自動組網設計- 信號穩定- 可隨意修改與編程

Crossbow硬體介紹

MIB520

Crossbow軟體介紹 -MoteVeiw

Crossbow軟體介紹 -MoteConfig

程式架構說明

系統運作流程圖

開發環境

作業系統: MS-XP SP2

使用語言: JAVA 、 PHP

JAVA 環境設定: jdk1.6_15 、 jre6 、 rxtx-2.1 、 jdbc

開發軟體: Eclipse-JEE

使用硬體: Crossbow Sensor

資料庫與工具: MySQL+PHPMyAdmin

簡訊系統提供: EVERY8D 企業簡訊

E-mail 提供: Google Gmail

連結 Sensor

比對及開啟 COMPORT

defaultPort 存放使用者所選 PORT

開 所選的啟 PORT

if (portId.getName().equals(defaultPort)) {System.out.println("Found port: "+defaultPort);

}

serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);

建立 listener

在使用者所選的 PORT 增加一個 listener

serialPort.addEventListener(this);

資料傳入即接收

Listener 一發現有資料傳入,就會 動此啟 function ,並把 event type 傳入。

public void serialEvent(SerialPortEvent event){switch ( event.getEventType() ){

case SerialPortEvent.DATA_AVAILABLE:

…}

}

數據資料轉換

原始資料處理

原始資料: 03 F0 01 00 00 00 00 00 00 00 00 F5 81 7E 5D 1B 00 00 03 00 00

00 33 83 81 00 00 32 02 16 02 19

03 00 id 00 00 parent 32 02 battery 16 02 temperature 19 03 light F0 01 mic

00 03 00 00 02 32 02 16 03 19 01 F0

轉換資料 (16進位轉 10進位 )

for(int i=0;i<4;i++)battery += (uint16(conver[i]) * pow16(3-i));

public static int uint16(char x)switch(x){

case '1':uint10 = 1;break;

public static int pow16(int a){int ans=1;for(int i=0;i<a;i++)

ans *= 16;return ans;

}

資料傳入公式

將 10 進位 傳入公式涵式,計算出值 ID 、 BATTERY等

困難點 :計算出的 唯一只有溫度有出入,多次驗算後還是一值樣。例 : 如果實際溫度為 29℃ ,原始資料經過公式轉換出來的溫度卻為 20.96 ℃ ,如果實際溫度為 30 ℃ ,那經過轉換卻為 19.96 ℃ 。

解決辦法 :自訂一常數 k=24.98temp = k - TEMPERATURE; TEMPERATURE = k + temp;

k=24.98

實際溫度 29℃

測得溫度 20.96 ℃

差距都為4.02 ℃

數據資料接收速度改善

困難點: 因為接收到的原始資料雖然長度以陣列大小來限制,但是資料內容順序卻會不一樣。在原本的資料接收設計為選擇固定的資料排列順序,如果不一樣則不接收此筆傳入的資料,但是這樣做會使資料的更新速度變慢,尤其是 sensor 數量越多時,資料被丟棄的比例越高。

解決辦法: 雖然接收到的資料排列順序不一樣,但是間格位置是固定的,所以利用計算有效資料的開頭位置,來計算所需要資料的位置,減少資料被丟棄比例,加快資料更新速度。

數據資料接收速度改善

例 :03 F0 01 00 00 00 00 00 00 00 00 F5 81 7E 5D

1B 00 00 03 00 00 00 33 83 81 00 00 32 02 16 02 19

有效資料開頭位置(為第 14 bytes)

此為 ID位置(一定會在開頭的後面第五個 bytes)

parent battery

若資料排列超過陣列限制長度時,會從第一個 bytes開始排

light

light

視窗介面

利用UIManager.setLookAndFeel 來建立 景主題,套件為佈SubstanceNebulaBrickWallLookAndFeel()

使用 Jtable 來監控每顆 Sensor所回傳的訊息

執行視窗後直接使用 JDBC 與MySQL 做連結

溫度條件達成會跳出警訊視窗並閃燈警示

參數設定

困難點: 利用 JFileChooser 所存

下的 案路徑不被程式所接受,檔並且會造成程式的當機。

解決辦法: 問題癥結點在於斜

線”/” 為 JAVA 語言內部所使用,所以必須改為兩條反斜線”\\” , replaceall 是用 re 做search ,“ \” 在 re 裡也是跳脫字,所以必須再多處理一次 ,必須寫為 replaceAll("\\\\", "/");

客戶設定

使用 JTabbedPane 製作客戶資料與監護人資料標籤

傳進“ SELECT * FROM client/guardian” 來取得client/guardian table 的資料並存進 Object[Row][7] 供 Jtable 使用

在客戶 / 監護人點兩下會切換標籤指向該客戶資料

底下計算 Jtable 目前資料筆數

提供新增、刪除、修改、 看事件查功能

新增、修改資料

新增與修改為同一視窗但會傳出各自的 function

傳進“ INSERT INTO client(id,name,sex,birthday,age,guardian) VALUES (?,?,?,?,?,?)” 來新增使用者資料

傳進“ UPDATE client ” +“SET name=”+“‘”+ob[1]+“’”+“,”+“sex=”+“‘”+ob[2]+“’”+“,”+“birthday=”+“‘”+ob[3]+“’”+“,”+“age=”+“‘”+ob[4]+“’”+“,”+“guardian=”+“‘”+ob[5]+“’”+“,”+“event=”+“‘”+ob[6]+“’”+“WHERE id =”+“‘”+ob[0]+“’” 來修改使用者資料

所有事件

擷取所選的 Jtable 的事件上的內容顯示在 JTextArea 上並未使用到資料庫的資料

使用 CanlendarPanel package 來顯示日曆功能

日期與姓名選擇好後按查詢後在底下會顯示 詢的查資料為幾筆

過濾的方式使用移除不是為關鍵字的 Jtable

按下重新整理將會重新讀取資料庫裡的資料再存回JTable

紀錄資料 詢查

E-mail

使用 javax.mail 與 google 所提供的 API 來實作

使用 google 的 smtp伺服器來送信

smtpServer="smtp.gmail.com";

若使用者亂填收件人的 寄出值後便會丟出例外顯示收件人格式錯誤

收件人使用逗點隔開不需做判斷即可寄出

簡訊 使用 EVERY8D簡訊系統

連上他們的 Web Client Service 取得類別與方法

利用 SecuritySoapProxy類別方法來登入他們公司的伺服器,伺服器會回傳 xml 再填入值 MessageSoapProxy類別方法來傳送簡訊

若伺服器回傳 為正的即表成功負為失敗值

收件人必須做檢 ,若傳送格式對了幾乎都可以發送查

傳送格式:<REPS> <IP/> <CARD_NO/> <USER NAME="Eric" MOBILE="+8869x8xxx562" EMAIL="" SENDTIME="" PARAM=""/> <USER NAME="May" MOBILE="+8869x1xxx931" EMAIL="" SENDTIME="" PARAM=""/> </REPS>

收件人

利用資料庫來取得收件人 Jtable

按著 Ctrl 點選可以選擇多個收件人

若使用者選擇為 E-mail 在點收件人按下確定後則會出現收件人的 E-mail ,若選擇為簡訊,則會出現手機號碼,並都以分號隔開

警告視窗若 Sensor 溫度 超過設定的條件值時,主程式將會跳出視窗並顯示訊息並發出設定的音效

困難: 由於是從 DataReceive這個類別做判斷,每次超過標準就要往返主程式呼叫警告視窗,判斷可能是在線程上出了問題,造成程式無法繼續使用。

解決: 使用 SwingUtilities 內的

invokeLater 方法來實作一個介面Runnable 來解決線程的問題。

Com Port 設定功能

使用 RXTX 套件來實做 JAVA I/O ,將列舉出來的 port 存進陣列裡,再放進 Jcombobox 裡

portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) { portId=(CommPortIdentifier)portList.nextElement();

if(portId.getPortType()==CommPortIdentifier.PORT_SERIAL) { comport[count]=portId.getName(); count++; }}

官方網站

讓監護人隨時能 掌握情況夠

網站架構圖

投票系統流程圖

資料表設計

欄位 型態 校對

id int(2)

name varchar(10) utf8_unicode_ci

sex varchar(2) utf8_unicode_ci

birthday date

age int(3)

guardian varchar(10) utf8_unicode_ci

event text utf8_unicode_ci

資料表: client

欄位 型態 校對

name varchar(10) utf8_unicode_ci

phone1 varchar(20) utf8_unicode_ci

phone2 varchar(20) utf8_unicode_ci

mail varchar(100) utf8_unicode_c

address varchar(50) utf8_unicode_ci

資料表: guardian

欄位 型態 校對

datatime varchar(20) utf8_unicode_ci

id int(2)

name varchar(10) utf8_unicode_ci

event text utf8_unicode_ci

資料表: event

欄位 型態 校對

news_id int(11)

news_type varchar(20) big5_chinese

news_date determine big5_chinese

news_subject varchar(100)

news_content Text big5_chinese

news_editor Varchar(100) big5_chinese

資料表: newscenter

資料庫 ER 圖

實際 DEMO

系統演練

THE END感謝觀賞 敬請指教

Recommended