是否可以将SIP请求记录到星号中的数据库?我对这些细节感兴趣:
我很确定可以将queue_log事件转换为SIP请求并从中获取上述信息。但是,由于并非所有呼叫都通过呼叫队列,因此该解决方案对我不起作用。
也许通过使用AMI可以实现?或者写自定义拨号方案?请分享您对此问题的看法。
答案 0 :(得分:5)
无法做到这一点。
除非您启用了SIP调试,否则Asterisk不会记录sip消息。
如果您需要控制消息级别,请查看kamailio / opensips项目。
答案 1 :(得分:4)
我曾经为需要非常详尽的实时统计数据的客户工作。为了使一切正确,我们必须结合CDR,CEL和queue_logs。最后这是一个非常复杂的系统,但目前我们还没有看到另一种方法。好吧,我们做了,但这不可行。
您可以提出的最简单的问题之一是:谁(A)最终称为谁(B)和谁接听了电话(C)。如果您可以回答这个问题,您基本上可以回答哪个客户(A),调用可能反映客户兴趣的扩展(B)。要找出工作负载发生的位置,您必须具有最终扩展名(C)。
听起来很简单,根据客户的设置,这很难做到。如果您有出站呼叫的ISDN和入站(公司内)呼叫的SIP(星号/自由转发)等混合技术,您可能会发现甚至根本没有可用的呼叫详细记录。
即使对于入站SIP电话,我也可以告诉您,在某些情况下,找到正确的A,B,C扩展非常强硬!首先,你必须知道Asterisk内部知道两个所谓的“腿”,其中两条腿代表两个通道之间的桥梁(如果我错了,请纠正我)。我不是这里的专家,但认为它是两个相互交流的终点。在该术语中,没有“最初称为扩展B”。此外,CEL和CDR不会反映出这一点。 CDR中有“dst”和“src”字段,但实际上“频道”和“dstchannel”对您来说更有价值。 “dstchannel”有时看起来像“SIP / dialnumber @ foobar”,但仅当您的SIP帐户以某种方式与给定号码(extension = dialnumber)相关时。请注意,客户通常不关心扩展名或拨号号码之间的区别,但在SIP中您必须关心。
如果您使用自定义CDR变量,真正有用的是什么。配置星号以使用“custom_cdr”驱动程序进行CDR日志记录,并使用“custom_cel”进行CEL日志记录。然后,您可以在拨号方案中设置CDR变量,它们会自动写入CDR / CEL后端日志记录工具(例如ODBC)。
作为思考的最后一点:将A,B和C视为人。让A打电话B.让B暂停A并回答C,如果她可以接受由于她的经验。将呼叫从A< - > B转移到A< - > C(B挂断)。您认为从中获得了多少个CDR和多少个CEL?这些田地是如何填满的?在CDR中,这看起来像A一直与B交谈。只有通过查看CEL,您才会注意到有一个TRANSFER事件可以提示您。 (对不起,如果从我的记忆中,现在可能完全不同了。)
有了这个相当可怕的答案,我建议你花很长时间在需求工程上,而不是从asterisk和kamailio开始。询问客户希望用您的解决方案覆盖哪些用例。相信我,你不能涵盖一切。考虑使用灵活的数据格式来存储统计信息。想想基于文档的数据库,如MongoDB。
如果您想从纯Asterisk开始,您应该使用AMI。也许有一些自定义进程监听事件,聚合它们并通过缓存使它们可用,因此您不必查询AMI并将负载放在Asterisk上。
我希望这会有所帮助,但可能你正在努力实现完全不同的东西。 :)
玩得开心。
答案 2 :(得分:2)
除此之外,如果我需要存储额外数据或者如果我想对调用执行某些操作,那么我使用自定义函数编写自己的拨号计划,并使用mysql数据库来存储我需要的数据。如果你想编写自己的应用程序,那么需要在你的系统上安装asterisk和asterisk-addon,并开始在asterisk-addon / apps dir下编写你自己的应用程序,并根据你的系统类型将共享库放在lib或lib64中。进行任何类型的更改后,请不要忘记重新启动星号。如果我能够清除您的疑问,请告诉我。
答案 3 :(得分:2)
让我们使用 asterisk -r
连接星号服务器然后输入命令 sip set debug on 。您可以找到正在运行的日志和所有sip请求。