目录
目  录

前言

第一部分 基 础 篇

第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


按 Ctrl+p 打印本页】【关闭