第三章 系統架構及流程
3.4 系統流程
件關聯式資料庫系統 PostgreSQL。
表 9:伺服端安裝元件。
OS Freebsd 9 JVM Open JDK 1.7 Application Server Glassfish 3.1.2
Queue Server RabbitMQ 3.0.1 Database PostgreSQL 9.2
在系統 web 介面部署主要是透過 Glassfish,GlassFish 是昇陽電腦公司所研發的開 放原始碼應用伺服器,透過 Java 程式語言編寫以增加跨平台性,它有助於組織透過輕量
(Experimeant Loader)和記錄上傳模組(Log Uploader)和伺服器端溝通,在 ECF 處理區分 為前端 ECF 剖析模組、後端限制條件過濾和不同屬性資料蒐集模組,資料記錄主要儲 存於智慧型手機 SQLite 資料庫,各模組處理細節將於第 4 節介紹。在伺服器端方面,
主要為實驗 ECF 設定檔資料產出和將用戶端上傳記錄,依實驗 ID 寫入 PostgreSQL 資料 庫。用戶端應用程式主要使用系統模組,如下圖 5 所
示:
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
圖 5:用戶端應用程式系統模組。
用戶端使用流程步驟如下:
1.受測者於網路上下載並將應用程式安裝於手機,應用程式已包含 ECF 剖析工具、限 制條件過濾和相對應記錄方法。
2.當使用者開啟應用程式時,會以 RESTful 方式向伺服端判定有無授權 ID,若沒有則 取得新授權 ID 及認證碼,便於使用者上傳記錄辨識,此資料會以 DAO(Data Access Objects)方式,記錄於本機 XML 檔案,若使用者未將此應用程式刪除或執行資料清 除動作,此後作實驗都沿用此 ID 作認證。
3.當使用者要選取實驗時,會先於 SQLite 資料庫建立資料表,並將用戶端授權 ID、
認證碼、手機 OS、版本、型號資訊參數帶入向伺服器端做認證,並也以 RESTful 方式向伺服端取得實驗 ECF 設定檔和實驗列表 ID。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
4.使用者確定實驗後,前端 ECF 剖析工具將使用實驗 ECF 設定檔分割成各類參數,
交由後端服務,以限制條件過濾器和呼叫對應的屬性資料記錄方法,同時並將相關 參數寫入另一個 XML 檔案,此 XML 檔的作用是考量使用者可能更換電池或其他 因素將手機關機,若使用者曾經執行過實驗,會在手機重新開機時,背景喚起此應 用程式後端服務對此 XML 檔案進行辨識,繼續原先選擇的實驗記錄。
5.在資料寫入資料庫之前會先以限制條件過濾器過濾,符合實驗限制的紀錄才可以寫 入 SQLite 資料庫。
6.在偵測到手機充電或待機(螢幕關閉)事件時,自動啟用上傳機制,將所收集而來暫 存於 SQLite 內的資料,包裝成 JSON 物件格式後進行加密,將物件逐一上傳至伺 服器端的 RabbitMQ。RabbitMQ 為專門處理 Message Queue 的伺服器,在此處主要 為擔任緩衝功能的角色。
7.在伺服器端,另外 建立了記錄監聽器程式,該程式會慢慢讀取 RabbitMQ 上的訊息,
並轉而呼叫 web 伺服器上轉存的 RESTful,最後將資料送達 PostgreSQL 資料庫內 儲存。上傳完畢後就將用戶端已上傳的資料列刪除,並繼續記錄後續的資料,以防 止上傳重複的資訊,導致實驗結果不正確。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
第四章 系統模組分析
本章主要是對實驗流程中,各模組運作細部內容進行分析,對於在取得實驗相關參 數方面,透過實驗者 ID 讀取模組和實驗 ECF 設定檔讀取模組使用 RESTful(於 4.1 節介 紹)方式和伺服器端索取資料;在實驗設定檔分析模組方面,如下圖 6 所示:區分為前 端 ECF 剖析模組、後端限制條件過濾和不同屬性資料蒐集模組;在資料庫方面,區分 為記錄寫入和讀取記錄上傳兩個模組。
圖 6:實驗設定檔分析模組。
‧
本系統實驗參數讀取是以 REST 方式,REST(Representational State Transfer)的縮 寫,以 URL (Uniform Resource Locator)網址定位資源所在處,就是透過使用 Http 的格 式對網站進行互動,並且針對的是網站所提供的「資源」而不是「網頁服務」,所以這 是一種 Design Pattern。
資源則藉由 HTTP 協定中所定義的方法操作資源。REST 所稱的資源如表 10 所 示,其實是資料與資料處理方法的包裝,也就是 OOP 中的「個體」、「物件」。同時 在 HTTP 中,也定義了四種基本方法,即 GET, POST, PUT, DELETE。以上四種基本 方法大致上對應了四種資料處理動作,即 Create, Read, Update, Delete。
REST 指的是一组架構約束條件和原則。滿足這些約束條件和原则的應用程序或設 計就稱為 RESTful。
表 10:網頁參數截取基本方法列表。
HTTP 方法 資料操作 描述
POST Create Create a resource without id.
GET Read Get a resource.
PUT Update Update a resource or create a resource with id if not existed.
DELETE Delete Delete a resource
4.1.1 實驗 ID 讀取模組
在本系統中,伺服器與用戶端之間設定檔和記錄資料交換,大都是以 Restful 方式,
在執行應用程式時,便會執行 loadClientId()辨識是否已存在實驗 ID 的 XML 設定檔,如 下表 11 所示:如果找不到該檔案時,在程式 1 到 13 行,便以 URL 向伺服器發出 HTTP 的 GET,取得兩個參數值,分別為實驗 ID(clientdeviceid)和授權認證碼(authcode),在程 式 14 到 18 行,並將兩參數存入新的實驗 ID 的 XML 設定檔。相反的,如果找到該檔案,
‧
在使用者點選載入實驗時,會呼叫 LoadExperimentList(),如下表 12 所示,在程式 1 至 2 行可看出,對伺服器發出 GET 方法時,代入手機 OS 版本、型號、實驗 ID 和授 權認證碼,向伺服器執行認證。在程式 7 至 10 行,再對取得的物件結構加以分析,分 別為實驗 ID、實驗名稱、實驗描述和實驗 ECF 設定檔,另外在程式 12 至 18 行,取得 所有實驗列表。在用戶端將實驗名稱以對話視窗列表方式呈現,讓使用者選取欲參加的
1. Idtext = new readREST().execute
2. ("http://clap.iis.sinica.edu.tw/ws/rc/getid ");
3. try {
4. JSONObject jCid = newJSONObject(Idtext.get());
5. int count = jCid.length();
6. clientdeviceIdList = new String[count];
7. authcodeList = new String[count];
8. for(int i = 0; i < jCid.length(); i++){
9. clientdeviceIdList[i] = jCid.getString("clientdeviceid");
10. authcodeList[i] = jCid.getString("authcode"); }
11. ClicentDeviceID = clientdeviceIdList[0];
12. AuthCode = authcodeList[0];
13. SharedPreferences ckdevice = getSharedPreferences(ID_CHECK,0);
14. SharedPreferences.Editor editor = ckdevice.edit();
16. editor.putString("clientdeviceid",ClicentDeviceID);
17. editor.putString("authCode",AuthCode);
18. editor.commit();
‧
檔分析。剖析部分是採用「java.util.regex」套件中兩個類別處理: 「Matcher」和「pattern」類別用來設定正規運算式(Regular Expression) ,而「Matcher」類別是利用 pattern 來比 對字串。其 ECF 剖析結構如下圖 7 所示,概分為紀錄屬性、紀錄屬性頻率、限制條件、
限制條件屬性、比較運算子、比較值和上傳時機。
1.RESTtext = new ReadREST().execute("http://clap.iis.sinica.edu.tw/ws/le 2./getall/Android/"+DeviceOs+"/"+Device+"/"+ClicentDeviceID+"/"+AuthCode);
3. try {
4. JSONObject jObj = newJSONObject(RESTtext.get());
5. JSONArray experiments = jObj.getJSONArray("experiment");
6. int count = experiments.length();
7. experimentIdList = new String[count];
8. experimentNameList = new String[count];
9. experimentDescriptionList = new String[count];
10. experimentScriptList = new String[count];
11.
12. for(int i = 0; i < experiments.length(); i++){
13. JSONObject experiment = experiments.getJSONObject(i);
14. experimentIdList[i] = experiment.getString("experimentId");
15. experimentNameList[i] = experiment.getString("name");
16. experimentDescriptionList[i] = experiment.getString("description");
17. experimentScriptList[i] = experiment.getString("script");
18. }
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
圖 7:實驗設定檔 ECF 剖析結構。
圖 8: 實驗設定檔 ECF 剖析步驟。
‧
1. privatevoid axintervalTokenizer(String inputString) {
2.Pattern p = Pattern.compile("(acc.ax\\s*\\d+)",Pattern.CASE_INSENSITIVE
3. | Pattern.MULTILINE);
4. Matcher m = p.matcher(inputString.replace(",", "").replace(" ", ""));
5. while (m.find()) {
6. Pattern p1 = Pattern.compile("\\d+", Pattern.CASE_INSENSITIVE
7. | Pattern.MULTILINE);
8.Matcher m1 = p1.matcher(m.group(0).replace(",", "").replace(" ", ""));
9. while (m1.find()) {
10. AXINTERVAL = (Integer.parseInt(m1.group(0)) * 1000);
11. Log.v(TAG,"axintervalTokenizer"); }}}
ECF 在剖析方面,步驟如上圖 8 所示,大致以關鍵字 where 判定此實驗有無限制條 件,若無實驗限制,僅會針對各記錄屬性和頻率分析,若有則需執行比較運算元結構剖 析和判定,另以關鍵字 uploadpolicy 判定此實驗上傳時機。
在 ECF 設定檔不管有無限制條件,第一步驟為頻率剖析,如下表 13 所示:在程式第
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
為考量研究員對於限制條件可能選擇某屬性兩數值的區間,舉例來說,研究員想於 加速度感應器 Z 軸數值大於 5、小於 3 時才記錄,如下圖 9 所示:將實驗限制條件設定為 5.0>az>3.0,實驗者需選擇同一屬性參數兩次,並各別選擇比較值。
圖 9:實驗屬性區間限制條件。
若不對比較運算子區分為大小兩個判定式,則實驗將無法取出大於和小於的比較值 和比較運算子,所以在程式後段改成大於和小於比較值和比較運算子的判定,在程式第 9 行到第 20 行,進行大於比較值和比較運算子判定和取值,另於第 21 行到第 34 行取得 小於的相對值,並將這些值寫入設定檔提供後端服務比較判定。
‧
1.privatevoid AccazbkTokenizer(String inputString) {
2. Pattern p = Pattern.compile("(acc.az[>=|>|=|<|<=]+\\d+\\.\\d+)",
3. Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
4.Matcher m = p.matcher(inputString.replace(",", "").replace(" ", ""));
5. while (m.find()) {
6. mapParser.put("acc", m.group(0));
7. System.out.println("accaz attribute: " + m.group(0));
8. btaz = true;
9. Pattern b1 = Pattern.compile("[>=|>|=]+", Pattern.CASE_INSENSITIVE
10. | Pattern.MULTILINE);
11.Matcher m1 = b1.matcher(m.group(0).replace(",", "").replace(" ",""));
12. while (m1.find()) {
13. azbigop= m1.group(0);
14. Pattern b2 = Pattern.compile("\\d+\\.\\d+",Pattern.CASE_INSENSITIVE
15 | Pattern.MULTILINE);
16.Matcher m2 = b2.matcher(m.group(0).replace(",", "").replace(" ",""));
17. while (m2.find()) {
18. azbigvalue=m2.group(0);
19. }
20. }
21. Pattern l1 = Pattern.compile("[<|<=]+", Pattern.CASE_INSENSITIVE
22. | Pattern.MULTILINE);
23. Matcher m3 = l1.matcher(m.group(0).replace(",", "")
24. .replace(" ", ""));
25. while (m3.find()) {
26. azlessop= m3.group(0);
27.Pattern l2 = Pattern.compile("\\d+\\.\\d+", Pattern.CASE_INSENSITIVE
28. | Pattern.MULTILINE);
29. Matcher m4 = l2.matcher(m.group(0).replace(",", "")
30. .replace(" ", ""));
31. while (m4.find()) {
32. azlessvalue=m4.group(0);
33. }
34. }
表 14:感測屬性比較分解。
‧
在上傳剖析判定方面,則是以 ECF 設定檔 uploadpolicy 字串後方「screenoff」和
「charging」兩關鍵字當成 Pattern,如果判定為真時,則將該布林參數設定為 TRUE,
並提供後端服務呼叫相對應的廣播監聽器,用以接收螢幕關閉或充電事件,當偵測到事 SENSOR
Accelerometer Magnetic Field
GPSLocation etc..
Sensormanager
Locationmanager RegisterListener Frequency
BEHAVIOR
AppLog
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
圖 10:資料蒐集模組示意圖。
1.像螢幕開啟、關閉或充電不充電等事件的記錄屬單一行為觸發行為,是採用廣播接 收器去接收相關的事件並且記錄。
2.感應器資訊(sensor),Android 將感應器有關的函式庫都放在「Android.hardware」,
是專門用來感應外界事物變化,並將其變化轉為數值的一種,此類的資訊取得方法 是,藉由函式庫提供的 sensormanager 註冊指定的監聽器,若感測到有改變在再呼 叫寫入記錄方法,但這類資訊若長期記錄會耗費大量電力,因此,為減少電力耗損,
採用 Handler 的 postDelayed 定時器方式,改以頻率方式定期蒐集記錄。
3.記錄在記憶卡的資訊,通話或簡訊等歷史記錄,在該資料來源有開放權限的情況 下,可以透過 API 提供的 content provider,透過個別的資料索引 URI 對資料進行新 增、刪除、修改和查詢作業。
4.GPS 之類的資訊,藉由函式庫 android.location 提供的 locationmanager 註冊監聽器 locationlistener,記錄位置的變化,但這類資訊與感應器資訊相似,若長期記錄會耗
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
費大量電力,因此,同感應器也改以頻率方式定期蒐集記錄。
4.4 實驗設定檔 ECF 後端限制條件過濾
本系統提供研究員對感測實驗設定限制,過濾掉對某屬性在某範圍之外的數值,有 助於提升實驗的精準性,並考量使用者部分隱私資訊,使用過濾條件進行篩選記錄,如 下圖 11 所示,後端限制條件過濾模組主要於記錄寫入之前進行判斷,在有數個限制條 件時,是以 AND 邏輯運算方式進行判斷,在完全符合全部的限制條件,才會將記錄寫 入 SQLite 資料庫。
圖 11:限制條件判斷示意圖。
要如何判定記錄當下是否符合限制條件,判定流程大致如下圖 12 所示:先設定 agreetest 布林參數為 True,檢測條件若有一項不符合,則無法將資料寫入資料庫,而在 前端已經剖析出實驗所需條件屬性,並得到比較運算子和比較值,在後端第一步驟為先 判定哪些項目的布林參數為 True,如果為 True 的話,則使用該屬性感測方法,取出即
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
(>,>=,=)和小於類(<,<=),使用該屬性 bigop 和 lessop 各對為大於類和小於類做字串比 對,若為真則進行第三步驟,將感測實際值和比較值作比較運算子反運算,舉例來說:
(>,>=,=)和小於類(<,<=),使用該屬性 bigop 和 lessop 各對為大於類和小於類做字串比 對,若為真則進行第三步驟,將感測實際值和比較值作比較運算子反運算,舉例來說: