Microsoft Word - FINALPROJnew.doc

Similar documents
PL600 IPPBX 用户手册_V2.0_.doc

目 录(目录名)

AL-M200 Series

IP505SM_manual_cn.doc

ebook140-9

ebook140-8

Symantec™ Sygate Enterprise Protection 防护代理安装使用指南

TPM BIOS Infineon TPM Smart TPM Infineon TPM Smart TPM TPM Smart TPM TPM Advanced Mode...8

Microsoft Word - template.doc

Windows XP

SIP/ENUM Trial


版 權 2014 贊 雲 科 技 股 份 有 限 公 司 版 權 保 護 聲 明 未 經 贊 雲 科 技 股 份 有 限 公 司 書 面 許 可, 本 檔 任 何 部 分 的 內 容 不 得 被 複 製 或 抄 襲 用 於 任 何 目 的 本 檔 的 內 容 在 未 經 通 知 的 情 形 下 可

RAQMON Context Setting MG PDA Applications RTP / FTP/ HTTP TCP/UDP S ignaling control plane (e.g. RS VP, NS IS) Streaming Media, Transaction, Bulk dat

IC-900W Wireless Pan & Tilt Wireless Pan & Tilt Remote Control / Night Vision FCC ID:RUJ-LR802UWG

實現架構在SIP的V2oIP與即時影音錄放

PH802使用手册

錄...1 說...2 說 說...5 六 率 POST PAY PREPAY DEPOSIT 更

1.ai

K7VT2_QIG_v3

目 彔 1. 准 备 工 作 登 彔 设 置 功 能 说 明 实 时 监 控 基 本 控 制 功 能 设 置 画 质 调 节 彔 像 与 抓 拍

《计算机网络》实验指导书

幻灯片 1


TX-NR3030_BAS_Cs_ indd

PowerPoint Presentation

穨control.PDF

QL1880new2.PDF

epub83-1

CANVIO_AEROCAST_CS_EN.indd

WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile..

ebook140-11

Bus Hound 5

ch08.PDF

audiogram3 Owners Manual

Microsoft Word - PS2_linux_guide_cn.doc

ebook70-11

软件测试(TA07)第一学期考试

Microsoft Word - Mail2000_SecurityPatch_


穨IC-1000

sipxservice SIP sipxservice SIP CDRservice EMSservice... 8 Sip

Microsoft PowerPoint - ch6 [相容模式]

untitled

epub 61-2

Microsoft PowerPoint - (new)電信常識-SIP_IP_PBX(Issue 01).ppt

Chapter 2

C3_ppt.PDF

OSI OSI 15% 20% OSI OSI ISO International Standard Organization 1984 OSI Open-data System Interface Reference Model OSI OSI OSI OSI ISO Prototype Prot

自由軟體教學平台

1 SQL Server 2005 SQL Server Microsoft Windows Server 2003NTFS NTFS SQL Server 2000 Randy Dyess DBA SQL Server SQL Server DBA SQL Server SQL Se

網路安全:理論與實務 第二版

GoFlex Home UG Book.book

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

Master Thesis_專門用來製作目錄.doc

Cadence SPB 15.2 VOICE Cadence SPB 15.2 PC Cadence 3 (1) CD1 1of 2 (2) CD2 2of 2 (3) CD3 Concept HDL 1of 1

untitled

Windows 2000 Server for T100

入學考試網上報名指南

User ID 150 Password - User ID 150 Password Mon- Cam-- Invalid Terminal Mode No User Terminal Mode No User Mon- Cam-- 2

