• 沒有找到結果。

網路通訊系統

N/A
N/A
Protected

Academic year: 2021

Share "網路通訊系統"

Copied!
58
0
0

加載中.... (立即查看全文)

全文

(1)

逢 甲 大 學

資 訊 工 程 學 系 專 題 報 告

網路通訊系統

黃 爾 健 (四甲)

生: 黃 智 宏 (四甲)

胡 舜 禹 (四甲)

謝 其 森 (四甲)

授 : 李 維 聰

中華民國九十一年十二月

(2)

目錄

第一章 緒 論……… 1 1.1 研究動機……… 1 1.2 專題製作的分工……… 1 1.3 系統簡介……… 2 1.4 系統目標 ………2 第二章 技術與現況 ………4 2.1 VOIP 概述 ………4 2.2 VB 概述………5 2.3 Winsock 概述 ………6 第三章 系統架構………8 3.1 H.323 Communication in TAPI 3.0………8 3.1.1 TAPI ………8 3.1.2 H.323 ………10

3.2 Server and Client架構………12

3.2.1 系統主要架構………12 3.2.2 主要功能流程………13 3.2.2.1 加入新朋友流程………13 3.2.2.2 Client 之間相互通訊流程…………13 3.2.2.3 留文字訊息流程 ………14 3.2.2.4 留語音流程………15 3.2.2.5 朋友上線訊息通知 ………16 3.2.3 Client 端………16 3.2.4 Server 端………16 3.3 Qos(服務品質)………17 第四章 實務製作過程 ………18 4.1 Client 端………18 4.1.1 啟動程式………18 4.1.2 加入新朋友到朋友名單………21 4.1.3 使用文字訊息通訊………24 4.1.4 使用聲音或視訊通訊………27 4.1.5 留言功能………29 4.1.6 使用群組名單將朋友分類………29 4.1.7 清除選取名單………31

(3)

4.2 Server 端………31 4.2.1 注冊 ………32 4.2.2 搜尋 ………32 4.2.3 上線 ………33 4.2.4 留言 ………33 4.2.5 更新 ………34 4.2.6 加入朋友 ………34 4.3 VOIP ………35 4.3.1 建立通訊過程 ………35 4.3.2 呼叫者的呼叫動作 ………37 4.3.3 被呼叫者的反應 ………41 4.4 本系統與 NetMeeting 互通性(H.323 標準互通)…………42 第五章 實作之問題討論及解決方法 ………46 第六章 結論及展望 ………48 第七章 心得 ………50 致謝………51 參考資料………52 附錄 ………53 操作手冊………53

圖目錄

圖 3.1 TAPI 架構 ………8 圖 3.2 TAPI 3.0 物件關係………9 圖 3.3 H.323 架構 ………11 圖 3.4 系統主要架構 ………12 圖 3.5 加入新朋友 ………13 圖 3.6 Client 之間相互通訊 ………13 圖 3.7 留文字訊息過程 1………14 圖 3.8 留文字訊息過程 2 ………14 圖 3.9 留語音過程 ………15 圖 3.10 聽語音過程………15 圖 3.11 朋友上線訊息通知………16 圖 4.1 程式主畫面………18

(4)

圖 4.2 註冊畫面………19 圖 4.3 搜尋其它使用畫面 ………22 圖 4.4 對方要求加入朋友的畫面………22 圖 4.5 同意和被同意加入朋友完成圖………23 圖 4.6 選擇使用文字訊息功能………26 圖 4.7 使用文字訊息通訊過程 1 ………27 圖 4.8 使用文字訊息通訊過程 2………27 圖 4.9 接到別人的影像聲音通訊要求 ………28 圖 4.10 通訊準備中………28 圖 4.11 使用群組名單分類 1………29 圖 4.12 使用群組名單分類 2………30 圖 4.13 刪除朋友名單過程………31

圖 4.14 Client & Server 概念圖………32

圖 4.15 註冊過程圖 ………32 圖 4.16 搜尋流程圖 ………33 圖 4.17 更新使用者基本資料圖………34 圖 4.18 電腦 A 查詢電腦 B 的 IP Address ………35 圖 4.19 雙方進行 H.323 通訊………36 圖 4.20 呼叫者發出呼叫的流程圖………37 圖 4.21 被呼叫者回應呼叫的流程圖………41 圖 4.22 NetMeeting 端的狀況………43 圖 4.23 本專題測試程式的狀況………43 圖 4.24 NetMeeting 接收到呼叫………44 圖 4.24 是 NetMeeting 通訊後狀況。………49 圖 4.25 是 NetMeeting 通訊後狀況………45 圖 4.26 本專題測試程式通訊後狀況………45

表目錄

表 4.1 使用者資料表………19 表 4.2 群組資料表 ………23 表 4.3 朋友資料表 ………24 表 4.4 從朋友資料表中取得所選使用者的 IP ………24

(5)

第一章 緒論

1.1 研究動機 在目前現代化的都市中,由於網路的盛行使得人與人之間的距離 可說是由有到無,網路的發達更使得生活的節奏變的更快,更逐漸的改 變人們的生活習慣,由於,近幾年資訊應用的方面越來越多,幾乎每個 人都會接觸到電腦,如何學會用 E-mail 傳送郵件;如何從上網得到想 要的資料;甚至如何從網路上購物,這些顯然的已經成為現代人必須要 會的技能,由於網路頻寬已經漸漸的由窄頻升為寬頻,未來也許會更快, 所以網路應用當然也就越來越廣泛,因此以休閒娛樂、遠距教學、網路 電話和視訊這些需要高頻寬的應用也會越來越蓬勃發展。 說到網路視訊和電話,有許多軟體都有這項功能,ICQ、MSN、Yahoo 即時通…等,在網路上講電話,擺脫了平常我們講電話一定要透過電話 拿起來撥打的印象,只要在電腦面前拿起麥克風,就能夠和不管多遠的 人講話,甚至裝上小眼睛,就能夠看到對方的影像,而費用也比打電話 和手機來的便宜,所以這項發展潛力蠻大的,而且我們這組組員,也都 對網路電話這項技術都很好奇,究竟他是如何傳遞聲音和影像?要何種 知識背景?需要何種技術和軟、硬體的的支援?所以我們決定以

VoIP(Voice over Internet Protocol)作為專題之研究方向,因此指導 老師我們找網路專長的李維聰老師,好好請教老師來完成專題。 1.2 專題製作的分工 黃爾健 黃智宏 胡舜禹 謝其森 聲音視訊 Client 端 Server 端 美工 各種實務操作 專題報告製作

(6)

1.3 系統簡介 開發工具:

主程式:聲音視訊:Microsoft Platform SDK、Visual Basic 資料庫:SQL、Access

附加功能:Visual Basic、Windows API 圖形介面:Windows API、Photoshop 美工:Photoshop 開發環樈: Windows NT 以上作業系統 軟硬體需求: 軟體:Windows NT 以上作業系統 硬體:符合安裝 Windows NT 系列要求的硬體即可 主要功能: 1. 讓兩台電腦可以透過區域網路或網際網路進行聲音與影像的 通訊 2. 留言-->文字留言、語音留言 3. 文字訊息通訊 其它功能: 1. 註冊:註冊後才能使用 2. 搜尋新朋友功能:必須要能夠加入朋友名單才可以通訊 3. 分類群組名單:將朋友分類 4. 更換面板、背景顏色 5. 修改個人狀態及資料 6. 永遠顯示在最上層:顯示在桌面的最上層,不被其它軟體蓋 住。 7. 朋友名單管理:從朋友名單裡刪除朋友,查詢朋友基本資料。 1.4 系統目標 我們的最主要目標是希望透過 Tapi3.0 來建構出能夠即時的傳送 語音和視訊,讓兩台電腦以網路的方式傳遞語音封包,而主要以 Visual Basic 撰寫程式部分,運用 Winsock 作為網路底層溝通工具,SQL、

(7)

Access 作為存取的資料庫,圖形介面則是以 WindowsAPI、Phtoshop。 系統內包含 Server 和 Client 端,當 Client 要與其他 Client 溝通則須 先向 Server 註冊,兩 Client 端才能互相傳遞訊息,因此達到了使用者 之間的語音視訊…等溝通目的。

(8)

第二章 技術與現況

2.1 VOIP 概述 目前的語音傳輸方式可以分成四種 1.多時分工: 多時分工(Time-Division Multiplexing;TDM) 是傳統的電路式傳 輸方式,為每通電話保留了 64K 的頻寬。這種方式目前應用於 PSTN 以 及商用電話交換機 PBX 的配備中。 2.訊框中繼語音傳輸:

訊框中繼語音傳輸(Voice over frame Realy) 是專門針對 ATM 網 路的 Layer2 的傳輸方式。

3.非同步語音傳輸:

非同步語音傳輸(Voice over ATM) 則是專門針對 ATM 網路的 Layer2 傳輸方式。

4.IP 語音傳輸:

VoIP(Voice over IP)是屬於 Layer3 傳輸,而且不受傳輸媒體的影 響。由於 VoIP 是在 Layer3 進行運作,因此很適合在異質性區域網路 及廣域網路上,包括訊框中繼及非同步語音傳輸網路,傳輸相當普遍 的端對端語音/傳真服務。

VoIP 的傳送原理是透過將原有語音類比封包,利用網路電話閘道 器(Internet Telephony Gateway 或 VoIP Gateway)轉換成 IP 數位封 包,再透過 Internet 或私有 IP 網路傳遞,傳至目的用戶時再把封包 轉換回原先語音格式。 根據 IDC 預測,全球 VoIP 話務量在 2000 年是 38 億分鐘,到 2005 年將會是 28 兆分鐘。2000 年佔國際話務比例是 4%, 2005 年約 79%。 但是建置成本高居不下,再加上頻寬網路的問題,目前國內外企 業使用率仍不甚普及。不過有鑒於網路 ip 化的趨勢,可預見未來的話 機都將搬到網路上去。 目前 VoIP 有三困境有待突破: 1. 主流標準尚待確立: 目前有三大標準- H.323、MGCP、SIP。其中 H.323 推出最早,是目

(9)

前市面上大部分產品所擁有的標準。不過 H.323 非常複雜,開發不易 且成本高,使得現在的廠商都開始追崇較簡單且又實用的 SIP 標準。 以目前的情況,產品之間互通性和其價格將會是關鍵。 2. 服務品質與建設成本的兩難: 為了保持 VoIP 品質,電信服務商均以一個專屬 IP 網路為平台,並 非以 Internet。故增加建置成本。 3. 新應用須持續開發: 由於和傳統電話的差價優勢已經不在,所以要強調附加的應用功 能。從以往的 PC-to-PC、PC-to-Phone、Phone-to-Phone 為基礎會再 加上語音會議、視訊會議等應用。更重要的是企業的需求-整合式暨網 路系統(整合式 VPN 應用)。 要知道企業有不可或缺的三大網路 a.語音通訊網路;b.視訊網路; c.數據網路。所以 VoIP 的服務主力會先由企業開始,然而不論 VoIP 的未來會變成怎麼樣子,未來網路的關鍵字只有兩個字:整合。 2.2 Visual Basic 概述 簡介與背景 自從美國微軟公司推出 Windows 後,由於它提供了易學易用的圖 形化介面取代了傳統 DOS 環境下,所要強記那些硬梆梆的命令,而且 在 Windows 下所開發的應用程式,其操作方式都統一,無形中提高了 使用者的親和力,同時微軟公司為了讓學習程式設計的初學者,亦能 輕鬆地在 Windows 環境下編寫程式,於 1991 年推出 Visual Basic,讓 初學者在 VB 的整合開發環境下,透過所提供的工具在短短的時間內, 建構出需要的輸出入介面,設計者只要著重在程式的主體上的流程, 這是傳統 BASIC 所無法做到的。 BASIC 程式的特色就是簡單容易上手,所以成為初學者入門最佳選 擇。也正因為不嚴謹的傳統 BASIC 語法在程式龐大時,偵錯非常困難。 另外 VB 雖然號稱是物件導向的程式,但卻沒有物件中非常重要的繼承 特色。微軟公司有鑑於此,乾脆重新打造 VB,因而 2002 年誕生 VB.NET。 VB.NET 除了具有傳統 BASIC 的優點之外,還具有其它傳統 BASIC 沒有 的功能,例如:

(10)

VB.NET 執行的過程是以物件為主,當使用到哪個物件,就執行該 物件所設定的動作,不像傳統 BASIC 的執行流程是根據編寫程式的時 候所決定的。 2. Multi-Tasking 與 Multi-Threading 處理 擁有 Multi-Tasking 與 Multi-Threading 處理功能,可以在同一個 程式中執行多項運算工作。 3. .NET Framework 提供許多物件類別

VB.NET 可以透過.NET Framework 提供的許多物件類別程式庫來進 行相關處理,不再需要直接呼叫 Windows API 簡化了程式設計過程, 而且和在 VB、Visual C#或 Visual C++(甚至其它支援.NET Framework 的程式語言)的使用法方都是統一的,進行語言轉換的時候十分方便。 4. 跨平台的程式開發

以往的 VB 經過編譯,會產生機器碼然後存成執行檔,在.NET Framework 架構下,程式是編譯成 MSIL(Microsoft Intermediate Language),然後也是以執行檔的形式存檔。MSIL 是一種接近機器碼的 中間語言,透過各種平台的 JIT 編譯器(Just In Time),就可以跨平 台執行。 2.3 Winsock 概述 網路程式中有一重要的東西,也就是 socket,很多的程式都透過它 來完成,以下就是一些有關 socket 的簡介: socket 提供允許應用程式在主機上嵌入特定的通訊埠,IP 位址和 通訊協定,我們可透過這樣的組合,做傳送或接受資料的服務。 Socket 可以分為兩種型態: ◎ 串流 socket,主要使用的通訊協定是 TCP,提供了雙向,且可靠 的循序且不重復的資料傳遞,提供可靠度。 ◎ 資料元 socket 使用 UDP 通訊協定提供單向的資料傳遞,並無提供 任何可靠的機制。 Socket 應用程式使用一個通訊埠(port)在一台電腦中來判斷流 進來的資料是不是自已的,或是自已的資料應該從哪一個 port 出去 (每一個 port 只能被一個 sock 使用)。通常自已寫的 sock 程式 port number 大都定在 1024 之後,因為之前的大都定義給了已知的通訊協 定,如 FTP 使用 21,HTTP 使用 80 等……。

(11)

一條虛擬的連線,建立完成後才可以在兩台電腦雙向傳遞資料。此協 定提供了可靠性,其傳輸的可靠性是透過每一個傳輸封包的指定序號 來達成,TCP 被切割成好幾個封包,每個封包都有號碼,而接受端可由 這些序號知道所有的封包是否都被收到。另外 TCP 也有用一個 ACK 封 包來確認封包是否已被接受端收到。 UDP: UDP 提供一個非連結導向資料元傳輸服務,在訊息上提供 不可靠,但確是最努力的資料傳輸。這個協定無法保證所有的資料可 以完整無缺的被接受端接收,也無法藉由發現封包遺失來重傳修正, 接收端收到資料時也不會有回應給傳送端,讓傳送端知道接受端已接 收到資料,此協定比較適合於只需傳送小封包,且又不需要有確認資 料接受的應用程式。

(12)

第三章 系統架構

3.1 H.323 Communication in TAPI 3.1.1 TAPI TAPI 3.0 是較進化的 API,集合了傳統的 PSTN 電話傳輸以及 IP 電話傳輸。IP 電話傳輸是一種新興的技術集,可使聲音、資料及視訊 經由現有的 LAN、WAN 以及 Internet 傳輸。TAPI 3.0 可提供簡便的 方法以連接二或多台電腦,並存取與此連接相關的任何媒體資料流, 讓 Microsoft® Windows® 作業系統啟用 IP 電話傳輸。 TAPI 3.0 支援標準的 H.323 會議和 IP 多點傳送會議。包含服務 品質 (QoS) 支援,以提高會議品質,使網路易於管理。以下是它的架 構圖: 圖 3.1 TAPI 架構

(13)

本專題選擇使用 TAPI 3.0 API 來建立 IP 電話傳輸(有聲音及視訊 通訊兩種功能)。TAPI 3.0 API 中包含五個物件-TAPI、Address、

Terminal、Call、Call Hub(本專題的 IP 電話通訊都是使用這五個物 件來進行設計),其物件關係如下圖所示: ITCallHub Call Hub Address ITAddress ITTerminalSupport ITMediaSupport ITAddressEventNotification ITCallNotification Terminal ITTerminal IBasicVideo ITBasicAudioTerminal ITMediaSupport ITBasicCallControl ITCallTones ITCallInfo ITCallTonesNotification ITConsultCall ITParticipantInfo Call TAPI ITTAPI ITTAPIEventNotification ITCallHubEventNotification 圖 3.2 TAPI 3.0 物件關係 l TAPI object: 代表本機電腦可以存取的所有電話服務的資源。 - TAPI 3.0 的應用程式入口。 - 同意應用程式列出所有本機和遠端的位址。 l Address object: 代表能產生或接受呼叫(calls) 的實體. 操作功能如下: - 找到必須可以支援特定媒體的位址 - 列舉正連結到位址的呼叫 - 可以在 Address object 建立或傳送呼叫 - 可以在 Address object 等候呼叫 - 取得連結到服務供應者(service provider)的名稱 - 取得連接點以允許詳細的終端操作(當有提供媒體服務者時)

(14)

l Terminal object: 代表在連線終點或起點的接收器或轉換器。 - 可以映射到作為人機介面的硬體,例如電話或麥克風 - 也可以是一個檔案,或是可接受輸入或建立輸出的其它任何裝置 l Call object: 代表本機位址和一或多個其它位址之間的位址連接。 (這個連接可以是直接,或是透過 Call Hub 連接的) - 你可以將 Call object 想像成電話呼叫的第一組檢視 - 所有呼叫控制都透過 Call object 來完成

- Call Hub 的每個成員都有一個 Call object。 l CallHub object: 代表一組相關的呼叫。 - 不能由應用程式直接建立,它是在透過 TAPI 3.0 接收撥入的呼 叫時間接建立的 - 使用者可用 CallHub object,在一個呼叫或會議中列舉其它的 與會者 - 如果有足夠的許可權,也可以在與這些使用者相關的遠端「呼 叫」物件上執行呼叫控制。 3.1.2 H.323 H.323 是由國際電信聯盟 (International Telecommunication Union, ITU)所訂定的協定標準,適用於即時的語音和視訊通訊。H.323 提供點對點和多點會議的呼叫控制、多媒體管理和頻寬管理。它也獨 立於網路、作業平台和應用程式,使任何 H.323 相容的終端機與其它 任何終端機進行相互操作。下圖是 H.323 架構及其說明:

(15)

圖 3.3 H.323 架構 l H.323 支援標準語音編解碼(G.711、G.723、G.729) 視訊編解碼(H.261、H.263)資料共享(T.120) n G.711 是 ITU 的標準語音編解碼器,設計用來傳輸速度為 48、56 和 64 Kbps 的 A-law 和 -law PCM 的語音。 n G.723 是設計用於低位元速率操作的 ITU 標準語音編解 碼器。 n H.261 是 ITU 標準的視訊編解碼器,設計用來傳輸速度為 64 Kbps、解析度為 176x44 圖素 (QCIF) 的壓縮視訊。 n H.263 是以 H.261 為基礎並與其相容的 ITU 標準視訊編 解碼器。它提供優於 H.261 的壓縮功能,並以 176 x 44 圖 素 (QCIF) 解析度傳輸視訊。 l H.323 可封包交換網路多媒體資料流,並可以當作「即時傳輸 通訊協定 (RTP)」使用,RTP 是設計用來處理 Internet 上即 時語音和視訊資料流需求的 IETF 標準。 l H.245 控制通道負責控制 H.323 終端機操作的控制資訊,包 含功能交換、指令和指導。 l Q.931 可用來在兩個終端機之間建立連接。 l RAS 控制登錄、許可權及端點與閘道守衛 (如果沒有閘道守 衛,不能使用 RAS) 之間的頻寬功能。

(16)

3.2 Server and Client 架構 本專題依照使用架構分為 Client 端和 Server 端 3.2.1 系統主要架構 下圖為系統主要架構: 圖 3.4 系統主要架構 Client 端:

使用者介面,負責和 Server 溝通協調。Client 和 Client 主要功 能是做影像、聲音、文字的通訊。 Server 端: 主要是負責,留言,語音訊息,及幫忙傳遞 client 與 client 之間的一些訊息。 Server DataBase ClientA DataBase ClienBt DataBase

Microsoft Jet 4.0 OLE DB Provider Microsoft Jet 4.0 OLE DB Provider

Microsoft Jet 4.0 OLE DB Provider ClientA Application Server Application ClientB Application

(17)

3.2.2 主要功能流程

以下是系統各主要功能執行流程:

圖 3.5 加入新朋友 3.2.2.1 加入新朋友流程

○1 :ClientA 和 ClientB 都向 Server 註冊。 ○2 :ClientA 傳送關鍵字向 Server 搜尋新朋友。 ○3 :Server 傳回搜尋到符合條件的朋友名單。 ○4 :ClientA 向 ClientB 請求加入好友名單。 ○5 :ClientB 同意讓 ClientA 加入好友名單。 3.2.2.2 Client 之間相互通訊流程 圖 3.6 Client 之間相互通訊 ○1 :ClientA 向 ClientB 連線。 ○2 :連線成功後,ClientA 自動傳送自己的 ID 給 ClientB 以提供 ClientB 辨識正在和誰連線,ClientA 並傳送所要求通訊的方式 (視訊、聲音)給 ClientB,若是文字通訊,就不需要 ClientB 選擇。 ○3 :ClientB 選擇視訊或聲音,回覆給 ClientA。 ○4 :開始通訊 ClientB 上線 ClientA 上線 Server Application ClientB 上線 ClientA 上線

(18)

3.2.2.3 留文字訊息流程

圖 3.7 留文字訊息過程 1

○1 :ClientA 傳訊息給 ClientB,但 ClientB 不在線上,若是文字 訊息就把留言傳給 Server,若是語音留言,就先將聲音錄起 來,再傳給 Server。

○2 :ClientA 將留言傳給 Server。

圖 3.8 留文字訊息過程 2

○1:下次 ClientB 上線時,由 Server 把 ClientA 的留言傳給 ClientB。 ○2 :ClientB 再決定要不要回訊給 ClientA。 ClientA 上線 ClientB 離線 Server Application ClientA 上線 ClientB 上線 Server Application

(19)

3.2.2.4 留語音流程

圖 3.9 留語音過程

○1 :ClientA 知道 ClientB 不在線上,但有事想找他,這時會 ClientA 程式就會讓你按留言的按鈕,按下就可以留言,留言完畢就按留 言完畢就會執行步驟○2 。 ○2 :ClientA 會跟 Server 說要留語音訊息給對方。 ○3 :Server 會和 ClientA 建立一條連線。 ○4 :ClientA 傳語音訊息給 Server。 圖 3.10 聽語音過程

○1 :ClientA 上線,這時他會發訊息給 Server 這時,Server 發現 ClientA 有語言留言,這時 Server 就執行步驟○2

○2 :Server 就會和 ClientA 建立一條連線

○3 :Server 把語音留言傳給 ClientA,這時 ClientA 收到時會跳出一 個 Form 告訴 ClientA 這時 ClientA 就可以選看要聽哪一個語音留 言。 ClientA Server Application ClientB ClientA 上線 Server Application

(20)

3.2.2.5 朋友上線訊息通知 圖 3.11 朋友上線訊息通知 ○1 :Client A 傳送自己的上線訊息和好友名單給 Server。 ○2 :Server 傳回 Client A 的最新 IP 和好友名單中好友的最新 IP 給 Client A。 ○3 :Client A 依據新的好友 IP 傳送自己的新 IP 給朋友,傳送成功就 將朋友的狀態改為上線。 3.2.3 Client 端

Client 端使用的資料庫是 Access,基本上 Client 端並不特別強 調資料庫的功能,所以 Acess 就足夠應付了。Client 的程式裡對資料 庫做動作,主要是使用 Data Environment 來代替 ADO 資料控制項作資 料連線的工作,原因是因為一個 ADO 資料控制項只能在一個表單上使 用資料庫功能,如果要在兩個表單上都存取同一個資料庫,就必須在 兩個表單都加入一個 ADO 資料控制項,而且要設定連線兩次。Data Environment 的功能機制就像存放共用變數的標準模組檔一樣,可以讓 多個表單,公用資料庫。

在 Client 對 Client、Client 對 Server 的溝通方面,使用 Winsock 做連線、傳訊和溝通協調的功能,最主要是做溝通協調,像是 否已註冊、聲音、視訊、留言、辨識要求連線的使用者、請求加入好 友名單等功能,都是先透過 Winsock 溝通現在要做哪一個動作,才能 繼續進行下去。 外觀的修飾方面,利用 Photoshop 做面版和按鈕的圖片,整個 軟體的外形則是使用 Windows API 修飾的。 3.2.4 Server 端

Server 端主要是由資料庫 Access 加 SQL 的搭配,再靠由 winsock

ClientA ClientB

(21)

傳近來 Client 的訊息,分析後,再套用 SQL 的語法,由 SQL 就可以到 資料庫中去拿 Client 所想要的資訊。

對於多使用者方面,Server 使用的是開多個 Socket 等候 Client 連線,然後用 FCFS queue 的來決定,哪一個訊息是要先被處理。 3.3 Qos(服務品質)

Quality of Service (QoS)是提供穩定、可預測的資料傳送服務, 來滿足使用程式的需求,QoS 並不能產生新的頻寬,而是依據應用程式 的需求以及網路管理的設定來有效的管理網路頻寬,在 IP(Internet Protocol)的資料傳送規格中,只針對傳送端及接收端的位址及服務等 做出規範,並利用 OSI 第四層以上,如 TCP 等協定來確認資料封包的傳 送無誤,但並沒有提供及保護傳輸的頻寬,而是以所謂盡力而為的方式 來提供頻寬服務,這樣的方式對於以往如 E-mail、FTP 等服務倒還可以 被接受,但面對 ERP、電子商務、VoIP 及 VoD 等多媒體資訊傳輸服務, 則無法滿足這些應用的頻寬,以及低延遲的要求。QoS 則能夠將既有的 頻寬資源作最佳化的調整,相關機制的完整應用,而 QoS 對頻寬/封包管 理機制,共有 TCP Rate Shaping、Class-based Queuing、Fail Allocation of Bandwidth 及 Packet-size Optimization 等四種,架構 出最佳化的頻寬控管功能,能對網路上的交通做到真正完全的控管。

(22)

第四章 實務製作過程

簡介流程 本軟體的主要功能是可以選擇視訊、聲音、文字三種通訊方式, 讓使用者互相溝通,在通訊之前必須先得到對方的位址資訊,透過 Server 即可查詢所有已註冊使用這套軟體的使用者,在徵求對方同意 之後,將對方加入自己的朋友名單,之後就可以開始選擇想要的通訊 方式,頻寬較小的使用者可用文字訊息的方式通訊,擁有足夠頻寬的 使用者則可選擇使用較需要頻寬的視訊或聲音來通訊。通常每位使用 者在離線之後,下次上線所使用的 IP 是和前次不同的,所以在每次上 線時,系統都會自動向 Server 取得最新的線上使用者的 IP 來更新自 己的朋友名單中的 IP,然後通知朋友名單中上線的朋友,自己的上線 訊息,這樣就可以隨時知道有誰現在可以進行通訊。對於不在線上的 朋友,也提供了留言功能,可以將文字或語音訊息留在 Server 上,等 下次對方上線時,由 Server 將留言通知對方。 4.1 Client 端 4.1.1 啟動程式 程式主畫面: 圖 4.1 程式主畫面

(23)

1.假設 UserA 啟動程式後,Client 端程式會先和 Server 進行連線,如 果是第一次執行,Client 端程式會執行註冊程序,首先填好個人基 本資料,如圖: 圖 4.2 註冊畫面 註冊完之後按確定把基本資料寫入使用者資料表,如表 4.1: 表 4.1 使用者資料表 本軟體的主要功能是可以選擇視訊、聲音、文字三種通訊方式, 讓使用者互相溝通,在通訊之前必須先得到對方的位址資訊,透過 Server 即可查詢所有已註冊使用這套軟體的使用者,在徵求對方同意 之後,將對方加入自己的朋友名單,之後就可以開始選擇想要的通訊 方式,頻寬較小的使用者可用文字訊息的方式通訊,擁有足夠頻寬的 使用者則可選擇使用較需要頻寬的視訊或聲音來通訊。通常每位使用 者在離線之後,下次上線所使用的 IP 是和前次不同的,所以在每次上 線時,系統都會自動向 Server 取得最新的線上使用者的 IP 來更新自 己的朋友名單中的 IP,然後通知朋友名單中上線的朋友,自己的上線 訊息,這樣就可以隨時知道有誰現在可以進行通訊。對於不在線上的

(24)

朋友,也提供了留言功能,可以將文字或語音訊息留在 Server 上,等 下次對方上線時,由 Server 將留言通知對方。 其中比較特別的欄位: Blue、Iblue、Red 等欄位是用來記錄此次所設定的背景顏色和前 景顏色。 AlwaysOnTop 欄位記錄此次設定是否顯示在桌面最上層。 按下確定後將個人基本資料傳送給 Server 端程式並寫入自己的資 料庫中,Server 端接到註冊資料後,就產生一個獨一無二的使用者 ID 並傳回給給剛註冊的使用者,使用者將 ID 記錄在自己的資料庫中,便 完成註冊程序。 2.若 UserA 已註冊過,並且已經有好友名單 a. 首先先傳送已註冊訊息和朋友名單給 Server, Private Sub TConServer_Timer()

If Winsock1(0).State = sckConnected Then

‘如果已連上 Server,傳送已註冊訊息和朋友名單給 Server Winsock1(0).SendData "register" & "|" & _

EnvMain.rsUser("ID") & "|" & _

EnvMain.rsUser("Password") & "|" & Data

'若沒連上 Server,在連線時間不超過4秒,將連線時間延長 ElseIf TConServer.Interval <= 4000 Then

TConServer.Interval = TConServer.Interval + 1000 '超過所能忍受的連線時間,仍未連上就停止和 Server 連線, 可能是 Server 有問題。 Else TConServer.Enabled = False ComboServer.Enabled = True End If b. Server 接到 UserA 的已註冊訊息和朋友名單後,就從自己的 資料庫中,找到朋友名單中的使用者最新的 IP 傳回給 UserA

(25)

更新 UserA 的朋友資料表的 IP 欄位。 For i = 1 To EnvMain.rsFriend.RecordCount '將 Servr 傳來朋友的最新 IP 更新到自己的朋友資料表 IP 欄位 EnvMain.rsFriend("Address") = TmpStr(i) EnvMain.rsFriend.MoveNext NEXT c. UserA 此時利用朋友最新的 IP 來通知朋友自己已上線,若朋 友未上線,表示剛剛從 Server 取得的 IP 是朋友上次上線時 使用的,則沒通知未上線朋友自己的上線訊息沒關係,以此 對每個上線的使用者類推,可以知道任何使用者都能獲得在 線上朋友的上線訊息。 For i = 1 To EnvMain.rsFriend.RecordCount '若對方不是上線狀態,且連線成功就傳送上線訊息給對方 If EnvMain.rsFriend("Status") <> "Online" Then If Winsock1(i).State = sckConnected Then

Winsock1(i).SendData "Online" & "|" & EnvMain. _ rsUser("ID") '更新朋友的線上狀態 EnvMain.rsFriend("Status") = "Online" End If End If EnvMain.rsFriend.MoveNext Next 4.1.2 加入新朋友到朋友名單 剛開始沒有朋友的資料,所以無法和別人通訊,假設 UserA 要取 得朋友資料,就向 Server 查詢朋友資料,查詢的方法有三種,暱稱、 ID、E-mail,輸入查詢關鍵字後,就將關鍵字傳送給 Server, 如下圖:

(26)

圖 4.3 搜尋其它使用畫面

Server 從自己的資料庫中搜尋被查詢的使用者 UserB 的資料,然 後將 UserB 的資料傳回給 UserA,UserA 從搜尋到的資料中選擇基本資 料完全相符的使用者 UserB, 因為當時 UserB 可能不在線上,所以傳 送請求加入好友名單的訊息到 Server,Server 從自己的資料庫中查詢 UserA 的基本資料,再將 UserA 的請求訊息和 UserA 的基本資料傳送給 UserB,UserB 接到訊息後,可以看到 UserA 的基本資料,

如下圖:

圖 4.4 對方要求加入朋友的畫面

此時可選擇將對方加入哪一個群組,也可以自己輸入群組名稱,新 增一個群組種類,加入完之後,群組資料表如表 4.2

(27)

表 4.2 群組資料表

若決定“同意”UserA 將自己加入好友名單,便傳送同意訊息給 Serevr,同時將 UserA 的資料寫入自己的資料庫,再由 Server 將同意 訊息和基本資料傳給 UserA,此時 UserA 才將 UserB 加入自己的好友名 單中,並將 UserB 的基本資料寫入自己的資料庫中;若 UserB 選擇不 同意 UserA 將自己加入好友名單,就傳回不同意訊息給 Server,再由 Server 傳不同意訊息給 UserA,此時 UserA 就不能將 UserB 加入朋友 名單中,也無法和 UserB 進行通訊。

加入朋友完成圖:

圖 4.5 同意和被同意加入朋友完成圖

(28)

表 4.3 朋友資料表 比較特別的欄位如下:

Status 欄位記錄朋友在線上的狀態。

Index 欄位記錄 Winsock 元件使用的索引值號碼值。

UseSock2 欄位記錄目前這個 Winsock 元件的索引值是由 Winsok1(用來 連線)還是 Winsock2(用來接受連線)在使用。 ListIndex 欄位記錄 List 元件中被加入的朋友所用的索引值。 Record 欄位用來記錄和對方文字通訊時的對話。 Group 欄位記錄使用者是哪一個群組。 4.1.3 使用文字訊息通訊 UserA 只要從朋友選單中選擇一人,然後執行傳遞文字訊息程式, 程式就會先從朋友資料表中搜尋所選的人,然後取得朋友的 IP 位址, 如表: 表 4.4 從朋友資料表中取得所選使用者的 IP

傳給 Winsock 元件,透過 Winsock 元件進行連線,VB 的 Winsock 元件用法,在連線之前,Winsock 必須先找出一個沒人使用過 Winsock 元件的索引值,才能利用擁有這個索引值的 Winsock 進行連線,因此 為了避免用到重複的索引值先執行 FindIdleIndex()副程式,以下是尋 找沒人用的 Index 的過程:

Dim IndexNum as Integer:用來記錄目前的 Index,直到找到了可用 的 Index 才將 IndexNum 傳回

FindIdleIndex()

Dim Count as Integer:用來計數執行比較到第幾次

Dim Check as Integer:用來計數每次和每個人的 Index 比較

