//Logo Image
作者:巫佳哲(2010-05-02);推薦:徐業良(2010-05-02)
附註:本文為元智大學機械工程研究所ME567A「老人福祉科技」課程,遠距居家照護系統建置實作教材。

遠距居家照護系統建置實作教材(3)Mini2440建置分散式資料伺服器

本文介紹遠距居家照護系統建置實作中,如何以Mini2440建置分散式資料伺服器DDS

1.     分散式遠距居家照護系統簡介

1為分散式遠距居家照護系統的資訊架構圖,在此架構中以家庭為遠距居家照護系統建置的基本單位,每一家庭以自身的照護需求安裝所需的感測設備,擷取監測資訊,透過有線或無線的傳輸方式傳送至家中的DDS進行儲存;當收集到的監測數值超過預設之正常範圍時,DDS將主動發送事件警訊(event)至應用伺服器(application server),將事件訊息以e-mail或手機簡訊服務(Short Message Service, SMS)等方式轉發至預設之聯絡人以進行處理,DDS亦可以同樣方式傳送即時量測數據等資料(regular report)給指定的家人或照護者。遠端的家人、照護者或家庭醫師可利用網路瀏覽器(browser)主動讀取DDS中的健康資訊,瀏覽器自動下載應用伺服器中的Java應用程式(Java applet),提供各項監測資訊的監測數據、趨勢分析、各項參數設定等功能。較複雜的管理需求(如照護者、家庭醫師有同時管理多個居家系統的需求或複雜的資料分析),亦可安裝客製的Visual Basic程式(VB program)進行系統管理。當使用者需要向典型的集中式遠距居家健康服務機構訂購額外的服務時,DDS在使用者授權的條件下,也可以讓集中式資料庫下載存於DDS內的健康監測資訊,以及發出即時量測訊息(event),讓集中式資料庫取得使用者的即時監測資訊。

1. 分散式遠距居家照護系統的資訊架構圖

如圖1所示,分散式資料伺服器DDS有兩種可能的型態,一是「精簡型伺服器(thin server)」,是指一台精簡化、小型化、針對特定目的提供所需功能之網路伺服器,第二種型態則是個人電腦上的軟體。分散式遠距居家照護系統中,DDS必須達到的四個基本功能如下:

(1)     接收資料:DDS必須能由其通訊埠或其他接腳,接收到另一個裝置(通常為感測器)所傳送出來的資料訊號。

(2)     運算處理:DDS的核心處理器必須能夠判讀資料格式並且加以運算。

(3)     資料存取:DDS具有將資料存放於外部記憶元件的功能,並且需要能夠反向將資料自記憶元件取出,加以運算處理或是直接輸出。

(4)     伺服處理:DDS具有Request/Response的伺服處理功能,使用者可以經由網路介面登入,遠端讀取DDS裝置系統現況以及記憶元件內容,並由網路介面操作裝置的能力。

本文敘述如何利用Mini2440開發版來建置精簡型伺服器型態的DDS,並且達成上述的四個基本功能。

2.     RS232序列埠資料讀取

Mini2440支援3RS232序列埠,由『/dev』裝置資料夾中可以得知其裝置名稱ttySAC0ttySAC1ttySAC2(如圖2),其中ttySAC0已被系統預設為標準訊息輸出使用,剩下ttySAC1ttySAC2可自由使用。另外Mini2440也可以藉由USBRS232的傳輸線再擴充出一組RS232序列埠來使用,若是使用此方式的RS232序列埠,在裝置列表中則會出現ttyUSB0的裝置檔案。本節主要介紹Mini2440RS232序列埠與裝置溝通使用方式。

2. /dev』裝置資料夾內容

3RS232序列埠腳位圖,請依照圖中的腳位說明,正確的連接至裝置。例如要使用ttySAC1與裝置連接,連結COM2中的腳位。

3. Mini2440序列埠腳位配置圖

【範例2-1】:使用ttyUSB0與電腦連接

