热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于asterisk做呼叫转接的一点经验记录

第一天上午接到一个需求,询问现在我们的电话系统是否能做个呼叫转接。然后在网上搜了一下,发现有路子可走,所以简单试了一下,还真是可以。首先,需求是什么?客户拨通了400电话到我们的

第一天

上午接到一个需求,询问现在我们的电话系统是否能做个呼叫转接。然后在网上搜了一下,发现有路子可走,所以简单试了一下,还真是可以。


首先,需求是什么?

客户拨通了400电话到我们的asterisk电话系统,比如说接通了坐席A;然后A需要在不挂断的情况下转拨给另外一个电话或者手机B。

实现:

找到http://www.asterisk-help.com/read.php?tid-191-page-1.html这篇文章说明了,配置features.conf 

blindxfer=#    ;转接开始的前缀
transferdigittimeout => 30
xfersound = beep            
xferfailsound = beeperr
featuredigittimeout = 1000
atxfernoanswertimeout = 15
atxferdropcall = no
atxferloopdelay = 10
txfercallbackretries = 2
其中blindxfer 参数,默认是#1 ,按注释意思是按了#后开始拨号码。但是我改成了#,因为我不知道那个1是什么意思;

transferdigittimeout 参数,默认是3秒,刚开始以为是拨号的时间(英文不好)测试后发现其实是你按#后,到你拨第一个号码按键的时间。所以,你要转接的话,你得先查下号码是多少,然后再按#,接着开始拨号;

其他的参数默认的,也没仔细看,目前;

配置完features.conf后,你还需在你的拨号语法文件extensions.conf中配置:

比如exten => _x.,1,Dial(DAHDI/G0/${EXTEN},30,t), 注意加了t参数,t的意思是允许被叫用户按前面设置的#转接;相应的T是允许主叫用户按#转接。


这样就可以呼叫转接了,但是接着还有个问题:

比如我在按#后,转接输入号码,假如号码输错了,这时候该怎么办呢,难道是挂断?这个我还没解决测试,或许能够再按一下#,来重新输入。

第二天

在看http://www.voip-info.org/wiki/index.php?page=Asterisk+config+features.conf文档中,发现了另外一种转接的方式atxfer  
   之前在features.conf使用的是blindxfer ,也就是无人管理的转接,而且配置文件说明的也不详细。 
 
现在的atxfer方式,据文档上的说明: 
      比如用户A打给坐席B,然后B需要转给分机C,B会先和C接通(blindxfer是接通后就自动断掉),然后B可以挂掉(挂掉后A与C将连通)或者按*(默认)返回到A与B的通话中。 
 
这个方式或许可以解决掉输错号码的问题,也就是输错号码后,按*回到A与B通话中,然后再来一遍转接。 
 
不过这些都还只是假想,还需要验证一下,傍晚试一下

第三天

了一下blindxfer 和atxfer 模式,发现: 
atxfer确实和文档上说的一样,但是貌似这两种模式是共存的,就是说,就算你在features.conf把blindxfer注释掉,但其实还是有用。 
这可以从CLI中输入features show(asterisk1.8+)或者show features看到你绑定的按键,所以为了防止混乱,干脆我就把blindxfer设为了##,atxfer设为了#,disconnect为*。 
 
但是又出现了一个问题: 
   转接成功后,用户与被转接的座机连上了,也能通话了,但是他们挂断之后,有时候却会出现所有电话出不去,外线也进不来的情况 
 
我的流程日志是这样的:(其中DAHDI/1234为 from-pstn外线) 
    首先是from-pstn DAHDI/3 外线打进来,进队列,然后DAHDI/8响应 
-- Executing [s@from-pstn:4] Queue("DAHDI/3-1", "1000,t,,,15") in new stack 
    -- Started music on hold, class 'default', on DAHDI/3-1 
    -- Executing [4008@from-internal:1] Dial("Local/4008@from-internal-00000000;2", "DAHDI/8") in new stack 
    -- Called DAHDI/8 
    -- DAHDI/8-1 is ringing 
    -- Local/4008@from-internal-00000000;1 is ringing 
    -- DAHDI/8-1 is ringing 
    -- DAHDI/8-1 answered Local/4008@from-internal-00000000;2 
    -- Local/4008@from-internal-00000000;1 answered DAHDI/3-1 
 
