//Logo Image
作者:巫佳哲(2009-03-13);推薦:徐業良(2009-03-13)

ARM-Based分散式資料伺服器建構生理訊號監測系統

本文敘述如何以ARM9為核心的KS_2410作為分散式資料伺服器(Distributed Data Server, DDS),並使用TD3250(泰博血壓血糖二合一儀器)來擷取血糖、血壓和心跳等生理訊號,來建構生理訊號監測系統。

1.         系統簡介

1為分散式遠距居家照護系統的架構圖,系統中TD3250使用RS232序列埠與DDS作連結,Application ServerClient user是透過網際網路與DDS通訊,DDS的儲存裝置則以MMC卡為主。

1. ARM-Based DDS系統架構圖

系統使用流程敘述如下:

「使用者使用TD3250量測血壓和血糖後,透過傳輸線將量測的資料上傳至DDS中,DDS會自動儲存於儲存裝置內,並且判斷血壓與血糖值是否介於設定的警戒值範圍內,若是超過或低於警戒值時,DDS會透過網際網路發送訊息給Application Server,藉由Application Server將訊息轉換成SMSE-mail等訊息再傳給照護者。遠端照護者則可以透過網頁瀏覽器的方式去讀取DDS內儲存的生理訊號、填寫照護日誌、設定警戒值和填寫病患資料等。」

系統的程式架構主要分為近端裝置資料處理與遠端網路請求處理兩部分。前者主要是由DDS_TD3250應用程式和KS_2410內建的wget應用程式負責處理;後者則是由DDS_Web應用程式和KS_2410內建的httpd應用程式負責處理。圖2所示為相關應用程式在系統中所扮演的角色關係圖。近端裝置資料處理的部分主要是由DDS_TD3250負責與TD3250通訊,並且處理與儲存擷取到的資料,若有警示的需求,則會啟動wget來發送訊息給遠端的Application Server;遠端網路請求部分處理的部分主要是由httpd接收由遠端瀏覽器所發送出來的請求,再啟動DDS_Web來判斷請求的內容,最後透過httpd回覆所需的資料。除此之外,必須配合KS_2410內建的Linux作業系統才可以使系統完整運作。

2. 應用程式關係圖

本文只描述DDS_TD3250DDS_Web兩支應用程式的程式架構與流程,以及介紹如何設定httpd網頁伺服器的相關參數,其餘的網路設定與內建應用程式就不詳細說明。

 

 

 

2.         DDS_TD3250應用程式

DDS_TD3250主要是由以下6個檔案及基本函式庫所組成:

(1)     DDS_TD3250_main.c:敘述主程式及每次循環所做的事件;

(2)     BUTTONS_LED.c:按鈕與Led燈號的控制函式;

(3)     DDS_TIME.c:系統時間的取得;

(4)     RS232COM1.cRS232序列埠的相關設定函式;

(5)     TD3250_Lib.c:與TD3250通訊的方式與指令函式;

(6)     warning.c:啟動警示與警示方式等函式。

各檔案內的函式說明如表1。注意當在編譯這支程式時,除了基本函式庫以外,其他6個檔案必須放在同一資料夾內才可編譯,否則會出現錯誤。

1. 各檔案所包含的函式整理

檔案名稱

函式

說明

DDS_TD3250_main.c

int main()

主程序

void doHouseKeeping()

每循環執行一次

BUTTONS_LED.c

void led_control()

Led燈號控制

void CLOSE_buttons()

關閉buttons裝置

int OPEN_buttons()

開啟buttons裝置

int buttons_check()

檢查buttons device狀態

DDS_TIME.c

int get_DDS_time()

擷取系統時間

RS232COM1.c

int OPEN_COM1()

開啟RS232 device

void CLOSE_COM1()

關閉RS232 device

TD3250_Lib.c

int MMC_Write()

將資料寫入MMC

int device_time_set()

設定TD3250的時間

int check_connect()

測試與TD3250連結

int delete_data()

刪除TD3250內的資料

int READ_MEMO()

讀取TD3250內的資料筆數

int device_judgment()

判斷資料類型與數值

int storage_time()

解讀TD3250的時間

int READ_DATA()

讀取TD3250內的資料

int READ_Device(void)

