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

Kamailio(OpenSER)开源SIP服务器-呼叫重定向 Kamailio是一个开源的SIP服务器,原名OpenSERKamailio is an Open Source, GPL2, SIP Server Routing Platform. It is written in C for Linux/Unix plaforms and focuses on performance, flexibility and security. On Nov 04, 阅读详情

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!

第八章:通话前转和语音邮件(call forward and voice mail)

通话前转是VoIP服务提供商提供的重要的特性。它的实现有两种方式,一种是派生(forking),一种是重定向。当使用派生时,新的通话分支将会被创建,在首选的目的地失败时(busy或timeout),它会向新的目的地发送新的INVITE消息。而使用重定向,代理只是会向发起者发送应答信息,并将新的重定向的通话地址告诉发起者。

本章结束你将能够:

l         描述诸如派生和重定向的概念

l         实现通话前转

l         实现忙线时的通话前转

l         使用AVP资源存储通话前转数据

l         使用失败路由块(failure route)前转没有应答和忙线的通话

在本材料中,我们只适用派生,因为它比重定向更加安全,而且还能够允许我们对通话进行计费。重定向的方法对于VoIP服务提供者来说几乎是无用的,因为代理不在通话的路径当中,在这种情况下根本无法计费。

让我们来检验一下我们的进度。VoIP服务提供商的解决方案中有许多部件。为了避免失去对整体的把握,我们在每一章中都会展示下面的这幅图。在这一章中,我们将同媒体服务器合作(采用Asterisk Voice Mail)。还有许多其他的媒体服务器可供选择,如SEMS(SIP Express Media Server www.iptel.org/sems),Yate,FreeSwitch等等。我们之所以选择Asterisk是因为它非常流行。“前转”对于在某些情况下将通话送到媒体服务器是非常重要的特性。本章我们会介绍语音邮件(voicemail)的使用。媒体服务器还可以被很多应用使用,如:IVRs,播放提示信息,播放语音文本,和声音识别等。请记住,SIP代理从不会去处理媒体,所以在需要对媒体进行的处理的情况下,你需要媒体服务器。


本章学习完后,VoIP服务提供商将能够使用连续派生将无应答和忙线的通话发送到语音邮箱服务器上。

通话前转(Call Forwarding)

本章中,我们将实现三种通话前转。此前转对于语音邮箱的操作很重要。

l         盲转(Blind call forwarding)——所有打给某一电话号码的通话的INVITE请求都会被立即重新指向存储在user_preferences表中的电话号码。SIP路由器将派生出一路指向新地址的通话。配置了前转的话机无论是否注册上,都不会振铃。

l         忙线前转(Forward on busy)——在这种情况下,我们将使用failure_route特性来拦截“486 Busy”消息,并创建一个新的通话将INVITE请求发送到最终的目的地。

l         无应答前转(Forward on no answer)——如果话机对于INVITE请求的回复是“408 Request Timeout”,那么OpenSER也会使用failure_route特性来拦截该消息并创建新的通话将INVITE消息发送到最终的目的地。

所有的呼叫前转的目的地址都被存储在叫做user_preferences的表中。我们在这一章将介绍如AVPs(Attribute-Value Pairs)和伪变量(pseudo-variables)的一些新的概念。AVPs是OpenSER的核心使用。AVPOPS(Attribute-Value Pairs Operations)模块提供了几个操作AVPs(如,同SIP请求和数据库进行交互,使用字符串和正则表达式进行操作。)的函数。

伪变量(Pseudo-Variables)

伪变量是系统变量,你可以在你的脚本中将其作为参数或内部函数(inside functions)使用。在脚本执行之前,这些变量会被相应的值替换掉。有些模块可以接受伪变量,如:

l         ACC

l         AVPOPS

l         TEXTOPS

l         UAC

l         XLOG

伪变量的名字总是以“$”开头。如果你想要在你的脚本中使用$字符,那么你必须像这样进行换码——$$。有一个伪变量的预定义集合。OpenSER1.1中使用的OpenSER伪变量如下:

$ar

Auth realm

$au

Auth username

$br

Request's first branch

$bR

All Request's branches

$ci

Call-ID header

$cl

Content length

$cs

Cseq

$ct

Contact Header

$cT

Content Type

$dd

Domain of destination URI

$di

Diversion header URI

$dp

Port of destination URI

$dP

Transport protocol of destination URI

$ds

Destination set

$du

Destination URI

$fd

From URI domain

$fn

From display name

$ft

From Tag

$fu

From URI

$fU

From URI username

$mb

SIP message buffer

$mf

Flags

$mF

Flags in hexadecimal

$mi

SIP message ID

$ml

SIP message length

$od

Domain in SIP request's original URI

$op

Port of Sip request's original URI

$oP

Transport protocol of SIP request's original URI

$ou

