Featured image of post kamailio acc模块介绍

kamailio acc模块介绍

背景

acc 模块用来记录会话信息到syslog或者数据库中,最小的记录信息包括:

  • 请求method
  • From 头的tag
  • To 头的tag
  • Call-ID
  • 响应的code
  • 响应的reason
  • 会话完成的时间戳

官方文档地址: acc,本次测试的kamailio版本是:

version: kamailio 5.8.5 (x86_64/linux)

重要参数解析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 响铃事件是否记录,默认是0, 0:不记录, 1:记录
modparam("acc", "early_media", 1)
# 当整个会话失败后记录的标志,默认不设置。
modparam("acc", "failed_transaction_flag", 4)
# 失败的响应码不记录,默认不设置,区间是[300,999]
modparam("acc", "failed_filter", "404,407")
# 是否记录ACK,默认是0, 0:不记录, 1:记录
modparam("acc", "report_ack", 1)
# 是否记录CANCEL,默认是0, 0:不记录, 1:记录
modparam("acc", "report_cancels", 1)
# 控制检查请求方向
modparam("acc", "detect_direction", 1)
# 是否事务记录延后标志
modparam("acc", "acc_prepare_flag", 5)
# 所有的请求事务延后标记的标志
modparam("acc", "acc_prepare_always", 1)
# 设置为1, 表acc中的extra字段如果没值会被设置成NULL;设置为0,该字段为空.
modparam("acc", "acc_extra_nullable", 1)
# 是否通过syslog记录事务标志,默认是不设置,其他:记录 
modparam("acc", "log_flag", 2)
# 是否通过syslog记录未接来电标志,默认是不设置,其他:记录
modparam("acc", "log_missed_flag", 3)
# 输出到syslog的日志等级
modparam("acc", "log_level", 2)   # Set log_level to 2 (L_INFO)
# 存到数据库的标志
modparam("acc", "db_flag", 2)
# 未接来电存储数据库的标志
modparam("acc", "db_missed_flag", 3)
# 成功拨打电话存储的数据表名,默认是acc
modparam("acc", "db_table_acc", "acc")
# 未接电话存储的数据表名,默认是missed_calls
modparam("acc", "db_table_missed_calls", "missed_calls")
# 数据库连接地址
modparam("acc", "db_url", "DBURL")
# 1,INSERT DELAYED; 2,ASYNC INSERT; 0,INSERT
modparam("acc", "db_insert_mode", 1)
# 是否开启cdr功能,记录数据到acc_cdrs表
modparam("acc", "cdr_enable", 1)
# dialog过期,是否打印CDR-based
modparam("acc", "cdr_expired_dlg_enable", 1)
# 开始计算时间从dialog创建还是接通? 0:dialog创建, 1:接通
modparam("acc", "cdr_start_on_confirmed", 1)
# 是否打印CDR-based到syslog,默认1,打印。0:不打印
modparam("acc", "cdr_log_enable", 0)
# 存储CDRs的表名,默认为"",即不存储到数据库
modparam("acc", "cdrs_table", "acc_cdrs")
# 设置时间的模式 默认0, 
# 0:保存unix时间戳到syslog, datetime到数据库;
# 1:保存second到time_attr,microseconds到time_exten.
# 2:保存second.milliseconds到time_attr
# 3:保存格式化的时间到time_format,使用localtime()输出 
# 4:保存格式化的时间到time_format,使用gmtime()输出
modparam("acc", "time_mode", 1)
# 命名syslog的attribute和数据库存储attribute值的时间事件
modparam("acc", "time_attr", "seconds")
...

重要函数

acc_log_request(comment)

主动上报请求到syslog,可以用在ANY_ROUTE

acc_db_request(comment, table)

主动上报请求到数据库,可以用在ANY_ROUTE

acc_request(comment, table)

主动上报请求到syslog和数据库,如果db_url没有设置,那么就输出到日志.可以用在ANY_ROUTE

实战

输出到日志

官方的示例配置基本上都是输出到日志,这里做一些简单的修改。

配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!define FLT_ACC 1
#!define FLT_ACCMISSED 2
#!define FLT_ACCFAILED 3
#!define FLT_NATS 5
loadmodule "dialog.so"
loadmodule "acc.so"
modparam("acc", "early_media", 0)
modparam("acc", "report_ack", 0)
modparam("acc", "report_cancels", 0)
/* by default we do not adjust the direct of the sequential requests.
 * if you enable this parameter, be sure the enable "append_fromtag"
 * in "rr" module */
