Asterisk 1.8 队列 分析

关于asterisk做呼叫转接的一点经验记录 上午接到一个需求,询问400电话是否能做个呼叫转接。 阅读详情

上一篇文章 讨论了 invite请求最终  走到 dialplan,走到拨号方案后  具体做什么动作由用户决定,对于呼叫中心应用,队列是必不可少的功能,本篇文档分析一下主叫打进系统,走到dialplan后 进队列,呼叫坐席。。

 

一切从队列开始。。。。

 

queue(nama,timout,tT,,.),

 

queue_exec为队列入口函数。首先解析 队列参数。

AST_DECLARE_APP_ARGS(args,
  AST_APP_ARG(queuename);
  AST_APP_ARG(options);
  AST_APP_ARG(url);
  AST_APP_ARG(announceoverride);
  AST_APP_ARG(queuetimeoutstr);
  AST_APP_ARG(agi);
  AST_APP_ARG(macro);
  AST_APP_ARG(gosub);
  AST_APP_ARG(rule);
  AST_APP_ARG(position);

 

这里 1.8版本增加了参数 position

 

此参数指定 主叫进入队列后在所有主叫中的排队位置,为1,则此客户优先级最高,优先接听,,这是个参数在队列内有很多等待电话时有用。

此参数跟 QUEUE_PRIO 类似,但position更灵活。。。

 

队列参数解析完毕 调用 join_queue 进入队列。。。同时指定进入队列失败原因。。。设置 QUEUESTATUS.

 

join_queue内部。首先调用 load_realtime_queue,加载队列坐席信息。。。

 

load_realtime_queue 内部,首先根据 队列名字 在内存中查找 队列是否存在,有,则返回在内存中的位置,否则为NULL

 

/* Find the queue in the in-core list first. */
 q = ao2_t_find(queues, &tmpq, OBJ_POINTER, "Look for queue in memory first");

这里ao2_t_find为hash查找,速度应该比链表快多了,这是1.6,1.8版本提供的。

 

if (!q || q->realtime)

如果没找到 ,或者找到了&&队列是realtime(数据库保存队列)的,则,调用ast_load_realtime,从数据库中加载队列信息。

所以,对于realtime队列,不管找不找到,都会执行数据库加载动作。

 

queue_vars = ast_load_realtime("queues", "name", queuename, SENTINEL);
  if (queue_vars) {
   member_config = ast_load_realtime_multientry("queue_members", "interface LIKE", "%", "queue_name", queuename, SENTINEL);
   if (!member_config) {
    ast_log(LOG_ERROR, "no queue_members defined in your config (extconfig.conf)./n");
    ast_variables_destroy(queue_vars);
    return NULL;
   }
  }
  if (q) {
   prev_weight = q->weight ? 1 : 0;
  }

 

首先根据队列名字加载队列,如果数据库中存在此队列,则加载此队列的坐席(queue_member表),没有坐席会则函数退出。这里做这两个步骤的目的是做一些溢出处理,如数据库没有队列,或队列无坐席等。

 

接下来 ,如果内存中存在此队列,则设置队列优先级。

然后调用 find_queue_by_name_rt 函数,此函数很重要,他的功能为 做数据库信息与内存的同步。。。返回全新的队列 到q

 

 q = find_queue_by_name_rt(queuename, queue_vars, member_config);

 

*****

queue_vars 保存的是 数据库队列信息,member_config 保存的是 数据库内此队列的坐席信息。

 

 

下面分析一下find_queue_by_name_rt

 

首先处理 不是 realtime的队列。接下来处理realtime队列。

 

/* Check if queue is defined in realtime. */
 if (!queue_vars) {

 

1。根据数据库中是否存在队列判断是否为realtime队列,,这里,如果数据库中队列已经没了,但内存中该队列还存在(不是queue.conf静态配置的队列),,此时,设置队列死亡。q->dead = 1;。实际就是在内存中删除,

 

2。数据库中存在,内存中不存在。创建。。。

 

alloc_queue 分配队列内存。。。同时指定析构函数。

 

clear_queue,清理队列,初始化队列,首先设置队列策略,找不到就设置默认ringall,这里这么早设置队列策略的原因为lineer策略依赖于

 

此设置,因为下面为初始化坐席到内存中时要用到策略。接下来把此队列放到全局队列容器中queues_t_link(queues, q, "Add queue to container");

 

接下来调用 init_queue 初始化队列默认值。这里,如果内存中已经存在,则也重置队列参数。原因是在与数据库同步。

包括 队列参数queue.conf 中 autopause,timeoutpriority 等的初始化。。坐席的分配。。。

 

 

q->dead = 0;
 q->retry = DEFAULT_RETRY;
 q->timeout = DEFAULT_TIMEOUT;
 q->maxlen = 0;
 q->announcefrequency = 0;
 q->minannouncefrequency = DEFAULT_MIN_ANNOUNCE_FREQUENCY;
 q->announceholdtime = 1;
 q->announcepositionlimit = 10; /* Default 10 positions */
 q->announceposition = ANNOUNCEPOSITION_YES; /* Default yes */
 q->roundingseconds = 0; /* Default - don't announce seconds */
 q->servicelevel = 0;
 q->ringinuse = 1;
 q->setinterfacevar = 0;
 q->setqueuevar = 0;
 q->setqueueentryvar = 0;
 q->autofill = autofill_default;
 q->montype = montype_default;
 q->monfmt[0] = '/0';
 q->reportholdtime = 0;
 q->wrapuptime = 0;
 q->penaltymemberslimit = 0;
 q->joinempty = 0;
 q->leavewhenempty = 0;
 q->memberdelay = 0;
 q->maskmemberstatus = 0;
 q->eventwhencalled = 0;
 q->weight = 0;
 q->timeoutrestart = 0;
 q->periodicannouncefrequency = 0;
 q->randomperiodicannou

Asterisk对接OpenAI Realtime API实现低延迟语音交互 语音代理系统本质上是将实时音频流与大模型推理能力在通信链路中无缝耦合的技术实践。其核心原理在于突破传统IVR的单向脚本化交互范式,通过SIP信令控制与RTP媒体流直通,在端到端建立双向、低延迟(<300ms)、可编程的语音数据通道。技术价值体现在隐私可控(语音不出内网)、响应自然(流式识别+合成)、架构轻量(无需WebRTC中转或浏览器依赖)。典型应用场景包括银行智能客服、物业报修热线、工厂调度电话等需深度集成现有PBX系统的工业级语音交互需求。本文聚焦Asterisk与OpenAI Realtime AP 阅读详情

相关推荐

asterisk-java:用于Asterisk PBX集成的免费Java库

适用于Asterisk-Java的自述文件 介绍 Asterisk-Java软件包包含一组Java类,使您可以轻松构建与交互的Java应用程序。 Asterisk-Java支持Asterisk为此场景提供的两个接口: 协议和 。 您可以在这里找到最新版本的Java文档: FastAGI FastAGI使您可以创建一种服务来管理呼叫,该服务的管理方式类似于网络服务器处理http请求的方式。 FastAGI可以(并且应该)用来代替Dialplan。 FastAGI比Dialplan快数千倍,更易于调试,并允许您使用熟悉的语言进行呼叫控制。 FastAGI实现支持Asterisk当前提供的所有命令。 经理API Manager API实现支持从Asterisk服务器接收事件(例如,呼叫过程,注册的对等方,通道状态),并向Asterisk发送动作(例如,发起呼叫,座席登录/注销,开始/停

Asterisk常用命令

Asterisk 常用命令 在控制台外执行 1.查看进程 ps() 如:ps a 显示所有进程 ps -a 显示同一终端下的所有程序 ps -A 显示所有进程 ps -A | grep +通道名   查看某一管道的进程 top 查看CPU负载   单核CPU正常情况不超过10.0   2.重启asterisk:  service asterisk restart 3.重启服务器

qq_37694101的博客 4424

通过asterisk-java操作asterisk

NULL 博文链接:https://nettm.iteye.com/blog/1824964

探索Asterisk Java:一款强大的VoIP开发框架

探索Asterisk Java:一款强大的VoIP开发框架 项目地址:https://gitcode.com/gh_mirrors/as/asterisk-java 是一个开源的Java库,用于与Asterisk PBX(私有企业交换机)进行交互和编程。它是开发VoIP(Voice over Internet Protocol)应用、集成电话系统到你的业务流程中的理想工具。本文将深入解析其技术特性...

gitblog_00088的博客 1050

Asterisk-Java:简化Asterisk交互的Java神器

Asterisk-Java:简化Asterisk交互的Java神器 在现代通信解决方案中,融合传统电话系统与高级软件应用的能力变得至关重要。这就是【Asterisk-Java】库大放异彩之处,它为开发者打开了一扇门,将Java编程语言的强大功能带入到Asterisk PBX服务器的世界。 项目介绍 Asterisk-Java是一个精心设计的Java库,它无缝桥接了你的Java应用程序和强大的Ast...

gitblog_00970的博客 979

java 连接asterisk_asterisk-java ami 入门篇,连接与关闭服务器

我选择的是通过AsteriskServer 来生成连接,因为后面要通过AsteriskServer来进行监听通话属性的改变。demo:AsteriskServer asteriskServer=new DefaultAsteriskServer("服务器ip", "账号","密码");if(asteriskServer!=null){ManagerConnection conn=asteriskS...

weixin_31653971的博客 712

Asterisk-Java 项目下载及安装教程

Asterisk-Java 项目下载及安装教程 1. 项目介绍 Asterisk-Java 是一个用于与 Asterisk PBX 服务器集成的 Java 库。它支持两种 Asterisk 提供的接口:FastAGI 协议和 Manager API。FastAGI 允许你创建一个服务来管理呼叫,类似于 Web 服务器处理 HTTP 请求的方式。Manager API 则支持从 Asterisk...

gitblog_01294的博客 735

asterisk代码分析及功能笔记

---------------------------------------------   一、main分析   ------------------------------------------------------- 1.参数初试化 ->//获取主机名,失败则设置为unknown. if (gethostname(hostname, sizeof(hostname)-1)) a

turbocc 因程序而激情 2435

Asterisk是什么?

     Asterisk是一个全软件方式的PBX系统。它可以运行在Linux,BSD,Windows(仿真的)以及 OS X上,它提供了您希望从PBX那里获得的所有功能,而且还比PBX更多。Asterisk支持4类VoIP的协议;通过使用相对便宜的硬件,它可以与几乎全部基于标准的电话设备进行互联操作。      Asterisk提供了具备目录的语音邮箱服务(Voicemail),电话会议,交互式

宝哥的博客 6533

 Asterisk

Asterisk是一个全软件方式的PBX系统。它可以运行在Linux,BSD,Windows(仿真的)以及 OS X上,它提供了您希望从PBX那里获得的所有功能,而且还比PBX更多。Asterisk支持4类VoIP的协议;通过使用相对便宜的硬件,它可以与几乎全部基于标准的电话设备进行互联操作。 Asterisk提供了具备目录的语音邮箱服务(Voicemail),电话会议,交互式语音应答(IVR),以及呼叫队列。它还可以支持三方呼叫,主叫标识,ADSI,IAX,SIP,H.323(客户侧和网关...

风的专栏 1619

怎样评估你需要的Asterisk系统

关于Asterisk系统的评估,在asterisk-users邮件列表里经常被问到的问题有:                为了满足我的需求,我需要CPU多快的机器?硬盘多大的机器?                  Asterisk能够处理多个并发呼叫 根据我的经验,只能提供下面的数据:                 Asterisk1.2版本:最大250并发SI

agileclipse的专栏 1207

Asterisk 扩展应用(2)——常见Extern App实现

1 常见Extern App实现 1.1 回拨AGI实现。 Asterisk本身提供回拨功能,但是有两个Bug 1) 没有回铃音 2) 回拨显示的号码都是中断号 如果要解决这两个问题必须自己实现Origin。 实现思路: 首先拨打主叫号码,当主叫号码接通后拨打被叫号码。设置两个变量,分别储存主叫号码和被叫号码。 从APIManager里面主动发起呼叫使用 OriginateAction 命令,首先必须是通道的选择. Trixbox提供了默认的l...

u010781280的博客 612

OpenAI实时语音API与Asterisk SIP集成实战指南

语音交互系统的核心在于低延迟、可运维的实时音频流管道,而非简单调用语音API。其技术原理涉及SIP信令控制、RTP音频流编解码转换、WebSocket全双工通信及Python异步IO协同调度。该方案的技术价值在于将大模型语音能力嵌入传统电话基础设施,实现毫秒级端到端响应(<350ms)与企业级稳定性。典型应用场景包括智能客服降本增效、私有化语音机器人部署、以及与CRM/工单系统的深度打通。本文聚焦OpenAI Realtime API与Asterisk SIP在生产环境中的协同实践,涵盖pjsip配置优化、

weixin_30458043的博客 428

10个Asterisk实战技巧:从基础配置到高级功能的快速上手

Asterisk是一个功能强大的开源IP PBX系统,为企业和开发者提供了完整的通信解决方案。本文将分享10个实用的Asterisk配置技巧,帮助您从基础设置快速进阶到高级功能应用。🎯 ## 📞 什么是Asterisk电话系统? Asterisk是一个开源的IP PBX系统,它能够将普通计算机转换为功能强大的通信服务器。无论是传统电话线路还是VoIP技术,Asterisk都能完美支持,实现

gitblog_00991的博客 540

asterisk 1.4 Queue members 无法update 处理

在使用show Queues 时,虽然Q members 已经接通电话,但是使用该命令还是看到该members 的状态变为 in used 并提示如下的警告:    -- Stopped music on hold on SIP/1004-09d9aca8[Dec  7 19:01:17] WARNING[4029]: app_queue.c:3225 try_calling: The dev

语音通讯-软交换asterisk,Freeswitch 1374
上一篇: Asterisk 1.8 sip 协议栈分析 2
下一篇: 数据库编程接口Libpq
voipmaker
博客等级 码龄18年 1034粉丝 660原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值