本书是FreeSWITCH领域最为权威的著作之一,在这本书面前,FreeSWITCH了无秘密!
由中国FreeSWITCH领域“第一人”、全球FreeSWITCH开源社区知名专家、FreeSWITCH-CN中文社区创始人兼执行主席Seven撰写,FreeSWITCH之父鼎力推荐。内容极为全面,涵盖FreeSWITCH的方方面面,从它的系统结构、核心概念、各项功能和使用、维护的方法和要点、系统的调试与排除、系统的性能优化、到脚本开发、基于源代码的二次开发和内部实现原理,深度与广度兼备;实战性极强,从呼叫排队、多人电话会议、话单计费等基本的配置实例到生产环境中的应用实例,从单个的FreeSWITCH应用到FreeSWITCH集群,从脚本开发到基于源代码的二次开发,各种案例应用尽有,很多案例中的参数都可以拿来直接使用。
封面图
目录
- 前言
- 第一部分基础篇
- 第1章PSTN与VoIP基础2
- 1.1PSTN起源与发展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.3PCM11
- 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.5H.323与SIP信令17
- 1.5媒体19
- 1.6电路交换与分组交换20
- 1.6.1电路交换20
- 1.6.2分组交换20
- 1.7VoIP21
- 1.8IMS22
- 1.8.1什么是IMS22
- 1.8.2IMS的特点22
- 1.8.3IMS核心网元23
- 1.8.4SIP协议的参考点26
- 1.9小结27
- 第2章PSTN、PBX及呼叫中心业务28
- 2.1PSTN业务28
- 2.1.1POTS28
- 2.1.2商务业务30
- 2.1.3其他增值业务30
- 2.2PBX业务31
- 2.2.1呼叫转移31
- 2.2.2同组代答31
- 2.3PBX与中继线31
- 2.4IP-PBX业务34
- 2.5呼叫中心35
- 2.5.1什么是呼叫中心35
- 2.5.2呼叫中心的历史36
- 2.5.3呼叫中心的分类37
- 2.5.4呼叫中心的主要技术指标39
- 2.5.5CTI中间件40
- 2.5.6FreeSWITCH在呼叫中心的应用41
- 2.6小结42
- 第3章初识FreeSWITCH43
- 3.1什么是FreeSWITCH ?43
- 3.1.1FreeSWITCH的概念43
- 3.1.2FreeSWITCH的功能45
- 3.2快速体验46
- 3.2.1安装基本FreeSWITCH系统46
- 3.2.2连接SIP电话57
- 3.3配置FreeSWITCH61
- 3.4FreeSWITCH用作软电话63
- 3.5配置SIP网关拨打外部电话64
- 3.5.1从某一分机上呼出65
- 3.5.2呼入电话处理66
- 3.6小结66
- 第4章运行FreeSWITCH67
- 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.6API 与 App73
- 4.7API命令帮助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.1freeswitch.xml86
- 5.3.2vars.xml88
- 5.3.3autoload_configs 目录89
- 5.3.4其他90
- 5.4XML 用户目录91
- 5.5呼叫相关概念93
- 5.5.1来去话、Session 、Channel与Call93
- 5.5.2回铃音与 Early Media94
- 5.5.3全局变量与局部变量94
- 5.6小结95
- 第6章拨号计划96
- 6.1XML Dialplan96
- 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.2inline Dialplan118
- 6.3其他Dialplan120
- 6.4常用的Dialplan App120
- 6.5在Dialplan中使用API命令123
- 6.6深入理解通道变量及相关操作124
- 6.7小结125
- 第7章SIP协议126
- 7.1SIP协议基础126
- 7.1.1HTTP与SIP协议基础127
- 7.1.2SIP的基本概念和相关元素129
- 7.1.3SIP协议的基本方法和头域简介131
- 7.2SIP注册132
- 7.3SIP呼叫流程135
- 7.3.1UA间直接呼叫136
- 7.3.2通过 B2BUA 呼叫137
- 7.4深入理解SIP147
- 7.4.1SIP URI147
- 7.4.2SDP和SOA147
- 7.4.33PCC151
- 7.4.4SIP承载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.2SDP及其在编码协商中的作用161
- 8.2.3协商时机与策略163
- 8.3其他媒体相关的问题163
- 8.3.1RTP和RTCP163
- 8.3.2转码165
- 8.3.3透传、媒体绕过与媒体代理167
- 8.3.4Media Bug168
- 8.3.5视频168
- 8.3.6排错169
- 8.4小结170
- 第9章SIP模块171
- 9.1基本概念171
- 9.2Sofia配置文件172
- 9.2.1Profile配置文件173
- 9.2.1Profile的几个重要参数175
- 9.2.2external.xml177
- 9.2.3Gateway179
- 9.3常用命令181
- 9.3.1状态相关命令181
- 9.3.2Profile相关命令182
- 9.3.3SIP Capture183
- 9.3.4global相关184
- 9.3.5debug相关184
- 9.3.6其他命令185
- 9.3.7其他186
- 9.4NAT穿越186
- 9.4.1NAT的种类188
- 9.4.2FreeSWITCH的拓扑结构189
- 9.4.3NAT是怎么影响SIP/RTP通信的190
- 9.4.4NAT的穿越方法191
- 9.5小结198
- 第二部分实战篇
- 第10章基本技能200
- 10.1调试与排错200
- 10.1.1解决问题的一般方法和流程200
- 10.1.2查看日志203
- 10.2使用外部工具抓包205
- 10.2.1tcpdump205
- 10.2.2tshark206
- 10.2.3ngrep207
- 10.2.4pcapsipdump208
- 10.3使用Wireshark抓包并分析呼叫208
- 10.3.1使用Wireshark抓包209
- 10.3.2使用Wireshark对抓包进行分析210
- 10.4originate命令实例解析213
- 10.4.1使用格式和参数213
- 10.4.2转入Dialplan214
- 10.4.3更改主叫号码215
- 10.4.4处理呼叫超时215
- 10.4.5防止命令阻塞216
- 10.4.6使用通道变量216
- 10.4.7Early Media对呼叫的影响217
- 10.4.8bridge也使用originate217
- 10.4.9bridge中的Early Media218
- 10.4.10bridge中的主叫号码219
- 10.5呼叫是怎样工作的?220
- 10.6FreeSWITCH图形用户界面简介223
- 10.6.1FusionPBX223
- 10.6.2blue.box223
- 10.6.3FreeSWITCH Portal224
- 10.7小结226
- 第11章基本功能与实现227
- 11.1批量创建用户227
- 11.2用FreeSWITCH实现IVR229
- 11.2.1最简单的菜单229
- 11.2.2默认IVR简介232
- 11.3按时间进行路由233
- 11.4配置中文语音提示234
- 11.4.1最简单的实现方案234
- 11.4.2使用sound_prefix235
- 11.4.3使用Phrase236
- 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.1playback的参数244
- 11.6.2循环播放248
- 11.6.3Say249
- 11.7TTS251
- 11.7.1使用mod_flite251
- 11.7.2mod_tts_commandline252
- 11.7.3MRCP256
- 11.7.4Google Translate257
- 11.7.5TTS小结258
- 11.8在呼叫失败的情况下向主叫用户播放语音提示259
- 11.8.1实现方法259
- 11.8.2进阶260
- 11.8.3使用TTS261
- 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.3fifo270
- 12.2使用mod_callcenter实现呼叫中心应用272
- 12.2.1mod_callcenter模块简介273
- 12.2.2座席配置与管理274
- 12.3数据库277
- 12.3.1默认数据库中有什么?277
- 12.3.2ODBC279
- 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.1CSV格式的话单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.2FreeSWITCH与FreeSWITCH对接306
- 13.2.1双机对接306
- 13.2.2汇接308
- 13.2.3双归属309
- 13.2.4长途局311
- 13.2.5ACL311
- 13.3FreeSWITCH作为PBX312
- 13.3.1普通的PBX设置313
- 13.3.2DID315
- 13.3.3使用PBX上的网关呼出319
- 13.4小结319
- 第14章FreeSWITCH与其他设备或系统对接321
- 14.1使用Doubango客户端连接321
- 14.2对接IMS322
- 14.2.1网关配置323
- 14.2.2通过IMS呼出324
- 14.2.3通过IMS呼入324
- 14.2.4其他问题325
- 14.3连接模拟话机和模拟中继线326
- 14.3.1FXS和FXO326
- 14.3.2拓扑结构327
- 14.3.3使用潮流网关连接模拟话机328
- 14.3.4使用迅时网关连接模拟话机和模拟中继线329
- 14.4通过E1线路与其他系统对接335
- 14.4.1配置FS1335
- 14.4.2配置E1网关设备340
- 14.4.3配置FS2342
- 14.4.4对接其他厂家的E1网关345
- 14.5对接Asterisk346
- 14.5.1从FreeSWITCH呼叫Asterisk346
- 14.5.2从Asterisk上呼叫FreeSWITCH347
- 14.5.3其他347
- 14.6使用H.323协议对接348
- 14.6.1mod_h323348
- 14.6.2mod_opal350
- 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.4DTMF361
- 15.4.1带内DTMF361
- 15.4.2RFC2833362
- 15.4.3SIP INFO363
- 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.1Domain简介368
- 15.7.2配置与实例370
- 15.7.3进阶372
- 15.7.4其他373
- 15.8使用loopback Endpoint外呼373
- 15.9在Web浏览器中打电话375
- 15.9.1Flash376
- 15.9.2WebRTC379
- 15.10HA382
- 15.10.1崩溃恢复实验382
- 15.10.2HA简介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.1FreeSWITCH中的嵌入式脚本400
- 16.2Lua401
- 16.2.1Lua语法简介402
- 16.2.2将电话路由到Lua脚本408
- 16.2.3Session 相关函数408
- 16.2.4非Session函数和独立的Lua脚本412
- 16.2.5Event相关函数412
- 16.2.6Chat相关函数415
- 16.2.7LUA拨号计划416
- 16.2.8连接数据库417
- 16.3其他脚本语言419
- 16.3.1JavaScript419
- 16.3.2Python420
- 16.4小结421
- 第17章嵌入式及HTTP开发423
- 17.1用Lua脚本写个小游戏423
- 17.2用Lua实现IVR425
- 17.3在会议中呼出429
- 17.4一个在FreeSWITCH中外呼的脚本431
- 17.5使用Lua脚本通过多个网关循环外呼433
- 17.6在FreeSWITCH中执行长期运行的嵌入式脚本434
- 17.7使用Lua提供XML Binding436
- 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 Socket452
- 18.1架构452
- 18.1.1外连模式453
- 18.1.2内连模式454
- 18.2Event Socket协议454
- 18.2.1外连455
- 18.2.2内连456
- 18.2.3Event Socket命令详解457
- 18.3Event Socket库465
- 18.3.1Event Socket示例465
- 18.3.2ESL函数说明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写一个ACD490
- 19.4用Inbound模式实现IVR496
- 19.5使用Java连接ESL501
- 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.2FreeSWITCH源代码目录结构519
- 20.3FreeSWITCH源代码导读519
- 20.3.1APR520
- 20.3.2SWITCH APR520
- 20.3.3main函数522
- 20.3.4可加载模块524
- 20.3.5模块的结构530
- 20.3.6Session和Channel531
- 20.3.7SWITCH IVR536
- 20.3.8Core IO537
- 20.3.9Core Media540
- 20.3.10Core RTP541
- 20.3.11SWITCH XML543
- 20.3.12SWITCH Event544
- 20.3.13Core Codec 和 Core File547
- 20.4FreeSWITCH源代码的编译548
- 20.4.1首次编译549
- 20.4.2增量编译550
- 20.4.3常见问题及最佳实践551
- 20.5小结552
- 第21章FreeSWITCH源代码分析553
- 21.1mod_dptools553
- 21.1.1echo553
- 21.1.2answer555
- 21.1.3set557
- 21.1.4bridge559
- 21.1.5Endpoint Interface563
- 21.1.6模块框架564
- 21.2mod_commands566
- 21.2.1模块框架566
- 21.2.2originate566
- 21.3mod_sofia567
- 21.3.1模块加载568
- 21.3.2Sofia的加载及通话建立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增加一个新的Interface586
- 22.2写一个新的FreeSWITCH编解码模块587
- 22.3从头开始写一个模块589
- 22.3.1初始准备工作589
- 22.3.2写一个简单的Dialplan590
- 22.3.3增加一个App592
- 22.3.4写一个API593
- 22.3.5小结594
- 22.4使用libfreeswitch594
- 22.4.1自己写一个软交换机594
- 22.4.2使用libfreeswitch提供的库函数595
- 22.4.3其他599
- 22.5调试跟踪600
- 22.6小结601
- 附录AFreeSWITCH开源软件社区指南603
- 附录B关于FreeSWITCH常用术语翻译的意见605
- 附录C模块列表607
- 附录DFreeSWITCH架构详细示意图614
- 后记615