Kamailio极简websocket脚本

本文提供一个Kamailio路由脚本,仅支持websocket客户端注册。

#!KAMAILIO5.5.x
debug=2

/* 下面是宏定义,其中7443是加密端口 */
#!substdef "!MY_IP_ADDR!192.168.31.63!g"    /* CUSTOMIZE ME 地址 */
#!substdef "!MY_SIP_PORT!5060!g"            /* CUSTOMIZE ME 不加密的端口 */
#!substdef "!MY_SIPS_PORT!7443!g"           /* CUSTOMIZE ME 加密的端口 */
#!substdef "!MY_DOMAIN!whatever.net!g"      /* CUSTOMIZE ME 域名 */

log_stderror=no                             /* 配置为no表示日志写到syslog */
log_facility=LOG_LOCAL0
tcp_accept_no_cl=yes                        /* 没有cl(content-length)头kamailio也接受,默认值是拒绝 */
enable_tls=yes

/* 配置监听的地址和端口 */
listen=udp:MY_IP_ADDR:MY_SIP_PORT
listen=tcp:MY_IP_ADDR:MY_SIP_PORT
listen=tls:MY_IP_ADDR:MY_SIPS_PORT

alias="MY_DOMAIN"
force_rport=yes

/* 模块路径 */
# mpath="/usr/local/lib/kamailio/modules/"

/* 加载模块 */
loadmodule "xhttp.so"
loadmodule "jsonrpcs.so"
loadmodule "tm.so"
loadmodule "sl.so"
loadmodule "pv.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "ctl.so"
loadmodule "tls.so"
loadmodule "websocket.so"

modparam("jsonrpcs", "pretty_format", 1)
modparam("jsonrpcs", "transport", 7)

modparam("tm", "failure_reply_mode", 3)
modparam("tm", "fr_timer", 30000)
modparam("tm", "fr_inv_timer", 120000)

modparam("registrar", "method_filtering", 1)
modparam("registrar", "max_expires", 3600)

modparam("usrloc", "use_domain", 0)
modparam("usrloc", "db_mode", 0)

/* 参考 https://github.com/kamailio/kamailio/blob/master/src/modules/tls/tls.cfg */
modparam("tls", "config", "/etc/kamailio/tls.cfg")

/* 主路由入口 */
request_route {
    xinfo("*** $sel(msg)\n");
    if ($rm == "REGISTER") {    /* 为了尽量简单,这里只处理注册请求 */
        save("location");
        exit;
    }

    sl_send_reply("404", "Not here");
    exit;
}

/* http请求的路由入口 */
event_route[xhttp:request] {
    set_reply_close();
    set_reply_no_connect();

    $var(msg) = @msg;           /* 跟$sel(msg)等效, 参考kamailio的selects文档 */
    xinfo("*** $var(msg)\n");
    /* 处理http升级到websocket */
    if ($hdr(Upgrade) =~ "websocket" && $hdr(Connection) =~ "Upgrade" && $rm =~ "GET") {
        if (ws_handle_handshake()) { /* websocket 握手 */
            exit;
        }
    }

    xhttp_reply("404", "Not Found", "", "");
}

申请根证书或者用openssl做好自签名证书之后就可以用js.sip或者sipml5等进行注册测试,sipml5wss端口是7443,sip用户名和密码可以配置为任意值。注册成功后运行kamcmd ul.dump可以看到用户的位置信息。