Dim Everuse as Boolean:用來表示現在比較到的 Index 有沒有人用 Dim UseSock2 as Boolean:表示是否是使用 Winsock2

(29)

因為一開始 Index 的分配是從 1 開始遞增,假設現已用了 1 到 5 這 五個 Index,若第 3 號 Index 的使用者離線,則 3 這個 Index 就會變 沒人用的狀態,只剩 4 個 Index 有人用,但不連號,在比較 Index 是 否有人用時,必須比四次,每次都和每個有人用的 Index 比較,總共 4 的二次方次,以上面所敘述的情況來看第一次用 1 來和四個有人用的 Index (1、2、4 和 5)比較

For Count = 1 To EnvMain.rsFriend.RecordCount IndexNum = IndexNum + 1

For Check = 1 To EnvMain.rsFriend.RecordCount

'若 Index 值相等,表示已有人使用,將 everuse 設為 True,並開迴圈 去檢查下一個 Index。

If EnvMain.rsFriend("Index") = CStr(IndexNum) Then everuse = True

Exit For Else

若 Index 值不相等,將 everuse 設為 False,表示找到沒人用的 Index everuse = False

End If Next

如果和所有有人用的 Index 都比較過了,且 everuse = True,表 示是一個朋友名單裡的朋友以外的新連線,可能是想加入新朋友的要 求,就離開迴圈,將 IndexNum+1,並載入一個新的 Winsock 元件。 If everuse = False Then

Exit For End If Next

若找到沒人用的 Index,且 UseSock2 = True,表示有人要求連線, 用 Winsock2 來載入一個 Winsock 元件來接受連線要求。

If everuse = False And UseSock2 = True Then Load Winsock2(IndexNum)

若 Index 都有人用了,且要接受連線,則將 indexNum+1 得到一個 沒人用的 Index,再載入一個新的 Winsock 元件來接受連線。

ElseIf everuse = True And UseSock2 = True Then IndexNum = IndexNum + 1

Load Winsock2(IndexNum)

若找到沒人用的 Index 且不是被要求連線(UseSock2 不等於 True),則是自己要求和別人連線,使用 Winsock1 來載入一個新的 Winsock 元件來和別人進行連線。

(30)

ElseIf everuse = False Then Load Winsock1(IndexNum)

同樣如果 Index 都有人用,然後自己要和別人連線,就將

indexNum+1 得到一個沒人用的 Index,再載入一個新的 Winsock 元件 來接受連線。 Else IndexNum = IndexNum + 1 Load Winsock1(IndexNum) End If 最後將載入的值傳回,在別的地方用來寫入朋友資料表 FindIdleIndex = IndexNum 找到沒人使用的 Index 後,每次使用一個 Winsock 元件時,就先在 朋友資料表中,在所進行連線的對像的資料表欄位裡記錄連線時所用 的索引值,然後進行連線,若連線成功就可以利用 Winsock 傳送字串, 以文字開始通訊。如圖: 圖 4.6 選擇使用文字訊息功能

(31)

圖 4.7 使用文字訊息通訊過程 1

圖 4.8 使用文字訊息通訊過程 2 4.1.4 使用聲音或視訊通訊

1.UserA 和 UserB 在通訊之前,UserA 先用 Winsock 和 UserB 連線,然 後傳遞想連線的方式和自己的 ID 給對方:

FClient.Winsock2(EnvMain.rsFriend("Index")).SendData _ "MsgSound" & "|" & EnvMain.rsUser("ID")

(32)

則表示要求使用視訊及聲音同時通訊,EnvMain.rsUser("ID")用來 讓對方從自己的資料庫中查詢是誰要求連線。

2.UserB 接到訊息,會跳出 Fcall 對話方塊,UserB 可利用裡面 Check 方塊來選擇要用哪種方式通訊,如圖:

圖 4.9 接到別人的影像聲音通訊要求

選擇完之後,按下接受,UserB 就傳回同意通訊模式給 UserA: FClient.Winsock2(EnvMain.rsFriend("Index")).SendData _

MsgStatus

MsgStatus 是變數,使用視訊時 MsgStatus = VideoAgree,使用聲音 時 MsgStatus = SoundAgree。

3.UserA 接到 UserB 的同意訊息後,啟動視訊電話程式開始和 UserB 通訊。如圖:

(33)

4.1.5 留言功能 這個是讓 UserA 要留言給不在線上的 UserB,這個留言又可以分為 兩種型態,一是文字,一是語音。 文字型態: Client 程式會在這個要留給對方的訊息前面加上一些特定的字, 在把這個訊息傳給 Server,加上的是自已本身的 ID(UerA)及對方 的 ID(UserB)讓 Server 記錄到資料庫中。 收文字留言:

這時如果 UserB 上線,UserB 會傳一些訊息給 Server,這時 Server 會知道 UserB 上線了,就會到 Database 中去查看有沒有人留言給 UserB,有的話就會傳給 UserB。 語音型態: 如果 UserA 要傳語音留言給 UserB,這時會有個錄音的畫面出來給 UserA 看,這時 UserA 只要按留言鈕即可開始留話,要結束按結束 留言即可。這時 UserA 的程式會告訴 Server 有留言要傳送,這時 Server 就會和 UserA 的程式建立連線,這時 UserA 的程式就會把 語音訊息傳給 Server。

收語音訊息:

當 Server 知道 UserB 上線時,Server 就會去 Database 中查有沒 有語音訊息,有的話,Server 就會和 UserB 建立連線,把語音訊 息傳給 UserB。 4.1.6 使用群組名單將朋友分類 當使用者覺得朋友名單中朋友數量太多時,可以使用這項功能,讓 畫面上只顯示使用者所選擇的群組,如下圖: 圖 4.11 使用群組名單分類 1

(34)

圖 4.12 使用群組名單分類 2 程式執行過程:

1. 初使化組群名單

a. 先將已有的群組名稱加到 TreeView 元件

Set NewNode1 = TreeView1.Nodes.Add(, , Temp, _ EnvMain.rsGroup("Group"))

b. 比較群組資料表裡的群組名稱和朋友資料表裡的群組名稱是否 相同

If EnvMain.rsGroup("Group") = EnvMain.rsFriend("Group") Then c. 若相同,就將相同群組的朋友加入到此群組下

Set NewNode1 = TreeView1.Nodes.Add(Temp, tvwChild, ,_ EnvMain.rsFriend("Name")) d. 重複以上步驟檢查每一個朋友屬於哪一個群組。 2. 選擇群組 a. 選擇群組後,先將所有 Listbox 元件上的名單都清除 FriendList.Clear b. 然後重新加入所選群組中的名單,先比較 Treeview 元件中的群名 稱和朋友資料表中的群組名稱是否相同

If TreeView1.SelectedItem = EnvMain.rsFriend("Group") Then c. 將群組中的名單加入 Listbox 元件中

FClient.FriendList.AddItem EnvMain.rsFriend("Name") d. ItemData(FClient.FriendList.NewIndex)用來記錄索引值 , 提

(35)

FClient.FriendList.ItemData(FClient.FriendList.NewInd ex) = EnvMain.rsFriend("ID")

e. ListIndex 用來動態刪除 List 中 EnvMain.rsFriend("Listindex") = FClient.FriendList.NewIndex 的朋友名單時所用的索引 f. 重複以上步驟,直到群組裡的人都加入朋友名單列表中。 4.1.7 清除選取名單 '移到朋友資料表中的第一筆資料 EnvMain.rsFriend.MoveFirst '搜尋所選的名單

EnvMain.rsFriend.Find "ListIndex='" & FriendList.ListIndex & _"'" '刪除資料庫裡的資料 EnvMain.rsFriend.Delete '刪除 Listbox 裡的資料 FriendList.RemoveItem FriendList.ListIndex 如圖: 圖 4.13 刪除朋友名單過程 4.2 Server 端

本軟體的 server 是由 VB+access 來達成的,至於和 client 端的溝 通則是透過 winsock 來達,如圖 4.14

(36)

圖 4.14 Client & Server 概念圖

解析由 client 送到 server 的訊息是靠 VB 的一個函數 split,這 個函數可以幫我們把字串分到字串陣列中。

例如:

dim Tmpstr

dim data as string

data = “there|is|a|dog” Tmpstr=split(data,”|”) 結果: Tmpstr(0) = there, Tmpstr(1)= is, Tmpstr(2), Tmpstr(3) 本 server 有下列幾項的功能: 4.2.1 註冊: 本功能是靠 client 傳來註冊的資訊,並且會由 server 發出一個號 碼, 這個號碼的產生是由資料庫的總資料筆數加 1 而得到的。這組號 碼產生後會傳回給 client。讓 client 知道他的號碼。 ID client 訊息 個人資料 server 訊息 圖 4.15 註冊流程圖 4.2.2 搜尋: 這個功能又分為三個小的不同功能