範例2-1示範使用ttyUSB0連結Mini2440與電腦傳送資料。將硬體裝置連接正確後,在電腦端開啟終端機並設定相對應的序列埠與傳輸速率9600。確認硬體連接妥當,在Mini2440端執行範例程式“ex2-1_RS232”。首先範例程式會由Mini2440傳送字串“Hello…ARM…DDS..”給電腦,圖4為電腦終端機顯示接收到字串“Hello…ARM…DDS..”,再以電腦鍵盤輸入“abcd” 4個字元回傳給Mini2440,圖5為顯示Mini2440接收到來至電腦的訊息。

4. 範例2-1電腦終端機顯示畫面

5. 範例2-1 Mini2440終端機顯示畫面

6為此範例程式“ex2-1_RS232”之程式碼。第3~12行主要是引用程式庫;第13~14行為基本定義,其中13行為定義“DDS_COM1_Path”ttyUSB0裝置路徑;14行為設定序列埠傳輸速率,注意速率必須與所連接裝置速率相同。

15~55行為主程式內容,其中17~21行為變數宣告;23行執行標準IO函式“open”以開啟序列埠ttyUSB0,並將函式回傳數值命名為“DDS_COM1”,當開啟序列埠成功時“DDS_COM1”大於0,反之失敗則“DDS_COM1”小於034~43行主要是設定序列埠的參數;46行執行標準IO函式“write”傳送字串“Hello…ARM…DDS..”49行執行標準IO函式“read”接收電腦傳送字元後,在終端機顯示;最後第54行執行內建函式“close”關閉序列埠。

 

6. “ex2-1_RS232”程式碼

【範例2-2】:TD3250讀取

範例2-2示範使用Mini2440ttyUSB0來與TD3250通訊。將硬體裝置連接正確後,在Mini2440端執行範例程式“ex2-2_TD3250”,若連接正確,會出現如圖7畫面,顯示接收到的生理量測訊號資料。圖8為主程式碼(main.c),圖9為主要讀取函數READ_Device()程式碼,程式流程如圖10。其餘程式碼可參考表1檔案列表中的檔案。與範例2-1相同,皆使用標準IO函式功能即可完成TD3250讀取。

1. 範例2-2相關檔案列表

檔案

內容

main.c

主程式

TD3250.c

TD3250相關讀取函式

ARMDDSLib/ARMDDSComPort.c

序列埠相關函式

Ex2-2_TD3250

範例執行檔

7. 範例2-2執行結果

8. 主程序之程式碼(main.c)

9. 主要讀取函式READ_Device()之程式碼

10. 範例2-2程式流程圖

【範例2-3】:溫濕度感應器讀取

範例2-3示範使用Mini2440ttyUSB0連結Xbee開發版來接收來至溫濕度感應器的資料。將硬體設備正確連接後,在Mini2440端執行範例執行檔“ex2-3_T_H”,若正確連結則會出現如圖11的畫面,畫面中會顯式接收到的感應器編號、溫度與濕度的訊息。本範例中的相關檔案詳列如表2,圖12為主程式碼,與範例2-1相同,皆使用標準IO函式完成接收資料。

11. 範例2-3執行結果

2. 範例2-3相關檔案列表

檔案

內容

main.c

主程式

ARMDDSLib/ARMDDSComPort.c

序列埠相關函式

ARMDDSLib/ARMDDSTime.c

時間相關函式

Ex2-3_T_H

範例執行檔

12. 範例2-3主程式碼

3.     資料儲存

Mini2440支援MMC/SD記憶卡讀寫功能,本節介紹如何使用C語言撰寫應用程式來讀取與寫入MMC記憶卡功能之應用程式。

【範例3-1】:將字串存入MMC/SD記憶卡中

範例3-1的目的是將預設的字串存入MMC/SD記憶卡中的“ex3-1.txt”檔案。在Mini2440端執行範例3-1的執行檔“ex3-1_mmc_write”,執行時會出現如圖13的畫面,完成後可以發現MMC/SD記憶卡出現“ex3-1.txt”檔案,如圖14,並且內容為預設的字串,如圖15。若再次執行“ex3-1_mmc_write”時,因為範例程式使用附加方式開啟檔案,所以“ex3-1.txt”的檔案內容會繼續往下寫入,並不會清除原先的舊資料,如圖16

13. 範例3-1程式執行畫面

14. 查看MM/SD卡目錄

15. “ex3-1.txt”檔案內容

16. “ex3-1.txt”檔案內容

