目 錄
前言
第一部分 基 礎 篇
第1章 PSTN與VoIP基礎 2
1.1 PSTN起源與發展 2
1.1.1 最早的電話網 2
1.1.2 人工電話交換時代 3
1.1.3 自動電話交換時代 3
1.1.4 半電子交換機時代 6
1.1.5 空分交換機時代 6
1.1.6 數字交換機時代 6
1.1.7 現代PSTN時代 6
1.1.8 下一代網絡及VoIP時代 6
1.2 電話實現技術 8
1.2.1 電話號碼 8
1.2.2 模擬信號與數字信號 11
1.2.3 PCM 11
1.2.4 局間中繼與電路復用技術 12
1.3 我國電話網結構 12
1.4 信令 14
1.4.1 信令分類 14
1.4.2 用戶綫信令 15
1.4.3 局間信令 15
1.4.4 七號信令 16
1.4.5 H.323與SIP信令 17
1.5 媒體 19
1.6 電路交換與分組交換 20
1.6.1 電路交換 20
1.6.2 分組交換 20
1.7 VoIP 21
1.8 IMS 22
1.8.1 什麼是IMS 22
1.8.2 IMS的特點 22
1.8.3 IMS核心網元 23
1.8.4 SIP協議的參考點 26
1.9 小結 27
第2章 PSTN、PBX及呼叫中心業務 28
2.1 PSTN業務 28
2.1.1 POTS 28
2.1.2 商務業務 30
2.1.3 其他增值業務 30
2.2 PBX業務 31
2.2.1 呼叫轉移 31
2.2.2 同組代答 31
2.3 PBX與中繼綫 31
2.4 IP-PBX業務 34
2.5 呼叫中心 35
2.5.1 什麼是呼叫中心 35
2.5.2 呼叫中心的曆史 36
2.5.3 呼叫中心的分類 37
2.5.4 呼叫中心的主要技術指標 39
2.5.5 CTI中間件 40
2.5.6 FreeSWITCH在呼叫中心的應用 41
2.6 小結 42
第3章 初識FreeSWITCH 43
3.1 什麼是FreeSWITCH ? 43
3.1.1 FreeSWITCH的概念 43
3.1.2 FreeSWITCH的功能 45
3.2 快速體驗 46
3.2.1 安裝基本FreeSWITCH係統 46
3.2.2 連接SIP電話 57
3.3 配置FreeSWITCH 61
3.4 FreeSWITCH用作軟電話 63
3.5 配置SIP網關撥打外部電話 64
3.5.1 從某一分機上呼齣 65
3.5.2 呼入電話處理 66
3.6 小結 66
第4章 運行FreeSWITCH 67
4.1 命令行參數 67
4.2 係統啓動腳本 68
4.3 判斷 FreeSWITCH 是否運行 69
4.4 控製颱與命令客戶端 69
4.5 呼叫 72
4.5.1 發起呼叫 72
4.5.2 呼叫字符串 72
4.6 API 與 App 73
4.7 API命令幫助 75
4.8 小結 76
第5章 FreeSWITCH架構 77
5.1 總體架構 77
5.1.1 核心 77
5.1.2 接口實現 81
5.2 目錄結構 83
5.3 配置文件 85
5.3.1 freeswitch.xml 86
5.3.2 vars.xml 88
5.3.3 autoload_configs 目錄 89
5.3.4 其他 90
5.4 XML 用戶目錄 91
5.5 呼叫相關概念 93
5.5.1 來去話、Session 、Channel與Call 93
5.5.2 迴鈴音與 Early Media 94
5.5.3 全局變量與局部變量 94
5.6 小結 95
第6章 撥號計劃 96
6.1 XML Dialplan 96
6.1.1 配置文件的結構 96
6.1.2 默認的配置文件簡介 99
6.1.3 正則錶達式 100
6.1.4 通道變量 101
6.1.5 測試條件 105
6.1.6 動作與反動作 108
6.1.7 工作機製深入剖析 109
6.1.8 內聯執行 111
6.1.9 實例解析 112
6.2 inline Dialplan 118
6.3 其他Dialplan 120
6.4 常用的Dialplan App 120
6.5 在Dialplan中使用API命令 123
6.6 深入理解通道變量及相關操作 124
6.7 小結 125
第7章 SIP協議 126
7.1 SIP協議基礎 126
7.1.1 HTTP與SIP協議基礎 127
7.1.2 SIP的基本概念和相關元素 129
7.1.3 SIP協議的基本方法和頭域簡介 131
7.2 SIP注冊 132
7.3 SIP呼叫流程 135
7.3.1 UA間直接呼叫 136
7.3.2 通過 B2BUA 呼叫 137
7.4 深入理解SIP 147
7.4.1 SIP URI 147
7.4.2 SDP和SOA 147
7.4.3 3PCC 151
7.4.4 SIP承載 152
7.5 小結 152
第8章 媒體 154
8.1 媒體與媒體處理 154
8.1.1 音頻編碼 154
8.1.2 媒體工作機理和相關配置 159
8.2 媒體協商 160
8.2.1 協商過程 160
8.2.2 SDP及其在編碼協商中的作用 161
8.2.3 協商時機與策略 163
8.3 其他媒體相關的問題 163
8.3.1 RTP和RTCP 163
8.3.2 轉碼 165
8.3.3 透傳、媒體繞過與媒體代理 167
8.3.4 Media Bug 168
8.3.5 視頻 168
8.3.6 排錯 169
8.4 小結 170
第9章 SIP模塊 171
9.1 基本概念 171
9.2 Sofia配置文件 172
9.2.1 Profile配置文件 173
9.2.1 Profile的幾個重要參數 175
9.2.2 external.xml 177
9.2.3 Gateway 179
9.3 常用命令 181
9.3.1 狀態相關命令 181
9.3.2 Profile相關命令 182
9.3.3 SIP Capture 183
9.3.4 global相關 184
9.3.5 debug相關 184
9.3.6 其他命令 185
9.3.7 其他 186
9.4 NAT穿越 186
9.4.1 NAT的種類 188
9.4.2 FreeSWITCH的拓撲結構 189
9.4.3 NAT是怎麼影響SIP/RTP通信的 190
9.4.4 NAT的穿越方法 191
9.5 小結 198
第二部分 實 戰 篇
第10章 基本技能 200
10.1 調試與排錯 200
10.1.1 解決問題的一般方法和流程 200
10.1.2 查看日誌 203
10.2 使用外部工具抓包 205
10.2.1 tcpdump 205
10.2.2 tshark 206
10.2.3 ngrep 207
10.2.4 pcapsipdump 208
10.3 使用Wireshark抓包並分析呼叫 208
10.3.1 使用Wireshark抓包 209
10.3.2 使用Wireshark對抓包進行分析 210
10.4 originate命令實例解析 213
10.4.1 使用格式和參數 213
10.4.2 轉入Dialplan 214
10.4.3 更改主叫號碼 215
10.4.4 處理呼叫超時 215
10.4.5 防止命令阻塞 216
10.4.6 使用通道變量 216
10.4.7 Early Media對呼叫的影響 217
10.4.8 bridge也使用originate 217
10.4.9 bridge中的Early Media 218
10.4.10 bridge中的主叫號碼 219
10.5 呼叫是怎樣工作的? 220
10.6 FreeSWITCH圖形用戶界麵簡介 223
10.6.1 FusionPBX 223
10.6.2 blue.box 223
10.6.3 FreeSWITCH Portal 224
10.7 小結 226
第11章 基本功能與實現 227
11.1 批量創建用戶 227
11.2 用FreeSWITCH實現IVR 229
11.2.1 最簡單的菜單 229
11.2.2 默認IVR簡介 232
11.3 按時間進行路由 233
11.4 配置中文語音提示 234
11.4.1 最簡單的實現方案 234
11.4.2 使用sound_prefix 235
11.4.3 使用Phrase 236
11.4.4 使用中文語音提示 238
11.5 錄音 239
11.5.1 單腿錄音 239
11.5.2 對兩條腿的通話進行錄音 240
11.5.3 立體聲 241
11.5.4 錄音相關的通道變量 242
11.5.5 原生格式 243
11.6 放音 244
11.6.1 playback的參數 244
11.6.2 循環播放 248
11.6.3 Say 249
11.7 TTS 251
11.7.1 使用mod_flite 251
11.7.2 mod_tts_commandline 252
11.7.3 MRCP 256
11.7.4 Google Translate 257
11.7.5 TTS小結 258
11.8 在呼叫失敗的情況下嚮主叫用戶播放語音提示 259
11.8.1 實現方法 259
11.8.2 進階 260
11.8.3 使用TTS 261
11.8.4 原理 262
11.9 實現呼叫前轉業務 263
11.10 小結 265
第12章 高級功能與配置實例 266
12.1 使用mod_fifo實現簡單呼叫隊列 266
12.1.1 呼叫停泊與取迴 266
12.1.2 配置座席 268
12.1.3 fifo 270
12.2 使用mod_callcenter實現呼叫中心應用 272
12.2.1 mod_callcenter模塊簡介 273
12.2.2 座席配置與管理 274
12.3 數據庫 277
12.3.1 默認數據庫中有什麼? 277
12.3.2 ODBC 279
12.3.3 使用數據庫原生客戶端庫直接連接數據庫 282
12.4 視頻通話 283
12.4.1 配置視頻通話 283
12.4.2 視頻錄像與迴放 285
12.4.3 視頻轉碼 285
12.5 多人電話會議 286
12.5.1 音頻會議 286
12.5.2 視頻會議 292
12.6 話單 297
12.6.1 CSV格式的話單 297
12.6.2 直接將話單寫入數據庫 298
12.6.3 使用HTTP服務器接收話單 299
12.7 計費 300
12.8 小結 302
第13章 FreeSWITCH與FreeSWITCH對接 303
13.1 在同一颱主機上啓動多個FreeSWITCH實例 303
13.1.1 背景故事 304
13.1.2 練習 305
13.1.3 進階 306
13.2 FreeSWITCH與FreeSWITCH對接 306
13.2.1 雙機對接 306
13.2.2 匯接 308
13.2.3 雙歸屬 309
13.2.4 長途局 311
13.2.5 ACL 311
13.3 FreeSWITCH作為PBX 312
13.3.1 普通的PBX設置 313
13.3.2 DID 315
13.3.3 使用PBX上的網關呼齣 319
13.4 小結 319
第14章 FreeSWITCH與其他設備或係統對接 321
14.1 使用Doubango客戶端連接 321
14.2 對接IMS 322
14.2.1 網關配置 323
14.2.2 通過IMS呼齣 324
14.2.3 通過IMS呼入 324
14.2.4 其他問題 325
14.3 連接模擬話機和模擬中繼綫 326
14.3.1 FXS和FXO 326
14.3.2 拓撲結構 327
14.3.3 使用潮流網關連接模擬話機 328
14.3.4 使用迅時網關連接模擬話機和模擬中繼綫 329
14.4 通過E1綫路與其他係統對接 335
14.4.1 配置FS1 335
14.4.2 配置E1網關設備 340
14.4.3 配置FS2 342
14.4.4 對接其他廠傢的E1網關 345
14.5 對接Asterisk 346
14.5.1 從FreeSWITCH呼叫Asterisk 346
14.5.2 從Asterisk上呼叫FreeSWITCH 347
14.5.3 其他 347
14.6 使用H.323協議對接 348
14.6.1 mod_h323 348
14.6.2 mod_opal 350
14.6.3 其他 351
14.7 小結 351
第15章 其他技巧與實例 353
15.1 轉接和代接 353
15.1.1 盲轉 353
15.1.2 協商轉 356
15.1.3 代接 357
15.2 共享綫路呈現 358
15.3 使用組播功能做網絡廣播 360
15.4 DTMF 361
15.4.1 帶內DTMF 361
15.4.2 RFC2833 362
15.4.3 SIP INFO 363
15.5 號碼連選 363
15.5.1 注冊到運營商服務器 364
15.5.2 通過單個號碼呼齣 364
15.5.3 使用隨機數做號碼連選 365
15.5.4 使用mod_distributor進行連選 365
15.5.5 其他 366
15.6 收發傳真 367
15.7 多租戶 368
15.7.1 Domain簡介 368
15.7.2 配置與實例 370
15.7.3 進階 372
15.7.4 其他 373
15.8 使用loopback Endpoint外呼 373
15.9 在Web瀏覽器中打電話 375
15.9.1 Flash 376
15.9.2 WebRTC 379
15.10 HA 382
15.10.1 崩潰恢復實驗 382
15.10.2 HA簡介 383
15.10.3 雙機HA實現細節及需要注意的問題 384
15.11 集群及分布式部署 386
15.11.1 大規模集群的總體結構 386
15.11.2 負載均衡配置實例 387
15.12 壓力測試 392
15.12.1 參數和指標 392
15.12.2 呼叫測試 393
15.12.3 注冊測試 395
15.12.4 編解碼測試 396
15.12.5 測試結果 396
15.13 生産環境下的穩定性和安全性 396
15.13.1 穩定性 397
15.13.2 安全性 397
15.14 小結 398
第三部分 高 級 篇
第16章 嵌入式腳本 400
16.1 FreeSWITCH中的嵌入式腳本 400
16.2 Lua 401
16.2.1 Lua語法簡介 402
16.2.2 將電話路由到Lua腳本 408
16.2.3 Session 相關函數 408
16.2.4 非Session函數和獨立的Lua腳本 412
16.2.5 Event相關函數 412
16.2.6 Chat相關函數 415
16.2.7 LUA撥號計劃 416
16.2.8 連接數據庫 417
16.3 其他腳本語言 419
16.3.1 JavaScript 419
16.3.2 Python 420
16.4 小結 421
第17章 嵌入式及HTTP開發 423
17.1 用Lua腳本寫個小遊戲 423
17.2 用Lua實現IVR 425
17.3 在會議中呼齣 429
17.4 一個在FreeSWITCH中外呼的腳本 431
17.5 使用Lua腳本通過多個網關循環外呼 433
17.6 在FreeSWITCH中執行長期運行的嵌入式腳本 434
17.7 使用Lua提供XML Binding 436
17.8 語音識彆 437
17.8.1 使用Pocket Sphinx進行中文語音識彆 438
17.8.2 通過商業語音識彆軟件進行識彆 444
17.9 使用mod_xml_curl提供動態用戶管理 446
17.10 使用mod_xml_cdr模塊處理話單 448
17.11 小結 450
第18章 Event Socket 452
18.1 架構 452
18.1.1 外連模式 453
18.1.2 內連模式 454
18.2 Event Socket協議 454
18.2.1 外連 455
18.2.2 內連 456
18.2.3 Event Socket命令詳解 457
18.3 Event Socket庫 465
18.3.1 Event Socket示例 465
18.3.2 ESL函數說明 470
18.4 事件 475
18.4.1 事件的學習方法 475
18.4.2 常用事件簡介 476
18.5 小結 478
第19章 使用ESL開發 479
19.1 創建獨立的ESL應用 479
19.1.1 創建目錄和源文件 479
19.1.2 編譯和執行 480
19.1.3 將源代碼納入版本控製 481
19.2 用ESL重寫空中充值服務 482
19.3 用ESL寫一個ACD 490
19.4 用Inbound模式實現IVR 496
19.5 使用Java連接ESL 501
19.6 使用Erlang控製呼叫流程 502
19.6.1 準備工作 503
19.6.2 將來話交給Erlang處理 504
19.6.3 用Erlang實現空中充值服務 506
19.6.4 用Erlang狀態機實現空中充值服務 509
19.6.5 其他 514
19.7 定時呼叫 516
19.8 小結 517
第20章 源代碼導讀及編譯指南 518
20.1 準備FreeSWITCH源代碼環境 518
20.2 FreeSWITCH源代碼目錄結構 519
20.3 FreeSWITCH源代碼導讀 519
20.3.1 APR 520
20.3.2 SWITCH APR 520
20.3.3 main函數 522
20.3.4 可加載模塊 524
20.3.5 模塊的結構 530
20.3.6 Session和Channel 531
20.3.7 SWITCH IVR 536
20.3.8 Core IO 537
20.3.9 Core Media 540
20.3.10 Core RTP 541
20.3.11 SWITCH XML 543
20.3.12 SWITCH Event 544
20.3.13 Core Codec 和 Core File 547
20.4 FreeSWITCH源代碼的編譯 548
20.4.1 首次編譯 549
20.4.2 增量編譯 550
20.4.3 常見問題及最佳實踐 551
20.5 小結 552
第21章 FreeSWITCH源代碼分析 553
21.1 mod_dptools 553
21.1.1 echo 553
21.1.2 answer 555
21.1.3 set 557
21.1.4 bridge 559
21.1.5 Endpoint Interface 563
21.1.6 模塊框架 564
21.2 mod_commands 566
21.2.1 模塊框架 566
21.2.2 originate 566
21.3 mod_sofia 567
21.3.1 模塊加載 568
21.3.2 Sofia的加載及通話建立 568
21.4 小結 576
第22章 FreeSWITCH二次開發 577
22.1 給FreeSWITCH匯報Bug和打補丁 577
22.1.1 修復內存泄露問題 577
22.1.2 給中文模塊打補丁 578
22.1.3 給FreeSWITCH核心打補丁 579
22.1.4 高手也會犯錯誤 581
22.1.5 匯報嚴重的問題 581
22.1.6 給Sofia-SIP打補丁 582
22.1.7 給現有App增加新功能 584
22.1.8 給FreeSWITCH增加一個新的Interface 586
22.2 寫一個新的FreeSWITCH編解碼模塊 587
22.3 從頭開始寫一個模塊 589
22.3.1 初始準備工作 589
22.3.2 寫一個簡單的Dialplan 590
22.3.3 增加一個App 592
22.3.4 寫一個API 593
22.3.5 小結 594
22.4 使用libfreeswitch 594
22.4.1 自己寫一個軟交換機 594
22.4.2 使用libfreeswitch提供的庫函數 595
22.4.3 其他 599
22.5 調試跟蹤 600
22.6 小結 601
附錄A FreeSWITCH開源軟件社區指南 603
附錄B 關於FreeSWITCH常用術語翻譯的意見 605
附錄C 模塊列錶 607
附錄D FreeSWITCH架構詳細示意圖 614
後記 615
電子版附錄:
附錄E FreeSWITCH中文FAQ
附錄F Sofia Profile參數
附錄G 使用GSM網關連接PSTN
附錄H Sangoma闆卡及驅動的安裝
附錄I FreeSWITCH與Asterisk
附錄J FreeSWITCH 的曆史
· · · · · · (
收起)