a.用 ID 搜尋:透過 Winsock 接受到的要查尋的人的 ID, server 就會到資料庫中去尋找這個人,找到後便會把 client server 資料庫 資料庫 Server 資料庫

(37)

資訊傳會給 client。 b.用 Email 搜尋:方法同上。 c.用 nickname 搜尋:方法同上。 這個功能主要是要配合著加入新朋友的功能。 要查的人 client 訊息 查到的結果 server 訊息 圖 4.16 搜尋流程圖 4.2.3 上線: 這個本功能是告訴 server 說是哪一個 client 上線了,也就是會和 server 建立一條連線,透過這條連線 server 可以知道這個 client 的 上線和斷線。這時 server 也會順便檢查是否有人有留過訊息給本人, 如果有的話又分兩種,一是文字訊息,一是語音訊息。如果是文字訊 息,則直接傳回給 client,如果是語音的話,就直接傳給 client,如 果是語音的話,會再建立一條連線,用來傳語音檔案。 處理過程如下: if rs(“type”) = “text”then 直接把要送的訊息給 client else ‘處理檔案 這是處理檔案 end if 4.2.4 留言: 這個功能又分為兩個 a.訊息:這功能是把由來源端(client)送到不在線上的目的端 (client),這時來源端(client)會把自已 ID 和對方的 ID 以及要送到對方的文字訊息一起送到 server 保存起來。 當對方上線時會由 server 轉送到目的端(client)。 過程如下:

rs.addnew SID ,DID,所要留給方的訊息 server

(38)

b.訊息:這功能也和文字訊息一樣,也是對方不在線上所以來源端 (client)也是把自已的 ID 和對方的 ID 的語音訊息,不過 如果是語音訊息,沒有辦法直接用前和 server 建立的那 條連線直接傳,所以要透過在建一條來達成傳輸功能。 過程如下: Rs.addnew SID,DID,所留下的檔名

Open 檔名 for binary access write as #1 接受檔案 4.2.5 更新:這個功能其實和註冊差不多,不過,這功能是要架構在 client 端必須是要先註冊才行使用,這功能主要是讓 server 能夠知道 client 的基本資料是維持在最新的, 已方便有人透過 search 這功能搜尋時能夠找到使用者 時是最新的資料。 完成 client 訊息 更新資料 server 訊息 圖 4.17 更新使用者基本資料圖 4.2.6 加入朋友: 這個功能是能夠讓使用者在 Client 使用搜尋(search)過後,找到 自已想要加入的對象時使用。這個功能在 Server 中只負責傳送兩個 Client 中的互相溝通的訊息而已,來源端(Client),也就是要把對方 加入好友的使用者會告訴 Server,要加入好友的對象是誰,並由 Server 把這要求送到目的端(Client),這時如果目的端(Client), 不在線上 時就會把訊息先存起來,等目的端(Client)上線時再通知,如果在線 上則目的端(Client)會立刻收到這要求,目的端(Client)可選擇是否 要被加入,選擇完一樣會有訊息傳回給 server,然後在時也會有當時 邀請者在不在線上的問題,處理方法和前面一樣即可。 處理過程如下:

while (winsock1(index).state = sckconnected) and(winsock1.tag = DID)’如果在現上就把要送過去。 送要求

Server 資料庫

(39)

wend 把要求存起來 備註: database table:member<-記錄所有使用者的基本資料 message<-記錄留言等等的訊息 member tabled 欄位:

nickname (匿稱) memberid(使用者 ID) memberip (使用者 IP) email(使用者 Email)

password(使用者的 password) online(使用者狀態) someone(是否有人找過使用者) occupation(使用者職業) birthday(使用者生日) sex(使用者性別)

introduction(使用者的簡介) message table 的欄位:

sid(來源的使用者 ID) did(目的地的使用者 ID) type(訊息類型) message(儲存的訊息) 4.3 VOIP 關於 Client 和 Server 的詳細部分請參考之前的章節,本章節只說 明 IP 電話通訊的實作。 4.3.1 建立通訊過程 這個系統可以在 LAN、WAN 以及 Internet 上面使用。首先,使用 兩張圖來大概說明兩台電腦之間如何進行通訊。 圖 4.18 電腦 A 查詢電腦 B 的 IP Address 電腦 A 電腦 B Server 電腦 A 向 Server 詢問”好友 -電腦 B”的 IP Address

(40)

如上圖所示,電腦 A 必須要得知電腦 B 的 IP Address,故先要向 Server 查詢電腦 B 的相關資訊(在此之前,雙方都把自己的資訊登錄到 Server 上)。 圖 4.19 雙方進行 H.323 通訊 如上圖所示,電腦 A 和電腦 B 建立了 H.323 Session。此時便算是 兩台電腦直接進行點對點通訊,不需要 Server 提供服務。由這兩個圖 得知兩台電腦間的通訊有兩個重要步驟,一個是電腦 A(呼叫者)要發出 呼叫給電腦 B(被呼叫者);一個是電腦 B(被呼叫者)要回應呼叫給電腦 A(呼叫者)。 接下來就開始說明呼叫者和被呼叫者所要做的動作流程。過程 如圖 4.19 電腦 A 電腦 B 2 Server 電腦 A 發出呼叫給電腦 B,若電腦 B 同意通訊則進 行 H.323 的通訊 H.323 Session

(41)

建立和啟動 TAPI object

使用 TAPI object 列舉電腦上所有可用的 Address objects

列舉各 Address object 所支援的位址類型

根據適當媒體 (語音、視訊等) 和位址類型的支援查詢 來選擇 Address object

使用 Address object 的 CreateCall 方法來建立與特定位址 相關的 Call object

在 Call object 上選擇適當的終端機

呼叫 Call object 的 Connect 方法以找到呼叫

圖 4.20 呼叫者發出呼叫的流程圖 4.3.2 呼叫者的呼叫動作

(42)

以上是發出呼叫動作的流程圖,以下是比較細部的說明。 1. 建立和啟動 TAPI object:

由於 TAPI object 是 TAPI 3.0 API 的入口,所以要先建立並且初始 化,程式碼片段如下所示:

2. 使用 TAPI object 列舉電腦上所有可用的 Address objects:

3. 列舉各 Address object 所支援的位址類型: 4. 根據適當媒體 (語音、視訊等) 和位址類型的支援查詢來選擇 Address object: 每當列舉一種 Address 便要檢查此位址類型和媒體類型,當兩者都 符合需求便可以作為指定的 Address。第 3 和第 4 步的程式片段如 下表示

'//create the tapi object Set gobjTapi = New TAPI

'//call Initialize before calling any other tapi function Call gobjTapi.Initialize

'//set the EventFilter to accept all defined tapi events gobjTapi.EventFilter = TAPI3_ALL_TAPI_EVENTS

'//register the outgoing interface (the one that will actually '//receive and process the events)

Set gobjTapiWithEvents = gobjTapi

Dim gobjAddress As ITAddress

Dim objCollAddresses As ITCollection Set objCollAddresses = gobjTapi.Addresses

(43)

5. 使用 Address object 的 CreateCall 方法來建立與特定位址相關的 Call object: 程式片段如上表示,strDestAddress 是對方的位址、nSelectedType 是線路類型(如 LINEADDRESSTYPE_IPADDRESS)、lMediaTypes 是媒 體類型(如 TAPIMEDIATYPE_AUDIO),以上三個參數是一個 Call 的 基本資訊。 6. 在 Call object 上選擇適當的終端機: 其說明註解和程式碼片段如下所示 bFound = False

For indexAddr = 1 To objCollAddresses.Count

Set objCrtAddress = objCollAddresses.Item(indexAddr) Set objMediaSupport = objCrtAddress

Set objAddressCapabilities = objCrtAddress

If objMediaSupport.QueryMediaType( nSelectedType ) bFound = True

End If

If bFound = True Then Exit For Next indexAddr

Set gobjAddress = objcollAddresses.Item(indexAddr)

Set gobjCall = gobjOrigAddress.CreateCall( strDestAddress, _ nSelectedType, lMediaTypes)

(44)

7. 呼叫 Call object 的 Connect 方法以找到呼叫

'query for ITBasicCallControl, the call control interface Dim objCallControl As ITBasicCallControl

Set objCallControl = gobjReceivedCallInfo

'query ITTerminalSupport from Address object Dim objTerminalSupport As ITTerminalSupport Set objTerminalSupport = gobjAddress

Dim objTerminal As ITTerminal

Set objTerminal = objTerminalSupport.GetDefaultStaticTerminal( _ lMediaType, dir)

'Select the terminal before answering

'we'll need the ITStreamControl interface for doing this. Dim objStreamControl As ITStreamControl

Set objStreamControl = objCallControl If Not (objStreamControl Is Nothing) Then Dim objITCollStreams As ITCollection

Set objITCollStreams = objStreamControl.Streams Dim nIndex As Long, objCrtStream As ITStream

For nIndex = 1 To objITCollStreams.Count