讀取TD3250流程

warning.c

int read_AP_server_ip_port()

讀取Application Serveripport

int read_CE_server_ip_port()

讀取Centralized Serveripport

int read_vitalsign_limit()

讀取生理訊號警示項目內容

int warning_by()

發送警示

int vitalsign_warning()

判斷警示項目

int check_vitalsign()

檢查生理訊號

DDS_TD3250程式流程如圖3所示。DDS_TD3250這支應用程式是屬於長駐的程式,所以必須將其加入開機啟動程序中,讓程式在系統開機時啟動,其功能主要是在處理與TD3250裝置通訊、資料儲存、時間校正和警示發送等4個事件,分別說明如下。

3. DDS_TD3250程式流程

(1)    TD3250通訊

KS_2410必須使用一組RS232序列埠與TD3250通訊。目前KS_2410提供3組的RS232序列埠,本系統使用第2RS232序列埠作為與TD3250的通訊埠。在程式開啟RS232序列埠裝置前,必須先取得其裝置代號。圖4KS_2410系統裝置資料夾(/dev)的內容,如紅框內所示第2RS232序列埠的裝置代號為ttyS1

4. KS_2410系統裝置資料夾(/dev)

開啟RS232序列埠裝置後,首先必須設定相關的通訊參數,這些參數必須符合TD3250的通訊規範如表2。圖5RS232COM1.c的第19~32行為設定RS232序列埠的參數。將相關參數設定完成且無誤後,再透過標準的輸入輸出函式如read()write()等,即可與TD3250通訊。

2. TD3250的通訊規範

Baud rate

19200

Data bit

8

Parity

No

Start bit

1

Stop bit

1

5. RS232COM1.c19~32

(2)    資料儲存

在資料儲存方面,本系統規劃使用MMC作為儲存裝置。KS_2410已有MMC的驅動程式,所以不需要額外再撰寫驅動程式,只需要在系統開機時透過mount /dev/mmc/part0 /dds/mmc”指令掛載MMC裝置即可使用。

6所示為MMC_Write()函式內容,DDS_TD3250在接收到TD3250的生理訊號資料後,會呼叫此函式將資料儲存於MMC中。首先在函式中使用標準的fopen()函式去開啟檔案,開啟成功後再利用fputc()fgetc()等標準的輸出輸入函式即可完成資料讀寫動作,當檔案的讀寫動作結束後則使用fclose()函式關閉檔案。注意在使用fopen函式去開啟檔案時,必須選擇適當的型態,例如要覆寫檔案時常使用‘w+ 型態,其他型態說明如表3

3. fopen函式型態說明

型態

說明

r

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

r+

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

w

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

w+

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

a

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

a+

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

(3)    警示發送

系統的警示功能主要是在接收TD3250所傳送過來的資料後進行判斷,警示的判斷函式主要都是撰寫在warning.c檔案內。首先在接收TD3250資料前DDS_TD3250會透過read_vitalsign_limit()read_AP_server_ip_port()函式分別讀取MMC卡內的limit.txtapip.txt兩個檔案內容,前者內容為警示界限與項目,後者為Application ServerIPPort資訊。DDS_TD3250在接收TD3250的資料同時也會透過vitalsign_warning()函式來檢查生理訊號是否異常。若資料不在設定的範圍內,則會觸發vitalsign_warning()warning_by()函式,依照設定的警示項目與內容啟動wget應用程式,透過網際網路的方式發送警示訊息給Application Server,表4為警示訊息的編碼內容。

4. 警示訊息編碼

例如:血壓異常和使用E-mail警示
http://140.138.40.190:8080/*5566*0*grc@mail.yzu.edu.tw*0*2009-03-04*12:05*180*120*80*

IP

Port

Code

E-mail(0)
SMS(1)

E-mail/Phone No.

BP(0)
BG(1)

Date

Time

SP

DP

Pulse

140.138.40.190

8080

5566

0

 grc @mail.yzu.edu.tw

0

2009-03-04

0.503472

180

120

80

例如:血糖異常和使用SMS警示
http://140.138.40.190:8080/*5566*1*0920123123*1*2009-03-04*12:05*200*

IP

Port

Code

E-mail(0)
SMS(1)

E-mail/Phone No.

