Featured image of post kamailio msilo 模块

kamailio msilo 模块

背景

msilo模块存储用户离线之后收到的信息,当用户上线之后会把这些信息再发送给他. 需要使用数据库, 官方文档地址:msilo

本次测试的版本信息为:

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
# 数据库地址
modparam("msilo", "db_url", DBURL)
# 当用户上线时,发送离线消息的地址
modparam("msilo", "from_address", "sip:registrar@example.org")
# 添加Contact头到通知消息
modparam("msilo", "contact_hdr", "Contact: <sip:null@example.com>\r\n")
# 添加额外的头到通知消息
modparam("msilo", "extra_hdrs", "X-Extra: $tu\r\nY-Extra: foo\r\n")
# 通知消息的body
modparam("msilo", "offline_message", "*** User $rU is offline!")
# 设置content-type值
modparam("msilo", "content_type_hdr", "Content-Type: text/plain\r\n")
# 数据表中消息过期时间
modparam("msilo", "expire_time", 36000)
# 检查存储消息是否发送成功的时间间隔,单位秒,默认:60
modparam("msilo", "check_time", 10)
# 检查是否有提醒消息的时间间隔
modparam("msilo", "send_time", 60)
# 当消息过期时,检查的循环次数.
modparam("msilo", "clean_period", 3)
# 是否使用Contact地址来发送消息
modparam("msilo", "use_contact", 0)
# 存储发送时间的AVP
modparam("msilo", "snd_time_avp", "$avp(i:123)")
# 当message存储时,是否添加创建时间
modparam("msilo", "add_date", 0)
# 一个AoR号,最多存储的消息数量,0:没有限制.
modparam("msilo", "max_messages", 0)

重要函数

m_store([owner])

存储当前sip请求的消息, OWNER必须包含SIP URI,可以是from,to等, OWNER缺失时, 使用R-URI。

m_store_addrs(owner, srcaddr, dstaddr)

功能和m_store相同, 但是从From-URI获取源用户地址,从To-URI获取目的用户地址.

m_dump([owner])

发送存储的消息。

实战

配置示例

 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
86
87
88
89
90
91
92
93
94
95
96
loadmodule "msilo.so"
modparam("msilo", "db_url", DBURL)
modparam("msilo", "db_table", "silo")
modparam("msilo", "from_address", "sip:registrar@example.org")
modparam("msilo","contact_hdr","Contact: registrar@172.16.4.111:5460;msilo=yes\r\n")
modparam("msilo","content_type_hdr","Content-Type: text/plain\r\n")
modparam("msilo","offline_message","*** User $rU is offline!")

...

route {
    ...
    if (uri==myself) {
    {
        # for testing purposes, simply okay all REGISTERs
        if (method=="REGISTER")
        {
            save("location");
            xlog("L_INFO","REGISTER received -> dumping messages with MSILO\n");

            # MSILO - dumping user's offline messages
            if (m_dump())
            {
                xlog("L_INFO","MSILO: offline messages dumped - if they were\n");
            }else{
                xlog("L_INFO","MSILO: no offline messages dumped\n");
            };
            exit;
        };

        # domestic SIP destinations are handled using our USRLOC DB
        
        if(!lookup("location")) 
        {
            if (! t_newtran())
            {
                sl_reply_error();
                exit;
            };
            # we do not care about anything else but MESSAGEs
            if (!method=="MESSAGE")
            {
                if (!t_reply("404", "Not found")) 
                {
                    sl_reply_error();
                };
                exit;
            };
            xlog("L_INFO","MESSAGE received -> storing using MSILO\n");
            # MSILO - storing as offline message
            if (m_store("$ru"))
            {
                xlog("L_INFO","MSILO: offline message stored\n");
                if (!t_reply("202", "Accepted")) 
                {
                    sl_reply_error();
                };
            }else{
                xlog("L_INFO","MSILO: offline message NOT stored\n");
                if (!t_reply("503", "Service Unavailable")) 
                {
                    sl_reply_error();
                };
            };
            exit;
        };
        # if the downstream UA does not support MESSAGE requests
        # go to failure_route[1]
        t_on_failure("1");
        t_relay();
        exit;
    };

    # forward anything else
    t_relay();

}

failure_route[1] {
    # forwarding failed -- check if the request was a MESSAGE 
    if (!method=="MESSAGE")
    {
        exit;
    };

    xlog("L_INFO","MSILO:the downstream UA doesn't support MESSAGEs\n");
    # we have changed the R-URI with the contact address, ignore it now
    if (m_store("$ou"))
    {
        xlog("L_INFO","MSILO: offline message stored\n");
        t_reply("202", "Accepted"); 
    }else{
        xlog("L_INFO","MSILO: offline message NOT stored\n");
        t_reply("503", "Service Unavailable");
    };
}

目前的配置示例使用的是MESSAGE消息。

测试

本次测试分别使用软电话MicroSIP号码为1004,1008注册到kamailio, 然后使用MicroSIPMessage功能发送消息。

MicroSIPMessage功能所在的位置为:

message

  1. 坐席1008在线

message1

  1. 坐席1008离线后再在线

坐席1008离线后,1004发送Message,信令图:

sip

message

通知信令图:

notice

数据表silo的数据为: db

坐席1008上线之后, 收到了离线的信息: message

相关的sip信令为: sip

总结

此功能主要是用作留言MESSAGE, 坐席也要支持MESSAGE信令才行。

本博客已稳定运行
发表了57篇文章 · 总计94.35k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计