使用OpenSER构建电话通信系统——第八章(3)

使用OpenSER构建电话通信系统 OpenSer官方退出的开发指南。相当权威。是中文版。 OpenSips也是继承于OpenSer,所以使用OpenSips开发的朋友也可以使用。 立即下载
注:以下文章如需转载,请注明所属作者,转载地址,谢谢!

 

 

检查配置文件(Ispecting the Configureation File)

我们的脚本正变得难以debug。现在,让我们介绍XLOG模块。它实现了XLOG函数。这个函数与LOG()函数很相似,但是它允许你在消息中使用诸如请求URI($ru)的伪变量。下面有一个使用XLOG的例子。

loadmodule "xlog.so"

xlog("L_ERR","Marker 480 ruri=<$ru>");

你可以使用下面的命令来检查最近的XLOG消息:

tail /var/log/syslog

在呼叫盲转中,只有一开始的INVITE消息会被处理,了解这一点是很重要的;我们能够安全地对请求URI和通话进行修改,append_branch不需要被调用。

另一方面,对于忙线时和无人接听时的呼叫前转,在开始的INVITE失败后,要在这时派生消息你就必须要执行append_branch()函数。

t_on_failure(“ 1 ” );

t_on_failure()函数告诉OpenSER如果(negative/unsuccessful replies)这些出错状况发生了,就要去处理之。在本上下文中的出错状况是那些以4××和5××开头的错误信息。在调用t_relay()函数之前当你调用t_on_failure时,要告知OpenSER当收到出错信息时将控制权转给failure_route[1]。