Request's original URI

$oU

Username in SIP request's original URI

$pp

Process id

$rd

Domain in SIP request's URI

$rb

Body of request/reply

$rc

Returned code

$rm

SIP request's method

$rp

SIP request's port of R-URI

$rP

Transport protocol of SIP request URI

$rr

SIP reply reason

$rs

SIP reply status

$rt

Refer-to URI

$ru

SIP request's URI

$rU

Username in SIP request's URI

$Ri

Received IP address

$Rp

Received Port

$si

IP source address

$sp

Source port

$td

To URI domain

$tn

To display name

$tt

To tag

$tu

To URI

$tU

To URI username

$Tf

String formatted time

$Ts

Unix time stamp

$ua

User agent header

$re

Remote-Party-ID header URI


AVP(Attribute-Value Pair)概览(AVP Overview)

属性-值对的操作相当于是允许了对用户的首选项(user preferences)进行访问和操作。AVP可以看作是与标识(字符串或整数)相关联的一个值。在OpenSER的处理过程中,AVP与事务捆绑在一起。当事务开始时,AVP被分配,当其结束时,则被释放。

AVPs的出现创造了一些服务实现和用户或域名的用户首选项处理的新的可能性。它们可以在配置脚本中被直接使用并从MySQL数据库中加载数据。

属性-值对的引用与变量的引用非常相似。

       $avp(id[N])

Where ID is:

l         si : name —— AVP标识名称。“s”和“i”分别表示字符串和整数。

l         name —— 别名AVP的名称。可以是字符串,也可以是整数。

例子:

       $avp (i: 700)

       $avp (s: blacklist)

对于了解Asterisk的人来说,AVPOPS模块之于OpenSER就相当于AstDB函数之与Asterisk。然而,实现方式非常不同,AVPs更加强大,允许一些更加高级的特性,如数据库的查询和直接将数据插入SIP包等。有许多与AVPs相联系的函数如下:

l         avp_db_load:将AVPs从数据库加载至内存

l         avp_db_store:将AVPs存进数据库

l         avp_db_delete:从数据库中删除AVPs

l         avp_db_query:进行数据库查询并将结果存进AVP中

l         avp_delete:从内存中删除AVPs

l         avp_pushto:将AVP的值插入sip消息

l         avp_check:使用一个操作符和一个值来检查AVP的值

l         avp_copy:拷贝AVP到另一个

l         avp_printf:格式化一个字符串到AVP

l         avp_subst:查找并替换一个值到AVP

l         avp_op:允许在AVPs上进行算术操作

l         is_avp_set:检查这个AVP名字是否被设置

l         avp_print:打印内存中的所有AVPs(为了debug)

由于文档中的这些函数,你可以对句法进行检查。现在,我们必须要了解如何使用avp_db_load和avp_pushto,它们将用在我们的脚本中。关于AVPs在http://www.voice-system.ro/docs上有一篇非常棒的教程。

AVPs不是很简单。但是如果你把它想象成一对简单的属性和值,那么它们其实也不是那么的复杂。然而,数据库中的AVPs的加载是非常令人费解的。默认的表是usr_preference。有时候我们想要的值并不是和一个特定的用户相关,而是同一个域相关。不管怎样,所有从数据库中被加载的AVPs都来自usr_preference表。

举例:对于呼叫前转,我们有一个与用户相关的前转呼叫。确实是一个usr_preference(用户优先)。让我们来查看usr_preference表的结构。

Id是一个自增域。

l         uuid是一个唯一的用户标识

l         username是用户名

l         domain代表域

l         attribute(AVP名称)

l         type(0–AVP str|Val Str, 1–AVP str|Val Int, 2–AVP int|Val Str,3-AVP int|Val int)

l         value(AVP值)

l         last modified(最后修改的日期)

AVPs可以与一个用户相关联也可以与一个域相关联。所以,你能够使用这两个参数中的任何一个来加载AVPs。你可以将AVP与uuid(唯一的用户ID)相关联,与一个用户名相关联(单域设置),或者与用户名和域建立多域设置关系。

函数 avp_db_load的第一个参数是源(source),第二个是avp_name。所以,下面的函数将以字符串的形式加载与被请求用户名中的URI相符合的用户的AVP名称为callfwd的AVP值。