BP(0)
BG(1)

Date

Time

BG

140.138.40.190

8080

5566

1

0920123123

1

2009-03-04

12:05

200

6. MMC_write()函式內容

 

(4)    時間校正

為了使量測資料的時間正確,TD3250的時間必須與DDS的時間統一。DDS_TD3250在抓取TD3250資料流程結束後,會觸發device_time_set()函式進行時間校正。在校正之前,DDS_TD3250會執行get_DDS_time()函式抓取即時的DDS系統時間。圖7get_DDS_time()函式內容。

7. get_DDS_time()函式內容

3.         httpd(網頁伺服器)應用程式

httpd應用程式為ARM-Linux作業系統的內建應用程式,提供簡易的網頁伺服器,並且支援CGI(Common Gateway Interface)動態網頁功能。所以目前httpdDDS主要功能就是擷取網路請求指令與顯示網頁資料的媒介。在系統啟用之前,必須將httpd的參數設定正確,這樣DDS的網頁功能才可以正常運作。

3.1 網頁伺服器參數設定

http的參數都記錄在/etc/boa/boa.conf這個檔案內。首先必須決定DDSportport的設定在其檔案的第25行(圖8)。

8. boa.conf25

為了讓CGI動態網頁在執行程式時能順利,所以在第48行(圖9)可以決定其執行的身份,不過注意若是使用root身份要小心安全性問題。

9. boa.conf48

接著要指定網頁放置的目錄,在第113行(圖10),必須將網頁放置在此目錄下才可以正常顯示。

10. boa.conf113

最後因為PIC-Basic DDS的動態網頁副檔名為egi,為了使ARM-Based DDS能夠接收相同的網頁請求指令,所以必須將egi的副檔名加入至第175行(圖11),讓httpd程式也能接受egi的網頁請求。

11. boa.conf175

3.2 網頁顯示與擷取網路指令

DDS裡目前的網頁規劃除了首頁index.html(圖12)為靜態網頁之外,其餘的網頁皆是CGI動態網頁型態,如表5DDS的所有網頁名稱與說明。在CGI動態網頁的撰寫上,使用的語言為shell語言,其指令就很類似於在終端機輸入時所使用的指令。CGI有許多的環境變數,其中DDS有使用到QUERY_STRING環境變數,QUERY_STRING等於動態網頁名稱問候後面的字串,舉例來說網路請求指令為“http://140.138.139.113:13101/to_pic.egi?pas=123?cmd=test”,此時QUERY_STRING等於“pas=123?cmd=test”

13main.egi動態網頁的程式碼,一開始使用“cd”指令進入tmp目錄內,接著第5“main.egi”字串存入eginame檔案內,第8行再將QUERY_STRING環境變數寫入query檔案,第13行啟動DDS_Web應用程式來判斷指令並列印相對應的文字,最後CGI則會將以上程序所列印出來的文字回覆到遠端的瀏覽器顯示。其他DDS的動態網頁程式碼除了第5行內的名稱有更動外,其餘部分皆與main.egi動態網頁相同。

12. index.html網頁內容

5. DDS的所有網頁名稱與說明

名稱

說明

index.html

首頁

main.egi

首頁內容

config.egi

修改DDS的網路位址

hostip.egi

修改Application ServerIPPort

time.egi

修改UDP Time Server網路位址和DDSRouter SubMask

rpserver.egi

修改Centralized ServerIPPort

vital.egi

生理訊號或日誌顯示

fmmpic.egi

讀取狀態與警示內容顯示

phone.ehi

警示電話與E-mail顯示

infor.egi

用戶資料顯示

state.egi

帳號狀態顯示

to_pic.egi

控制指令指向網頁

13. main.egi網頁內容

4.         DDS_Web應用程式

DDS_Web主要是由以下4C程式及基本函式庫所組成:

(1)   DDS_Web_main.c:敘述程式的程序及判斷與執行網路指令;

(2)   DDS_TIME.c:系統時間的取得;

(3)   get_ifconfig.c:讀取和更改DDS的網路設定值;

(4)   put_egi.c:讀取和回報資料給遠端瀏覽器的函式。