Set objCrtStream = objITCollStreams.Item(nIndex) If objCrtStream.MediaType = lMediaType Then If objCrtStream.Direction = dir Then

Call objCrtStream.SelectTerminal(objTerminal) End If End If Next nIndex End If gobjCall.Connect (False)

(45)

建立和啟動 TAPI object

使用 TAPI object 列舉電腦上所有可用的 Address objects

列舉各 Address object 所支援的位址類型

根據適當媒體 (語音、視訊等) 和位址類型的支援查詢 來選擇 Address object

以適當的 Address object 在特定media type 中登錄有 興趣的物件

以 Address object 登錄呼叫事件處理程式 (亦即建置 ITCallNotification 介面)

TAPI 透過 ITCallNotification 通知應用程式有新的呼 叫,然後建立 Call object

在 Call object 上選擇適當的Terminal

呼叫 Call object 的Answer 方法以應答呼叫 呼叫 Call object 的Connect 方法以找出呼叫

圖 4.21 被呼叫者回應呼叫的流程圖 4.3.3 被呼叫者的反應

(46)

'設定可能會觸發的事件 Const TAPI3_CALL_EVENTS = _ TE_CALLMEDIA Or _ TE_CALLNOTIFICATION Or _ TE_CALLSTATE '把它加入到 EventFilter,讓 TAPI 程式可以接受事件觸發 gobjTapi.EventFilter = TAPI3_CALL_EVENTS '登錄呼叫事件處理程式

Set gobjTapiWithEvents = gobjTapi

Dim fOwner As Boolean, fMonitor As Boolean

Dim lMediaTypes As Long, lCallbackInstance As Long