modparam("acc", "detect_direction", 0)
/* account triggers (flags) */
modparam("acc", "log_flag", FLT_ACC)
modparam("acc", "log_missed_flag", FLT_ACCMISSED)
modparam("acc", "log_extra",
        "src_user=$fU;src_domain=$fd;src_ip=$si;"
        "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
#!ifdef WITH_ACCDB
modparam("acc", "db_flag", FLT_ACC)
modparam("acc", "db_missed_flag", FLT_ACCMISSED)
modparam("acc", "db_url", DBURL)
modparam("acc", "db_extra",
        "src_user=$fU;src_domain=$fd;src_ip=$si;"
        "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
#!endif

request_route {
    xlog("L_INFO","$si:$sp|$Ri:$Rp|$pr|$rm\n");
    ...
    route(WITHINDLG);
    route(AUTH);
    if(is_method("INVITE")) {
        dlg_manage();
        setflag(FLT_ACC);
    }
    ...
    route(LOCATION);
    return;
}

route[WITHINDLG] {
    if (!has_totag()) return; 

    if (loose_route()) {
        route(DLGURI);
        if (is_method("BYE")) {
            setflag(FLT_ACC);
            setflag(FLT_ACCFAILED);
        } else if ( is_method("ACK)) {
            route(NATMANAGE);
        } else if (is_method("NOTIFY|REFER")) {
            record_route();
        }
        route(RELAY);
        exit;
    }
    ...
}

route[LOCATION] {
    if (!lookup("location")) {
        ...
    }
    if (is_method("INVITE")) {
        setflag(FLT_ACCMISSED);
    }
    route(RELAY);
    exit;
}

官方配置解析:

  1. FLT_ACC: 表示记录成功的请求,在第一次收到INVITE请求和BYE时设置。
  2. FLT_ACCMISSED: 表示记录未接来电,在LOCATION路由中设置。
  3. FLT_ACCFAILED: 表示记录失败的请求,在BYE请求时设置。

输出的结果

  1. 正常接通挂断

sip信令图: sip

日志输出内容:

1
2
3
4
5
6
7
(234) INFO: |25-05-09 13:37:17|2bc344935b9f4996abde8a19388967af| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|INVITE
 5(237) NOTICE: |25-05-09 13:37:19|2bc344935b9f4996abde8a19388967af| acc [acc.c:288]: acc_log_request(): ACC: transaction answered: timestamp=1746769039;method=INVITE;from_tag=7c34d89688d9462ba511a1bdb2d21295;to_tag=e43d4609;call_id=2bc344935b9f4996abde8a19388967af;code=200;reason=OK;src_user=1004;src_domain=172.16.4.111;src_ip=172.16.80.13;dst_ouser=1009;dst_user=1009;dst_domain=172.16.80.13
 6(238) INFO: |25-05-09 13:37:19|2bc344935b9f4996abde8a19388967af| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|ACK
 1(233) INFO: |25-05-09 13:37:19|2bc344935b9f4996abde8a19388967af| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|INVITE
 8(240) INFO: |25-05-09 13:37:19|2bc344935b9f4996abde8a19388967af| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|ACK
 3(235) INFO: |25-05-09 13:37:25|2bc344935b9f4996abde8a19388967af| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|BYE
 2(234) NOTICE: |25-05-09 13:37:25|2bc344935b9f4996abde8a19388967af| acc [acc.c:288]: acc_log_request(): ACC: transaction answered: timestamp=1746769045;method=BYE;from_tag=7c34d89688d9462ba511a1bdb2d21295;to_tag=e43d4609;call_id=2bc344935b9f4996abde8a19388967af;code=200;reason=OK;src_user=1004;src_domain=172.16.4.111;src_ip=172.16.80.13;dst_ouser=1009;dst_user=1009;dst_domain=172.16.80.13

可以看到acc_log_requestINVITEBYE两条记录,分别表示接通时挂断时的信息。

  1. 被叫未接挂断

sip信令图: sip

日志输出内容:

1
2
3
4
1(233) INFO: |25-05-09 13:49:54|e9c569bdad5c48829b9554b501e193de| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|INVITE
 7(239) NOTICE: |25-05-09 13:49:57|e9c569bdad5c48829b9554b501e193de| acc [acc.c:288]: acc_log_request(): ACC: call missed: timestamp=1746769797;method=INVITE;from_tag=0dcc6761a39f4e0ea7c665f374c3c0b4;to_tag=fc7fe45d;call_id=e9c569bdad5c48829b9554b501e193de;code=480;reason=Temporarily Unavailable;src_user=1004;src_domain=172.16.4.111;src_ip=172.16.80.13;dst_ouser=1009;dst_user=1009;dst_domain=172.16.80.13
 8(240) INFO: |25-05-09 13:49:57|e9c569bdad5c48829b9554b501e193de| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|ACK
 6(238) INFO: |25-05-09 13:50:40|39a979acab324160b76e70dda10bdcf9| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|REGISTER

acc_log_request打印了被叫挂断时的信息。

  1. 主叫CANCEL

sip信令图: sip

日志输出内容:

1
2
3
4
 3(235) INFO: |25-05-09 13:57:51|eb0b9b1788994cad83d720f4bd91b1e9| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|INVITE
 1(233) INFO: |25-05-09 13:57:55|eb0b9b1788994cad83d720f4bd91b1e9| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|CANCEL
 6(238) NOTICE: |25-05-09 13:57:55|eb0b9b1788994cad83d720f4bd91b1e9| acc [acc.c:288]: acc_log_request(): ACC: call missed: timestamp=1746770275;method=INVITE;from_tag=eb2b4f6fedae413da47d27b7561b6a16;to_tag=ef67ee5d;call_id=eb0b9b1788994cad83d720f4bd91b1e9;code=487;reason=Request Terminated;src_user=1004;src_domain=172.16.4.111;src_ip=172.16.80.13;dst_ouser=1009;dst_user=1009;dst_domain=172.16.80.13
 7(239) INFO: |25-05-09 13:57:55|eb0b9b1788994cad83d720f4bd91b1e9| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|ACK

acc_log_request打印了一些信息,methodINVITE,确认是487这个响应产生的,也就是miss_calls.

  1. 上报完整数据

配置放开:

1
2
3
4
modparam("acc", "early_media", 1)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "cdr_enable", 1)
  • 被叫接通挂断:

sip 信令图: sip

日志输出内容:

1
2
3
4
5
6
7
8
9
 1(348) INFO: |25-05-09 14:10:28|3f0f993e4f04443ab3db388d52eb09e4| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|INVITE
 8(355) NOTICE: |25-05-09 14:10:36|3f0f993e4f04443ab3db388d52eb09e4| acc [acc.c:288]: acc_log_request(): ACC: transaction answered: timestamp=1746771036;method=INVITE;from_tag=477742ca66494db89925be1add2d306d;to_tag=4758cb30;call_id=3f0f993e4f04443ab3db388d52eb09e4;code=200;reason=OK;src_user=1004;src_domain=172.16.4.111;src_ip=172.16.80.13;dst_ouser=1009;dst_user=1009;dst_domain=172.16.80.13
 7(354) INFO: |25-05-09 14:10:36|3f0f993e4f04443ab3db388d52eb09e4| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|ACK
 2(349) INFO: |25-05-09 14:10:36|3f0f993e4f04443ab3db388d52eb09e4| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|INVITE
 7(354) NOTICE: |25-05-09 14:10:36|3f0f993e4f04443ab3db388d52eb09e4| acc [acc.c:288]: acc_log_request(): ACC: request acknowledged: timestamp=1746771036;method=ACK;from_tag=477742ca66494db89925be1add2d306d;to_tag=4758cb30;call_id=3f0f993e4f04443ab3db388d52eb09e4;code=200;reason=OK;src_user=1004;src_domain=172.16.4.111;src_ip=172.16.80.13;dst_ouser=1009;dst_user=1009;dst_domain=172.16.80.13
 4(351) INFO: |25-05-09 14:10:36|3f0f993e4f04443ab3db388d52eb09e4| <script>: 172.16.80.13:62759|172.16.4.111:5460|udp|ACK
 1(348) INFO: |25-05-09 14:10:46|3f0f993e4f04443ab3db388d52eb09e4| <script>: 172.16.80.13:35030|172.16.4.111:5460|udp|BYE
 6(353) NOTICE: |25-05-09 14:10:46|3f0f993e4f04443ab3db388d52eb09e4| acc [acc.c:288]: acc_log_request(): ACC: transaction answered: timestamp=1746771046;method=BYE;from_tag=477742ca66494db89925be1add2d306d;to_tag=4758cb30;call_id=3f0f993e4f04443ab3db388d52eb09e4;code=200;reason=OK;src_user=1009;src_domain=172.16.4.111;src_ip=172.16.80.13;dst_ouser=1004;dst_user=1004;dst_domain=172.16.80.13
 6(353) NOTICE: |25-05-09 14:10:46|3f0f993e4f04443ab3db388d52eb09e4| acc [acc_cdr.c:371]: log_write_cdr(): start_time=1746771028.010; end_time=1746771046.351; duration=18.341

可以看到有4个事件被记录了:

  1. 被叫坐席接通200OK
  2. ACK
  3. 主叫BYE
  4. 打印CDR

目前来看,180响铃这个上报没生效。

  • 主叫CANCEL:

sip 信令图: sip

日志输出内容:

1
2
3
4
5
 5(352) INFO: |25-05-09 14:25:55|NmU5MmY1ZTVmMjE4MzZiODVjOGQ2NWNhMWI2ODY4Mzc.| <script>: 172.16.80.13:35030|172.16.4.111:5460|udp|INVITE
 8(355) INFO: |25-05-09 14:26:00|NmU5MmY1ZTVmMjE4MzZiODVjOGQ2NWNhMWI2ODY4Mzc.| <script>: 172.16.80.13:35030|172.16.4.111:5460|udp|CANCEL
 2(349) NOTICE: |25-05-09 14:26:00|NmU5MmY1ZTVmMjE4MzZiODVjOGQ2NWNhMWI2ODY4Mzc.| acc [acc.c:288]: acc_log_request(): ACC: call missed: timestamp=1746771960;method=INVITE;from_tag=9e3d6277;to_tag=f6895a68c2a1431884fa58987098321f;call_id=NmU5MmY1ZTVmMjE4MzZiODVjOGQ2NWNhMWI2ODY4Mzc.;code=487;reason=Request Terminated;src_user=1009;src_domain=172.16.4.111;src_ip=172.16.80.13;dst_ouser=1004;dst_user=1004;dst_domain=172.16.80.13
 2(349) NOTICE: acc [acc_cdr.c:371]: log_write_cdr(): start_time=1746771955.753; end_time=1746771955.753; duration=0
 3(350) INFO: |25-05-09 14:26:00|NmU5MmY1ZTVmMjE4MzZiODVjOGQ2NWNhMWI2ODY4Mzc.| <script>: 172.16.80.13:35030|172.16.4.111:5460|udp|ACK

CANCEL这个事件上报没生效, 在request_route中,添加以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
...
route(NATDETECT);
if (is_method("CANCEL")) {
    xlog("L_INFO", "is cancel.\n");
    setflag(FLT_ACC);
    if (t_check_trans()) {
            route(RELAY);
    }
    exit;
}
if (!is_method("ACK")) {
    ...
}

日志输出内容:

1
2
3
4
5
6
7
 1(623) INFO: |25-05-09 14:48:23|NDBlOTdhZThmNDdiNjZiZWY1NjAxNWY4MzQxNmE0MDc.| <script>: ------172.16.80.13:1352|172.16.4.111:5460|udp|INVITE
 8(630) INFO: |25-05-09 14:48:26|NDBlOTdhZThmNDdiNjZiZWY1NjAxNWY4MzQxNmE0MDc.| <script>: ------172.16.80.13:1352|172.16.4.111:5460|udp|CANCEL
 8(630) INFO: |25-05-09 14:48:26|NDBlOTdhZThmNDdiNjZiZWY1NjAxNWY4MzQxNmE0MDc.| <script>: is cancel.
 8(630) NOTICE: |25-05-09 14:48:26|NDBlOTdhZThmNDdiNjZiZWY1NjAxNWY4MzQxNmE0MDc.| acc [acc.c:288]: acc_log_request(): ACC: transaction answered: timestamp=1746773306;method=CANCEL;from_tag=e50e6473;to_tag=;call_id=NDBlOTdhZThmNDdiNjZiZWY1NjAxNWY4MzQxNmE0MDc.;code=200;reason=OK;src_user=1009;src_domain=172.16.4.111;src_ip=172.16.80.13;dst_ouser=1004;dst_user=1004;dst_domain=172.16.4.111
 3(625) NOTICE: |25-05-09 14:48:26|NDBlOTdhZThmNDdiNjZiZWY1NjAxNWY4MzQxNmE0MDc.| acc [acc.c:288]: acc_log_request(): ACC: call missed: timestamp=1746773306;method=INVITE;from_tag=e50e6473;to_tag=6dc3d5effba74226bb9212dbb7f2452b;call_id=NDBlOTdhZThmNDdiNjZiZWY1NjAxNWY4MzQxNmE0MDc.;code=487;reason=Request Terminated;src_user=1009;src_domain=172.16.4.111;src_ip=172.16.80.13;dst_ouser=1004;dst_user=1004;dst_domain=172.16.80.13
 3(625) NOTICE: acc [acc_cdr.c:371]: log_write_cdr(): start_time=1746773303.836; end_time=1746773303.836; duration=0
 4(626) INFO: |25-05-09 14:48:26|NDBlOTdhZThmNDdiNjZiZWY1NjAxNWY4MzQxNmE0MDc.| <script>: ------172.16.80.13:1352|172.16.4.111:5460|udp|ACK

可以看到CANCEL事件上报生效了。

所以如果想上报CANCEL,需要两个条件:

  • report_cancels=1
  • 主路由中在方法为CANCEL的地方,添加setflag(FLT_ACC)

输出到数据库

配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!define  WITH_ACCDB
#!define FLT_ACC 1
#!define FLT_ACCMISSED 2
#!define FLT_ACCFAILED 3
#!define FLT_NATS 5
loadmodule "dialog.so"
loadmodule "acc.so"
modparam("acc", "early_media", 1)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 1)
/* by default we do not adjust the direct of the sequential requests.
 * if you enable this parameter, be sure the enable "append_fromtag"
 * in "rr" module */
modparam("acc", "detect_direction", 0)
modparam("acc", "cdr_enable", 1)
/* account triggers (flags) */
modparam("acc", "log_flag", FLT_ACC)
modparam("acc", "log_missed_flag", FLT_ACCMISSED)
modparam("acc", "log_extra",
        "src_user=$fU;src_domain=$fd;src_ip=$si;"
        "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
#!ifdef WITH_ACCDB
modparam("acc", "db_flag", FLT_ACC)
modparam("acc", "db_missed_flag", FLT_ACCMISSED)
modparam("acc", "db_url", DBURL)
modparam("acc", "db_extra",
        "src_user=$fU;src_domain=$fd;src_ip=$si;"
        "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
modparam("acc", "cdrs_table", "acc_cdrs")

#!endif

request_route {
    xlog("L_INFO","$si:$sp|$Ri:$Rp|$pr|$rm\n");
    ...
    if (is_method("CANCEL")) {
        xlog("L_INFO", "is cancel.\n");
        setflag(FLT_ACC);
        if (t_check_trans()) {
                route(RELAY);
        }
        exit;
    }

    route(WITHINDLG);
    route(AUTH);
    if(is_method("INVITE")) {
        dlg_manage();
        setflag(FLT_ACC);
    }
    ...
    route(LOCATION);
    return;
}

route[WITHINDLG] {
    if (!has_totag()) return; 

    if (loose_route()) {
        route(DLGURI);
        if (is_method("BYE")) {
            setflag(FLT_ACC);
            setflag(FLT_ACCFAILED);
        } else if ( is_method("ACK)) {
            route(NATMANAGE);
        } else if (is_method("NOTIFY|REFER")) {
            record_route();
        }
        route(RELAY);
        exit;
    }
    ...
}

route[LOCATION] {
    if (!lookup("location")) {
        ...
    }
    if (is_method("INVITE")) {
        setflag(FLT_ACCMISSED);
    }
    route(RELAY);
    exit;
}

目前因为是测试,所以输出到syslog不去掉,在测试过程中会既打印日志又写数据库.

在运行之前,还要手动为表添加一些字段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
ALTER TABLE acc ADD COLUMN src_ip varchar(64) NOT NULL default '';
ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
ALTER TABLE missed_calls ADD COLUMN src_ip varchar(64) NOT NULL default '';
ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';

输出结果

  1. 被叫接通并挂断:

sip信令图: sip

acc表记录: acc

acc_cdrs表数据: acc_cdrs

  1. 主叫CANCEL

sip信令图: sip

acc表记录: acc

miss_calls表记录: miss_calls

acc_cdrs表数据: acc_cdrs

总结

  1. CANCEL生效的条件有两个: report_cancels=1setflag(FLT_ACC)
  2. 使用数据库的话,总共要用到acc,miss_calls,acc_cdrs三张表。
  3. 180响铃目前看是没记录的,183也许可行,但是没测试过。
  4. ACK也不是所有的都记录, 200OKACK记录了。
本博客已稳定运行
发表了31篇文章 · 总计55.61k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计