[ 13 年 12 月 06 日, 下 午 6 点 24 分 ] Intel Hosts 新 加 入 的 同 学 们, 快 去 听 听 在 线 宣 讲 会 哦, 同 时 完 成 页 面 下 方 有 奖 调 查, 就 有 资 格 参 与 大 奖 抽 取 啦! [ 13 年 12 月 06 日, 下 午

(Real-time) (Local Host) (Buffer) (Video Conference) (VoD) (NetRadio) ,000 [1]( ) ( ) 1400 (2001 ) 75 (2005 ) DFC Intelligence [2] 1

Microsoft Word - DIR-615_B2_Manual_1.00_T_.doc

一.NETGEAR VPN防火墙产品介绍

專業式報告

IP Audio Conference Phone 2033 User Guide

ch_code_infoaccess

Logitech Wireless Combo MK45 English

ebook71-13

ansoft_setup21.doc

untitled

#FT66/68CN(01~07)

untitled

SEC-220

Microsoft Word - ChineseSATII .doc

TrackF- 網際網路技術 ChangAd-Hoc [5][6]SIP SIP UA Ad-HocSIP UPnPoverhead 3. SIP LSP SIPSIP presencesip(all SIP)SIP SIP (State Digram) 3.1 SIP UDP SIP UASIP

QVM330 多阜寬頻路由器

目 录 目 录 1. 安 装 和 快 速 入 门 附 件 1.1 随 机 附 件 附 件 信 息... 3 连 接 和 设 定 1.3 连 接 记 录 纸... 4 快 速 入 门 1.5 发 送 传 真 / 复 印 接 收 传 真

ebook 185-6

11N 无线宽带路由器

QVM330 多阜寬頻路由器

Basic System Administration

TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP

Background 2006 年 2 月 我 国 新 企 业 会 计 准 则 的 颁 布, 标 志 着 与 国 际 惯 例 趋 同 的 中 国 新 会 计 准 则 体 系 的 建 立, 自 2007 年 1 月 1 日 起 首 先 在 境 内 上 市 的 公 司 施 行, 自 2008 年 1 月

<55342D323637CBB5C3F7CAE92E786C73>

Microsoft PowerPoint - AWOL - Acrobat Windows Outlook.ppt [Compatibility Mode]

Chn 116 Neh.d.01.nis

Microsoft Word - CX VMCO 3 easy step v1.doc

ebook64-1

Cisco CP-7911G= (CP-PWR-CORD-NA=+CP-PWR-CUBE-3=) 1 SIP 案號 LP 第 組 / 項次 / 2.03 契約金額 ( 含稅 )/NT$ 6,930 Cisco... Cisco Unified IP Phone 7911G 10/10

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

2_dvdr3380_97_CT_21221b.indd

(UTM???U_935_938_955_958_959 V )

EK-STM32F

財金資訊-80期.indd

P4V88+_BIOS_CN.p65

Microsoft Word - Front cover_white.doc

iGENUS爱琴思邮件系统技术白皮书

背 景 资 料 对 于 在 华 经 营 的 企 业 里, 人 力 资 源 管 理 绝 不 是 一 件 轻 松 的 工 作 HR 从 业 者 除 了 要 具 备 猎 人 的 眼 光 心 理 学 家 的 耐 心 谈 判 专 家 的 口 才, 更 为 重 要 的 是, 还 需 要 具 备 专 业 的 法

A API Application Programming Interface 见 应 用 程 序 编 程 接 口 ARP Address Resolution Protocol 地 址 解 析 协 议 为 IP 地 址 到 对 应 的 硬 件 地 址 之 间 提 供 动 态 映 射 阿 里 云 内

Transcription:

逢甲大學資訊工程學系專題研究報告 網路電話 SIP 原理與應用 指導教授 : 蘇宗安學生 : 黃朝琴蔡宗穎鍾易君 中華民國九十五年十二月

1. 研究動機與目的 :...4 1.1 使用工具 :...4 2.VOIP:...5 2.1 VOIP 技術的起源 :...5 2.2 VOIP 技術的趨勢 :...5 2.3 VOIP 技術架構簡介及比較 :...6 2.4 VOIP 的產品與應用 :-...7 2.5 VOIP 通信之整合方案 :...8 2.6 VOIP 之未來 :...9 3.SIP(SESSIONINITIATIO-NPROTOCOL)...10 3.1 SIP 協定的源起 :...10 3.2 SIP 之簡介 :...10 3.3 SIP 的請求與回應 :...11 3.3.1 SIP 的請求 (Requests):... 11 3.3.2 SIP 的回應 (Responses):...12 3.3.3 SIP 的標題 (Heads):...13 3.3.4 SIP 的訊息本體 :...13 3.3.5 SIP 的元件介紹 :...13 3.4 SIP 六個 METHOD:...14 3.5 實際的 SIP 請求與回應範例 :...17 3.6 應用 :...21 4. 實作 VOIP 服務...22 4.1 選擇實作平台...22 4.2ASTERISK 的架構 :...22 4.2.1Asterisk 的架構總覽 :...22 4.2.2Asterisk 的架構細節 :...23 4.3ASTERISK 的實作 :...23 4.3.1 安裝前準備 :...23 4.3.2 安裝 Asterisk:...25 4.3.3 啟動 :...27 4.4.4Asterisk 的 Dial plan:...28 4.3.5 設定 sip.conf 及 extensions.conf 撥打校內分機及網路電話 :...32 4.3.6 Asterisk 的語音信箱功能 :...33 4.3.7 使用 MeetMe() 進行線上語音會議 :...37 4.3.8MusicOnHold 功能 :...40 4.3.9 錄下電話 :...41 2

4.3.10 使用 Festival 讓 Asterisk 說話 :...42 4.3.11AsteriskAGI:...43 4.3.12 Trixbox(formerlyAserisk@home)...45 5.CLIENT 實際測試...46 5.1X-LITE...46 5.1.1 安裝...46 5.1.2 設定...48 5.1.3 功能概述...49 5.2 SJPHONE...51 5.2.1 安裝...51 5.2.2 設定...54 5.3 CLIENT 比較...60 6. SIP 服務監控程式 DEMO...62 7. 總結...71 8. 參考資料與銘謝 :...72 3

1. 研究動機與目的 : 由於路由式 IP 網路的普及化, 以及企業至於個人都希望儘量降低電信費用, 那麼除了目前平時最常使用的 PSTN(Public Switched Telephone Network) 以外, 我們何不利用 IP 網路的數據傳輸來做語音服務, 並且將傳統的電話語音撥打方式和網際網路做一個整合, 利用將類比的語音資料經過壓縮處理後, 轉換成電腦所使用的數位資料, 再將這些數位資料經由網路封包的方式 傳給對方也就是所謂的 VOIP(Voice Over IP) 但我們希望能夠傳輸的資料並不只是語音, 甚至可以是檔案 文字或者是多媒體 為此, 我們便需要一個開放靈活的通訊協定架構 而 SIP(Session Initiation Protocol) 便符合這個條件, 透過 SIP 可以很容易地實現通話及會議通訊的功能, 並且和各個地區的傳統 PSTN 網路和行動電話鍵接, 達到節費的及多面向的各式服務 在這一次的研究計畫中, 我們最主要的目的為 : 了解 VOIP 的趨勢 應用及未來 SIP 技術的了解與應用 實作開放源碼的 SIP 通訊 PBX 交換機之研究並使其成為逢甲校園 VOIP 的骨幹 Client 端軟體的測試與研究關鍵字 :SIP ASTERISK VoIP PBX 網路電話 1.1 使用工具 : 我們使用 CentOS( 一 Linux 基礎的作業系統 ), 並在其上利用 Asterisk 及 Zaptel 等程式建立網路電話交換機服務, 另外再加上 Client 軟體電話來建立電話 語音信箱等服務 使用 perl 程式語言實作 SIP 協定的訊息之收發來達到監控 SIP 伺服器系統的能力, 以及 AGI 函式庫的運用 4

2.VOIP: 2.1 VOIP 技術的起源 : VOIP 技術最早是由以色列的 Vocaltec 公司開發出來, 安裝其 Internet Phone 之後可以透過網際網路來撥打長途電話 使用者只需要使用個人電腦, 再安裝該軟體, 就可以實現和全世界所有安裝 Internet Phone 的使用者通話 也由於 VOIP 技術近幾年的發展, 人們可以享受到更便宜 甚至是完全免費的通話及多媒體服務 當時的 Internet Phone 依照終端裝置來分類, 是屬於 PC-to-PC 的方式, 也就是用戶使用 PC, 藉著軟體登入服務業者的伺服器進行遠端的通話 隨著 VOIP 的發展和網路的收費方式轉為月租方式收費的影響, 開始有硬體廠商開始製造 TA(Terminal Adapter) 或是 Gateway, 讓使用者可以很輕易地在不改變目前的網路硬體架構下, 也可以享受到網路語音服務 2.2 VOIP 技術的趨勢 : 過去人們總是認為 VoIP 僅僅只是節費而已, 雖然 1999 年 Cisco 就提出 AVVID, 主張藉由 IP 網路整合語音 影像跟數據, 但是受限於頻寬以及通訊技術, 在 H.323 的複雜架構下始終不能有效推動相關的發展 在多年技術發展之後,SIP 協定終於從草案成為可以在設備上使用的標準, 這個從網際網路發明以來最重要的會晤通訊協定, 憑藉著簡單快速的優勢, 終於讓 VoIP 可以褪下節費功能的單純外衣, 蛻變成能夠提升通聯效率的強大工具 單就技術的演進並不足以讓 VoIP 重新成為眾人目光焦點, 寬頻環境的成熟也是必須的, 在先天技術與後天環境的雙重利多之下,VoIP 成為新一代通訊架構的主角 5

2.3 VoIP 技術架構簡介及比較 : 目前的 VoIP 技術主要有 SIP 及 H.323, 以下為二項技術的簡介與比較 :Session Initiation Protocol(SIP) 是一個用來建立 修改及終止會晤的通訊協定 其中服務 內容包含網路電話 多媒體的發佈及會議 ( 參考 RFC3261) 最早此協定是由哥 倫比亞大學的 Henning Schulzrinne 所設計並在 1999 年納入 IETF SIP Working Group 的 RFC3261 中 2000 年十一月時,SIP 成為 3GPP 協定以及 IMS 架構的 一環, 並被廣泛地應用在 VoIP 領域中 H.323 是由 ITU-T 所提出的一個通訊協定,H.323 主要參考了傳統 PSTN 的 呼叫控制和信息架構, 定義了可以在任何使用封包的網路架構下提供語音通訊的 應用, 並且在許多的網路即時應用中被使用 例如 NetMeeting 和 Ekiga H.323 也是 H.32x 系列通訊協定的一部分, 與 SIP 相同的是, 此技術也在 VoIP 與 IP 為 基礎的視訊會議中被大量使用 SIP H.323 Clinents Intelligent Intelligent Network intelligence Provided by servers (proxy, Provided by gatekeepers and services redirect, registrar) Model used Internet/WWW Telephony/Q.SIG Signaling protocol UDP or TCP TCP(UDPisoptionalinversion3 ) Media protocol RTP RTP- Code basis ASCII Binary(ASN.1encoding) Other protocols used IETF/IP protocols, such as SDP,HTTP/1.1Ipmc,and ITU/ISDN protocols, such as H.225,H.245, and H.450 MIME Vendor interoperability widespread Widespread 表格一 SIP 與 H.323 特性之比較 6

2.4 VoIP 的產品與應用 :- VoIP 技術在企業應用相對廣泛, 而家庭應用卻發展緩慢, 除了寬頻網路普及不足的原因外, 標準 功能特性定型以及架構等方面還存在很大的制約因素 VoIP 是透過封包交換網路傳輸語音採樣 通常有三種 VoIP 業務類型 最常見的一種是透過 IP 電話卡來進行的通話, 一般用於長途語音通訊, 使用者可能永遠都不知道他的通話是採用 VoIP 技術 第二種是 PC 至電話 ( 或 PC 至 PC) 通話, 是利用 PC 上執行的軟體電話來進行 通話者對著與 PC 相連的麥克風 手機或無線電話講話 很明顯, 這種模式不可能擴展到普通大眾, 而僅限於熟悉電腦的用戶 使用筆記型及 PDA 上執行的軟體電話客戶程式, 將隨著無線資料及語音接取業務的繼續融合變得更為流行 第三種是設備至電話業務, 其中將標準電話插入類比電話配接器 (ATA)/ 語音路由器中, 或採用實際 IP 電話, 用戶借助寬頻連接通話 無需用 PC 來實現通話, 且用戶體驗類似於常規電話業務, 因而使其成為迄今 VoIP 技術供應商最感興趣的市場 另外,VoIP 依產品及設備類型可以分為 VoIP 軟體 VoIP 網路電話 VoIP 閘道器及 VoIPPBX(Private Branch exchange) 目前 VoIP 軟體最熱門的莫過於 Skype, 該軟體採 P2P 技術, 可繞過伺服器與防火牆, 在傳輸效能及服務品質上有不錯的表現 Skype 提供免費的 PC-to-PC 功能, 以及需要費用的 Skype-out( 撥打至市話 手機 國際電話 ), 以及 Skype-in ( 從市話 手機撥打至 PC), 多方電話會議等 VoIP 網路電路則如同一般電話具備 RJ45 的介面, 可直接經由網際網路的連結進行通話, 使用者的感覺上如同傳統電話 最後是 VoIP PBX 交換機,PBX 交換機不僅有傳統交換機的功能, 還整合了語音與數據 將原先企業內部使用之電信類比式交換機與類比式話機, 改採 IP 電話

機與 Call Server 來取代 IP 電話將語音訊號轉換為 IP 封包後,IP PBX 透過訊號控制決定封包傳輸的方向 當此通電話終點為一般電話時, 其 IP PBX 便將 IP 封包送至 VoIP 閘道器, 然後由 VoIP 閘道器做為一個傳統 PSTN 與 IP 網路轉換的介面, 再回傳到一般 TDM(Time-Division Multiplexing) 的 PSTN 一般會使用到 PBX 的對象為一定人數以上的公司團體 2.5 VoIP 通信之整合方案 : VoIP 通信之整合主要分為三種, 分別敘述如下 : 第一種是將 VoIP 功能增到路由器或 DSL/ 纜線數據機中, 因此可稱為 ATA 用戶端設備 (CPE) 或整合接取設備 (IAD) 第二種是 VoIP 平臺用於中小型企業的 IP 電話 / 網路接取設備 IP 電話外觀及使用的體驗類似常規電話, 唯一的區別是它們與 LAN 連接而不是與 PSTN 線連接第三種則是 VoIP 平臺是與無線區域網路 (WLAN) 合用, 亦稱為 WiFi 手機, 它將行動性及可能的漫遊功能與統一的消息傳送功能相結合 當越來越多的寬頻接取家庭採用無線接取點時, 就可用來實現這種無線手機業務 8

2.6 VoIP 之未來 : 自從開始有 VoIP 技術以來, 藉由價格低廉的網際網路取代昂貴且維護麻煩的電信網路, 不再需要負擔沈重的電信 - 通話費用, 就成為許多人心中的終極理想, 但在實際使用時卻又發現問題重重, 無論是品質不佳或是難以設定, 都成為導入者沈重的負擔 學者 產業界與實際使用者沸沸揚揚爭論了十數年, 一直到 2004 至 2005 年間,VoIP 的導入比例才正式超過傳統電信網路, 主要的原因就在於寬頻網路的成長, 不單只是普及率高, 還包括頻寬的提升 費用的降低及使用率增加 未來的 VoIP 技術, 除了 打電話 這種行為之外, 溝通的應用環境會更複雜, 企業會在各種層面使用 IP 電話服務 比如說利用 IP 交換機 (IP PBX), 搭配 IP 的電話機, 以後企業的員工使用電話時不必侷限於自己的座位, 可以隨時將 IP 電話機插上任何的網路接口, 分機的號碼也完全不必變動, 甚至可以將 IP 電話機和個人的 Notebook 結合, 真正達到所謂企業的移動辦公室 (Mobile Office) 的理想 類似這樣的 VoIP 電話應用會陸續在營運商的服務項目, 除了可以更經濟的使用電話與溝通, 更重要的是有更符合企業需求的通訊方式與工具, 這種彈性與擴充性才是 VoIP 未來發展最重大的影響

3.SIP(SessionInitiatio-nProtocol) 3.1 SIP 協定的源起 : SIP 最先由美國哥倫比亞大學在 1998 年初開始發展,1999 年 3 月由 IETF 的 MMUSIC(Multipart Multimedia Session Control) 工作小組制定正式標準成為 RFC2543[2],1999 年 9 月 IETF 成立新的工作小組, 負責 SIP 新版本 2.0 的制定, 並於 2000 年 7 月釋出初版 RFC2543bis, 於 2001 年發佈了 RFC3261[3] RFC3261 的發佈, 標示著 SIP 的基礎已經確立, 隨後又發佈了幾個 RFC 增定版本, 充實了安全性及身份認證等幾個領域的內容 3.2 SIP 之簡介 : 如同 Internet 一樣,SIP 易於理解 擴充 及實做, 作為 IETF 的規範,SIP 將 Internet 開放標準的精神延伸至通訊領域, 實現了不同電腦 電話 及軟體的通訊 SIP 的訊息類似於 HTTP (RFC2068[8]), 其定址方式, 則是重用了 SMTP 的定址方式,SIP address( 如 :SIP:inaba@ssl.es.ncku.edu.tw) 與 E-mail address 的結構相同,SIP 甚至利用 Web 的體系結構, 如 DNS, 而使得 SIP 的使用者之間的通訊, 有更高的擴充性 因為 SIP 為應用層 (Application-Layer) 的協定, 所以不需要改變作業系統便可以支援, 以 SIP 來支援行動通訊, 對於 real-ti-me 的服務可以提升其效能 相較於 MobileIP,SIP 較易於與其他 IETF 的協定整合, 對於行動電信也提供更廣泛的應用 在未來的發展性,SIP 已經獲得 3GPP(Third Generation Partnership Project) 3GPP2(Third Generation Partnership Project Number2) 等機構認證, 成為未來第三代行動通訊 (3G) 的標準 系統設計的目標就是要讓使用者可以在 SIPbase 的環境中, 使用 VoIP 的服務, 並且在使用者漫遊的 - 時候, 系統會自動建立連線並且繼 10

續之前的通話 SIP 的定址方式上使用的是 SIP URLs, 這是一個包含電話號碼而且看起來很像電子郵件位址的定址方式, 例如 : SIP:henry@wcom.com SIP:+19725551212@gateway.com 另外也可以使用電話號碼的方址定址 : tel:+19725551212 在我們使用的支援 SIP 架構的 AsteriskPBX 系統中, 其實也支援 IAX( 縮寫 ), 那麼我們為什麼使用 SIP 呢? 主要原因有二 : 一 因其擁有許多開放原始碼之軟體可供支援, 另外 SIP 也很容易與 php 或是 perl 語言搭配來實作各種更為強大的延伸功能 二 因 SIP 為目前較為流行的協定, 為了讓使用者及我們能夠快速熟習此一系統之詳細運作方式, 以及未來對於採取類似協定的系統能夠更加了解, 並且也由於 SIP 協定比起 H.323 等等的協定更為令人容易了解與實作 因此我們使用 SIP 此一標準來實現網路語音服務的內容 3.3 SIP 的請求與回應 : 3.3.1 SIP 的請求 (Requests): SIP 主要是針對點對點的通訊, 但不論如何, 使用的還是終端對伺服器的模式 SIP 的請求又被叫做 SIP 的方法 (methods), 在 RFC 的規範中, 規範了六個基本的方法向伺服器發出請求 這六個方法是 INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER 在下文的 SIP 請求及回應概述中會詳細敘述 INVITE ACK OPTIONS Session setup request or media negotiation.used also to hold &retrievecalls. Acknowledgement for an INVITE transaction completion Used as a query for remote's status & capabilities 11

BYE CANCEL REGISTER Terminating a session Used to cancel an on-going transaction Registers a user with a Proxy/Register 表格二 SIP 的六個基本 Methods 3.3.2 SIP 的回應 (Responses): Response 用 status-codes 來表示回應的內容, 並產生類似 HTTP 協定般的數字回應, 分成 Provisional ( 暫時 ) 及 Final ( 決定 ) 兩類,Provisional 為 1xx 類別,Final 則包括了 2xx,3xx,4xx,5xx,6xx 等類別, 下表顯示出各個不同類別的 Response 1XX: 暫時回應訊息 ( 做為收到請求, 繼續處理此一請求 ) 2XX: 成功回應訊息 ( 此一動作是表示訊息成功收到, 已被瞭解及接受 ) 3XX: 重新導向回應訊息 ( 為了完成此一請求, 更進一步的動作是需要採取的 ) 4XX: 用戶錯誤回應訊息 ( 此一請求包含不好的語法, 無法在伺服器端配合 ) 5XX: 伺服器錯誤回應訊息 ( 伺服器對目前有效的請求失效, 而無法配合 ) 6XX: 全域失效回應訊息 ( 請求在任何一伺服器中均無法滿足 ) SIP Response Codes 100 Trying-Request has been received by a proxy/gateway 180 Ringing-The called party received the INVITE request, the phone is ringing. 181 Call is being forwarded 182 Queued-Invite has been received and will be processed in a queue 183 Session Progress-Used to convey report of incoming early-media 200 OK- successful transaction completion 302 Moved Temporarily-Forward call to a given contact 305 Use Proxy-Repeats a me call setup using a given proxy 400 Bad Request-General error 401 Unauthorized-The request requires user authentication 12

404 Not Found-The user does not exist at the specified domain 408 Request Time out 486 Busy here 5xx 6xx Server Failure Global failure 表格三 SIP 常見的回應碼 3.3.3 SIP 的標題 (Heads): SIP 請求及回應包含了標題 ( 類似 Email 的標題 ), 它包含了 To From Via Call-ID Cseq Optional Header Subject Date Authentication 3.3.4 SIP 的訊息本體 : 一個 SIP 訊息擁有一類似 Email 訊息的訊息本體, 例如一個送出 INVITE 訊息本體的音訊會晤的描述 通常使用 SDP-Session Description Protocol 3.3.5 SIP 的元件介紹 : SIP 是一個用戶端與伺服器的架構, 在此環境當中, 有三個主要的元件分別為 : 用戶代理器 (User Agent, UA) 伺服器 還有位址伺服器 UserAgent: 在 SIP 環境中的終端設備, 主要負責產生 SIP 請求, 用來建立多媒體會議, 並且傳送及接收多媒體資料 用戶代理又分成了用戶代理 (UAC) 及用戶代理伺服器 (UAS) 兩種模式 UAC 負責產生請求及處理回應,UAS 則是接受請求並且產生回應 在會晤建立過程中,UA 通常需要接替著扮演這兩個角色 這點並不像其他用戶與伺服器架構, 如 HTTP,PC 一直扮演著 HTTP 用戶的角色, 而 Web 伺服器也一直扮演著 HTTP 伺服器的角色 伺服器 : 根據 RFC2543 中定義, 伺服器主要分成了代理伺服器, 重新導向伺服器 13

以及註冊伺服器 SIP 代理器 : 負責接受 UA 或其他代理器所發送的 SIP 請求, 並且轉送請求到其他地方 重新導向伺服器 : 負責接受 UA 或其他代理器所發送的 SIP 請求, 並且傳回重新導向的回應 (3xx), 指出這個請求該送往何方 註冊伺服器 : 負責接受 SIP 註冊請求, 並且更新 SIP UA 在位址伺服器或其他資料庫當中的資訊 SIP 代理伺服器 重新導向伺服器 以及註冊伺服器只有做單純的訊息轉送, 他們沒有傳送多媒體資料 - 及產生 SIP 請求的能力 位址伺服器 : 在 RFC2543 中, 通常當作一個資料庫來使用 資料庫當中可以存放使用者的資訊, 例如 URLs IP address, 或是其他資料等等 SIP UA 不能直接來存取定址伺服器, 而是透過代理伺服器 重新導向伺服器 以及註冊伺服器 3.4 SIP 六個 method: 在 SIP 的請求中, 提到在 RFC 規範中, 主要提供了六個方法, 詳述如下 : INVITE INVITE 請求為建立會晤之用, 在其訊息中,IP 位址 port 和編碼器會被記錄在訊息本體內 另外, 在一個已經建立的會晤上再發出 INVITE 請求稱為 re-invite, 可用來更改會晤的參數 ACK ACK 對於 INVITE 完成三方交握協議的確認 (INVITE, final response, ACK), 且只有 INVITE 會使用到 另外, 如果 INVITE 沒有附帶音訊的資訊, 就必須在 ACK 中附帶 OPTIONS OPTIONS 請求用來查訊伺服器及其功能, 當送出此一請求, 伺服器便會回應一支援的方法 編碼方式等等資訊的表列 14

BYE BYE 結束一個已經存在的會晤, 並且 UA 會停止送出音訊封包 (RTP) CANCEL CANCEL 用來終止尚未建立連線的會晤 當 INVITE 方法送出但未收到不屬於 1xx 訊息的回應, 並且 UA 及 proxies 停止 INVITE 程序 REGISTER 此方法用來註冊使用者的 URL, 建立在 SIP 對於行動服務 ( 例如手機 ) 的支援 和 SIP 相關的通訊協定 : SDP (Session Description Protocol): 是一個以文字為主的協議, 用來描述影音傳遞的詳細訊息 由 RFC2327 所定義 SDP Example: v=0 o=tesla28908452628904526in IP4lab.high-voltage.org s=c=inip4100.101.102.103 t=00 m=audio49170rtp/avp0 a=rtpmap:0pcmu/8000 Versionnumber(ignoredbySIP) Origin(ignoredbySIP) Subject(ignoredbySIP) ConnectionData(IPAddress) Time(ignoredbySIP) 15

Media(type, port, RTP/AVPProfile) Attribute(profile, codec, samplingrate) RTP(Real-timeTransport Protocol) 是在 IP 網路上傳遞音訊封包的協議 由 RFC1889 所定義 RTCP RTP Control Protocol 則是用來交換關於 Quality reports Statistics 及 Basic identity information 等資訊的封包 一樣由 RFC1889 所定義 H.323 ITU 的 H.323 協定是早期 VoIP 技術主流, 但由於其協定複雜的關係, 使得 H.323 漸漸由 SIP 取代 16

3.5 實際的 SIP 請求與回應範例 : 使用 SIP 中所內建的請求與回應方法, 便可以建立一連串所需要的通訊 在 這裡我們會介紹 SIP 到底是如何使用這些方法來完成我們想要完成的通訊 這是一個簡單的 INVITE 範例 : INVITE is a Request and contains Tesla s media information 180Ringing is an Informational response and is not required 200OK is a final Response and contains Marconi s media information ACK completes three-way-handshake. BYE tears down session 圖表一 INVITE 範例

Call Flow with Proxy INVITE is sent to Proxy instead of to Heisenberg directly. Proxy looks up address of Heisenberg and forwards INVITE to that IP 圖表二 Call Flow with Proxy Address. Responses to INVITE route back through the Proxy:180Ringing and 200OK 200OK contains a Contact header which allows the ACK and all future requests to go directly by passing Proxy. Call Flow with Redirect Server INVITE is sent to Redirect Server Server looks up address of Heisenberg and returns that address in a Contact header in a 302MovedTemporarily response The ACK completes the transaction with the Server 圖表三 Call Flow with Redirect Sever Schroedinger then re-sends the INVITE directly to Heisenberg 18

SIP Registration Heisenberg sends a REGISTER request to a Registrar Server. The request contains Contact headers listing the URLs for which Heisenberg wishes to receive incoming SIP calls Registrar Accepts registration and replies with 200OK and echoes current contact list 圖表四 REGISTER 展示 SIPMessageDetails: 上面敘述了 SIP 是如何達成回應與要求, 接下來就讓我們看看在 SIP 中傳遞的訊息的細節 INVITESIP:wh@200.201.202.203SIP/2.0 Via:SIP/2.0/UDPproxy.munich.de:5060;branch=82.1 Via:SIP/2.0/UDP100.101.102.103:5060 To:Heisenberg<SIP:w.heisenberg@munich.de> From:E.Schroedinger<SIP:schroed5244@aol.com> Call-ID:10@100.101.102.103 CSeq:1INVITE Contact:SIP:schroed5244@aol.com Content-Type:application/sdp Content-Length:159 19

此訊息主要包含了一個對 SIP:wh@200.201.202.203 發出的 INVITE 的方法, 及 SIP 的版本號碼 SIP/2.0 另外,Via 標題這兩行表達了將請求帶入 SIP 網路的訊息傳遞路徑, 第二行的 Via 是由 proxies 所寫入的, 而第三行的 Via 標題則是 User Agent 初始的請求 20

3.6 應用 : SIP(Session Initiation Protocol) 成為標準化協議格式已有一段時間, 但是真正開始邁入普及應用也是最近的事, 在網路方面,WiFi 應用環境開始成熟,VoIP 軟體方面除了 Skype 以外, 幾乎都有支援, 硬體方面, 各大通訊設備製造廠商也開始著手推出各自的 VoIP 無線裝置, 藉由不同的整合方式, 來挑戰傳統通訊市場 目前 SIP 的應用已經可以實現下列的功能 SIP service creation Gateway service to the PSTN User preferences Presence Instant communications Universal messaging voicemail SIP-PSTN-mobile phone interworking Mobility and user location ENUM: Telephone number based directory Third party call control: PC-phone Voice portal 目前 teltel windows messenger 等主流 VoIP 通訊軟體, 大多採用 SIP 協定, 因此只要硬體週邊支援 SIP, 也就能進一步跟這些軟體整合 而就如前述, 因為 SIP 是個彈性很大的架構, 因此也能透過各種擴充定義, 進一步增加功能上的表現 在軟體架構方面,SIP 已經提供了為數不少的標準可供依循, 但是在硬體的設計方面, 就得兼顧目前最新科技的發展與使用者的消費導向 其中有一項很重要的應用, 那就是整合 VoIP 功能手機的推出 21

4. 實作 VoIP 服務 4.1 選擇實作平台 Announcements IVR Voice mail Auto-attendant Conferencing 圖表五 VoIP 服務架構圖目前在市面上有許多 VoIP 軟體可提供語音服務及語音信箱等等的功能 但在我們測試過幾個不同的 VoIP 軟體之後, 我們發現 Asterisk 是一套開放原始碼並且十分穩定的軟體, 同時它也被放在網路上供人免費下載 且市面上已經有許多用戶與企業選用這套系統來做為節費的工具 另外 Asterisk 也提供整合性的語音服務及完整的介面供其它的程式呼叫 由於以上的優點, 所以我們選用 Asterisk 這套軟體做為實作的平台 4.2Asterisk 的架構 : 4.2.1Asterisk 的架構總覽 : Asterisk 的架構十分簡單, 但異於絕大部分的電信產品 尤其是當 Asterisk 扮演一個中介者的角色去連結底層的電信技術和上層的應用方面, 並建立一個混合式的電信服務環境 在 VoIP 的通信技術中包含了 SIP H.323 IAX 及 MGCP, 22

正如許多傳統的 TDM 技術, 如 T1 ISDN PRI 類比式的 POTS 和 PSTN 服務 Basic Rate ISDN(BRI) 等等 電信服務的應用包含了來電轉接 電話會議 語音郵件及其他多方面的應用 4.2.2Asterisk 的架構細節 : Asterisk 的核心在數個軟體上扮演著重要角色 當 Asterisk 啟動時,Dynamic Module Loader 會被載入並且初始化各個提供 channel drivers 檔案格式 編碼 撥號細節記錄等等的 driver, 並將其使用合適的內部 API 將它們連結起來 之後, Asterisk 的 PBX Switching Core 會開始接受 dialplan 上的撥號, 利用 Application Launcher 來完成電話響鈴 連結語音郵件 向外撥打到 outbound trunks 等等的服務 此核心也對應用的服務功能和 drivers 提供一個標準的排班程式及 I/O 管理 Asterisk s Codec Translator 允許各個使用不同編碼壓縮的 channels 可以毫無障礙地進行通話 4.3Asterisk 的實作 : 4.3.1 安裝前準備 : 首先, 在安裝 Asterisk 之前, 我們需要一個執行 Linux 的作業環境, 經過多次的測試之後, 我們發現對於 Asterisk 最容易編譯的環境為 CentOS, 在安裝 OS 之後, 我們便得開始下載三個程式 :Asterisk 主程式 (Asterisk) Zapata 電話驅動 (zaptel) 和 PRI(libpri) 如果我們只打算建立一個純 VoIP 的網路, 那麼只需要 Asterisk 主程式 ; 如果要使用 ztdummy 驅動作為會議或是外撥功能, 便需要另外安裝 zaptel 程式 但是我們建議安裝所有與 zaptel 有關的程式 另一個可能要安裝的就是 asterisk-sounds, 當 Asterisk 接收到分布在各地的用戶的呼叫時,asterisk-sounds 會給出一個合適的聲音提示 如果想為 Asterisk 系統提供許多擴展的專業提示那麼此程式就是必須的 Asterisk 原始碼可以通過 FTP 或通過 CVS 得到 下面會示範如何使用這兩種途徑得到原始碼, 雖然你只需要通過其中一種方法得到原始碼 (FTP 是比較好 23

的方法, 所以我們選擇利用 FTP 來下載, 因為使用 CVS 得到的原始碼可能有很多的錯誤, 例如版本不是很穩定, 從 FTP 上下載的才是真正穩定的 ) 從 FTP 得到 Asterisk 原始碼 : Asterisk 原始碼可以從 Digium FTP 伺服器上得到, 位址是 ftp://ftp.digium.com 最容易的方法就是透過 wget 指令得到穩定的版本 為了得到最新的穩定版本原始碼, 可以輸入下面的指令 : #cd/usr/src #wget passive-ftpftp.digium.com/pub/asterisk/asterisk-1.*.tar.gz #wget passive-ftpftp.digium.com/pub/asterisk/asterisk--sounds-*.tar.gz #wget--passive-ftpftp.digium.com/pub/zaptel/zaptel-*.tar.gz 通過 CVS 得到 Asterisk 原始碼 : CVS 版本控制系統是一個可以提供中心倉庫功能的工具, 它可以為一個大型的開發團隊管理項目開發過程中繁多的相關文件 一旦出現了修改, 它就會更新到 CVS 伺服器上, 在伺服器上可以直接下載和編輯 使用 CVS 的附加功能可以將一個特定的文件回溯到特定的狀態, 要是文件被損壞, 你可以很容易的恢復到一個可以執行的版本 要是你發現安裝最新的 Asterisk 引起了系統的某一部分損毀, 你可以及時回溯到一個更早的還原點並同時研究這個問題 如果你是一個開發者想得到最新的更新, 你需要透過 CVS 伺服器下載穩定的版本 : 輸出 CVSROOT 路徑 : #cd/usr/src/ #exportcvsroot=:pserver:anoncvs:anoncvs@cvs.digium.com:/usr/cvsroot 從 CVS 下載 : #cvs checkoutzaptellibpriasterisk 從 CVS 下載 STABLE1.0: #cvscheckout rv1-0zaptellibpriasterisk 24

從 CVS 下載 STABLE1.2: #cvscheckout rv1-2zaptellibpriasterisk 從 CVS 下載可選擇的模組 : #cvscheckoutasterisk-soundsasterisk-addons 注意, 能夠從 CVS 上得到的穩定版本並不是一個已發佈的版本, 也不應該被應用到實作的系統中 4.3.2 安裝 Asterisk: 如果你使用 wget 從 FTP 伺服器上得到原始碼, 在編譯之前需要先解壓 以下的命令可以處理這些壓縮的檔案 : #cd/usr/src/ #tar zxvf zaptel-*.tar.gz #tar zxvf libpri-*.tar.gz #tar zxvf asterisk-sounds*.tar.gz 這些命令會將解壓縮後的檔案放到相對應的目錄中 編譯 Zaptel: 接下來使用以下命令來編譯 Zaptel( 用你使用的 zaptel 版本號碼來代替 version): #cd/usr/src/zaptel-version #make clean #make #make install 25

編譯 libpri: 編譯和安裝 libpri 和上述安裝 zaptel 相似 Libpri 被很多不同的分時系統硬體所使用, 但是即使沒有相應的硬體, 也同樣可以編譯和安裝 libpri 在安裝 Asterisk 主程式之前必須編譯和安裝 libpri,asterisk 可以檢測和使用它 #cd/usr/src/libpri-version #make clean #make #make install 編譯 Asterisk: 當你編譯和安裝了 zaptel 和 libpri 後, 可以把注意力移到 Asterisk 上了 接下來我們準備要安裝 Asterisk,Asterisk 是使用 gcc 來編譯的, 你可以使用以下的指令 : #cd/usr/src/asterisk-version #make clean #make #make install #make samples 為了安全起見, 不要以 root 執行 Asterisk 預設上,Asterisk 會以 root 執行 為了避免讓人得以掌控你的機器, 我們需要用一個更安全的方式來執行 Asterisk 為此, 先建立一位用戶 : #adduser c AsteriskPBX d/var/lib/asteriskasterisk 接著, 修改位於 /usr/src/asterisk/makefile 的 Makefile, 使用文字編輯器, 找出 ASTVARRUNDIR, 然後修改為 : ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run/asterisk 再來, 重新編譯 Asterisk: #cd/usr/src/asterisk

#make clean;make install 在重新編譯後, 便要確定新的帳號對幾個 Asterisk 相關的目錄都有適當的權限 : #chown Rasterisk:asterisk/var/lib/asterisk #chown Rasterisk:asterisk/var/log/asterisk #chown Rasterisk:asterisk/var/run/asterisk #chown Rasterisk:asterisk/var/spool/asterisk #chown Rasterisk:asterisk/dev/zap #chmod Ru=rwX,g=rX,o=/var/lib/asterisk #chmod Ru=rwX,g=rX,o=/var/log/asterisk #chmod Ru=rwX,g=rX,o=/var/run/asterisk #chmod Ru=rwX,g=rX,o=/var/spool/asterisk #chmod Ru=rwX,g=rX,o=/dev/zap #chown Rroot:asterisk/etc/asterisk #chmod Ru=rwX,g-rX,o=/etc/asterisk 4.3.3 啟動 : 現在, 可以用新帳號啟動 Asterisk, 或者用 su 指令從 root 身份進行 : #suasterisk c/usr/sbin/asfe_asterisk 最後, 調整位於 /usr/sbin/safe_asterisk, 然後在 asterisk 命令的每個實體前增加 suasterisk c 這些步驟做完後, 就算攻擊者有可能讓 Asterisk 掛掉, 但是, 攻擊者也無法取得 root 的憑証 啟動 Asterisk 執行 Asterisk 事實上還蠻直覺的, 基本上, 它毫無疑問是一個獨立在 Linux 系統幕後運作的一個 daemon process 通常, 利用參數進入 Asterisk 的 console mode 是很有用的, 當你一使用命令列的模式, 它就會提供你各式的除錯及目前系統狀態的資訊 27

如同大部分的 Linux 應用程式,Asterisk 有許多的命令列選項 這些選項通常來說都會加上一個 - 符號 以下是 Asterisk 所使用的各個命令列參數 -c Enables console mode. If console mode is enabled, Asterisk will provide a command line that can be used to issue commands and view the state of the system. Implies -f as well -C<configfile> Executes Asterisk with a different configuration file. -d Enables extra debugging across all modules. -f Prevents Asterisk from daemonizing into the background. -g Forces Asterisk to dump core in the unlikely event of a segmentation violation. -h Displays basic command line help. -i Forces Asterisk to prompt for cryptographic initialization passcodes at startup. -n Disables ANSI color support. -p Run with a real-time priority. -q Run in quiet mode. -r Connects to an already running instance of Asterisk. -v Causes asterisk to produce more verbose output. More -v's mean more verbose. -x<command> Executes a command in Asterisk (when combined with -r) 表格四 啟動 Asterisk 的選項 4.4.4Asterisk 的 Dial plan: Asterisk 的 Dial Plan 就是 Asterisk 用來處理撥出及接收到的電話該如何處理的設定, 在這邊我們會介紹一些有關 Dial Plan 的各種基本相關設定 : Context: Dial plan 被分成幾個段落, 這些段落稱為 context Context 用來對 extension 的組別命名 簡單來說, 它把撥號方案的不同部分進行分離 28

Context 的表示方法是把名字放在方形括號 ([]) 的中間 這個名字圖以由 A-Z ( 大小寫都可以 ) 數字 0-9, 以及連字號和底線組成 例如一個來電的 context 看起來像 : [incoming] 所有放在 context 定義後的指令都是這個 context 的一部分, 直到下一個 context 定義的開始 Extension: 在每一個 context 內, 可以定義一個或者多個 extension Extension 是 Asterisk 要執行的指令, 由來電或者 channel 上所撥的數字所觸發 Extension 在傳統意義上被用來定義電話分機, 但在 Asterisk 上有更多用途 extension 的語法是單字 exten 後面跟著一個由等號和大於符號組成的箭頭, 如下所示 : exten=> 之後是 extension 的名字 在與電話系統打交道的時候, 我們把 extension 看作是呼叫另一部電話所撥的號碼 在 Asterisk 上, 還意味著更多的東西, 例如, extension 的名字可以是字母和數字的組合 一個完整的 extension 由三部分組成 : Extension 的名字或者號碼 Priority( 每個 extension 可以有多個步驟, 步驟的編號稱作 Priority) 應用 ( 或者命令 ), 針對呼叫完成一些動作這三個部分用英文逗號分開, 如 : exten=>name,priority,application() 下面是一個簡單的例子, 讓我們來看一下實際的 extension 是什麼樣子 : exten=>123,1,answer() 在這個例子中,extension 的名字是 123,priority 是 1, 應用是 Answer() Priority: 每個 extension 都可以有多個步驟, 稱為 priorities 每個 priority 都按順序編號, 29

從 1 開始 每個 priority 執行一個規定的應用 下面給出一個例子, 這個 extension 接聽電話 (priority 為 1), 然後掛斷 (priority 為 2): exten=>123,1,answer() exten=>123,2,hangup() Application: 每個 application 針對當前 channel 的設定來完成規定的動作, 比如撥放聲音 接受撥號輸入或者掛斷電話 一個簡單的 dialplan: 先來介紹一個特別的 extension, 名字叫作 s 當沒有指定 extension 的呼叫進入 context 的時候, 就由這個 s extension 來處理 (s 表示 start, 因為多數的呼叫都是從 sextension 開始 ) 我們要在呼叫上完成三個動作, 把所有來話都接入此 context: [incoming] exten=>s,1,application() exten=>s,2,application() exten=>s,3,application() 模式匹配語法 : 模式匹配語法是用不同的字母和符號來代表可能要匹配的數字 模式總是用一個底線開始, 它告訴 Asterisk 要做模式匹配, 這不是一個 extension 名字 在底線之後, 可以使用一個或者多個下面列出的符號 : X: 匹配 0-9 的任何數字 Z: 匹配 1-9 的任何數字 N: 匹配 2-9 的任何數字 [15-7]: 匹配任何數字或者指定的數字範圍 在這個例子中, 匹配 1 5 到 7.( 句號 ): 匹配一個或者多個字元例如撥打校內分機時, 30

exten=>_xxxx,1,dial(sip/${exten}@140.134.13.40) 將會匹配所有 0000 到 9999 的號碼, 但如果設定為 exten=>_n[13-7]xx,1,dial(sip/${exten}@140.134.13.40) 便會匹配為第一個數字為 0-9, 第二個數字為 1 3 到 7, 接下來第三和第四數字為 00 到 99 使用 GOTO() 及 Background() application: Background() 通常用來創建語音選單 很多公司使用語音選單來引導撥號方到適當的分機, 免得接待員得接聽每一個電話 例如 :exten=>123,1,background(hello-world) 另外一個非常有用的 application 是 Goto(), 如同其名字所表現的, 它用於把呼叫發送到另一個 context extension 以及 priority Goto() application 使得在 dialplan 的不同部分有序地移轉到別的 dialplan 例如: exten=>123,1,goto(context,extension,priority) 在下一個例子中, 我們會用 Background() 和 Goto() application 來建立一個略為複雜的 dial plan, 充許撥號方利用撥號方式與系統互動 首先利用 Background() 接受來自撥號方的輸入 : [incoming] exten=>s,1,answer() exten=>s,2,background(enter-ext-of-person) 在這個例子中, 撥放一個範例語音檔案, 檔案名為 enter-ext-of-person.gsm 現在再加入兩個 extension, 由撥號方根據語音提所輸入的 1 或 2 來觸發 : [incoming] exten=>s,1,answer() exten=>s,2,background(enter-ext-of-person) exten=>1,1,playback(digits/1);playback 用來撥放音效 exten=>2,1,playback(digits/2) 31

此功能會聽到 請輸入分機號碼 如果按下 1, 會聽到數字 1, 如果按下 2, 會聽到數字 2 我們繼續對它使用 Goto() 做一點修飾 : [incoming] exten=>s,1,answer() exten=>s,2,background(enter-ext-of-person) exten=>1,1,playback(digits/1) exten=>1,2,goto(incoming,s,1) exten=>2,1,playback(digits/2) exten=>2,2,goto(incoming,s,1) 新加入的兩行粗體字在撥放所選擇的數字之後, 把呼叫控制送給 sextension 4.3.5 設定 sip.conf 及 extensions.conf 撥打校內分機及網路電話 : SIP 是一個應用層的通訊協議, 使用 5060 這個 port 進行通信 SIP 可以通過 UDP 或 TCP 的傳輸層進行傳輸 SIP 用來建立 修改和終止例如網際網路上的電話呼叫及其他有關多媒體應用的功能 要在 Asterisk 中使用 SIP 協議進行通話, 首先都必須先在 sip.conf 中做硬體電話或是登入者的設定 下面我們以 john 做為例子對其進行設定 : [john] type=friend secret=welcome qualify=yes;qualify peer is no more than 2000ms away nat=no;this phone is not natted host=dynamic;this device registers with us context=internal;the internal context controls what we can do 而 extensions.conf 中的設定是用來做 dialplan 的, 例如上述設定完成後可以 32

在 extensions.conf 中加入 : [internal] exten=>79740,1,dial(sip/john) exten 的用法是 exten=> 分機, 優先權, 撥號名稱這是一個最簡單的連線, 也就是說可以用 client 端的軟體撥 79740 這個號碼撥號給 john 另外因為學校的分機也支援 sip, 所以可以將撥號指到 140.134.13.40 這台機器, _XXXX 則是可以撥到校內所有分機, 設定如下 : exten=>_xxxx,1,dial(sip/${exten}@140.134.13.40) 4.3.6 Asterisk 的語音信箱功能 : Asterisk 除了可以撥打電話給對方外, 還可以直接將語音留言送到對方的電子郵件中, 我們在此先略過參數的設定, 只要有需要用到時再加上去就可以了 VM 設定方式如下 : 一開始先用文字編輯器打開 voicemail.conf 這個檔案 : [default] 101=>1234,jack,jackjack200142@yahoo.com.tw,d9223127@fcu.edu.tw 102=>1234,fly,d9229996@fcu.edu.tw,flytsaifly@yahoo.com.tw 103... 這個地方的用法如下 : mailbox=>password,name[,email[,pager_email[,options]]].mailbox: 這是用來設定個人的語言信箱號碼, 專門用來儲存指定的使用者的語音郵件.password: 這是類似如中華電信撥出 777 會接通到個人的留言中, 不過 Asterisk 可以設密碼.name: 指定此 mailbox 的使用者 33

.email: 當有留言時, 會寄出的 email 位址.pager_email: 傳送語音郵件的短訊息到行動電話或是 B.B.Call.options: 如 server email,tz,say cid,review,operator,call back,dial out,andexitcontext 等參數 一開始我們所設定能夠撥出的電話是 : exten=>79740,1,dial(sip/jack,r) ($ 可以是 SIP IAX 等連線方式 ) 這樣就可以通話了但是如果 jack 正在忙碌中或是忙線中呢? 使用此設定, 那麼我們會聽到一個 jack 正在 busy 的訊息 exten=>101,1,dial(sip/jack,r) exten=>101,102,voicemail(b101@default) ( 有一點非常重要, 那就是如果對方是在 busy 的情況下的話, 優先權的地方要在原本的 n 再加上 101!, 所以第二條才會是 102 ) 而如果 jack 在 30 秒內沒有接電話的話, 就會接到下一個優先權並且進入 VoiceMail exten=>101,1,dial(${jack},30,r) exten=>101,2,voicemail(u101@default) exten=>101,102,voicemail(b101@default) 之後, 便會收到一封帶有附件的 email, 例如 : Dear jack: Just wanted to let you know you were just left a 0:06 long message (number13) in mail box 101 from fly, on Friday, June 16, 2006 at 11:42:16 PM so you might want to check it when you get achance.thanks! --Asterisk 34

tz Sets the voice mail zone from the [zone messages] section above. This option is irrelevant if envelope is set to no. attach Attaches the voice mail to the notification email (but not to the pager email). Maybe set to either yes or no. Say c id cid internal contexts Say Says the Caller ID information before the message. Sets the internal context for name playback instead of extension digits when saying the Caller ID information. Turns on/off the duration information before the message Defaults to on. duration Say duration m Dial out Specifies the minimum duration to say when say duration is on. Default is 2 minutes. Specifies the context to dial out from (by choosing option 4 from the advanced menu). If not specified, dialing out from the voice mail system will not be permitted. Send voicemail Specifies the context to send voice mail from (by choosing option 5 from the advanced menu). If not specified, sending messages from within the voicemail system will not be permitted. callback Specifies the context to callback from. If not specified, calling the sender back from within the voicemail system will not be permitted. review Allows sender store view/rerecord their messages before saving them. Defaults to off. operator Allows senders to hit 0 before, after,or while leaving a voicemail message to reach an operator. Defaults to off. envelope Turns on/off envelope playback before message playback. Defaults to on. This does not affect to ption3, 3 from the advanced options menu. 35

delete Deletes voicemails from the server after no tification is sent. This option may be set only on a per-mailbox basis; it is intended for use with users who wish to receive their voicemail message sonly by email. Next after cmd Skips to the next message after the user hits 7 or 9 to delete or save the current message. This can be set only globally at this time, not on a per-mailbox basis. Force name Forces new user store cord their names. A new user is determined by the password being the same as the mail box number. Defaults to no. Force greetings Hide from Forces new user store cord greetings. A new user is determined by the password being the same as the mail box number. Defaults to no. Hides the mailbox from the dial-by-name directory. Defaults to no. dir 表格五 語音信箱的參數列表藉由 字元將各個選項分開, 你可以將許多的的選項混合在一起使用 例如以下的範例 : [default] ;regular mailbox with email notification 101=>4242,Example Mailbox, somebody@asteriskdocs.org ;more advanced mailbox with email and pager notification and a couple of special options 102=>9855,Another User, another@asteriskdocs.org, pager@asteriskdocs.org, attach=no tz=central ;a mailbox with no email notification and lots of extra options 103=>6522,JohnQ.Public,,,tz=central attach=yes saycid=yes dialout=fromvm callback=fromvm review=yes 36

4.3.7 使用 MeetMe() 進行線上語音會議 : 在以前傳統的 PBX 中, 這個功能很昂貴, 你必須花一大輩錢給服務商, 或者是你不得不安裝一個昂貴的會議橋接器到你所有的 PBX 上 這裡主要的功能在於 : 建立密碼保護的會議 會議管理 ( 將電話會場靜音 鎖定會議 斷開某個參與者 ) 允許一個人講話, 其他的人安靜的選項 ( 常用在公司的會議 廣播等情況 ) 創建動態或是靜態會議我們設置一個基本會議室,MeetMe 會議系統的配置是在 meetme.conf 中, 在檔案內, 你來定義會議室和進去會議室的密碼 例如, 我們設置一個 extension 為 600 的會議室 首先, 我們將在 meetme.conf 中設置會議室, 稱為 600, 密碼設為 54321, 以下的例子第一行加上分號, 以便區別它是一個用法註解 [rooms] ;Usageisconf=>confno,pincode,adminpin conf=>600,54321 在 extensions.conf 中設定 : ;MeetMe([confno][,[options][,pin]]) exten=>600,1,meetme(600,i,54321) 我們可以由第一行的用法註解看到 MeetMe() 是如何被使用的 在中間的 i 為一個參數, 下面會列出所有的參數功能 在撥出 600 之後便會撥放進去會議室的密碼輸入提示語, 我們輸入 54321 後再加上 # 結束符號, 便可以加入會議室

Asterisk 會議室設定範例 : 一開始先在 meetme.conf 中設定一個會議室, 號碼為 101, 密碼 (PIN) 為 123456, 接著在 extensions.conf 中寫入以下指令 : exten=>500,1,meetme(101 123456) 上面範例表示了一個有著最基本密碼功能的會議室 下面則介紹如何製作一個需要認証的會議室 : exten=>18,1,answer exten=>18,2,wait(1) exten=>18,3,authenticate(5678) exten=>18,4,meetme(18 p) exten=>18,5,playback(vm-goodbye) exten=>18,6,hangup 接下來展示一個動態的會議室如何建立, 使用者必須輸入會議室號碼來建立會議室 : exten=>9999,1,wait(1) exten=>9999,2,meetme( Md) 選項 'M' 是當會議室中只有一個人時, 便會播放等待音樂 而如果你在這裡加上了選項 'e',asterisk 便會自動幫你選擇一個空的會議室 最後, 如果把選項 'd' 改為大寫 'D' 的話, 你會需要再為這個會議室加入一個密碼 1 Disable "you are currently the only person in this conference" message for first member (new in1.2trunk, see bug6316 )(This is not included in1.2.11). A A B Set admin mode. Set marked mode. Run AGI script specified in${meetme_agi_background}. Default: conf-background.agi (Note:This does not work with non-zap channels in

the same conference). C d D Announce user(s) count on joining a conference. Dynamically add conference. Dynamically add conference, prompting for a PIN. At the pin prompt, if the user does NOT want a pin assigned to the conference, they should hit the #key. e E i Select an empty conference. Select an empty pin less conference. Announce user join/leave requires chan_zap.so (newinasterisk1.2). M Enable music on hold when the conference has a single caller. M Set monitor only mode (Listen only, no talking). P P Q r Allow user to exit the conference by pressing'#'. Always prompt for the pin even if it is specified. Quiet mode(don' t play enter/leave sounds). Record conference (recordsas${meetme_recordingfile}using format${meetme_recordingformat}). Default filename is meetme-conf-rec-${confno}-${uniqueid}and the default format is wav. requires chan_zap.so S t T V w Present menu (user or admin) when'*'is received ('send' to menu). Set talk only mode.( Talk only, no listening). Set talker detection (sent to manager inter face and meet me list). Video mode(this option currently does nothing at all) Wait until the marked user enters the conference. All other connected users will hear MusicOnHold until the marked user enters. X Allow user to exit the conference by entering a valid single digit extension of the 39

context specified in${meetme_exit_context}or the current context if that variable is not defined. Due to a bug (see 5773 and 5631) thisoptiondidn'tworkinasteriskv1.2.0. x Close the conference when last marked user exits. 表格六 MeetMe() 的參數列表在 CLI 模式下的 Asterisk 新參數 : 在 CLI 模式下, 除了原本的 meetme 功能以外, 新版的 Asterisk 更加入了以下功能 : Meetme MeetMekick<confno><user> MeetMekick<confno> MeetMelist<confno> MeetMelock<confno> MeetMeunlock<confno> MeetMemute<confno><user> MeetMeunmute<confno><user> Listallconferences. Kickauseroutofaconference. allkickallusers. Listparticipantsinaconference. Lockaconference-nomoreusers. Unlockaconference. Muteauserinaconference. Unmuteauserinaconference. 表格七 meetme 新參數 4.3.8MusicOnHold 功能 : Asterisk 也可以從 MP3 檔案取得等待音樂的聲音訊號, 將其解碼後, 再透過兩個支援的 MP3 播放器其中之一 (Mpg123 或是 MAD(MPEGAudioDecoder)), 排入管道進入 Asterisk 在這裡我們使用 MAD, 因為 Mpg123 有一些很明顯的安全議題尚未解決 ( 如果你喜歡使用 Mpg123, 也可以直接在 Asterisk 原始碼目錄下 makempg123) 關於 MAD 的取得, 你可以先到 http://mad.sourceforge.net, 你需要三個套件 :ID3 程式庫 MAD 程式庫及 madplay 應用程式 你得下載這三個套件並且解壓縮 然後安裝 40

如果你在安裝完成之後打入 madplay 卻發現得到 failtoload 的錯誤訊息, 則表示安裝程式可能把程式庫放錯地方, 如果是這種情況, 試著將 libmad.so 及 libid3tag.so 移入 /usr/lib: #mv/usr/local/lib/libmad.so*/usr/lib #mv/usr/local/lib/libid3tag.so*/usr/lib 如果之後執行 madplay 沒有再出現任何錯誤提示, 便可以修改 /etc/asterisk/musiconhold.conf 這個檔案並加入 : default=>custom:/var/lib/asterisk/mohmp3/,/usr/local/bin/madplay\--mono R8000 ou tput=raw 這是通知 Asterisk 使用 madplay 應用程式, 以單聲道,8MHz 的播放頻率, 從 /var/lib/asterisk/mohmp3 中隨機撥放 MP3 檔案 接著, 因為等待音樂的橋接少不了 Zaptel 驅動程式架構內建的計時程式碼, 因此, 我們輸入以下指令載入 Zaptel: #modprobezaptel #modprobeztdummy 最後, 我們在 extensions.conf 中寫一個小小的測試指令 : exten=>100,1,musiconhold(30) exten=>100,2,hangup 當你撥打 100 分機時, 會聽到 30 秒的音樂, 之後由伺服器掛斷電話 你也可以使用串流式的 MP3 網路電台作為等待音樂的來源, 在 musiconhold.conf 中建立 : default=>/var/lib/streaming,http://64.236.34.196:80/stream/1040 接著建立一個目錄 /var/lib/streaming, 然後重新啟動 Asterisk 即可 4.3.9 錄下電話 : 要用 Asterisk 替電話錄音, 使用內建的 Monitor() 應用 在 extensions.conf 之中, 任何分機號碼都可以用下列方式錄音 : 41

exten=>s,1,answer exten=>s,2,monitor(wav,most-recent-call,m) 這個範例會在 /var/spool/asterisk/monitor 中建立一個名為 most-recent-call 的 wav 檔案 M 參數則會使得該通電話被自動混音, 讓來電和接聽者的聲音都能錄在同一個檔案中 沒有 M,Monitor() 就會建立兩個不同檔案 : most-recent-call-in-ext 和 most-recent-call-out-ext est 表示來電者觸發此 Monitor(), 開始監控所撥打的分機號碼, 如果你希望可以保留每通錄下的電話, 而不要覆寫已存在的檔案, 你可以使用 ${DATETIME} 變數來產生檔案, 檔名就類似於 112205-09:45:42-40, 例如 : exten=>40,1,answer exten=>40,2,monitor(wav,${datetime},m) 另外, 要讓 M 選項能夠正常地運作, 首先就必須安裝 SoX(SoundEXchange), 是一種聲音轉換工具 我們利用 Asterisk 來錄下聲音, 而 SoX 則負責混音及轉檔 沒有 SoX,Asterisk 就無法輸出自動混合的電話錄音 主要的 Linux 撥行套件中, 多數都有提供 SoX 套作作為安裝選項之一 如果你的系統沒有安裝 SoX, 在替電話錄音前, 請先安裝它 4.3.10 使用 Festival 讓 Asterisk 說話 : 在 Asterisk 中可以使用 Festival, 它是一個語音合成器, 可以將文字或檔案經由合成語音的方式, 把這些字讀出來 Festival 最大的用處就是當你在路上的時候, 它能將你的 E-Mail 自動讀給你聽 首先你必須安裝 Festival, 你可以到 http://www.cstr.ed.ac.uk/projects/festival/download.html 取得 Festival 原始碼, 並且安裝它 安裝之後, 你可能需要重新編譯 Asterisk 現在做個測試 只要在命令列執行 festival, 就可以讓你進入互動模式, 可在此和語音合成器互動 : festival>(saytext Helloworld. ) 42

festival>(tts text-file.txt ) 要讓 Asterisk 透過 Festival 支援文字語音, 你可以使用 Asterisk 內建的 Festival( ) 應用, 例如 : exten=>s,1,answer exten=>s,2,festival( Hellocaller.MynameisMr.Synthetic. ) 要按照名稱來歡迎來電者, 可以使用 Asterisk 內建的來電者 ID 變數 : exten=>s,1,answer exten=>s,2,festival( Hello${CALLERIDNAME}.MynameisMr.Synthetic. ) 4.3.11AsteriskAGI: Asterisk 的 AGI, 為外部程式控制 Asterisk 的 dialplan 提供了一個標準的介面 AGI 通常被用來做一些高級邏輯與資料庫的連結 也因為 Asterisk 為 AGI 提供了一個標準介面, 所以無論任何現代的程式語言都可以來寫這些腳本 但是用在 AGI 程式中最多程式設計語言的 Perl PHP Python 是最多人使用的 AGI 通訊的基本原則及標準輸出入 : STDIN STDOUT STDERR 是一些通道, 透過這些類似 UNIX 的環境的通道可以以從外部程式中接收和發送訊息 STDIN 也就是標準輸入, 是指透過鍵盤或是其他程式送到本程式中的訊息 從 Asterisk 傳來的信息通過 STDIN 的訊息自動進入到 STDIN 中 STDOUT 也就是標準輸出, 是 AGI 腳本用來把信息傳回 Asterisk 的檔案中 最後,AGI 腳本可以用 STDERR( 標準錯誤 ) 把錯誤訊息寫回 Asterisk 控制台 讓我們總結一下這三個概念 : AGI 腳本通過 STDIN 從 Asterisk 獲取訊息 AGI 腳本通過 STDOUT 把輸出信息寫到 Asterisk 中 AGI 腳本可以通過 STDERR 把信息送到 Asterisk 控制台在 dialplan 中調用 AGI 腳本 : 首先, 你的 AGI 腳本必須是可執行的 在 dialplan 中運用 AGI 腳本, 可以 43

簡單的調用 AGI(), 把 AGI 腳本的名字作為參數, 像如下所示那樣 : exten=>123,1,answer() exten=>123,2,agi(agi-test.agi) AGI 腳本通常保存在 AGI 目錄下 ( 通常保存在 /var/lib/asterisk/agi-bin), 當然你也可以指定完整的 AGI 腳本目錄 AGI(),EAGI(),DeadAGI(),andFastAGI() 除了 AGI() 應用程式, 還有一些其它的不同環境下使用的 AGI 應用程式 EAGI():( 增強型 AGI) 的用法很像 AGI(), 但是它允許你的 AGI 腳本在檔案描述符 3 讀取收到的音訊流訊息 DeadAGI():DeadAGI() 的用法也很像 AGI(), 但是它允許你的 AGI 腳本可以在一個掛斷的 channel 中也可以正常執行 也就是說通用的 AGI() 不能在一個 Dead 的 channel 中正常運作 FastAGI():FastAGI() 應用程式允許通過網路運用你的腳本, 這樣在多 Asterisk 伺服器的環境中, 就可以在某一個位置集中呼叫這些 AGI 腳本 在 Asterisk 的系統中, 便有幾個預設的範例可以參考, 展示如何使用 perl 或是其他程式語言來製作 AGI 腳本 44

4.3.12 Trixbox(formerlyAserisk@home) Trixbox 是以 CentOS 為基礎, 加上 Asterisk 的套件整合而成 原本之所以命名為 Asterisk@home 是希望每個人可以在家裡簡單的設置一個 VoIP PBX, 另外也提供了 xpl(home automation) 介面, 使得我們設定更容易 Trixbox 提供了兩種安裝方法 第一種是在官方網站下載 ISO 檔, 並且燒錄成光碟之後在 PC 上面安裝, 如此您便會有一台獨立的 VoIP PBX server( 此方法會將 PC 上硬碟的資料完全清除 ) 如果說您沒有一台獨立的 PC, 可以選擇透過 VMware Player 在 Windows 上面安裝,Trixbox 也提供了 VMware Player 對應的映像檔, 使沒有多餘 PC 的使用者也能體驗 Trixbox 圖表六 trixbox 介面

5.Client 實際測試 5.1X-lite X-lite 是目前市場上佔居領先地位的免費 SIPphone, 最新版本 X-lite3.0 是從較進階的 eyebeam1.5 簡化而來, 支援 video,audio,zero-touch configuration, 即時訊息 (IM:Instant Messaging), 以及個人化的通訊錄 5.1.1 安裝 (1) 從官方網站下載安裝檔 http://www.xten.com/index.php?menu=download 46

(2) 依照安裝精靈指示按 Next 即可 (3) 執行畫面

5.1.2 設定 設定帳號 再 DisplayName 跟 Username 分別輸入自己的名字,Password 密碼 ( 以上皆須在 server 設定好 ),Domain 則是註冊的主機, 這裡是我們自行架設的 Asterisk 主機

5.1.3 功能概述 撥打電話 49

接聽電話 首先會在右下角出現以下畫面, 可以選擇接或不接 若接通則出現以下畫面 50

5.2 SJphone SJphone 是由 SJLabs(http://www.sjlabs.com/) 所發展出來的, 其公司在世界佔有領先地位, 在這幾年間也贏得許多 industry awards SJphone 是一個 VOIP client, 可以和任何的 VOIP client,stand-aloneip-phone, 傳統電話, 甚至行動電話溝通, 並且支援 SIP 和 H.323 5.2.1 安裝 首先在 http://www.sjlabs.com/ 找到 download

接著找到 SJphone for Windows 介由安裝精靈的指示按下一步即可

執行畫面 53

5.2.2 設定 接著按滑鼠右鍵做些設定

Profiles 新增 Profile name 可以任意命名

SIPProxy 輸入 Proxy domain 和 port( 這裡是自行架設的 proxy server) SIPProxy 端註冊完成執行畫面

接下來向官方註冊吧! 一樣選擇 Options Support 可以找到 Register 57

選擇 GetKey 來取得註冊碼 註冊是免費的, 將下列欄位填入正確的資料吧! 收信, 並且點選下列網址 58

取得 ActivationKey 填入註冊碼就大功告成了! 59

5.3 client 比較 Program Operating systems Source and licencing Security Asterisk PBX Linux for PPC, OpenBSD, FreeBSD, Mac OS X Jaguar. Dual Licensed: GPL / Commercial Minisip Windows XP, 2000, Linux, Pocket PC LGPL, GPL SRTP, TLS, MIKEY (DH, PSK, PKE), end to end encryption Open source sipx (different OSI approved licenses) SJphone MS Windows, Mac, Linux, Win Mobile 5.0 Proprietary Skype Windows XP/2000, Mac OS X, Linux, Pocket PC Proprietary/closed Always encrypted. See Skype#Security for detailed discussion. TelTel Windows Proprietary SIP over TLS, SRTP Windows Live Messenger Yahoo! Messenger Windows XP/2000 Windows, Mac (OS X, OS 9, OS 8), (Linux/FreeBSD version not VOIP capable) Proprietary freeware Proprietary X-Lite Windows, Mac, Linux Proprietary SIP over TLS, SRTP 表格八 各個 client 比較

Program Other capabilities Protocols/based upon/ compatible with Key and target markets Asterisk PBX Minisip Video, voice, IM Conferencing SIP sipx Interoperable with al Conferencing, Video, lstandards-based software ITSP (Internet SJphone Presence, Chat and and services. Support Telephony Service more SIP/H.323, RTP, SDP, Providers) and ISV STUN, Jabber and more Video, Chat, file Proprietary P2P protocol Skype transfer, voicemail, Skype to phone, uses "SuperNodes" on TCP ports 80 and 443 to phone to Skype circumvent firewalls TelTel voice, IM, TelTel-Out, TelTel-In SIP, STUN, TLS, SRTP based on Resiprocate sip stack Windows Live Messenger Video, voice, chat, text messaging, PC 2 Phone SIP, RTP, proprietary Video, chat, file Yahoo! transfer, voice (PC to Messenger PC, PC to phone, phone to PC) X-Lite Video, voice, IM, Conferencing, Multiple login account SIP, STUN, ICE, TLS, SRTP based on Resiprocate sip stack 表格九 各個 client 比較 ( 續 ) 61

6. SIP 服務監控程式 demo 這支 SIP 服務監控程式, 目的在於送出一個 OPTIONS 的請求給 SIP 伺服器, 而 SIP 伺服器若收到此封包, 則會傳回當前系統的各項資訊 我們可以用這支程 式來監控目前伺服器是否還繼續提供服務, 以及了解此伺服器當前的一些狀態 圖表七 監控程式介面 圖表八 收到的伺服器回傳訊息 62

程式碼 : #!/usr/local/bin/perl usestrict; usewarnings; useio::socket; useposix'strftime'; usetime::hiresqw(gettimeofdaytv_interval); usegetopt::long; usewin32::gui(); my$dos=win32::gui::getperlwindow(); Win32::GUI::Hide($DOS); my$recv_timeout=5;# 以秒計算等待回應的時間 my$sock=io::socket::inet->new(proto=>'udp', LocalPort=>'6655', ReuseAddr=>1) die"couldnotmakesocket:$@"; my$report=win32::gui::window->new( -name=>'report', -text=>'sip 訊息回報 ', -width=>400, -height=>500 ); my$main=win32::gui::window->new( -name=>'main', 63

-text=>'sip 遠端監控程式 ', -width=>300, -height=>120 ); my$font=win32::gui::font->new( -name=>"timesnewroman", -size=>9, ); my$reportfont=win32::gui::font->new( -name=>"timesnewroman", -size=>10, ); my$labelip=$main->addlabel( -text=>'sip 服務主機名稱或 IP 位址 ', -pos=>[5,0], -font =>$font, -foreground=>0x000000, #color=0x00(blue)00(green)00(red) ); my$iptextfield=$main->addtextfield( -name=>"editip", -pos=>[5,15], 64

-size=>[150,20], -font=>$font, ); my$labelhost=$main->addlabel( -text=>'port', -pos=>[160,0], -font =>$font, -foreground=>0x000000, ); my$hosttextfield=$main->addtextfield( -name=>"edithost", -text=>'5060', -pos=>[160,15], -size=>[50,20], -font=>$font, -readonly=>1 ); $main->addbutton( -name=>'default', -text=>'ok', -default=>1,#givebuttondarkerborder -ok=>1,#press'return'toclickthisbutton -width=>60, 65

-height=>20, -left=>$main->scalewidth()-140, -top=>$main->scaleheight()-30, ); $main->addbutton( -name=>'cancel', -text=>'exit', -cancel=>1,#press'esc'toclickthisbutton -width=>60, -height=>20, -left=>$main->scalewidth()-70, -top=>$main->scaleheight()-30, ); $main->show(); Win32::GUI::Dialog(); exit(0); submain_terminate{ } return-1; subdefault_click{ #pingwho my$host=$main->editip->text(); 66

my$dst_addr=inet_aton($host) die"couldnotfindhost:$host"; my$dst_ip=inet_ntoa($dst_addr); my$portaddr=sockaddr_in(5060,$dst_addr); #whoweare my$my_ip="140.134.25.27"; my$my_port="6655"; #callidis32randomchar(hex) my$callid=""; $callid.=('0'..'9',"a".."f")[int(rand(16))]for1..32; my$port=$main->edithost->text(); #todaydate my$date=strftime('%a,%e%b%y%i:%m:%s%z',localtime()); #print"\n$date\n"; #branchid my$branch="z9hg4bk".time(); #print"\n$branch\n"; my$packet=qq(optionssip:$dst_ipsip/2.0 Via:SIP/2.0/UDP$my_ip:$my_port;branch=$branch From:<sip:ping\@$my_ip> To:<sip:$host> Contact:<sip:ping\@$my_ip> 67

Call-ID:$callid\@$my_ip CSeq:102OPTIONS User-Agent:AstMon.pl Date:$date Allow:ACK,CANCEL Content-Length:0 ); $report->show(); #packetsend print"sending:\n\n$packet\n"; my$sendmsg=$report->addlabel( -text=>' 送出的封包內容 :', -pos=>[5,2], -font =>$font, -foreground=>0x000000, ); my$packetsend=$report->addtextfield( -text=>$packet, -wantreturn=>1, -pos=>[0,20], -autohscroll=>1, -autovscroll=>1, -multiline=>1, 68

-size=>[400,200], -font =>$reportfont, -foreground=>0x000000, ); send($sock,$packet,0,$portaddr)==length($packet) die"cannotsendto$host$!"; my$send_time=[gettimeofday()]; my$elapsed; #request eval { local$sig{alrm}=sub{die"alarmtimeout"}; alarm$recv_timeout; $portaddr=recv($sock,$packet,1500,0) die"couldn'treceive:$!"; $elapsed=tv_interval($send_time); #printf("\nportaddress:%s\nelapsed:%f\n",$portaddr,$elapsed); alarm0; 1; } die($@); printf("after(\%0.2fms),hostsaid:\n\n\%s\n",$elapsed*1000,$packet); my$receivemsg=$report->addlabel( -text=>' 收到的伺服器回應 :', -pos=>[5,230], 69

