




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、windowswindows 下基于電話線路的數(shù)據(jù)通信程序的設(shè)計(jì)與實(shí)現(xiàn)下基于電話線路的數(shù)據(jù)通信程序的設(shè)計(jì)與實(shí)現(xiàn)的設(shè)計(jì)與實(shí)現(xiàn)的設(shè)計(jì)與實(shí)現(xiàn)摘摘 要要電話網(wǎng)絡(luò)是最大的通信網(wǎng)絡(luò),但是我們通常只是用來進(jìn)行語音傳輸。為了更好的發(fā)掘電話網(wǎng)絡(luò)的潛力,以及解決一些在沒有互聯(lián)網(wǎng)地區(qū)的數(shù)據(jù)的傳輸需要,開發(fā)一種可以通過電話線路進(jìn)行數(shù)據(jù)傳輸?shù)能浖呛苡斜匾?。微軟的電話?yīng)用程序接口(tapi)是一種標(biāo)準(zhǔn)的應(yīng)用程序接口(api),使得個(gè)人電腦能夠通過運(yùn)行微軟的 windows 系統(tǒng)來使用電話服務(wù)。tapi 里面封裝了所有的對(duì) modem 進(jìn)行操作的 at 指令,從而我們只需要調(diào)用 tapi 的函數(shù)而不需要知道底層的具體操
2、作就可以執(zhí)行一個(gè)呼叫和應(yīng)答一個(gè)呼叫,以及其他的線路操作,從而快速開發(fā)出一個(gè)基于 windows 平臺(tái)的通過電話線路進(jìn)行數(shù)據(jù)傳輸?shù)某绦?。本文介紹了開發(fā)次程序需要的理論基礎(chǔ)包括 windows 平臺(tái)軟件開發(fā)的基礎(chǔ)、tapi 的概述、tapi 的基本概念。詳細(xì)的介紹了軟件開發(fā)的的思路和流程,闡述了整個(gè)呼叫的生命周期內(nèi)的線路上所產(chǎn)生的狀態(tài)消息,以及依據(jù)這些消息而應(yīng)該進(jìn)行的具體操作。根據(jù)軟件開發(fā)的思路的指導(dǎo)以及整個(gè)線路消息為程序開發(fā)的脈絡(luò),本文最后介紹了一個(gè)可以在 windows 下面撥打?qū)Ψ降碾娫捥?hào)碼,當(dāng)雙方連通后可以通過電話線路進(jìn)行數(shù)據(jù)傳輸?shù)某绦虻木幋a開發(fā)過程,并且最后程序進(jìn)行了測試。關(guān)鍵詞:關(guān)鍵詞
3、: windows;電話線路;數(shù)據(jù)通信;tapithe design and implementation of a telephone-line based communication program in windows operating systemabstractthe telephony network is the largest communications network, and its generally used for voice transmission. to better utilize the advantages of the telephony netwo
4、rk and meet the need of data transmission in places where internet is inaccessible, it is definitely necessary to develop a software which could transmit data over existing telephone lines. microsofts telephone application program interface (tapi), a standard application program interface (api), can
5、 help personal computers running microsofts windows system to take use of telephone services. tapi has encapsulated all at commands for modem operation, which will only need users to call the tapi function to initiate and answer a call, rather than to know the detail operation on the implementation,
6、 nor other operations on the lines. this would largely help to develop a program through telephone lines for data transmission, on a windows-based platform. the paper firstly describes the theoretical basis for the development of sub programs, including the software development basis on windows plat
7、form, tapi overview and its basic concepts. the paper then describes the detail ideas and processes on the software implementation. the paper also represents an entire call life cycle with its possible state messages, and the corresponding operations needed. finally, on the one below in the windows
8、call each others phone numbers, when the two sides can connect through telephone lines for data transmission procedures for the development of the coding process, and in the final process of the test.key words: windows; telephone lines; data communications; tapi目目 錄錄論文總頁數(shù):17 頁1前言.12設(shè)計(jì)開發(fā)的基礎(chǔ)理論.12.1win
9、dows sdk 簡介.12.2windows 程序的基本結(jié)構(gòu).12.2.1概述.12.2.2消息處理函數(shù).12.2.3窗口的建立.22.2.4消息循環(huán).22.3modem 的控制.32.4tapi 通信編程.32.4.1tapi 的含義 .32.4.2tapi 的體系結(jié)構(gòu) .42.5tapi 的基本概念 .43程序設(shè)計(jì)思想與流程.63.1使用 tapi 開發(fā)的基本思路 .63.2各功能模塊的設(shè)計(jì).83.2.1tapi 的配置階段 .83.2.2tapi 的連接階段 .83.2.3數(shù)據(jù)傳送階段.93.2.4關(guān)閉連接階段.104編碼實(shí)現(xiàn).104.1程序主類的的定義.104.2線路操作的實(shí)現(xiàn).11
10、4.3呼叫的發(fā)起和應(yīng)答的實(shí)現(xiàn).124.4數(shù)據(jù)操作的實(shí)現(xiàn).135軟件測試.14結(jié) 論.14參考文獻(xiàn).14第 1 頁 共 17 頁1 1前言前言當(dāng)今計(jì)算機(jī)網(wǎng)絡(luò)十分普及,但仍有不少地區(qū)無法安裝網(wǎng)絡(luò),相比之下電話線網(wǎng)比 internet 發(fā)達(dá)很多,我們用的寬帶也是在電話線網(wǎng)的基礎(chǔ)上建立起來的。因此在網(wǎng)絡(luò)不發(fā)達(dá)地區(qū),在無網(wǎng)絡(luò)的情況下能用電話線進(jìn)行數(shù)據(jù)通訊就十分有意義了。用電話線進(jìn)行數(shù)據(jù)通訊不僅可以方便的接收和發(fā)送數(shù)據(jù),比起internet 數(shù)據(jù)通訊,安全性也是非常可靠的。modem 曾經(jīng)被廣泛用于撥號(hào)上網(wǎng),通過幾年的迅速發(fā)展,已經(jīng)取得了極大的成功。隨著技術(shù)的發(fā)展和認(rèn)識(shí)的提高,人們拓寬了 modem 的應(yīng)
11、用領(lǐng)域,把它用于遠(yuǎn)程數(shù)據(jù)通信。modem 能從計(jì)算機(jī)接收串行數(shù)據(jù),通過 pstn 電話網(wǎng)傳送給另一端的 modem ,所以使用 modem 可以實(shí)現(xiàn)兩臺(tái)遠(yuǎn)程計(jì)算機(jī)的互聯(lián),就像組成一個(gè)廣域網(wǎng)絡(luò)系統(tǒng)一樣。當(dāng)兩臺(tái)計(jì)算機(jī)通過 modem 撥號(hào)連接成功后,它們之間的通信就像串行通信一樣方便。2 2設(shè)計(jì)開發(fā)的基礎(chǔ)理論設(shè)計(jì)開發(fā)的基礎(chǔ)理論2.12.1 windows sdk 簡介簡介sdk 即 software develope kit(軟件開發(fā)工具包) ,它包含了進(jìn)行windows 軟件開發(fā)的文檔和 api 函數(shù)的輸入庫、頭文件(因?yàn)?api 在動(dòng)態(tài)鏈接庫中,這些動(dòng)態(tài)鏈接庫是系統(tǒng)的組成部分因此不用再提供,而
12、輸入庫和頭文件則必須,這樣才能在你的程序中使用 api 函數(shù)) 。早期 sdk 是一個(gè)單獨(dú)發(fā)放的包,現(xiàn)在在 visual c+和其他一些開發(fā)環(huán)境中已經(jīng)包含了它。sdk 編程就是直接調(diào)用 windows 的 api 進(jìn)行編程,api 由上千個(gè) api 函數(shù)組成。2.22.2 windowswindows 程序的基本結(jié)構(gòu)程序的基本結(jié)構(gòu)2.2.12.2.1 概述概述windows 程序具有相對(duì)固定的結(jié)構(gòu),對(duì)編寫者而言,不需要書寫整個(gè)過程,大部分過程由系統(tǒng)完成。程序中只要按一定的格式填寫系統(tǒng)留給客戶的那一小部分。所需要完成的有:窗口類的定義、窗口的建立、消息函數(shù)的書寫、消息循環(huán)。2.2.22.2.2
13、消息處理函數(shù)消息處理函數(shù)windows 程序是事件驅(qū)動(dòng)的,對(duì)于一個(gè)窗口,它的大部分例行維護(hù)是由系統(tǒng)維護(hù)的。每個(gè)窗口都有一個(gè)消息處理函數(shù)。在消息處理函數(shù)中,對(duì)傳入的消息進(jìn)行處理。系統(tǒng)內(nèi)還有它自己的缺省消息處理函數(shù)??蛻魧懸粋€(gè)消息處理函數(shù),在窗口建立前,將消息處理函數(shù)與窗口關(guān)聯(lián)。這樣,每當(dāng)有消息產(chǎn)生時(shí),就會(huì)去調(diào)用這個(gè)消息處理函數(shù)。通常情況下,客戶都不會(huì)處理全部的消息,而是只處理自己感興趣的消息,其他的,則送回到系統(tǒng)的缺省消息處理函數(shù)中去。第 2 頁 共 17 頁消息處理函數(shù)的原型如下:參數(shù):窗口句柄,消息,消息參數(shù),消息參數(shù)lresult callback wndproc(hwnd hwnd, u
14、int message, wparam wparam, lparam lparam) /處理感興趣的消息 switch (message) case .case./其他消息交給由系統(tǒng)提供的缺省處理函數(shù)return :defwindowproc (hwnd, message, wparam, lparam) ;2.2.32.2.3 窗口的建立窗口的建立客戶需要自己建立窗口,建立后會(huì)得到系統(tǒng)返回的窗口句柄(hwnd),后繼的針對(duì)窗口的操作都針對(duì)句柄進(jìn)行。1.注冊(cè)窗口類建立窗口前,需要制定好這個(gè)窗口的相關(guān)屬性,最主要的就是將自己定義的消息處理函數(shù)與窗口關(guān)聯(lián),其他的屬性還包括:菜單、圖標(biāo)等等。這個(gè)屬性
15、指定步驟是通過指定窗口類來完成的。對(duì)于自己建立的窗口,這個(gè)窗口類需要自己制定,也即自己填充一個(gè) wndclass 結(jié)構(gòu),然后向系統(tǒng)注冊(cè)。對(duì)于一些特殊窗口,如按鈕等控件,他們的行為是系統(tǒng)制定好了的,所以不需要自己注冊(cè),直接使用對(duì)應(yīng)的“窗口類”名稱就行了。2.建立窗口建立窗口時(shí),注冊(cè)的窗口類名稱作為參數(shù)傳入。這樣,當(dāng)有針對(duì)該窗口的消息時(shí),將調(diào)用“窗口類”中指定的消息處理函數(shù),在其中得到處理。2.2.42.2.4 消息循環(huán)消息循環(huán)系統(tǒng)會(huì)將針對(duì)這個(gè)程序的消息依次放到程序的“消息隊(duì)列”中,由程序自己依次取出消息,在分發(fā)到對(duì)應(yīng)的窗口中去。因此,建立窗口后,將進(jìn)入一個(gè)循環(huán)。在循環(huán)中,取出消息、派發(fā)消息,循環(huán)
16、往復(fù),直到取得的消息是退出消第 3 頁 共 17 頁息。循環(huán)退出后,程序即結(jié)束。2.32.3 modemmodem 的控制的控制目前模擬電話線路被廣泛用于數(shù)據(jù)傳輸。調(diào)制解調(diào)器(modem)被用來實(shí)現(xiàn)數(shù)字信號(hào)到模擬信號(hào)和模擬信號(hào)到數(shù)字信號(hào)的相互轉(zhuǎn)換。modem 通過 pstn (public switched telephone network,公用交換式電話網(wǎng))來傳輸數(shù)據(jù)。目前計(jì)算機(jī)控制調(diào)制解調(diào)器有兩種方法:一種方法是向 modem 發(fā)送 at 指令,另一種方法是使用 tapi (telephony application programming)即電話應(yīng)用程序接口。at 指令集是由 hays
17、 公司首先推出的用于控制自己開發(fā)的 smart modem 系列產(chǎn)品的命令集合,at 命令集推出后得到廣泛的應(yīng)用,很快其它生產(chǎn)調(diào)制解調(diào)器的公司也都使用與 hays 公司 at 指令集兼容的 at 指令集。開發(fā)者利用串行通信 api 再加上基本的 hays 兼容的 at 命令,就可以實(shí)現(xiàn)對(duì) modem 的控制。但這種方法在 windows 中用起來很不方便。原因如下:許多 modem 制造商已向標(biāo)準(zhǔn)的 at 指令集中添加了許多變種,這就使應(yīng)用程序與市售的所有 modem 保持完全兼容很困難。而 windows 維護(hù)了一個(gè)數(shù)據(jù)庫,其中包含了商用調(diào)制解調(diào)器以及每個(gè) modem 支持的 at 命令集變
18、種,使用 tapi 則可以訪問該數(shù)據(jù)庫,所以使用標(biāo)準(zhǔn) tapi 函數(shù)生成呼叫和控制 modem 的應(yīng)用程序不需要知道 at 命令集的詳細(xì)內(nèi)容。2.42.4 tapitapi 通信編程通信編程2.4.12.4.1 tapitapi 的含義的含義計(jì)算機(jī)電話集成(computer telephony integration,縮寫 cti)是計(jì)算機(jī)技術(shù)和電信技術(shù)相結(jié)合的產(chǎn)物。電子通信行業(yè)配備了各種各樣的硬件系統(tǒng),僅僅收集這些系統(tǒng)的標(biāo)準(zhǔn)、文檔和接口規(guī)范就是很復(fù)雜的任務(wù),要設(shè)計(jì)一個(gè)考慮所有情況的任務(wù)就更加困難。為了減輕開發(fā)者的負(fù)擔(dān),microsoft 公司和 intel公司聯(lián)合起來創(chuàng)建了 windows
19、telephony api(tapi)給應(yīng)用程序編程者提供一個(gè)接口,并且允許應(yīng)用程序無需改變就可以適應(yīng)多種多樣的電信系統(tǒng)。 tapi 是 microsoft 公司的 windows 開放式服務(wù)結(jié)構(gòu)中的一部分,它包括兩個(gè)接口:開發(fā)人員使用的應(yīng)用程序接口和用于連接某種電話網(wǎng)絡(luò)的接口。tapi 為通信應(yīng)用程序提供控制通信的功能,包括數(shù)據(jù)、傳真、語音,以及處理計(jì)算機(jī)與電話網(wǎng)之間的信號(hào)燈。 tapi 服務(wù)為通信應(yīng)用程序提供了一種與設(shè)備無關(guān)的方法,避免了使用 at指令直接訪問硬件可能造成的沖突,并且讓應(yīng)用程序可以與包括數(shù)字綜合服務(wù)網(wǎng)(intergrated services digital network
20、)在內(nèi)的各種通信網(wǎng)絡(luò)通信;同時(shí)還提供了訪問通信端口和設(shè)備的通用機(jī)制。這樣,多個(gè)應(yīng)用程序就可以共享這些設(shè)備,tapi 管理對(duì)各個(gè)設(shè)備的訪問,讓通用程序協(xié)調(diào)使用這些設(shè)備。tapi第 4 頁 共 17 頁的設(shè)計(jì)本身是可以擴(kuò)展的,從而可以滿足未來通信網(wǎng)絡(luò)多方面的需求。2.4.22.4.2 tapitapi 的體系結(jié)構(gòu)的體系結(jié)構(gòu)圖 1 是 tapi 體系結(jié)構(gòu)示意圖。作為中間層的 tapi dll,提供對(duì)服務(wù)提供者的管理,并在服務(wù)提供者與應(yīng)用程序之間進(jìn)行信息傳遞。tapi 可以保證多個(gè)服務(wù)者和應(yīng)用程序能夠同時(shí)存在,并且不會(huì)發(fā)生相互沖突。圖 1 tapi 的體系結(jié)構(gòu)在底層將 tapi 和實(shí)際的電話硬件連接是
21、 tapi 服務(wù)提供者(tapi service provider 縮寫為 tsp).tsp 一般都由硬件生產(chǎn)廠商提供。2.52.5 tapitapi 的基本概念的基本概念(1) 設(shè)備 id 設(shè)備 id 是從零開始按順序分配給每個(gè)設(shè)備的 id;也就是說,如果安裝了4 個(gè)線路設(shè)備,這些線路沒備的設(shè)備 id 相應(yīng)為 0、1、2、3。(2) 長度變化的數(shù)據(jù)結(jié)構(gòu) tapi 使用的大多數(shù)的復(fù)雜數(shù)據(jù)結(jié)構(gòu)是變長的數(shù)據(jù)結(jié)構(gòu)。這些結(jié)構(gòu)的組織如圖二所示。最前面 l 的 3 個(gè)域分別是 dwtotalsize ,dwneededsize 和dwusedsize。在這三個(gè)域后面是固定長度的域,對(duì)每個(gè)給定的結(jié)構(gòu)類型固定
22、長度的域都具有同樣的長度。一般而言,長度范圍從 0 到 300 個(gè)字節(jié)或者更長字節(jié)的結(jié)構(gòu)。存儲(chǔ)在結(jié)構(gòu)中的可變部分的信息總是通過相對(duì)于結(jié)構(gòu)定長部分的一個(gè)偏移量來引用,以字節(jié)為單位的偏移量指出變長數(shù)據(jù)的起點(diǎn)的位置。信息量大小就是變長數(shù)據(jù)所占用的字節(jié)數(shù)。其大小包括字符串末尾的空字符。這些結(jié)構(gòu)的內(nèi)存總是由應(yīng)用程序分配。但是數(shù)據(jù)結(jié)構(gòu)需要多大的內(nèi)存空間,應(yīng)用程序并不總是知道,這就是設(shè)置前三個(gè)域的原因。將結(jié)構(gòu)傳送給 tapi 之前,應(yīng)用程序可使用緩沖區(qū)的大小填充 dwtotalsize 域。tapi 首先證實(shí)該結(jié)構(gòu)有足夠大空間容納其定長部分,然后填充定長域,接著填入變長項(xiàng)。 tapi 填入變長項(xiàng)直到?jīng)]有空間
23、為止。最后 tapi 用為獲得所有數(shù)據(jù)所需的空間量來填充 dwneededsize 域,而 dwusedsize 域用 tapi 實(shí)際使用的空間量來填充。第 5 頁 共 17 頁當(dāng)應(yīng)用程序得到該結(jié)構(gòu)時(shí),它首先應(yīng)該檢查 dwneededsize 助和 dwusedsize 域。如果兩者相等, tapi 就能夠找出用于所有變長數(shù)據(jù)的控件。如果 dwusedsize 小于 dwneededsize ,應(yīng)用程序可以檢查相應(yīng)的偏移量和域大小看是否有需要的變長數(shù)據(jù),如果這些數(shù)據(jù)域都被設(shè)置為零,那么應(yīng)用程序必須分配一個(gè)更大的緩沖區(qū)并且重試上述過程。圖 2 tapi 所用到的數(shù)據(jù)結(jié)構(gòu)(3) 邏輯線路設(shè)備線路(
24、line)指的是物理電話線路。線的終端位置一般稱為站(station) 。線路設(shè)備(line device)是任何連接計(jì)算機(jī)到電話線或者線路的物理設(shè)備,如調(diào)制解調(diào)器或 isdn 卡等。線路設(shè)備不必位于應(yīng)用程序運(yùn)行的計(jì)算機(jī)上。邏輯線路設(shè)備(logical line device)代表一根電話線。邏輯線路設(shè)備的性能取決于它所代表的實(shí)際電話線的性能。典型的電話線路稱為 pots (plain old telephone service 普通老式電話服務(wù)) 。在 windows 中, pots 線通過單一邏輯線路設(shè)備表示。一些數(shù)字電話線(例如 isdn )包含了多個(gè)“信道”或者信息通路,可用來同時(shí)傳送
25、不同類型的數(shù)據(jù),這些多信道數(shù)字線路通常由多邏輯線路設(shè)備表示,一個(gè)邏輯線路設(shè)備代表一個(gè)信道。邏輯電話(logical phone)表示電話。一部典型的電話包括叉簧和轉(zhuǎn)換器組成。叉簧是可以將電話與線路連接或掛斷的開關(guān),轉(zhuǎn)換器是一種由揚(yáng)聲器和話筒組成的設(shè)備,話筒可以將聲能轉(zhuǎn)換為電能,或?qū)㈦娔苻D(zhuǎn)換為聲能。(4) 地址第 6 頁 共 17 頁地址 (address) 是字母、數(shù)字和控制字符組成的字符串,它們定義到電話、調(diào)制解調(diào)器或計(jì)算機(jī)的路徑。線路、電話和地址是靜態(tài)的,他們有一定程度的持久性,線路或與計(jì)算機(jī)連接的電話不經(jīng)常改變,線路的電話號(hào)碼也一樣。(5) 呼叫呼叫(call) 是當(dāng)兩個(gè)線路設(shè)備由電話網(wǎng)
26、絡(luò)連接在一起時(shí)存在的一種交互狀態(tài)。呼叫方(calling party)是發(fā)起呼叫的一方,而被呼叫方(called party)則是應(yīng)答呼叫的一方。對(duì)呼叫可以進(jìn)行連接、置于保持狀態(tài)以及傳送、召開會(huì)議、暫停、恢復(fù)等操作。每個(gè)呼叫在期生存期都會(huì)經(jīng)歷許多狀態(tài)。在呼叫改變狀態(tài)時(shí),windows 會(huì)通知控制應(yīng)用程序。呼叫狀態(tài)包括 dailtone、ringing 和 connected 等。在這幾個(gè)狀態(tài)中,connected 狀態(tài)尤為重要,因?yàn)橐坏┖艚修D(zhuǎn)換到這種狀態(tài),數(shù)據(jù)就可以通過線路發(fā)送出去,到達(dá)信宿方。已經(jīng)拆接的呼叫和還沒有開始的呼叫所處的狀態(tài)都是 idle。3 3 程序設(shè)計(jì)思想與流程程序設(shè)計(jì)思想與流
27、程3.13.1 使用使用 tapitapi 開發(fā)的基本思路開發(fā)的基本思路使用 tapi 能夠比較方便地發(fā)出一個(gè)呼叫和應(yīng)答一個(gè)呼叫,它對(duì)呼叫的操作簡單方便,給開發(fā)者帶來了很大的方便。總的來說使用 tapi 開發(fā) modem 呼叫控制通信程序流程如下所示: (1) 初始化 tapi :通過調(diào)用 linelnitialize ( )函數(shù)來完成。tapi 通過調(diào)用這兩個(gè)函數(shù)來加載 tapi32 .dll 和有關(guān)的電話設(shè)備驅(qū)動(dòng)程序,并且指定檢測線路設(shè)備的狀態(tài)和事件的回調(diào)函數(shù)。 (2) 協(xié)商 tapi 版本:iinenegotiateapiversion ( )函數(shù)將找出對(duì)應(yīng)于用戶的應(yīng)用程序及線路設(shè)備服務(wù)
28、者通用的 tapi 的最高版本。 (3) 獲取線路設(shè)備的性能:應(yīng)用程序通過調(diào)用 linegetdevcaps ( )函數(shù)來確定所使用的 tapi 版本提供的線路設(shè)備能力。(4) 打開線路設(shè)備:應(yīng)用程序調(diào)用 lineopen( ) 函數(shù)打開一條線路設(shè)備并返回一個(gè)線路設(shè)備的句柄,這個(gè)句柄用于完成以后對(duì)這個(gè)設(shè)備的各種操作。 (5) 轉(zhuǎn)換電話號(hào)碼:使用 linetranslateaddress ( )將要撥打的號(hào)碼轉(zhuǎn)換成可以直接在計(jì)算機(jī)上撥打的號(hào)碼格式。 (6) 開始呼叫或是應(yīng)答:應(yīng)用程序調(diào)用 linemakecall ( )函數(shù)進(jìn)行呼叫,調(diào)用完成后它將返回帶有擁有者特權(quán)的呼叫句柄,此句柄可用在對(duì)該次
29、呼叫所進(jìn)行的進(jìn)一步操作。應(yīng)用程序通過調(diào)用 lineanswer( )函數(shù)來自動(dòng)應(yīng)答呼叫。 (7) 掛斷呼叫:在呼叫完成后, linedrop ( )函數(shù)將用來掛斷呼叫,但是在上一步中得到的擁有者的呼叫句柄并不會(huì)因此釋放,因?yàn)樵诤艚斜粧鞌嘁院螅?7 頁 共 17 頁呼叫的句柄還有可能被用在一些后續(xù)的操作中。可以通過 linedeallocate ( )來釋放呼叫句柄。 (8) 關(guān)閉線路設(shè)備:應(yīng)用程序調(diào)用 lineclose ( ) 函數(shù)來關(guān)閉被 lineopen ( )函數(shù)打開的線路設(shè)備,如果一條線路被應(yīng)用程序打開后始終沒有被關(guān)閉,那么其它的應(yīng)用程序?qū)o法訪問該線路。 (9) 結(jié)束 tapi
30、的使用:在一切有關(guān) tapi 的操作完成之后,調(diào)用lineshutdown()函數(shù)來終止 tapi 的使用,它會(huì)隱含地關(guān)閉所以打開的線路設(shè)備。根據(jù) tapi 的開發(fā)基本思路整個(gè)程序的設(shè)計(jì)思路流程如圖 3圖 3 程序流程圖第 8 頁 共 17 頁3.23.2 各功能模塊的設(shè)計(jì)各功能模塊的設(shè)計(jì)3.2.13.2.1 tapitapi 的配置階段的配置階段tapi 的置階段配置階段包括對(duì)線路的配置和對(duì) modem 的配置,只有正確地配置并打開線路設(shè)備之后,才能對(duì) modem 進(jìn)行配置。以下函數(shù)完成對(duì) tapi 的配置:tapi 類成員函數(shù) telephonylnitialize 分配支持邏輯線路設(shè)備的
31、使用所必須的某些內(nèi)部資源,并返回應(yīng)用程序一個(gè) tapi 句柄,同時(shí)傳遞了一個(gè)回調(diào)函數(shù)的地址作為參數(shù),此函數(shù)處理對(duì)整個(gè)線路狀態(tài)進(jìn)行處理。然后使用 tapi 的類成員函數(shù) linenegotiateapiversion 與 windows 協(xié)商 tapi 版本。tapi 類成員函數(shù) mylinegetdevcaps 獲得有關(guān)邏輯線路的性能的信息 windows 把這些信息填充到一個(gè)名為 linedevcaps 的只讀結(jié)構(gòu)中,應(yīng)用程序檢查這個(gè)結(jié)構(gòu)就可以了解哪些設(shè)置是驅(qū)動(dòng)程序所允許的 tapi 類成員函數(shù) lineopen 打開線路。3.2.23.2.2 tapitapi 的連接階段的連接階段tpai
32、 在連接階段 moden 會(huì)產(chǎn)生很多消息,消息的處理 tapi 由回調(diào)函數(shù)進(jìn)行消息處理,回調(diào)函數(shù)在初始化 tapi 時(shí)創(chuàng)建,消息的處理在 tapi 的使用過程中是至關(guān)重要的。以下是一些主要的消息(1)linecallstate_idle 沒有呼叫,為空,此時(shí)應(yīng)斷接,釋放掉占用的資源; (2)linecallstate_dialing 撥號(hào)中,正在撥號(hào)。(3)linecallstate_busy 線路忙或設(shè)備忙,此時(shí)應(yīng)斷接,釋放掉占用的資源。(4)linecallstate_specialinfo 特別的消息,此時(shí)應(yīng)斷接,釋放掉占用的資源; (5)linecallstate_offering 應(yīng)
33、答方已收到呼叫方信號(hào),此時(shí)應(yīng)進(jìn)行應(yīng)答,調(diào)用 lineanswer 函數(shù); (6)linecallstate_connected 已連接成功,此時(shí)可進(jìn)行數(shù)據(jù)的傳輸,但必須先得到 modem 的句柄(7)linecallstate_disconnected 已斷接,此時(shí)應(yīng)釋放掉占用的資源。tapi 類成員函數(shù) makecall 被用于發(fā)起呼叫,產(chǎn)生呼叫后依次進(jìn)入圖 4 狀態(tài):第 9 頁 共 17 頁圖 4 狀態(tài)流程圖新生成的呼叫處于 idle 狀態(tài),隨后依次進(jìn)入 proceding,offering, connected 和 disconnected 最后 回到 idle 狀態(tài)。這些狀態(tài)都通過在調(diào)
34、telephonylnitialize 函數(shù)初始化 tapidll 的時(shí)候傳遞的回調(diào)函數(shù)來處理。3.2.33.2.3 數(shù)據(jù)傳送階段數(shù)據(jù)傳送階段tapi 并不提供數(shù)據(jù)傳輸?shù)暮瘮?shù)。因?yàn)?modem 通過控制計(jì)算機(jī)串口來進(jìn)行通信,所以 modem 的數(shù)據(jù)通信與串口數(shù)據(jù)通信的方法一樣,采用 readfile 和 writefile 函數(shù)來接收數(shù)據(jù)和發(fā)送數(shù)據(jù)。傳送數(shù)據(jù)的時(shí)候要用到 modem 的句柄,此時(shí)調(diào)用 tapi 的類成員函數(shù) linegetid 得到 moden 的句柄后就可以通過readfile 和 writefile 函數(shù)來進(jìn)行數(shù)據(jù)傳輸。readfile 與 writefile 有兩種模式,
35、一種是等待模式,一種是非等待模式。等待模式下必須完成了所有讀寫操作函數(shù)才會(huì)返回,最后一個(gè)參數(shù)必須為 null。非等待模式下要先定義一個(gè)overlapped 變量,并且作為函數(shù)的最后一個(gè)參數(shù)傳遞進(jìn)去。 非等待模式下函數(shù)會(huì)馬上返回,overlapped 變量在初始化的時(shí)候會(huì)調(diào) createevent 函數(shù)產(chǎn)生一個(gè)事件,當(dāng)函數(shù)返回后我們調(diào)用 waiforsingobject(event)函數(shù)讓線程阻塞,當(dāng)數(shù)據(jù)傳送完以后操作系統(tǒng)會(huì)給應(yīng)用程序發(fā)出一消息,當(dāng)應(yīng)用程序得到此消息以后程序繼續(xù)往下運(yùn)行。一旦呼叫進(jìn)入 connected 數(shù)據(jù)鏈路連通狀態(tài),則表明連接已經(jīng)建立。此時(shí)第 10 頁 共 17 頁我們就可
36、以進(jìn)行數(shù)據(jù)傳輸了,不過在傳送數(shù)據(jù)之前我們要得到 moden 的句柄,此時(shí)調(diào)用 tapi 的類成員函數(shù) linegetid,此函數(shù)會(huì)把 moden 的名稱和句柄保存到一個(gè) varstring 類型的變量里面。通過次句柄我們就可以利用 writefile 和readfile 來讀寫數(shù)據(jù)了。3.2.43.2.4 關(guān)閉連接階段關(guān)閉連接階段當(dāng)我們數(shù)據(jù)傳送完成后需要退出程序的時(shí)候。我們會(huì)對(duì)線路進(jìn)行掛斷操作,tapi 的類成員函數(shù) linedrop 來斷開連接,然后調(diào)用 lineclose 來關(guān)閉一條打開的線路,同時(shí)釋放前面階段操作所用到的一些緩存以及復(fù)位一些信號(hào)型變量。4 4 編碼實(shí)現(xiàn)編碼實(shí)現(xiàn)4.1 程序
37、主類的的定義程序主類的的定義4.2 線路操作的實(shí)現(xiàn)線路操作的實(shí)現(xiàn)4.3 呼叫的發(fā)起和應(yīng)答的實(shí)現(xiàn)呼叫的發(fā)起和應(yīng)答的實(shí)現(xiàn)呼叫的建立和應(yīng)答使用類成員函數(shù) makeoutgoingcall、getincomingcall 來實(shí)現(xiàn)。里面封裝了 linemakecall 和 lineanswer 兩個(gè) tapi 類成員函數(shù)。int ctapiline:makeoutgoingcall(const char *szaddress)/呼出/呼叫前對(duì)呼叫選項(xiàng)的設(shè)置.lret = linemakecall(m_hline, &m_hcall, szaddress, 0, lpcallparams);return
38、(lret=0)?0:lret;int ctapiline:getincomingcall()/應(yīng)答.lret = linesetnumrings(m_hline,0,5);/設(shè)置響鈴次數(shù)lret = lineanswer(m_hcall, null, 0);4.4 數(shù)據(jù)操作的實(shí)現(xiàn)數(shù)據(jù)操作的實(shí)現(xiàn)在程序中數(shù)據(jù)的讀取單獨(dú)創(chuàng)建一個(gè)線程,定義了一個(gè)回調(diào)函數(shù) readthread封裝了 writefile 和 readfile 來實(shí)現(xiàn)數(shù)據(jù)的發(fā)送。dword winapi cmytapidlg:readthread(lpvoid lpvoid)/接收數(shù)據(jù)overlapped ov;第 11 頁 共 17 頁/ov 的初始化設(shè)置for(;!pcdlg-m_bstopreadthread;)readfile(pcdlg-m_hserialhandle,szbuff,512,&dwreadlen,&ov);/讀數(shù)據(jù)/錯(cuò)誤處理switch(waitforsingleobject(ov.hevent,infinite)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 張劍1986-1999年考研英語試題解析
- 管理咨詢服務(wù)合同(2025年版)
- 實(shí)心板橋施工方案
- 針灸學(xué)課程實(shí)驗(yàn)教學(xué)大綱
- 窗口側(cè)壁施工方案
- 汽車美容行業(yè)品牌建設(shè)策略試題及答案
- 汽車維修行業(yè)人才培養(yǎng)策略試題及答案
- 教學(xué)工作督導(dǎo)機(jī)制計(jì)劃
- 班級(jí)團(tuán)體競賽的組織與管理計(jì)劃
- 藥理學(xué)考試2024年快速提升試題及答案
- 生物質(zhì)能源綜合利用項(xiàng)目可行性分析報(bào)告
- 【道法】做自強(qiáng)不息的中國人課件+-2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)下冊(cè)
- 【道法】人生當(dāng)自強(qiáng)課件-2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)下冊(cè)
- 汽車維修質(zhì)量保證制度
- 外研版(三起)(2024)三年級(jí)下冊(cè)英語Unit 3 單元測試卷(含答案)
- 2024年廣州市衛(wèi)生健康系統(tǒng)招聘“優(yōu)才計(jì)劃”考試真題
- 重點(diǎn)營業(yè)線施工方案
- 餐飲店菜品成本計(jì)算表
- 《水土保持監(jiān)測技術(shù)規(guī)范SLT 277-2024》知識(shí)培訓(xùn)
- 2025年江蘇南京事業(yè)單位招聘(787人)高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 第11課《山地回憶》公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論