failure_route[1] {

##--

##-- If cancelled, exit.

##--

if (t_was_cancelled()) {

exit;

};

failure_route的第一部分处理487 cancelled消息。这个脚本对于此类信息只是简单将处理终止。接下来我们将处理busy消息。

##--

##-- If busy send to the e-mail server, prefix the "b"

##-- character to indicate busy.

##--

if (t_check_status("486")) {

revert_uri();

prefix("b");

xlog("L_ERR","Stepped into the 486 ruri=<$ru>");

rewritehostport("192.168.1.171");

append_branch();

route(1);

exit;

};

如果状态变为486,那么执行的动作就是还原URI(486是对于INVITE请求的一个出错消息),URI以“b”打头(告知语音邮箱系统要播放线路正忙的消息)并重写主机地址,将消息发送给语音邮箱系统。调用append_branch()来将目的地址添加到请求中。相同的处理逻辑被应用在对消息408和480的处理上。

##-- If timeout (408) or unavailable temporarily (480),

##-- prefix the uri with the "u"character to indicate

##-- unanswered and send to the e-mail

##-- sever

##--

if (t_check_status("408") || t_check_status("480")) {

revert_uri();

prefix("u");

xlog("L_ERR","Stepped into the 480 ruri=<$ru>");

rewritehostport("192.168.1.171");

append_branch();

route(1);

exit;

};

Asterisk服务器上的extesions.conf配置文件要写成下面这样。语音邮箱帐号要创建成同OpenSER上的帐号相符。你也可以整合两个数据库以避免维护双数据库入口,具体请参考http://www.voip-info.org/wiki/view/Realtime+Integration+Of+Asterisk+With+OpenSER上面的教程。

#extensions.conf file

[default]

exten=>_9.,1,Dial(ZAP/g1/${EXTEN})

exten=>_9.,2,hangup()

exten=>_u.,1,Voicemail(u${EXTEN})

exten=>_u.,2,hangup()

exten=>_b.,1,Voicemail(b${EXTEN})

exten=>_b.,2,hangup()

实验——测试呼叫前转特性(Lab——Testing the Call Forward Feature)

要完成这个实验,对于语音邮箱部分的整合需要asterisk方面的一些经验。这个实验实现起来有些难度。有些IP电话很难发送出busy消息,因为它们有不止一条线路。在获得“486” busy消息之前,要使用所有的线路对于这个实现的成功是很重要的。有一种SNOM的ip电话,具有一个busy按钮用来告知用户电话正忙。为了降低实验难度和复杂性,我们将减少INVITE的超时时间。在产品的环境上,去掉这些语句。

modparam("tm", "fr_timer", 5)

modparam("tm", "fr_inv_timer", 20)

步骤1:测试无人应答的呼叫前转

用1000呼叫1002。这通电话应该捎带着“不可得消息”(unavailable message)转向语音邮箱系统。

步骤2:测试忙线呼叫前转。

将1003摘机。用1000呼叫1003。这通电话应该捎带着“忙线消息”(busy message)转向语音邮箱系统。

概要(Summary)

这一章中,我们学会了如何使用AVPs来处理诸如呼叫前转之类用户喜好(user preferences)。使用failure_route允许我们实现两种通常情况下的呼叫前转,忙线和无人应答。最后我们还学会了如何将此类消息发送到外部的语音邮箱系统,譬如asterisk服务器。

 

 

结束语:这本书就翻译到这里了,有了上面的对openser的基本认识,我想,再通过实践和opensips官网的文章的洗礼,相信大家都能够对opensips掌握了。

 
 
 
 
 
 
 
 
 
 
 
<script>window._bd_share_config={"common":{"bdsnskey":{},"bdtext":"","bdmini":"2","bdminilist":false,"bdpic":"","bdstyle":"0","bdsize":"16"},"share":{}};with(document)0[(getelementsbytagname('head')[0]||body).appendchild(createelement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new date()/36e5)];</script>
阅读(1216) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-10-26 16:47:46

感谢分享

评论热议
AltiumDesigner.zip 立即下载

相关推荐

风储VSG-基于虚拟同步发电机的风储并网系统Simulink仿真

内容概要:本文介绍了“Plecs全桥LLC谐振变换器仿真模型”这一技术资源,聚焦于隔离型全桥LLC谐振变换器的建模、仿真与参数设计,涵盖其在电力电子系统中的关键应用,如软启动、闭环控制、变频控制及效率优化等。该模型支持对LLC变换器在不同工作模式下的动态响应与性能表现进行深入研究,适用于探究谐振拓扑结构、磁性元件设计、谐振参数匹配以及先进控制策略的科研与工程实践。同时,文档配套提供了仿真模型、设计报告与计算书等完整资料,强化了其实用性与教学价值。; 适合人群:具备电力电子、自动化或电气工程等相关专业背景,从事电力电子变换器研发、系统仿真与控制算法设计的科研人员、工程师及研究生。; 使用场景及目标:①用于全桥LLC谐振变换器的建模、仿真与动态性能分析;②支持对软启动过程、闭环稳压控制、变频调谐及效率优化等核心技术的研究与教学;③为电力电子电源系统的工程设计、参数优化与控制策略验证提供高精度仿真平台。; 阅读建议:建议结合Plecs或Simulink等仿真工具进行动手实践,重点理解电路拓扑构建、谐振参数计算、控制器设计与系统稳定性分析,并配合文档中的设计报告与计算书,系统掌握从理论到仿真的完整流程。

使用OpenSER构建电话通信系统——第六章(1)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!<h1 style="mso-line-height-alt:5.0pt;page-break-before:always;mso-list:none; tab-stops:21.0pt"><span lang="AR-SA" style="font-size:14.0pt;font-family:宋体; mso-ascii-font-fa

老黑 866

国央企创新负责人如何通过平台实现科技创新资源的系统集成与高效配置?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

使用OpenSER构建电话通信系统——第八章(1)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!<h1 style="mso-line-height-alt:5.0pt;page-break-before:always;mso-list:none; tab-stops:21.0pt"><span lang="AR-SA" style="font-size:14.0pt;font-family:宋体; mso-ascii-font-fa

老黑 747

星网宇达Newton-M2设备安装及配置

主要介绍了星网宇达Newton-M2设备的配置过程

weixin_49353445的博客 2676

centos7下安装gcc-10.3.0

生成多个系统版本的代码,如果你的操作系统是32位,默认就已经设置为 disable,这时gcc仅能生成32位的可执行程序;这里只开启了c,c++ 和fortran,因为支持的语言越多,就需要安装越多的相应静态与动态库,还有五花八门的依赖库,这会让管理变得困难,体积也会变得庞大。启用posix标准的线程支持,这个设置取决于宿主或目标操作系统的类型,其它可用值有:aix,dec,solaris,win32等,如果你是其它的类UNIX系统,就需要设置相应的值。指定安装路径,这里没有指定,就直接放到文件夹里就好。

lxystar2003的博客 1189

SIP介绍

前言:openser已经成为opensips项目,但是本书的内容绝大部分是适合于学习相关知识的。所以还是针对原书原封不动的做的翻译。使用OpenSER构建电话通信系统Building Telephony Systems with OpenSER第一章:SIP介绍(Introduction to SIP)会话初始化协议是互联网工程任务组(IETF)制定的协议标准,在多个RFC(Request for Comments)文档中被进行了描述说明。RFC3261是最近的一个RFC,一般称它为SIP版本2。SIP是一

gdjylks的专栏 1002

esxi8.0.3如何添加USB外置硬盘

本文介绍了在ESXi系统中配置外置USB硬盘作为数据存储的完整步骤:1)通过SSH禁用USB仲裁服务并关闭自启;2)识别已连接的USB硬盘设备路径;3)使用partedUtil创建GPT分区表并计算扇区范围;4)设置VMFS6分区并格式化。关键命令包括停止usbarbitrator服务、partedUtil分区操作以及vmkfstools格式化命令。整个过程需通过SSH执行,最终将USB硬盘配置为名为"USB_Datastore"的VMFS6存储设备。

