内容简介
第一部分 基础篇
第1章 PSTN与VoIP基础
1.1 PSTN起源与发展
1.1.1 最早的电话网
1.1.2 人工电话交换时代
1.1.3 自动电话交换时代
1.1.4 半电子交换机时代
1.1.5 空分交换机时代
1.1.6 数字交换机时代
1.1.7 现代PSTN时代
1.1.8 下一代网络及VoIP时代
1.2 电话实现技术
1.2.1 电话号码
1.2.2 模拟信号与数字信号
1.2.3 PCM
1.2.4 局间中继与电路复用技术
1.3 我国电话网结构
1.4 信令
1.4.1 信令分类
1.4.2 用户线信令
1.4.3 局间信令
1.4.4 七号信令
1.4.5 H.323与SIP信令
1.5 媒体
1.6 电路交换与分组交换
1.6.1 电路交换
1.6.2 分组交换
1.7 VoIP
1.8 IMS
1.8.1 什么是IMS
1.8.2 IMS的特点
1.8.3 IMS核心网元
1.8.4 SIP协议的参考点
1.9 小结
第2章 PSTN、PBX及呼叫中心业务
2.1 PSTN业务
2.1.1 POTS
2.1.2 商务业务
2.1.3 其他增值业务
2.2 PBX业务
2.2.1 呼叫转移
2.2.2 同组代答
2.3 PBX与中继线
2.4 IP-PBX业务
2.5 呼叫中心
2.5.1 什么是呼叫中心
2.5.2 呼叫中心的历史
2.5.3 呼叫中心的分类
2.5.4 呼叫中心的主要技术指标
2.5.5 CTI中间件
2.5.6 FreeSWITCH在呼叫中心的应用
2.6 小结
第3章 初识FreeSWITCH
3.1 什么是FreeSWITCH?
3.1.1 FreeSWITCH的概念
3.1.2 FreeSWITCH的功能
3.2 快速体验
3.2.1 安装基本FreeSWITCH系统
3.2.2 连接SIP电话
3.3 配置FreeSWITCH
3.4 FreeSWITCH用作软电话
3.5 配置SIP网关拨打外部电话
3.5.1 从某一分机上呼出
3.5.2 呼入电话处理
3.6 小结
第4章 运行FreeSWITCH
4.1 命令行参数
4.2 系统启动脚本
4.3 判断FreeSWITCH是否运行
4.4 控制台与命令客户端
4.5 呼叫
4.5.1 发起呼叫
4.5.2 呼叫字符串
4.6 API与App
4.7 API命令帮助
4.8 小结
第5章 FreeSWITCH架构
5.1 总体架构
5.1.1 核心
5.1.2 接口实现
5.2 目录结构
5.3 配置文件
5.3.1 freeswitch.xml
5.3.2 vars.xml
5.3.3 autoload_configs目录
5.3.4 其他
5.4 XML用户目录
5.5 呼叫相关概念
5.5.1 来去话、Session、Channel与Call
5.5.2 回铃音与Early Media
5.5.3 全局变量与局部变量
5.6 小结
第6章 拨号计划
6.1 XMLDialplan
6.1.1 配置文件的结构
6.1.2 默认的配置文件简介
6.1.3 正则表达式
6.1.4 通道变量
6.1.5 测试条件
6.1.6 动作与反动作
6.1.7 工作机制深入剖析
6.1.8 内联执行
6.1.9 实例解析
6.2 inline Dialplan
6.3 其他Dialplan
6.4 常用的Dialplan App
6.5 在Dialplan 中使用API命令
6.6 深入理解通道变量及相关操作
6.7 小结
第7章 SIP协议
7.1 SIP协议基础
7.1.1 HTTP与SIP协议基础
7.1.2 SIP的基本概念和相关元素
7.1.3 SIP协议的基本方法和头域简介
7.2 SIP注册
7.3 SIP呼叫流程
7.3.1 UA间直接呼叫
7.3.2 通过B2BUA呼叫
7.4 深入理解SIP
7.4.1 SIP URI
7.4.2 SDP和SOA
7.4.3 3PCC
7.4.4 SIP承载
7.5 小结
第8章 媒体
8.1 媒体与媒体处理
8.1.1 音频编码
8.1.2 媒体工作机理和相关配置
8.2 媒体协商
8.2.1 协商过程
8.2.2 SDP及其在编码协商中的作用
8.2.3 协商时机与策略
8.3 其他媒体相关的问题
8.3.1 RTP和RTCP
8.3.2 转码
8.3.3 透传、媒体绕过与媒体代理
8.3.4 Media Bug
8.3.5 视频
8.3.6 排错
8.4 小结
第9章 SIP模块
9.1 基本概念
9.2 Sofia配置文件
9.2.1 Profile配置文件
9.2.1 Profile的几个重要参数
9.2.2 external.xml
9.2.3 Gateway
9.3 常用命令
9.3.1 状态相关命令
9.3.2 Profile相关命令
9.3.3 SIP Capture
9.3.4 global相关
9.3.5 debug相关
9.3.6 其他命令
9.3.7 其他
9.4 NAT穿越
9.4.1 NAT的种类
9.4.2 FreeSWITCH的拓扑结构
9.4.3 NAT是怎么影响SIP/RTP通信的
9.4.4 NAT的穿越方法
9.5 小结
第二部分 实战篇
第10章 基本技能
10.1 调试与排错
10.1.1 解决问题的一般方法和流程
10.1.2 查看日志
10.2 使用外部工具抓包
10.2.1 tcpdump
10.2.2 tshark
10.2.3 ngrep
10.2.4 pcapsipdump
10.3 使用Wireshark抓包并分析呼叫
10.3.1 使用Wireshark抓包
10.3.2 使用Wireshark对抓包进行分析
10.4 originate命令实例解析
10.4.1 使用格式和参数
10.4.2 转入Dialplan
10.4.3 更改主叫号码
10.4.4 处理呼叫超时
10.4.5 防止命令阻塞
10.4.6 使用通道变量
10.4.7 Early Media对呼叫的影响
10.4.8 bridge也使用originate
10.4.9 bridge中的Early Media
10.4.10 bridge中的主叫号码
10.5 呼叫是怎样工作的?
10.6 FreeSWITCH图形用户界面简介
10.6.1 FusionPBX
10.6.2 blue.box
10.6.3 FreeSWITCH Portal
10.7 小结
第11章 基本功能与实现
11.1 批量创建用户
11.2 用FreeSWITCH实现WR
11.2.1 最简单的菜单
11.2.2 默认IVR简介
11.3 按时间进行路由
11.4 配置中文语音提示
11.4.1 最简单的实现方案
11.4.2 使用sound prefix
11.4.3 使用Phrase
11.4.4 使用中文语音提示
11.5 录音
11.5.1 单腿录音
11.5.2 对两条腿的通话进行录音
11.5.3 立体声
11.5.4 录音相关的通道变量
11.5.5 原生格式
11.6 放音
11.6.1 playback的参数
11.6.2 循环播放
11.6.3 Say
11.7 TTS
11.7.1 使用mod flite
11.7.2 mod_tts_commandline
11.7.3 MRCP
11.7.4 Google Translate
11.7.5 TTS小结
11.8 在呼叫失败的情况下向主叫用户播放语音提示
11.8.1 实现方法
11.8.2 进阶
11.8.3 使用TTS
11.8.4 原理
11.9 实现呼叫前转业务
11.10 小结
第12章 高级功能与配置实例
12.1 使用mod_fifo实现简单呼叫队列
12.1.1 呼叫停泊与取回
12.1.2 配置座席
12.1.3 fifo
12.2 使用mod callcenter实现呼叫中心应用
12.2.1 mod_callcenter模块简介
12.2.2 座席配置与管理
12.3 数据库
12.3.1 默认数据库中有什么?
12.3.2 ODBC
12.3.3 使用数据库原生客户端库直接连接数据库
12.4 视频通话
12.4.1 配置视频通话
12.4.2 视频录像与回放
12.4.3 视频转码
12.5 多人电话会议
12.5.1 音频会议
12.5.2 视频会议
12.6 话单
12.6.1 CSV格式的话单
12.6.2 直接将话单写入数据库
12.6.3 使用HTTP服务器接收话单
12.7 计费
12.8 小结
第13章 FreeSWITCH与FreeSWITCH对接
13.1 在同一台主机上启动多个FreeSWITCH实例
13.1.1 背景故事
13.1.2 练习
13.1.3 进阶
13.2 FreeSWITCH与FreeSWITCH对接
13.2.1 双机对接
13.2.2 汇接
13.2.3 双归属
13.2.4 长途局
13.2.5 ACL
13.3 FreeSWITCH作为PBX
13.3.1 普通的PBX设置
13.3.2 DID
13.3.3 使用PBX上的网关呼出
13.4 小结
第14章 FreeSWITCH与其他设备或系统对接
14.1 使用Doubango客户端连接
14.2 对接IMS
14.2.1 网关配置
14.2.2 通过IMS呼出
14.2.3 通过IMS呼入
14.2.4 其他问题
14.3 连接模拟话机和模拟中继线
14.3.1 FXS和FXO
14.3.2 拓扑结构
14.3.3 使用潮流网关连接模拟话机
14.3.4 使用迅时网关连接模拟话机和模拟中继线
14.4 通过E1线路与其他系统对接
14.4.1 配置FS1
14.4.2 配置E1网关设备
14.4.3 配置FS2
14.4.4 对接其他厂家的E1网关
14.5 对接Asterisk
14.5.1 从FreeSWITCH呼叫Asterisk
14.5.2 从Asterisk上呼叫FreeSWITCH
14.5.3 其他
14.6 使用H.323协议对接
14.6.1 mod_h323
14.6.2 mod_opal
14.6.3 其他
14.7 小结
第15章 其他技巧与实例
15.1 转接和代接
15.1.1 盲转
15.1.2 协商转
15.1.3 代接
15.2 共享线路呈现
15.3 使用组播功能做网络广播
15.4 DTMF
15.4.1 带内DTMF
15.4.2 RFC2833
15.4.3 SIP INFO
15.5 号码连选
15.5.1 注册到运营商服务器
15.5.2 通过单个号码呼出
15.5.3 使用随机数做号码连选
15.5.4 使用mod distributor进行连选
15.5.5 其他
15.6 收发传真
15.7 多租户
15.7.1 Domain简介
15.7.2 配置与实例
15.7.3 进阶
15.7.4 其他
15.8 使用loopback Endpoint外呼
15.9 在Web浏览器中打电话
15.9.1 Flash
15.9.2 WebRTC
15.10 HA
15.10.1 崩溃恢复实验
15.10.2 HA简介
15.10.3 双机HA实现细节及需要注意的问题
15.11 集群及分布式部署
15.11.1 大规模集群的总体结构
15.11.2 负载均衡配置实例
15.12 压力测试
15.12.1 参数和指标
15.12.2 呼叫测试
15.12.3 注册测试
15.12.4 编解码测试
15.12.5 测试结果
15.13 生产环境下的稳定性和安全性
15.13.1 稳定性
15.13.2 安全性
15.14 小结
第三部分 高级篇
第16章 嵌入式脚本
16.1 FreeSWITCH中的嵌入式脚本
16.2 Lua
16.2.1 Lua语法简介
16.2.2 将电话路由到Lua脚本
16.2.3 Session相关函数
16.2.4 非Session函数和独立的Lua脚本
16.2.5 Event相关函数
16.2.6 Chat相关函数
16.2.7 LUA拨号计划
16.2.8 连接数据库
16.3 其他脚本语言
16.3.1 JavaScript
16.3.2 Python
16.4 小结
第17章 嵌入式及HTTP开发
17.1 用Lua脚本写个小游戏
17.2 用Lua实现IVR
17.3 在会议中呼出
17.4 一个在FreeSWITCH中外呼的脚本
17.5 使用Lua脚本通过多个网关循环外呼
17.6 在FreeSWITCH中执行长期运行的嵌入式脚本
17.7 使用Lua提供XML Binding
17.8 语音识别
17.8.1 使用Pocket Sphinx进行中文语音识别
17.8.2 通过商业语音识别软件进行识别
17.9 使用mod_xml_curl提供动态用户管理
17.10 使用mod_xml_cdr模块处理话单
17.11 小结
第18章 Event Socket
18.1 架构
18.1.1 外连模式
18.1.2 内连模式
18.2 Event Socket协议
18.2.1 外连
18.2.2 内连
18.2.3 Event Socket命令详解
18.3 Event Socket库
18.3.1 Event Socket示例
18.3.2 ESL函数说明
18.4 事件
18.4.1 事件的学习方法
18.4.2 常用事件简介
18.5 小结
第19章 使用ESL开发
19.1 创建独立的ESL应用
19.1.1 创建目录和源文件
19.1.2 编译和执行
19.1.3 将源代码纳入版本控制
19.2 用ESL重写空中充值服务
19.3 用ESL写一个ACD
19.4 用Inbound模式实现IVR
19.5 使用Java连接ESL
19.6 使用Erlang控制呼叫流程
19.6.1 准备工作
19.6.2 将来话交给Erlang处理
19.6.3 用Erlang实现空中充值服务
19.6.4 用Erlang状态机实现空中充值服务
19.6.5 其他
19.7 定时呼叫
19.8 小结
第20章 源代码导读及编译指南
20.1 准备FreeSWITCH源代码环境
20.2 FreeSWITCH源代码目录结构
20.3 FreeSWITCH源代码导读
20.3.1 APR
20.3.2 SWITCH APR
20.3.3 main函数
20.3.4 可加载模块
20.3.5 模块的结构
20.3.6 Session和Channel
20.3.7 SWITCH IVR
20.3.8 Core IO
20.3.9 Core Media
20.3.10 Core RTP
20.3.11 SWITCH XML
20.3.12 SWITCH Event
20.3.13 Core Codec和Core File
20.4 FreeSWITCH源代码的编译
20.4.1 首次编译
20.4.2 增量编译
20.4.3 常见问题及最佳实践
20.5 小结
第21章 FreeSWITCH源代码分析
21.1 mod_dptools
21.1.1 echo
21.1.2 answer
21.1.3 set
21.1.4 bridge
21.1.5 Endpoint Interface
21.1.6 模块框架
21.2 mod_commands
21.2.1 模块框架
21.2.2 originate
21.3 mod_sofia
21.3.1 模块加载
21.3.2 Sofia的加载及通话建立
21.4 小结
第22章 FreeSWITCH二次开发
22.1 给FreeSWITCH汇报Bug和打补丁
22.1.1 修复内存泄露问题
22.1.2 给中文模块打补丁
22.1.3 给FreeSWITCH核心打补丁
22.1.4 高手也会犯错误
22.1.5 汇报严重的问题
22.1.6 给Sofia-SIP打补丁
22.1.7 给现有App增加新功能
22.1.8 给FreeSWITCH增加一个新的Interface
22.2 写一个新的FreeSWITCH编解码模块
22.3 从头开始写一个模块
22.3.1 初始准备工作
22.3.2 写一个简单的Dialplan
22.3.3 增加一个App
22.3.4 写一个API
22.3.5 小结
22.4 使用libfreeswitch
22.4.1 自己写一个软交换机
22.4.2 使用libfreeswitch提供的库函数
22.4.3 其他
22.5 调试跟踪
22.6 小结
附录A FreeSWITCH开源软件社区指南
附录B 关于FreeSWITCH常用术语翻译的意见
附录C 模块列表
附录D FreeSWITCH架构详细示意图
后记