接着DAHDI/8 转接给9898,看日志应该是通过dahdi/4这个外线来拨通62539898 
Stopped music on hold on DAHDI/3-1 
  == Begin MixMonitor Recording DAHDI/3-1 
    -- Started music on hold, class 'default', on DAHDI/3-1 
    -- Playing 'pbx-transfer.gsm' (language 'en') 
     Executing [9898@from-internal:1] Dial("Local/9898@from-internal-00000001;2", "DAHDI/G0/9898,30,th") in new stack 
    -- Called DAHDI/G0/9898 
    -- DAHDI/4-1 answered Local/9898@from-internal-00000001;2 
 
然后DAHDI/8挂断,用户和9898通话, 
== Manager 'asterccdaemon' logged off from 192.168.2.62 
    -- Hanging up on 'DAHDI/8-1' 
    -- Hungup 'DAHDI/8-1' 
  == Spawn extension (from-internal, 4008, 1) exited non-zero on 'Local/4008@from-internal-00000000;2' 
    -- Stopped music on hold on DAHDI/3-1 
    -- Playing 'beep.gsm' (language 'en') 
  == Spawn extension (from-pstn, s, 4) exited non-zero on 'Transfered/DAHDI/3-1' 
  == MixMonitor close filestream 
 
接着就没有日志了,然后就是电话打不进也出不去,一直提示忙碌 
Executing [18701008325@from-internal:1] Dial("DAHDI/8-1", "DAHDI/G0/18701008325,30,th") in new stack 
[Jun 26 19:27:15] WARNING[24070]: app_dial.c:2341 dial_exec_full: Unable to create channel of type 'DAHDI' (cause 34 - Circuit/channel congestion) 
  == Everyone is busy/congested at this time (1:0/1/0) 
    -- Executing [18701008325@from-internal:2] Hangup("DAHDI/8-1", "") in new stack 
  == Spawn extension (from-internal, 18701008325, 2) exited non-zero on 'DAHDI/8-1‘ 
    -- Hanging up on 'DAHDI/8-1' 
    -- Hungup 'DAHDI/8-1' 

标红那一句,是不是说明用户的那个通道已经成僵尸了,所以给堵住了呢?再打进来,就提示坐席忙碌,没有空闲的了,而且CLI也没有任何日志。

第四天

分析原因:电话局->中继线->电话交换机->tdm卡,是模拟信号,对于模拟信号挂机、摘机检测确实会有漏的,除非从电话交换机把模拟信号转换为数字信号,但是这样tdm卡就没用了,因为tdm卡的作用就是将模拟信号转换为数字信号。

尝试解决:

1、通过给通道设置超时时间,到时间后,强制将该通道关闭。set(TIMEOUT())这样的语句。但是这样对超时时间的把控就 有问题了,有可能1小时,有可能几分钟。

2、向固话运营商申请反极信号,这样能比较准确挂机、摘机。不过我问联通的,一般人完全不知道这是啥。。而且据说不太好加,他们也做不好。


最后的解决:

我们在交换机中出6根模拟线(貌似交换机需要装个什么设备),通到语音卡(对语音卡来说,这6根线就相当于外线了),然后语音卡连接其他坐席,这样坐席就相当于分机了,拨打公司其他分机也就在交换机内部(之前是通过外线出去,然后进来,相当于占了2根外线),不用花钱了。并且,我们禁止转接到外线,只能转接到公司内部分机。这样,一直占线吊死的情况就不会了。



推荐阅读
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • Spring 切面配置中的切点表达式详解
    本文介绍了如何在Spring框架中使用AspectJ风格的切面配置,详细解释了切点表达式的语法和常见示例,帮助开发者更好地理解和应用Spring AOP。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 解决Unreal Engine中UMG按钮长时间按住自动释放的问题
    本文探讨了在Unreal Engine中使用UMG按钮时,长时间按住按钮会导致自动释放的问题,并提供了详细的解决方案。 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
author-avatar
祖巧爽_940
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有