-font =>$font, -foreground=>0x000000, ); my$packetrece=$report->addtextfield( -text=>$packet, -wantreturn=>1, -pos=>[0,250], -autohscroll=>1, -autovscroll=>1, -multiline=>1, -size=>[400,200], -font =>$reportfont, ); } return0; subcancel_click{ print"cancelbuttonclicked\n"; exit(); return0; } 70

7. 總結 在這一次的專題製作當中, 我們主要完成了以下幾個目標 : 當我們測試了幾個不同的伺服器以及軟體的 client 後, 我們最後選擇了 Asterisk 來做為我們實作 VoIP 語音服務的平台, 並利用 X_lite 這一個軟體電話來達成與伺服器端的連線及各式服務的實作 在使用 Asterisk 的部分, 我們學會編譯 安裝它, 然後學習這套系統的設定及 dial plan 的規則, 我們可以利用這套系統實現撥打學校以及宿舍分機 提供語音信箱服務 music on hold 功能 線上的多人語音會議及錄音等功能 由於缺少硬體外接卡的關係, 我們的專題結果僅限於在網路對網路的應用上, 在若往後有購買硬體外接卡, 也能夠很輕易地與傳統 PSTN 網路架接, 甚至可以做到收發傳真 控制家中的電器開關等功能, 除了語音服務外, 還能享受到更為便利的生活 在 client 的部分我們對 sipx Sjphone TelTel minisip X-Lite skype 等十多個目前較為流行的軟體電話後, 挑選出一些對 SIP 支援性較高的軟體 ( 同時它最好也是開放原始碼的軟體 ) 來測試他們的通話音質 是否支援 IM 等功能, 最後針對它們之間的異同做一個比較 另外, 在使用 Asterisk 這套系統時, 以目前我們所使用的 Pentium4 1.5GHz 處理器來說, 只能夠提供幾十人同時使用 VoIP 服務 如果我們要同時服務更多的使用者 例如與校園 VoIP 骨幹做整合時, 就需要更加強大的處理器來處理語音編碼及封包的傳送 71