17為範例3-1之程式碼,此範例中有兩個函式,一為主函式main(),另一個為mmc_write()副函式。其中第13mmc_fp=fopen(path, "a+")呼叫<stdio.h>中的fopen副函式,使用"a+"匯流型態來開啟檔案路徑為“path”的檔案並將其檔案指標存入“fp_mmc”(在第10行宣告),各匯流型態說明如表334fputs(buf, fp_mmc)呼叫<stdio.h>中的fputs副函式,用來將字串變數buf寫入檔案指標為“fp_mmc”所代表的檔案。第15fclose(fp_mmc)呼叫<stdio.h>中的fclose副函式,用來關閉檔案指標為“fp_mmc”所代表的檔案。

17. 範例3-1程式碼

3. “fopen相關型態說明

型態

說明

r

開啟唯讀檔,檔案游標由檔頭開始,且檔案必須存在。

r+

開啟可讀寫檔,檔案游標由檔頭開始,且檔案必須存在。

w

開啟唯寫檔,會覆蓋其檔案內容,若檔案不存在時系統會自動建立。

w+

開啟可讀寫檔,會覆蓋其檔案內容,若檔案不存在時系統會自動建立。

a

開啟唯寫檔,檔案游標由檔尾開始,若檔案不存在時系統會自動建立。

a+

開啟可讀寫檔,檔案游標由檔尾開始,若檔案不存在時系統會自動建立。

【範例3-2】:讀取MMC/SD記憶卡中的檔案內容

範例3-2的目的是讀取MMC/SD記憶卡中的“ex3-1.txt”檔案,並且將其檔案內容顯示在終端機上。首先執行「ex3-2_mmc_read」範例程式,執行結果如圖18所示。

18. 範例3-2程式執行畫面

19為範例3-2之程式碼。包含了主函式mian()與副函式mmc_read(),其中第15feof(fp_mmc)呼叫<stdio.h>中的feof副函式,用來偵測“fp_mmc”檔案的檔案游標是否已移動到檔尾,若已移動到檔尾則回傳非零值,其他狀況回傳0。第17fgetc(fp_mmc)呼叫<stdio.h>中的fgetc副函式,用來讀取“fp_mmc”檔案中的字元並回傳讀取到的字元。

19. 範例3-2程式碼

4.     網頁伺服器

本節介紹如何使用與設定Mini2440之網頁伺服器功能,以及如何透過CGI(Common Gateway Interface)動態網頁方式來顯示系統即時資訊與進行遠端控制功能。

4.1 伺服器設定

首先由開機檔得知(『/etc/init.d』資料夾內的rcS檔),目前Mini2440的網頁伺服器在開機時預設為啟動,所以不需要再輸入指令去啟動網頁伺服器。網頁伺服器的預設環境參數內容(http port、權限、名稱等)如表4,若有需要做更改的話,直接利用“vi”文字編輯指令,修改在『/etc/boa』資料夾內的boa.conf檔案即可,如圖20。注意,若是隨意修改可能會造成網頁伺服器無法正常運作,修改前最好可以利用“cp”複製指令製作備份。確認參數正確無誤後,可以參考執行範例一來測試網頁伺服器是否正常運作。

4. 伺服器相關設定參數表

伺服器參數

參數內容

預設值

Port

伺服器Port

80

User

權限

root

Group

權限群組

root

ErrorLog

錯誤紀錄

/dev/console

AccessLog

連線紀錄

/dev/null

ServerName

伺服器名稱

friendly-arm

DocumentRoot

網頁根目錄

/www

DirectoryIndex

網頁首頁

Index.html

KeepAliveMax

最大連線數

1000

KeepAliveTimeout

連線逾時

10

MimeTypes

 

/etc/mime.types

DefaultType

 

text/plain

CGIPath

CGI執行路徑

/bin

AddType application/x-httpd-cgi

CGI型態

cgi

20. etc/boa/boa.conf

【範例4-1】:顯示靜態網頁