各檔案內的所有函式說明如表6。注意當在編譯這支程式時,除了基本函式庫以外,其他4個檔案必須放在同一資料夾內才可編譯,否則會出現錯誤。

DDS_Web程式流程如圖14所示。DDS_Web這支應用程式是屬於被動的程式,必須藉由其他應用程式來啟動。在功能方面,主要是網路請求指令判斷和執行、回覆網頁資料給遠端瀏覽器等事件。當DDS_Web程式被啟動後,DDS_Web會先利用read_egi_name()http_egi_check()函式去讀取並判斷網路請求類型。在DDS的網路請求類型規畫中,分成兩種類型,第一種為遠端控制指令請求(to_pic.egi),第二種是網頁資料請求(非to_pic.egi)。DDS_Web對兩種網路請求處理方式敘述如下:

14. DDS_Web程式流程

6. 各檔案所包含的函數介紹

檔案名稱

函式

說明

DDS_Web_main.c

int main()

主程序

int read_egi_name()

讀取egi名稱

int http_egi_check()

檢查egi檔案名稱

int read_query()

讀取query檔案內容

int http_pas_check()

檢查密碼

int write_journal()

撰寫日誌

int http_cmd_check()

檢查網路

DDS_TIME.c

get_DDS_time(void)

取得DDS系統時間

get_ifconfig.c

int get_DDS_ifconfig()

讀取DDSIPport

int change_DDS_ifconfig()

更變DDSIPport

put_egi.c

int read_vitalsign_txt()

讀取生理資料

int read_user_AD1()

讀取管理者帳號密碼

int read_user_GC1()

讀取使用者1帳號密碼

int read_user_GC2()

讀取使用者2帳號密碼

int read_user_MD1()

讀取照護者1帳號密碼

int read_user_MD2()

讀取照護者2帳號密碼

int read_login_name_pas()

讀取登入者的帳號密碼

int check_uesr_name_pas()

檢查使用者

int check_user()

檢查使用者

int change_name_pas()

更改帳號密碼

int read_vital_limit()

讀取警示資料

int read_BI()

讀取日誌資料

int read_phone_mail()

讀取電話與E-mail內容

int read_AP_server_ip_port()

讀取Application Serveripport

int read_CE_server_ip_port()

讀取Centralized Serveripport

int put_egi()

回覆egi內容

(1)    遠端控制指令請求

當請求檔案為to_pic.egi()遠端控制指令請求時,DDS_Web觸發read_query()函式讀取請求指令,接著執行http_pas_check()函式來判斷請求指令中的密碼是否正確,當密碼正確後,DDS_Web就會執行http_cmd_check()函式來執行請求指令,其指令包含登入帳號密碼驗證、更改帳號密碼、指定讀取生理訊號時間、指定讀取日誌時間和用戶管理等。相關的指令表如表7

7. DDS網路請求指令

動作

請求指令

登入系統

指令

/to_pic.egi?pas=I_am_superman.?cmd=CPL*DDS*DDS*+
帳號:DDS、密碼:DDS

網頁

/state.egi
回傳格式:*帳號權限*帳號變更成功與否狀態*
目前帳號權限(0: 帳號密碼錯誤, 1: 管理者, 2: 照護者a, 3: 照護者b, 4: 使用者a, 5: 使用者b)、帳號變更成功與否狀態(0: 失敗, 1: 成功)

讀取目前帳號資訊

指令

/to_pic.egi?pas=I_am_superman.?cmd=GUAD1+
管理者: AD1, 照護者a: MD1, 照護者b: MD2, 使用者a: GU1, 使用者b: GU2

網頁

/account.egi
回傳格式:*帳號*密碼*

寫入變更後的帳號資訊

指令

/to_pic.egi?pas=I_am_superman.?cmd=CPN*舊帳號*舊密碼*新帳號*新密碼*+

網頁

/state.egi
回傳格式:*帳號權限*帳號變更成功與否狀態*
目前帳號權限  (0: 帳號密碼錯誤, 1: 管理者, 2: 照護者a, 3: 照護者b, 4: 使用者a, 5: 使用者b)、帳號變更成功與否狀態(0: 失敗, 1: 成功)

下載生理訊號

指令

/to_pic.egi?pas=I_am_superman.?cmd=GD0810*A
送出要求200810月之所有生理量測資料