(avp_db_load("$ruri/username","s:callfwd")

之后,我们将把这个AVP插进SIP包中,以将原来的$ruri进行改造。

avp_pushto("$ruri","s:callfwd");

换句话说,如果这个用户设置了对应的呼叫前转号码,那么这通通话将不会呼给原来的用户,而是呼给存储在AVP s : callfwd中的用户。呼叫前转的特别之处就在于将呼叫前转号码插入了usr_preference表中。

AVPOPS模块假造和参数(AVPOPS Module Loading and Parameters)

在模块加载中,我们指定数据库地址,访问参数和AVP表。

loadmodule "/usr/lib/openser/modules/avpops.so"

modparam("avpops", "avp_url", "mysql://openser:openserrw@localhost/openser")

modparam("avpops", "avp_table", "usr_preferences")

<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>
阅读(1364) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
使用OpenSER构建电话通信系统 Building Telephony Systems With OpenSER 原文翻译为中文版本 立即下载

相关推荐

OpenSIPS/OpenSER-a versatile SIP Server-开源

OpenSIPS(以前的OpenSER)是多功能SIP服务器的GPL实现,旨在提供用于专业SIP服务器平台的高级技术解决方案(性能,安全性和质量)。 重要提示:这不再是项目的主要托管。 这已在GITHUB上移动-https://github.com/OpenSIPS/opensips

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

MRST开源油藏模拟:从入门到精通的全流程指南

本文全面介绍了MRST开源油藏模拟工具的使用方法,从环境搭建到核心功能实战,再到性能优化和工业级应用。MRST作为一款基于MATLAB的开源工具,为油藏工程师提供了强大的数值模拟能力,特别适合教学和科研场景。文章还分享了二次开发技巧和常见问题解决方案,帮助读者快速掌握油藏模拟技术。

beer8的博客 326

OpenSergo使用详解

OpenSergo是一个基于微服务治理的标准和生态,覆盖了服务元信息、流量治理、服务容错、数据库/缓存治理、服务注册发现、配置治理等十几个关键领域,覆盖了完整的微服务生命周期(从开发态到测试态,到发布态,再到运行态)。OpenSergo标准基于微服务治理中相关领域的实践与场景抽象,旨在定义服务之间的服务注册和发现能力,使得异构微服务体系可以互联互通。同时,它还定义了服务元信息格式和服务治理具体能力,描述这些能力所要达到的效果。OpenSergo的架构包括控制面和通信协议以及数据面。

技术人集结地 2861

欧姆龙OMRON PLC之HostLink通讯协议(四)-FINS命令进阶应用与调试技巧

本文深入探讨欧姆龙OMRON PLC的HostLink通讯协议中FINS命令的进阶应用与调试技巧。文章聚焦实战排错,详细解析命令帧解剖、响应帧解读与网络抓包三大核心方法,并分享性能优化策略,如合并读写与异步设计。同时介绍了强制操作、多存储区访问等高级命令的应用场景,旨在帮助工程师高效解决现场通讯问题,提升系统稳定性与效率。

nept的博客 750

【一步到位】Android Studio 实现安卓连接阿里云物联网云平台

最新版本目前是Android Studio Iguana | 2024.1.2,你可以到官网上去找之前的版本,手上有工作项目的不要去轻易尝试,说不定你就编译失败了,失败了也不要担心,解决就可以了。

m0_73799445的博客 1万+

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

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!     检查配置文件(Ispecting the Configureation File) 我们的脚本正变得难以debug。现在,让我们介绍XLOG模块。它实现了XLOG函数。这个函数与LOG()函数很相似,但是它允许你在消息中使用诸如请求URI($ru)的伪变量。下面有一个使用XLOG的例子。 loadmodule "xlog

老黑 725

国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

DLL,非.net开发,所以无需安装配置,直接程序引用开发即可,支持各类开发语言。已知省份有广西、贵州、安徽、河北、黑龙江、湖南、吉林、江苏、四川、新疆等各地方。国家医保移动支付国密算法SM2签名验签、SM4加解密DLL。//SM4加密与解密。支持医保移动支付(国家统一版),//SM2签名与验签。

4264

使用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

STM32+ESP8266+MQTT协议连接阿里云物联网平台

一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 开发软件:keil5 二、实现功能 通过阿里云物联网服务器实现设备数据远程上传、下发,实现数据交互。 在当前使用的开发板上有4盏LED灯、一个蜂鸣器、4个按键。 三、阿里云物联网服务器创建步骤 说明:如果没有账号的话,先点击网页右上角,注册一个账号,并完成实名认证再继续下一步。 产品名称根据自己情况填...

6万+

用python画带有正负值的条形图

常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析

weixin_44853840的博客 5384

Kamailio 简介

Kamailio项目诞生于2005年7月,它是从德国FhG FOKUS研究所主导的SIP Express Router(SER)项目组分裂出来的。新项目建立的目标是创建一个开放的开发环境,以建立一个强大的可扩展的开源SIP服务器。最初,新项目命名为OpenSer,后来因为商标侵权问题,在2008年7月28号,重命名为Kamailio(另外一个分枝是OpenSips)。         Kama

至虛極,守靜篤 1万+

【电容/电感】电路板会“滋滋”的响,我们称它为啸叫

一、啸叫的起源 大部分硬件工程师应该都遇到过,PCBA上电后出现“滋滋滋”的叫声,其声响或大或小,或时有时无,或深沉或刺耳,或变化无常者皆有。该现象我们称为“啸叫”,一般分为电感啸叫和电容啸叫。

云轩阁 6万+

Diameter协议

Diameter 是一种用于认证、授权和计费 (Authentication, Authorization, and Accounting,AAA) 的协议,它主要应用于电信网络和互联网服务的管理,特别是 3G、4G、5G 网络中的用户管理和计费系统。Diameter 是RADIUS 的替代协议,具有更强的扩展性和灵活性。以下是对 Diameter 及其使用场景的详细介绍,包括其原理、命令、消息结构和具体示例。Diameter 协议提供了以下三种核心功能:Diameter 协议基于请求-响应模式,客户端发出

pumpkin84514的博客 4010

关键!C#工业上位机界面设计终极指南:WinForm/WPF怎么选?【工业实战完整版,无废话选型+避坑+落地技巧】

工业上位机UI选型指南:WinForm与WPF核心对比 摘要: 本文基于工业实战视角,对比WinForm与WPF在工业上位机开发中的适用性。WinForm凭借GDI+原生渲染、极致兼容性(完美支持Win7/XP)、低资源占用和硬件底层调用优势,成为老旧工控机、简单监控系统和7×24小时运行设备的首选。WPF则依托DirectX硬件加速、MVVM架构和强大可视化能力,更适合复杂可视化大屏、3D模拟等高端场景及需要长期迭代的大型项目。核心选型原则是:优先考虑稳定性与兼容性,WinForm解决"能不能用

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 729

深度学习工具包 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'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('DeepLearnToolbox'));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('state',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'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',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 = 'sigm';%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, 'Too big error');```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('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';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)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';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, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% 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'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 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, 'Too big error');```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('state',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, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',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, 'Too big error');%% ex3 neural net with dropoutrand('state',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, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % 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, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % 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, 'Too big error');%% 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('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % 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, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

AVP(Attribute-Value Pair)

AVP(Attribute-Value Pair) VoIP服务使用AVP资源存储通话前转数据,属性-值对的操作相当于是允许了对用户的首选项(user preferences)进行访问和操作。AVP可以看作是与标识(字符串或整数)相关联的一个值。在OpenSER的处理过程中,AVP与事务捆绑在一起。当事务开始时,AVP被分配,当其结束时,则被释放。 AVPs的出现创造了一些服务实现和用户或...

iteye_7332的博客 1379

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

opensips实战教程(三):路由脚本介绍与实战

目录 前言 1、路由脚本opensips.cfg结构简介 2、脚本路由逻辑介绍与实战应用 2.1 route路由和子路由实战:将用户信息存储到redis 2.2 onreply_route请求响应路由:将呼叫状态上报 2.3 其他路由类型介绍 3、在脚本中调用自己编写的函数 前言 OpenSI...

I_O_fly的博客 3749

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

使用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

db.query的使用

首先假设有如下表格,表格名称为:"Employees" SQL基本格式如下: [sql] view plain copy  print? select 列名称 from 表名称   最基本SQL语句,就是从表中选取要返回的列数据,不加任何过滤条件。当然如果"列名称"是"*",那么将返回整个表格数据。在Androi

qing000的博客 2万+

解决opensips启动时出现PID file /var/run/opensips.pid does not exist 的错误

启动opensips时报下列错误 [root@OpenSIPS opensips]# opensipsctl start INFO: Starting OpenSIPS :  ERROR: PID file /var/run/opensips.pid does not exist -- OpenSIPS start failed 查看日志文件 [root@OpenSIPS opens

禅与代码的艺术 1万+

SIP协议详解(中文)-2

 在对话中,有其他的相关会被发送。一个对话是一个持续一定时间的两个用户之间的端到端的SIP关系。对话过程要求两个用户代理之间的信息是有序的而且请求被正确路由传输的。在这个规范中,只有INVITE请求可以用来建立会话。当一个UAC在一个对话中发出请求的时候,它不仅遵循第8节描述的一般UAC规则而且也遵循对话中的请求规则。第12节讲述了对话并且讨论了对话的创建和维持,以及在对话中创建一个请求。SI

demon_evil的专栏 3880

openSIPS路由类型

OpenSIPS路由规则使用几种类型的路由。每种路由是被一种特定事件触发,并且允许你处理一种确定类型的消息(请求或者应答)。1.route(主路由)请求路由块。它包含对SIP请求采取的一些列动作。触发条件:SIP请求处理:SIP请求类型:无状态的初始请求,可以通过TM模块函数变为有状态的。默认动作:如果请求没有被转发或者应答,路由会在最后把路由简单的丢弃。主路由块通过代码route{…}或route

跟着大数据和AI去旅行 2770

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

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

老黑 1632

使用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

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

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值