fOwner = True fMonitor = False lMediaTypes = TAPIMEDIATYPE_AUDIO lCallbackInstance = 1 glRegistrationToken = gobjTapi.RegisterCallNotifications( _ gobjAddress, _ fMonitor, _ fOwner, _ lMediaTypes, _ 以上是發出呼叫動作的流程圖,由於大部分和呼叫動作相同,故只 說明與呼叫動作相異之處-登錄呼叫事件處理程式。 此外還需要設計一個判斷事件觸發的 Function。每當有事件來到的 時候,便由此 Function 判斷目前的通話狀況及所需要做的動作。例如: 發出呼叫者要藉此 Function 接收對方的回應狀況並作對應動作;而接 收呼叫者要藉此 Function 接收對方的呼叫資訊並作回應。 4.4 本系統與 NetMeeting 互通性(H.323 標準互通) 為了驗證本系統可以與其他同為是擁有 H.323 的產品能夠互相溝 通。所以找了同樣也是依照 H.323 標準而設計的 NetMeeting 作為測

(47)

試。其結果是成功的,在聲音和視訊都能夠有良好品質的狀況下進行 通訊。以下的圖片是其成果: 1. 開啟 NetMeeting 端的 IP Address 如下 圖 4.22 NetMeeting 端的狀況 2.由本系統程式發送呼叫訊號給對方的 NetMeeting 圖 4.23 本專題測試程式的狀況

(48)

3.NetMeeting 收到呼叫,按下接受,同意互相通訊

圖 4.24 NetMeeting 接收到呼叫

(49)

圖 4.26(上圖)本專題測試程 式通訊後狀況;圖中的人像 是本組成員。

圖 4.25(左圖)是 NetMeeting 通訊後狀況。

(50)

第五章

實作之問題討論及解決方法

剛開始起步的時候,有關於 Tapi 的中文書,可以說是一本也找不 到,英文的也不多見,只能上網找文件來看,而且大都多只能找到英 文的。而在使用 VB 的過程中也碰到一些書上沒寫的狀況,記錄在下面: Client 端 Q1:使用時,只要在某段副程式裡使用到某元件時就會引起該元件 的 Click 事件,因此在撰寫程式時,常會有意想不到的錯誤情 況發生。 Sol:只能在寫程式碼的時候注意用過的元件,寫好了之後要一直 測試程式,直到沒錯誤為止。 Q2:VB6.0 中的 Winsock 元件,在使用 Winsock1(0).Listen 變成 接受連線用的之後,其它使用 Winsock1 的 Winsock 陣列(例 如:Winsock(5))就不能再做向別人連線的動作。

Sol:另外使用一個 Winsock 元件”Winsock1”來負責做向別人連 線的動作,Winsock2 用來接受連線要求。後來參考了一些 書,我想應該是因為當我把 Winsock 設為接受連線狀態後, VB 就把整個 Winsock 元件的一些必須條件改變了,成為只能 接受連線的狀態。 Q3:在用 Winsock 進行連線的時候,想利用迴圈自動和很多人連 線,但是就是沒辦法連上,就算在迴圈中設定只有一個人在 線上可連線,但是只要一跑迴圈,就連不上,把迴圈拿掉之 後就連上了,檢查執行步驟,一切看起來都很單純合理,實在 想不出來到底錯在哪。 Sol:在幾次重寫程式後,居然可以了。不知道之前錯在哪裡,不 過我想邏輯是沒錯的。 Server 端 Q1:當初寫 Server 端的資料庫時,是使用 ADO 來控制資料庫,這 樣造成了 Server 的動作緩慢。 Sol:因為寫的時候沒想好,在寫時是把 Server 寫成當資料被查尋 時,就會把結果給顯示到營幕上面,這樣寫時當有很多的

(51)

Client 連到 Server 做動作時就會造成 Server 忙於把被查的 資料更新到營幕上,所以造成 Server 緩慢。把 Server 改成 不把被查的資料更新在營幕上,情況就有改善了。

TAPI 端:

Q1:由於國內相關的中文文件太少.故花了許多時間研究了外國的相關 文件.並且沒有很多 Samplay Code 可以參考.故只能辛苦鑽研 TAPI 的 SDK 文件.

Sol:時間就是關鍵

Q2:有時候會因為網路頻寬的不足,所以聲音和視訊會 delay, Sol:目前還沒有一個有效的方法來解決.

(52)

第六章 結論與展望

VoIP(Voice over Internet Protocol)是指在 IP 數據網絡上 (IP-based data networks)提供通話服務,為網絡通訊的一大突破。 在 TCP/IP 網路協定上,可以將語音數字化,經過壓縮,以封包型態傳 輸,再解壓縮還原為語音,藉此執行通話功能,如此將可大幅節省傳 統電路式交換網絡的擴充成本,因為網際網路服務是大家原本存在且 共用的,就不需另外架設專屬線路,再者 VoIP 是透過 Data Switch (資 訊封包交換),用所謂的軟體或硬體將類比的語音訊號轉為網路上的數 位資料封包來做數據交換的動作,比起傳統電信結構做交換動作,當然 會成本很低多並且能更有效的利用現有數據網絡與傳輸骨幹網絡,把 語音封包用網路送到當地,再轉成一般市話或手機,但是這就需要一個 裝置和服務,裝置負責將語音封包轉回類比語音再與當地 PSTN 進行交 換,稱之為 VoIP Trunk Gateway,還有打當地電話還是要付費,這時候計 費和此 VoIP Trunk Gateway 裝置提供就要靠 ITSP(Internet Telephony Service Provider ,也就是網際網路電話服務供應商),類似於使用行 動電話可以選擇 ”中華電信”或是”台灣大哥大”等等不同的公司 提供服務一樣,您要使用網路電話,也必須選擇網際網路電話服務供應 商,這些公司提供將使用者發送的 VoIP 語音封包轉接到世界各地市內 電話的服務(PC to Phone),因此可以為企業或個人節省可觀的長途電 話費,所以,許多的服務及設備公司也都想參與 VoIP 的發展,這也就是 VoIp 目前越來越受到重視的因素。 我們現在所製作的系統只侷限於 PC-to-PC,也就是只能對電腦傳送 語音、文字和視訊,如果想進一步將電腦和電話、手機溝通,可能需要 購置 VOIP GATEWAY 等硬體設備,但是礙於經費有限,目前無法購置。當 然我們現在的系統還算是陽春型,沒有許多了附加功能,例如:多方通 話、轉接功能、語音保留…等,但是未來假使有更多的使用者使用,那 系統功能的完整性和使用者的方便性當然會更再加強,甚至加上 Qos 機 制,讓傳輸品質能更提升。 其實 VoIP 在許多報章雜誌或研究上都有很多的討論, 根據 Frost and Sullivan 的數據分析,經由傳統公眾電信網絡(PSTN) 打電話, 將因網路電話的快速成長而逐年萎縮至市場的 20%以內,其研究資料 顯示,一九九八年上網通話量僅佔通話市場的 6.2%,未來每年網路電

(53)

話將以數倍快速成長,其預估電信公司每年將會失去 15~20%的語音市 場,到二○○四年,經由 PSTN 打電話的僅剩 18.9%,而其餘 81%利用 傳統電信公司網路打電話的則將被網路電話及其它方式取代,可見得 網路電話在未來極具潛力。

(54)

第七章 心得

謝其森 專題終於完成,心中的沉重也化為烏有,雖然我們花的時間比其他 專題的人長,印象中應該是從二下的暑假開始的,不過這中間學習的過 程卻也比別人深刻,從有到無,從開始到現在,確實是有些成長和進步, 了解了如何製作一個系統流程,和該有的態度,當然若是團隊合作彼此 的溝通我想是最需要的,而我也很感謝我其他的組員,沒有他們我想我 一個人很難去完成,而且他們的程式撰寫能力也比我強很多,所以重要 的程式都是由他們來負責,我則是負責比較簡單的工作,有問題當然也 會問他們,所以這一路下來,他們幫助我最多,再次的感謝他們!! 胡舜禹 這次專題實驗,我覺得最大的收穫是學習邏輯思考和如何去研究 一個完全不了解的東西。剛開始找專題題目時,完全搞不懂 Tapi 這個 東西,在老師、學姐和學長的指導和協助下,有了一些資料,不過都 是英文的,看了很久還不是很懂,在和一些程式碼對照後才漸漸了解。 一開始在規劃 Client 和 Server 之前的溝通時,覺得架構很簡易,可 是在實際去做時才發現很多東西沒考慮到,就像看懂一個演算法不會 太難,應用的時候才發現不是那麼容易寫出程式來,所以 Client 端程 式碼我整個重新寫過了兩、三次。 黃智宏 這個專題實驗讓我收獲良多,也許我們寫的這個軟體並不是很 好,但從中獲得了一個對 SDK 的初步的了解與對 VB 元件及函數的運用。 會寫這個是對類似 icq 這樣的軟體有興趣,因為平常最常用他來與班 上其它人來做溝通,然後專題又有幸能夠寫到 TAPI,也就是網路電話, 所以就開始了研究這個東西,最初在看有關 TAPI 的 SDK 就遇到困難, 因為以前沒有看過也沒碰過,以前寫程式有問題就看書,而且還是中 文,而 SDK 只有英文所以一剛始在閱讀上就有了問題,而且在市面上 也找不太到有關 TAPI 的中文書,加上又要 trace 一些 sample code 所 以蠻痛苦的,後來有了一些了解後,我們便開始想這的應用,我們後 來就想要做的和 ICQ 類似,便開始分組,我是被分配到做 server 和 client 的這一組,不過主要是做 server,一開始也是遇到問題,後來

(55)

看了網路上的資訊和書,才了解到其實可以用 winsock 做出來,這時 才會另一位同學開始著手做。當然,途中還是有遇到不少的問題,不 過,在大家的討論下和看一些相關資訊後都可以有一個解答。 最後,由於大家的同心協力,讓我們能夠完成,也謝謝已經畢業 的學姐 Kelly 和蔡鳴興學長的幫忙與指導。 黃爾健 起初也不知道自己的專題要朝什麼方面發展,當聽到李維聰老師招 募人才來實作網路電話的時候,想想這好像也是個有趣的題目。就這 樣投入 VoIP 的懷抱了。 雖然當時便有了像 NetMeeting 這樣的產品存在,但是在台灣真正 使用網路來講電話的人還是不夠普及。所以這樣的技術在台灣根本不 是主流,很少人在做。所以初期找到的資料都是外國的相關文件,研 究起來相當吃力。不過要感謝李維聰老師和莊凱莉學姊的熱心指引, 讓我們快速進入狀況。漸漸地就把通話的程式部分建構起來。 其實網路電話所需要的是穩定且速度快的頻寬,依照目前台灣網路 的現況其實還不是很適合使用網路電話。必須要等待電信服務業為此 建設更完整的實體網路架構,VoIP 及其應用才會在台灣大放光彩。然 而 VoIP 未來勢必會取代傳統電話的服務,故現在投入這方面去做研究 真的讓自己對於一個未來趨勢的技術多了一份認知。將來若有機會, 可能會繼續朝這方面前進。

致謝

在這裡先感謝李維聰老師的指導,提供我們專題所需的儀器,以 及專題方向上的意見,讓我們在實作專題上有莫大的助益,也要感謝 Kelly 學姐的大力幫忙,她幫我們找到了不少的相關資料,還教我們要 找如何去找資料,以及如何去 Trace 程式,和 VB 一些 Debug 的小技巧, 再感謝蔡嗚興學長的督促指導和程式的後期製作。

(56)

參考資料

[1] 王國榮著,Visual Basic 資料庫程式設計,旗標出版社,2001 年 10 月 [2] 陳峰棋著,Visual Basic 網路應用程式設計,知城出版社,2002 年 3 月 [3] 盧毅著,Visual Basic 程式設計學習寶典,碁峯出版社,2000 年 8 月

[4] Peter G. Aitken 著; 張力平,吳佛東譯,深入 VISUAL BASIC 4.0 系統核心,松崗出版社,1996 年

[5] 蕭世彰,周千代編著,Visual Basic 6.0 Activex 控制項技術手 冊,儒林出版社,2000 年

[6] 王國榮著,Visual Basic 6.0 與 Windows API 講座,旗標出版社, 1998 年 [7] 網路通訊 127 期,2002 年 2 月份 [8] 網路通訊 128 期,2002 年 3 月份 [9] 網路資訊 122+123 期,2002 年 1、2 月份 [10] 網路資訊 132 期,2002 年 11 月份 [11] http://www.msdn.microsoft.com/ [12] http://www.iptelephony.org/ (VoIP) [13] http://www.ip-centrex.org/ (IP Centrex)

(57)

附錄 操作手冊 程式的主畫面,將滑鼠停在按鈕或其它介 面上,會出現輔助訊息,顯示其功能。 右邊的快速啟動按鈕可以在點選使用者後 ,快速的使用常用的功能,不用再另外按 滑鼠右鍵或工具列。 工具列的管理功能 執行功能 工具功能 說能功能:幫助使用軟體 按滑鼠右鍵可快速使用常用的功能

(58)

Step1:第一次使用本軟體,系統會自動跳出註冊視窗,填寫完註冊資 訊後,按下確定,系統會自動將註冊資訊傳給 Server 完成註冊 手序。 Step2:使用功具列的“查詢其它使用者名單” 功能,選擇 ID、Name 或 Email,然後輸入查詢關鍵字,按下搜尋鈕向 Server 查詢其 它使用者,用來加入朋友名單。 Step3:找到要加入的朋友後,按下加入好友鈕,就會傳遞要求加入好 友訊息給對方,然後等待對方同意。 Step4:對方同意後,在朋友名單表列就會顯示剛剛加入的朋友名字, 以後當任何朋友開啟這個軟體,就可以得到他的上線訊息,只 要在朋友名單表列選擇已加入的朋友,就可以對所選擇的朋友 做通訊、查詢基本資料、刪除朋友等功能。 其它功能:背景顏設定、更換面版、永遠顯示在最上層、修改個人資 料、改變線狀態等,都可以在功能設定選項裡設定。

數據

圖 3.3   H.323 架構  l H.323 支援標準語音編解碼(G.711、G.723、G.729)  視訊編解碼(H.261、H.263)資料共享(T.120)  n G.711 是 ITU 的標準語音編解碼器,設計用來傳輸速度為  48、56 和 64 Kbps 的 A-law 和 -law PCM 的語音。  n G.723 是設計用於低位元速率操作的 ITU 標準語音編解 碼器。  n H.261 是 ITU 標準的視訊編解碼器,設計用來傳輸速度為  64 Kbps、解析度為 176x44
圖 3.5 加入新朋友  3.2.2.1 加入新朋友流程
圖 3.7 留文字訊息過程 1
圖 3.9 留語音過程
+7

參考文獻

相關文件

教育局網頁 www.edb.gov.hk &gt; 課程發展 &gt; 課程範疇 &gt; 全方位學習. 與津貼有關的重要資訊 會通過聯遞系統 Communication and Delivery

a 全世界各種不同的網路所串連組合而成的網路系統,主要是 為了將這些網路能夠連結起來,然後透過國際間「傳輸通訊 控制協定」(Transmission

‡圖形使用者介面( graphical user interface GUI). ‡圖形使用者介面( graphical user

Flash 動畫與視訊產生互動,例如加上字幕、音 效…等,也能以 ActionScript 來控制視訊的播放 效果,甚至藉由 ActionScript

資訊及通訊科技課程 (

雜誌 電台 數碼廣播 期刊 漫畫 電影 手機短訊 圖書 手機通訊應用程式 即時通訊工具 網路日誌(blog) 車身廣告 霓虹燈招牌 電子書

密碼系統中,通常將想要保護的密碼訊息稱為 plain text。而將經過加密後產生的加密訊息稱為 cipher text。在這 中間的過程,會用到可以對外供應的 Public Key 以及私人保

教育局網頁 www.edb.gov.hk &gt; 課程發展 &gt; 課程範疇 &gt; 全方位學習. 與津貼有關的重要資訊 會通過聯遞系統 Communication and Delivery