網頁

/vital.egi
取得生理訊號量測資料

讀取日誌記錄

指令

/to_pic.egi?pas=I_am_superman.?cmd=GD0810+A
送出要求200810月之所有日誌記錄

網頁

vital.egi
取得日誌記錄資料

寫入日誌記錄

指令

/to_pic.egi?pas=I_am_superman.?cmd=WD0810031320A此為日誌測試+
寫入2008103下午13:20之日誌記錄,內容為:此為日誌測試

用戶資料管理

網頁

/infor.egi
讀取使用者姓名、性別、年齡、身高、體重與併發疾病

用戶資料管理

指令

/to_pic.egi?pas=I_am_superman.?cmd=BIname*sex*year*height*weight*disease*+
寫入使用者姓名、性別、年齡、身高、體重與併發疾病

警示設定

指令

/to_pic.egi?pas=I_am_superman.?cmd=ST180.100.110.50.95.50.200.40.1.1.1.0#

網頁

/fmmpic.egi
回傳格式:*資料讀取狀態*警示開關*收縮壓上界*收縮壓下界*舒張壓上界*舒張壓下界*心跳上界*心跳下界*血糖上界*使用SMS*使用Skype*使用E-mail1*使用E-mail2*

寫入警示方式設定

指令

/to_pic egi?pas=I_am_superman.?cmd=MB10932123123#
第一組手機號碼:0932123123

指令

/to_pic egi?pas=I_am_superman.?cmd=MB20923321321#
第二組手機號碼:0923321321

指令

/to_pic egi?pas=I_am_superman.?cmd=EM1s97xxxx@mail.yzu.edu.tw#
第一組E-mail信箱:s97xxxx@mail.yzu.edu.tw

指令

/to_pic egi?pas=I_am_superman.?cmd=EM1s97oooo@mail.yzu.edu.tw#
第二組E-mail信箱:s97 oooo @mail.yzu.edu.tw

指令

/to_pic?pas=I_am_superman.?cmd=SY
開啟SMS功能

指令

/to_pic?pas=I_am_superman.?cmd=SN
關閉SMS功能

指令

/to_pic?pas=I_am_superman.?cmd=SkypeY
開啟Skype功能

指令

/to_pic?pas=I_am_superman.?cmd=SkypeN
關閉Skype功能

讀取警示方式設定

網頁

/phone.egi
* SMS* Skype
語音通知*E-mail1*E-mail2*

(2)    網頁資料請求

當請求檔案不為to_pic.egi()、即網頁資料請求類型時,DDS_Web觸發put_egi()函式來回覆相關的網頁資料,在put_egi()函式中,會先讀取預先放置在MMC中的原始網頁內容,再將其內容傳送給網頁伺服器,若當讀取到@符號開頭的代碼時,DDS_Web會將其轉換為@代碼所包含的內容,表8@代碼說明。透過網頁伺服器的轉換,遠端的瀏覽器就會顯示相關的網頁內容。

8. @代碼說明

egi name

@代碼

說明

main.egi

@v, @t, @s, @r, @o

Information of PIC_Server IP, gateway, HTTP port, and Application server IP & port.

config.egi

@v, @t, @s, @r, @o

Information of PIC_Server IP, gateway, HTTP port.

hostip.egi

@r, @o

Information of Application server IP & port.

time.egi

@u, @n, @m

Information of UDP time server, PIC server sub net mask, local port (remote update).

fmmpic.egi

@A

MMC reading state, 0: not finish, 1: EOF

@B

Event switch, 0: off, 1: on

@a

Up limit of SP

@b

Low limit of SP

@c

Up limit of DP

@d

Low limit of DP

@e

Up limit of pulse

@f

Low limit of pulse

@g

Up limit of BG

@h

Low limit of BG

@i

Phone one

@j

Phone two

@k

Email one

@l

Email two

phone.egi

@w

Phone and E-mail message

account.egi

@x

A string of name, old password and new password

state.egi

@V

Login user; (0: AD1, 1: MD1, 2: MD2, 3: GU1, 4: GU2)

@U

Renew account, 0: fail, 1:OK

infor.egi

@y

Personal information

vital.egi

@z

Vital sign data (with 999 characters)