範例4-1主要是在網頁根目錄下放置一個名稱為index.html的網頁,再透過其他個人電腦的網頁瀏覽器(如IEPCMANKKMAN等)去瀏覽其網頁資訊。首先在網頁根目錄『/www』下放置一個名稱為index.html的網頁,其內容簡單即可。HTML網頁程式撰寫語法,請自行參考坊間眾多的網頁製作書籍。此範例中的index.html網頁內容如圖21。接下來在個人電腦上開啟網頁瀏覽器,並在網址列內鍵入網址(http://伺服器位址/index.html),最後會在網頁瀏覽器上顯示放置於『/www』下的index.html網頁內容,如圖22畫面。

21. Index.html網頁程式碼

22. Index.html網頁畫面

4.2. CGI介紹與撰寫方式

CGI(Common Gateway Interface)中文翻譯為「共通閘道介面」,是一種標準介面程式,能讓客戶端藉由網頁與伺服器溝通、執行應用程式及要求數據等。CGI溝通流程如圖23所示,客戶端可藉由網頁瀏覽器等介面發送要求給伺服端,伺服端先透過CGI介面將接受到的要求轉述給應用程式,應用程式會執行相關要求之程式並將其結果再回傳給CGI,此時CGI會將結果再轉述成動態網頁方式讓客戶端的網頁瀏覽器可以讀取。透過這樣的流程,可以讓我們進行遠端控制以及即時讀取兩大功能。

23. CGI流程

可以用來撰寫CGI的語法有許多,如PerlUnix shell scriptsPythonRubyPHPTclC/C++Visual Basic等。本文使用Unix shell scripts方式來撰寫CGI,其撰寫的方式和語法就如同在寫Shell scripts相同,詳細可以參考linux相關書籍。在CGI動態網頁中有一些常用的環境變數如表5,在範例4-2會示範如何將這些環境變數顯示在CGI動態網頁上。除了可以將這頁環境變數顯示於動態網頁上,可以藉由Shell scripts簡單的邏輯判斷等方式,來分辨遠端所傳送過來的指令並且做適當回應。在範例4-3則會示範藉如何透過動態網頁來顯示MMC/SD卡中的資料。

5. CGI環境參數說明

變數名稱

內容

GATEWAY_INTERFACE

ServerCGI版本編號

QUERY_STRING

傳遞給CGI程式的QUERY資訊

REMOTE_ADDR

Client端的IP位址

SCRIPT_NAME

CGI程式所在的路徑

SERVER_NAME

Server的名稱

SERVER_ADDR

ServerIP位址

SERVER_PORT

ServerPORT

SERVER_SOFTWARET

Server程式的名稱和版本

【範例4-2】:透過動態網頁顯示系統資訊

範例4-2主要是利用一個動態網頁ex4-2_cgi.cgi,將系統的一些即時資訊提供客戶端的網頁瀏覽器讀取。首先建立一個ex4-2_cgi.cgi的動態網頁將其並放置於網頁根目錄內,其撰寫界面可使用Windows XP中的筆記本或Linux中的文字編譯器(gedit)等軟體進行撰寫。此範例的動態網頁程式碼內容如圖24,第3~35行是將相關的環境參數和字串利用指令“echo”顯示。最後開啟個人電腦的網頁瀏覽器,在網址列內鍵入網址(http://伺服器位址/ex4-2_cgi.cgi),結果會顯示如圖25的網頁資訊。另外可以試著輸入(http://伺服器位址/ex4-2_cgi.cgi?pas=234&cmd=123)等網路指令,來查看QUERY_STRING的數值。

24. ex4-2_cgi.cgi動態網頁程式碼

25. ex4-2_cgi.cgi動態網頁畫面

【範例4-3】:透過動態網頁顯示記憶卡中的ex3-1.txt檔案內容

範例4-3主要是利用一個動態網頁ex4-3_cgi_mmc.cgi,將MMC/SD卡中的ex3-1.txt檔案內容提供客戶端的網頁瀏覽器讀取。首先建立一個ex4-2_cgi.cgi的動態網頁將其並放置於網頁根目錄內。此範例的動態網頁程式碼內容如圖26,其中第9行是透過“cat”指令來顯示在記憶卡中的檔案。最後開啟個人電腦的網頁瀏覽器,在網址列內鍵入網址(http://伺服器位址/ex4-3_cgi_mmc.cgi),結果會顯示如圖27的網頁資訊。

26. ex4-3_cgi_mmc.cgi動態網頁程式碼

27. ex4-3_cgi_mmc.cgi動態網頁畫面