8. 參考資料與銘謝 : 參考書目及書面資料 : Asterisk-asterisk at home Guidebook Article-Session.Initiation.Protocol-(SIP) Asterisk-ABare-Bones VoIP Example Asterisk-The future of telephony ASTERISK handbook-draft VoIP-Programming-SIPToolkit Message Layer Reference Guide Building Telephony Systems With Asterisk (Packt-2005) VoIP Telephony with Asterisk (Paul Mahler) Unofficial AsteriskPBX IntegrationGuide VoIP HACKS 參考網站 : Asterisk: Voip-info http://www.voip-info.org Getting started with asteriskhttp://www.automated.it/guidetoasterisk.htm Trixbox: Handbook http://www.voip-info.org/wiki/view/asterisk%40home+handbook+wiki Setup your own IP-PBX http://chayden.net/asterisk/seupasteriskathome.htm Running Asterisk@home under Windows http://voipspeak.net/index.php?option=com_content&task=view&id=45&itemid=28 72

X-Lite: Official site http://www.xten.com/docs/x-lite3.0_userguide.pdf Setting up an X-Lite client on Asterisk http://www.astmasters.net/stuff/x-lite-and-asterisk.pdf A dummies guide http://www.asteriskguru.com/xlite.html SJPhone: Official site:http://www.sjlabs.com/sjp.html Official guide:http://www.sjphone.org/doc/sjphone%20guide.pdf How to configure Asterisk for the SJphone http://www.voip-info.org/wiki/index.php?page=asterisk+phone+sjphone 這份專題之所以能完成, 在這裡得感謝幾位師長大力相助 首先, 我們得感謝我們的指導老師 蘇宗安老師, 蘇老師不但提供了我們良好的題目與方向, 讓我們在專題製作過程中得到樂趣, 並且在百忙之中撥冗指導我們, 更鼓勵我們參加國科會開放原始碼會議, 使得我們增廣見聞 另外, 感謝余禎祥組長以及柯守全副組長, 他們請廠商來講解, 使我們有獲得寶貴的業界經驗, 遭遇瓶頸的時候亦提供適當的方法解決 有了他們的幫助, 方能使專題報告更加完美 73