背景
acc 模块用来记录会话信息到syslog或者数据库中,最小的记录信息包括:
- 请求
method - From 头的
tag - To 头的
tag Call-ID- 响应的
code - 响应的
reason - 会话完成的
时间戳
官方文档地址: acc,本次测试的kamailio版本是:
version: kamailio 5.8.5 (x86_64/linux)
重要参数解析
|
|
重要函数
acc_log_request(comment)
主动上报请求到syslog,可以用在ANY_ROUTE中
acc_db_request(comment, table)
主动上报请求到数据库,可以用在ANY_ROUTE中
acc_request(comment, table)
主动上报请求到syslog和数据库,如果db_url没有设置,那么就输出到日志.可以用在ANY_ROUTE中
实战
输出到日志
官方的示例配置基本上都是输出到日志,这里做一些简单的修改。
配置文件
|
|
官方配置解析:
FLT_ACC: 表示记录成功的请求,在第一次收到INVITE请求和BYE时设置。FLT_ACCMISSED: 表示记录未接来电,在LOCATION路由中设置。FLT_ACCFAILED: 表示记录失败的请求,在BYE请求时设置。
输出的结果
- 正常接通挂断
sip信令图:

日志输出内容:
|
|
可以看到acc_log_request有INVITE和BYE两条记录,分别表示接通时和挂断时的信息。
- 被叫未接挂断
sip信令图:

日志输出内容:
|
|
acc_log_request打印了被叫挂断时的信息。
- 主叫CANCEL
sip信令图:

日志输出内容:
|
|
acc_log_request打印了一些信息,method是INVITE,确认是487这个响应产生的,也就是miss_calls.
- 上报完整数据
配置放开:
|
|
- 被叫接通挂断:
sip 信令图:

日志输出内容:
|
|
可以看到有4个事件被记录了:
- 被叫坐席接通
200OK ACK- 主叫
BYE时 - 打印
CDR
目前来看,180响铃这个上报没生效。
- 主叫CANCEL:
sip 信令图:

日志输出内容:
|
|
CANCEL这个事件上报没生效, 在request_route中,添加以下代码:
|
|
日志输出内容:
|
|
可以看到CANCEL事件上报生效了。
所以如果想上报CANCEL,需要两个条件:
- report_cancels=1
- 主路由中在方法为
CANCEL的地方,添加setflag(FLT_ACC)
输出到数据库
配置文件
|
|
目前因为是测试,所以输出到syslog不去掉,在测试过程中会既打印日志又写数据库.
在运行之前,还要手动为表添加一些字段:
|
|
输出结果
- 被叫接通并挂断:
sip信令图:

acc表记录:

acc_cdrs表数据:

- 主叫
CANCEL
sip信令图:

acc表记录:

miss_calls表记录:

acc_cdrs表数据:

总结
CANCEL生效的条件有两个:report_cancels=1和setflag(FLT_ACC)- 使用数据库的话,总共要用到
acc,miss_calls,acc_cdrs三张表。 180响铃目前看是没记录的,183也许可行,但是没测试过。ACK也不是所有的都记录,200OK的ACK记录了。