掌上電腦(即PPC,Palmsize PC)以Windows CE為操作系統(tǒng) 。Windows CE是一種模塊化的、開放的、實(shí)時(shí)的、具有強(qiáng)大通信能力的、搶先式、多任務(wù)的嵌入式操作系統(tǒng)。它具備高性能、高效率的OS特性,包括按需換頁、共享存儲(chǔ)、交叉處理同步、支持大容量堆(heap)等。它支持文件系統(tǒng)、注冊(cè)表、以及對(duì)象存儲(chǔ)(ObjectStore)技術(shù)。通過UNICODE完全支持國際字符集。它具有靈活的電源管理,包括睡眠/喚醒模式。它有支持特定目標(biāo)應(yīng)用的豐富服務(wù),例如手寫體、流式Video等等。
由于掌上電腦有Windows圖形用戶界面,因此操作簡(jiǎn)單方便。更由于掌上電腦只有手掌大小, 因此特別適用于移動(dòng)計(jì)算和移動(dòng)通訊領(lǐng)域?! indows CE提供了豐富的通信支持:撥號(hào)連接、LAN,提供與PC、內(nèi)聯(lián)網(wǎng)、以及Internet的連接。提供基本的通信基礎(chǔ)結(jié)構(gòu),包括:套接字(socket)、Internet的TCP/IP、PPP、IrDA、遠(yuǎn)程訪問、TAPI(Telephoney API)以及Unimodem、WinInet、Win32串行、SLIP驅(qū)動(dòng)程序,以及PC連接性的支持。并支持廣泛的通信硬件。
下面以兩個(gè)掌上電腦之間通過MODEM進(jìn)行遠(yuǎn)程通訊為例,說明掌上電腦上的通訊程序設(shè)計(jì)的主要過程。兩個(gè)掌上電腦之間通過MODEM進(jìn)行遠(yuǎn)程通訊程序設(shè)計(jì)時(shí)主要有兩種方法。一種方法是直接利用串行通訊函數(shù)而不用TAPI,另一種方法是利用TAPI及串行通訊函數(shù)。由于利用TAPI可以簡(jiǎn)化使用MODEM的過程,并且TAPI已經(jīng)成為事實(shí)上的工業(yè)標(biāo)準(zhǔn),因此,本文介紹采用TAPI的方法。
TAPI函數(shù)以lineXXXXX...的形式命名,其主要函數(shù)的具體功能介紹如下。
1. LONG lineGetID(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect, LPVARSTRING lpDeviceID, LPCTSTR lpszDeviceClass):獲取或指定開放線路,地址或呼叫相關(guān)聯(lián)的設(shè)備標(biāo)識(shí)符。它返回一個(gè)MODEM句柄。。在進(jìn)行呼叫之前,程序常需要MODEM句柄來檢索MODEM的配置和性能,程序可以通過調(diào)用GetCommProperties()以讀取COMMPROP和COMMCONFIG結(jié)構(gòu)來了解MODEM的信息,而GetCommProperties()就需要lineGetID()返回的MODEM句柄。
2. LONG lineInitialize(LPHLINEAPP lphLineApp, HINSTANCE hInstance, LINECALLBACK lpfnCallback, LPCTSTR lpszAppName, LPDWORD lpdwNumDevs):初始化TAPI線路。在用TAPI通過MODEM進(jìn)行遠(yuǎn)程通訊程序設(shè)計(jì)時(shí),必不可少的是調(diào)用lineInitialize()函數(shù)以初始化TAPI。lineInitialize()分配為支持邏輯線路設(shè)備的使用而必須的內(nèi)部資源。它還登記了一個(gè)回調(diào)函數(shù),使操作系統(tǒng)通過該函數(shù)將有關(guān)線路狀態(tài)的消息返回給程序。
3.lineShutDown(hTAPI):關(guān)閉TAPI。它是與lineInitialize()相對(duì)應(yīng)的函數(shù),當(dāng)程序使用完線路設(shè)備后,應(yīng)調(diào)用lineShutDown(hTAPI)以釋放為線路設(shè)備分配的資源。
4.lineNegotiateAPIVersion(hAPI,dwDeviceID,dwLowVersion,dwHighVersion,&dwVersionToUse,&extensions):協(xié)商TAPI版本號(hào)。TAPI是需要版本協(xié)商的一種Win32 API。版本協(xié)商確保當(dāng)安裝了新版本的TAPI驅(qū)動(dòng)程序時(shí),程序仍能安全正常運(yùn)行.
5.lineGetDevCaps(hAPI,dwLine,dwVersionToUse,dwExtVersion,&linedevcaps):返回指定邏輯線路設(shè)備的能力。
6.LONG lineGetDevConfig (DWORD dwDeviceID, LPVARSTRING lpDeviceConfig, LPCTSTR lpszDeviceClass):返回指定邏輯線路設(shè)備的缺省配置。
7.LONG lineSetDevConfig (DWORD dwDeviceID, LPVOID const lpDeviceConfig, DWORD dwSize, LPCTSTR lpszDeviceClass):設(shè)置指定媒體流設(shè)備。
8.LONG lineConfigDialogEdit (DWORD dwDeviceID, HWND hwndOwner, LPCTSTR lpszDeviceClass, LPVOID const lpDeviceConfigIn, DWORD dwSize, LPVARSTRING lpDeviceConfigOut):顯示一個(gè)允許用戶改變邏輯線路設(shè)備的配置數(shù)據(jù)的對(duì)話框。
9.LONG lineOpen(HLINEAPP hLineApp, DWORD dwDeviceID, LPHLINE lphLine, DWORD dwAPIVersion, DWORD dwExtVersion, DWORD dwCallbackInstance, DWORD dwPrivileges, DWORD dwMediaModes, LPLINECALLPARAMS const lpCallParams):打開指定邏輯線路設(shè)備,并提供后續(xù)監(jiān)視和控制線路的功能。調(diào)用lineInitialize()函數(shù)初始化TAPI后,就可以調(diào)用lineOpen()函數(shù)以打開線路。
10.LONG lineClose(HLINE hLine):關(guān)閉指定邏輯線路設(shè)備。
11.LONG lineMakeCall(HLINE hLine, LPHCALL lphCall, LPCTSTR lpszDestAddress, DWORD dwCountryCode, LPLINECALLPARAMS const lpCallParams): 初始化輸出撥號(hào),進(jìn)行呼叫,并返回線路句柄以進(jìn)行數(shù)據(jù)傳輸。
12.LONG lineDrop(HCALL hCall, LPCTSTR lpsUserUserInfo, DWORD dwSize):收線或斷開呼叫。當(dāng)程序結(jié)束呼叫時(shí),需要調(diào)用lineDrop()函數(shù)以斷開或中止呼叫。
13.LONG lineDeallocateCall(HCALL hCall):釋放系統(tǒng)為呼叫分配的內(nèi)存。當(dāng)程序結(jié)束呼叫時(shí),除了需要調(diào)用lineDrop()函數(shù)以斷開或中止呼叫外,還調(diào)用lineDeallocateCall()函數(shù)以釋放系統(tǒng)為呼叫分配的內(nèi)存,調(diào)用lineClose()函數(shù)以關(guān)閉線路,調(diào)用lineShutdown()函數(shù)以將程序與TAPI斷開。
總之,在通過MODEM進(jìn)行遠(yuǎn)程通訊程序設(shè)計(jì)時(shí),必不可少的是要調(diào)用lineInitialize()函數(shù)以初始化TAPI,以及調(diào)用lineOpen()函數(shù)以打開線路,調(diào)用lineMakeCall()函數(shù)以進(jìn)行撥號(hào)。當(dāng)程序撥號(hào)成功后,就可以使用由lineMakeCall()函數(shù)返回的線路句柄進(jìn)行數(shù)據(jù)傳輸了!除此之外,為了編寫可靠的遠(yuǎn)程通訊程序,還應(yīng)調(diào)用有關(guān)檢測(cè)線路設(shè)備能力的函數(shù),檢測(cè)TAPI版本兼容性的函數(shù),檢測(cè)線路當(dāng)前使用狀態(tài)的函數(shù)等以適應(yīng)各種情況。當(dāng)程序結(jié)束呼叫時(shí),需要調(diào)用lineDrop()函數(shù)以斷開和中止呼叫,調(diào)用lineDeallocateCall()函數(shù)以釋放系統(tǒng)為呼叫分配的內(nèi)存,調(diào)用lineClose()函數(shù)以關(guān)閉線路,調(diào)用lineShutdown()函數(shù)以將程序與TAPI斷開。
由于掌上電腦有Windows圖形用戶界面,因此操作簡(jiǎn)單方便。更由于掌上電腦只有手掌大小, 因此特別適用于移動(dòng)計(jì)算和移動(dòng)通訊領(lǐng)域?! indows CE提供了豐富的通信支持:撥號(hào)連接、LAN,提供與PC、內(nèi)聯(lián)網(wǎng)、以及Internet的連接。提供基本的通信基礎(chǔ)結(jié)構(gòu),包括:套接字(socket)、Internet的TCP/IP、PPP、IrDA、遠(yuǎn)程訪問、TAPI(Telephoney API)以及Unimodem、WinInet、Win32串行、SLIP驅(qū)動(dòng)程序,以及PC連接性的支持。并支持廣泛的通信硬件。
下面以兩個(gè)掌上電腦之間通過MODEM進(jìn)行遠(yuǎn)程通訊為例,說明掌上電腦上的通訊程序設(shè)計(jì)的主要過程。兩個(gè)掌上電腦之間通過MODEM進(jìn)行遠(yuǎn)程通訊程序設(shè)計(jì)時(shí)主要有兩種方法。一種方法是直接利用串行通訊函數(shù)而不用TAPI,另一種方法是利用TAPI及串行通訊函數(shù)。由于利用TAPI可以簡(jiǎn)化使用MODEM的過程,并且TAPI已經(jīng)成為事實(shí)上的工業(yè)標(biāo)準(zhǔn),因此,本文介紹采用TAPI的方法。
TAPI函數(shù)以lineXXXXX...的形式命名,其主要函數(shù)的具體功能介紹如下。
1. LONG lineGetID(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect, LPVARSTRING lpDeviceID, LPCTSTR lpszDeviceClass):獲取或指定開放線路,地址或呼叫相關(guān)聯(lián)的設(shè)備標(biāo)識(shí)符。它返回一個(gè)MODEM句柄。。在進(jìn)行呼叫之前,程序常需要MODEM句柄來檢索MODEM的配置和性能,程序可以通過調(diào)用GetCommProperties()以讀取COMMPROP和COMMCONFIG結(jié)構(gòu)來了解MODEM的信息,而GetCommProperties()就需要lineGetID()返回的MODEM句柄。
2. LONG lineInitialize(LPHLINEAPP lphLineApp, HINSTANCE hInstance, LINECALLBACK lpfnCallback, LPCTSTR lpszAppName, LPDWORD lpdwNumDevs):初始化TAPI線路。在用TAPI通過MODEM進(jìn)行遠(yuǎn)程通訊程序設(shè)計(jì)時(shí),必不可少的是調(diào)用lineInitialize()函數(shù)以初始化TAPI。lineInitialize()分配為支持邏輯線路設(shè)備的使用而必須的內(nèi)部資源。它還登記了一個(gè)回調(diào)函數(shù),使操作系統(tǒng)通過該函數(shù)將有關(guān)線路狀態(tài)的消息返回給程序。
3.lineShutDown(hTAPI):關(guān)閉TAPI。它是與lineInitialize()相對(duì)應(yīng)的函數(shù),當(dāng)程序使用完線路設(shè)備后,應(yīng)調(diào)用lineShutDown(hTAPI)以釋放為線路設(shè)備分配的資源。
4.lineNegotiateAPIVersion(hAPI,dwDeviceID,dwLowVersion,dwHighVersion,&dwVersionToUse,&extensions):協(xié)商TAPI版本號(hào)。TAPI是需要版本協(xié)商的一種Win32 API。版本協(xié)商確保當(dāng)安裝了新版本的TAPI驅(qū)動(dòng)程序時(shí),程序仍能安全正常運(yùn)行.
5.lineGetDevCaps(hAPI,dwLine,dwVersionToUse,dwExtVersion,&linedevcaps):返回指定邏輯線路設(shè)備的能力。
6.LONG lineGetDevConfig (DWORD dwDeviceID, LPVARSTRING lpDeviceConfig, LPCTSTR lpszDeviceClass):返回指定邏輯線路設(shè)備的缺省配置。
7.LONG lineSetDevConfig (DWORD dwDeviceID, LPVOID const lpDeviceConfig, DWORD dwSize, LPCTSTR lpszDeviceClass):設(shè)置指定媒體流設(shè)備。
8.LONG lineConfigDialogEdit (DWORD dwDeviceID, HWND hwndOwner, LPCTSTR lpszDeviceClass, LPVOID const lpDeviceConfigIn, DWORD dwSize, LPVARSTRING lpDeviceConfigOut):顯示一個(gè)允許用戶改變邏輯線路設(shè)備的配置數(shù)據(jù)的對(duì)話框。
9.LONG lineOpen(HLINEAPP hLineApp, DWORD dwDeviceID, LPHLINE lphLine, DWORD dwAPIVersion, DWORD dwExtVersion, DWORD dwCallbackInstance, DWORD dwPrivileges, DWORD dwMediaModes, LPLINECALLPARAMS const lpCallParams):打開指定邏輯線路設(shè)備,并提供后續(xù)監(jiān)視和控制線路的功能。調(diào)用lineInitialize()函數(shù)初始化TAPI后,就可以調(diào)用lineOpen()函數(shù)以打開線路。
10.LONG lineClose(HLINE hLine):關(guān)閉指定邏輯線路設(shè)備。
11.LONG lineMakeCall(HLINE hLine, LPHCALL lphCall, LPCTSTR lpszDestAddress, DWORD dwCountryCode, LPLINECALLPARAMS const lpCallParams): 初始化輸出撥號(hào),進(jìn)行呼叫,并返回線路句柄以進(jìn)行數(shù)據(jù)傳輸。
12.LONG lineDrop(HCALL hCall, LPCTSTR lpsUserUserInfo, DWORD dwSize):收線或斷開呼叫。當(dāng)程序結(jié)束呼叫時(shí),需要調(diào)用lineDrop()函數(shù)以斷開或中止呼叫。
13.LONG lineDeallocateCall(HCALL hCall):釋放系統(tǒng)為呼叫分配的內(nèi)存。當(dāng)程序結(jié)束呼叫時(shí),除了需要調(diào)用lineDrop()函數(shù)以斷開或中止呼叫外,還調(diào)用lineDeallocateCall()函數(shù)以釋放系統(tǒng)為呼叫分配的內(nèi)存,調(diào)用lineClose()函數(shù)以關(guān)閉線路,調(diào)用lineShutdown()函數(shù)以將程序與TAPI斷開。
總之,在通過MODEM進(jìn)行遠(yuǎn)程通訊程序設(shè)計(jì)時(shí),必不可少的是要調(diào)用lineInitialize()函數(shù)以初始化TAPI,以及調(diào)用lineOpen()函數(shù)以打開線路,調(diào)用lineMakeCall()函數(shù)以進(jìn)行撥號(hào)。當(dāng)程序撥號(hào)成功后,就可以使用由lineMakeCall()函數(shù)返回的線路句柄進(jìn)行數(shù)據(jù)傳輸了!除此之外,為了編寫可靠的遠(yuǎn)程通訊程序,還應(yīng)調(diào)用有關(guān)檢測(cè)線路設(shè)備能力的函數(shù),檢測(cè)TAPI版本兼容性的函數(shù),檢測(cè)線路當(dāng)前使用狀態(tài)的函數(shù)等以適應(yīng)各種情況。當(dāng)程序結(jié)束呼叫時(shí),需要調(diào)用lineDrop()函數(shù)以斷開和中止呼叫,調(diào)用lineDeallocateCall()函數(shù)以釋放系統(tǒng)為呼叫分配的內(nèi)存,調(diào)用lineClose()函數(shù)以關(guān)閉線路,調(diào)用lineShutdown()函數(shù)以將程序與TAPI斷開。