qq_41683719的博客 1546

使用OpenSER构建电话通信系统——第八章(2)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!实现呼叫盲转(Implementing Blind Call Forwarding) <p class="MsoNormal" style="text-indent:21.0pt;line-height:22.0pt;mso-line-height-rule: exactly"><span style="font-family:宋体;m

老黑 682

innovus:InstPad、CellPad 、module padding、clock cell halo

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?site_num指的是padding的大小以site宽度为单位。

m0_61544122的博客 2027

华为OD机考双机位C卷 - 池化资源共享 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 池化资源共享 (OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 1072

使用OpenSER构建电话通信系统——第五章(3)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!Openserctl shell脚本Openserctl工具是安装在/usr/sbin上的shell脚本。被用来使用命令行的方式来对OpenSER进行管理。可以用来进行:l         启动,终止,重启OpenSERl         展示,授权,撤销ACLsl         添加,删除,列出别名l         添加,删除,配置AVP

老黑 1632

携程滑块、点选验证码登录识别逆向

本文分析了携程登录系统的风控机制,主要包含三种验证场景:无验证码、滑块验证码和二次图标点选验证码。通过跟踪risk_inspect风控接口,发现验证流程采用标准AES加密,需提交设备指纹等加密信息。当触发验证码时,需额外提交包含轨迹坐标的verify_msg参数及token/rid参数。最终通过风控检测后,需使用一致的指纹参数和验证token完成加密登录。文章强调所有分析仅用于学习,代码实现需确保符合法律规范。

码王吴彦祖的博客 1100

使用OpenSER构建电话通信系统——第一章(2)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!基本消息(Basic Messages) <p class="MsoNormal" style="text-indent:21.0pt;line-height:22.0pt;mso-line-height-rule: exactly"><span lang="AR-SA" style="mso-bidi-font-size:10.5pt

老黑 1291

微波技术仿真:微波谐振器分析_(2).微波谐振器理论

谐振器是一种能够在特定频率范围内存储和释放电磁能量的器件。在微波频段,谐振器通常用于滤波、频率选择和能量存储等应用。一个理想的谐振器在谐振频率下能够存储无限大的能量,但在实际应用中,由于损耗的存在,谐振器的性能会受到一定限制。微波谐振器在微波通信、雷达系统、微波测量和微波电路设计等领域中发挥着重要作用。谐振器的设计需要考虑多个因素,包括谐振频率的精确控制、损耗的最小化、频率稳定性的提高和小型化设计。通过理论分析和仿真工具的使用,可以有效优化谐振器的性能,满足实际应用的需求。

2401_87715305的博客 934

谁在 SAP 系统里说了算:事务码 SCC4 与 SE06 的分工、优先级与实战管控

SAP系统通过SE06和SCC4两套机制控制变更权限:SE06作为系统级"总闸"管理跨Client对象修改,SCC4作为Client级"分闸"控制Client内配置变更。两者存在明确优先级,SE06的全局设置优先于SCC4。当SE06设为"不可修改"时,即使SCC4开放也无法更改跨Client对象。实际项目中需同时检查两处设置,并遵循"最小开放"原则进行变更管理。这种分层设计既满足日常维护需求,又能实现严格的变更管控。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 229

使用OpenSER构建电话通信系统——第五章(1)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!第五章:用MySQL添加认证(Adding Authentication with MySQL)在这一章中我们将学到如何使用几种数据库后端来对SIP请求进行鉴定并提供诸如位置和别名表等数据的持续性。最主要的是,我们将使用MySQL来做每一件事。这一章分为两个部分。第一个部分,我们将学到如何实现认证,第二部分我们将学到如何处理不同方向的通话。这一

老黑 1086

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

使用OpenSER构建电话通信系统——第四章(1)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!<h1 style="margin-left:0cm;text-indent:0cm;mso-line-height-alt:5.0pt; page-break-before:always;tab-stops:0cm"><span lang="AR-SA" style="font-size:14.0pt; font-family:宋体;ms

老黑 1045

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

提供《使用OpenSER构建电话通信系统》中文翻译版本下载

提供《使用OpenSER构建电话通信系统》中文翻译版本下载    感谢网友将这本《使用OpenSER构建电话通信系统》整理城doc文档,方便了大家,在此非常之感谢,感谢这个开源的世界,感谢互联网。《使用OpenSER构建电话通信系统》 管理员在2009年8月13日编辑了该文章文章。 -->

老黑 865

使用OpenSER构建电话通信系统——第七章(3)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!实验——使用LCR特性(Lab——using the LCR Feature)<p class="MsoNormal" style="text-indent:21.0pt;line-height:22.0pt;mso-line-height-rule: exactly"><span style="font-family:宋体;mso-asci

老黑 804

使用OpenSER构建电话通信系统——第二章

<h1 style="margin-left:0cm;text-indent:0cm;mso-line-height-alt:5.0pt; page-break-before:always;tab-stops:0cm">注:以下文章如需转载,请注明所属作者,转载地址,谢谢!<h1 style="margin-left:0cm;text-indent:0cm;mso-line-height-alt

老黑 776

使用OpenSER构建电话通信系统——第一章(1)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!前言:openser已经成为opensips项目,但是本书的内容绝大部分是适合于学习相关知识的。所以还是针对原书原封不动的做的翻译。使用OpenSER构建电话通信系统 Building Telephony Systems with OpenSER第一章:SIP介绍(Introduction to SIP) 会话初始化协议是互联网工程

老黑 763

使用OpenSER构建电话通信系统——第七章(1)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!<h1 style="mso-line-height-alt:5.0pt;page-break-before:always;mso-list:none; tab-stops:21.0pt"><span lang="AR-SA" style="font-size:14.0pt;font-family:宋体; mso-ascii-font-fa

老黑 603

使用OpenSER构建电话通信系统——第五章(2)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!安装 MySQL支持 <p class="MsoNormal" style="text-indent:21.0pt;line-height:22.0pt;mso-line-height-rule: exactly"><span lang="AR-SA" style="mso-bidi-font-size:10.5pt;font-fami

老黑 596

使用OpenSER构建电话通信系统——第四章(2)

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!路由基础(Routing Basics) <p class="MsoNormal" style="text-indent:21.0pt;line-height:22.0pt;mso-line-height-rule: exactly"><span lang="AR-SA" style="mso-bidi-font-size:10.5pt

老黑 548
上一篇: 使用OpenSER构建电话通信系统——第八章(2)
下一篇: 提供《使用OpenSER构建电话通信系统》中文翻译版本下载
老黑徒
博客等级 码龄23年 9粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值