https://www.zoiper.com/en/support/home/article/179/Busy%20Lamp%20Field%20%28BLF%29%20feature%20on%20Opensips%202.4.0%20with%20Zoiper
#
# OpenSIPS 2.4.x configuration file
#
# Busy Lamp Field ( event:dialog )
# BLF + SIP Presence Server
#
# ----------- global configuration parameters ------------------------
log_level=3
debug_mode=yes
log_stderror=no
check_via=no
dns=no
rev_dns=no
listen=udp:10.7.173.117:5060
listen=tcp:10.7.173.117:5060
children=2
# ------------------ module loading ----------------------------------
mpath="/usr/local/opensips/lib64/opensips/modules/"
loadmodule "db_mysql.so"
loadmodule "sl.so"
loadmodule "signaling.so"
loadmodule "tm.so"
loadmodule "maxfwd.so"
loadmodule "textops.so"
loadmodule "sipmsgops.so"
loadmodule "rr.so"
loadmodule "mi_fifo.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "dialog.so"
loadmodule "presence.so"
loadmodule "presence_xml.so"
loadmodule "presence_dialoginfo.so"
loadmodule "pua.so"
loadmodule "pua_dialoginfo.so"
loadmodule "uri.so"
loadmodule "xcap.so"
loadmodule "proto_udp.so"
loadmodule "proto_tcp.so"
loadmodule "domain.so"
# Uncomment this if you want digest authentication
#loadmodule "auth.so"
#loadmodule "auth_db.so"
# ----------------- setting module-specific parameters ---------------
modparam("mi_fifo","fifo_name","/tmp/opensips_fifo")
# -- usrloc params --
modparam("usrloc","db_mode",2)
modparam("usrloc","db_url","mysql://opensips:opensipsrw@localhost/opensips")
# -- auth params --
# Uncomment if you are using auth module
#modparam("auth_db", "calculate_ha1", yes)
#modparam("auth_db", "password_column", "password")
# -- dialog params --
modparam("dialog", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("dialog", "db_mode", 2)
modparam("dialog", "dlg_match_mode", 1)
# -- core presence params --
modparam("presence","db_url","mysql://opensips:opensipsrw@localhost/opensips")
modparam("presence","server_address","sip:10.7.173.117:5060")
modparam("presence_xml","force_active",1)
# -- pua and pua_dialoginfo parameters --
modparam("pua","db_url","mysql://opensips:opensipsrw@localhost/opensips")
modparam("pua_dialoginfo", "presence_server", "sip:10.7.173.117:5060")
# ----- xcap params -----
modparam("xcap", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
# ----- domain params -----
modparam("domain", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("domain", "db_mode", 1) # Use caching
# ------------------------- request routing logic -------------------
# main routing logic
route{
# initial sanity checks
if(!mf_process_maxfwd_header("10")) {
send_reply("483","Too Many Hops");
exit;
}
if (has_totag()) {
# sequential requests within a dialog should
# take the path determined by record-routing
if (loose_route()) {
# route it out to whatever destination was set by loose_route()
# in $du (destination URI).
route(relay);
} else {
if (is_method("SUBSCRIBE") && is_myself("$rd")) {
# in-dialog subscribe requests
route(handle_presence);
exit;
} else if ( is_method("ACK") ) {
if ( t_check_trans() ) {
# non loose-route, but stateful ACK; must be an ACK after
# a 487 or e.g. 404 from upstream server
t_relay();
exit;
} else {
# ACK without matching transaction ->
# ignore and discard
exit;
}
}
send_reply("404","Not here");
}
exit;
}
# CANCEL processing
if (is_method("CANCEL")) {
if (t_check_trans())
t_relay();
exit;
}
t_check_trans();
# authenticate if from local subscriber (uncomment to enable auth)
# authenticate all initial non-REGISTER request that pretend to be
# generated by local subscriber (domain from FROM URI is local)
##if (!(method=="REGISTER") && from_uri==myself) {
## if (!proxy_authorize("", "subscriber")) {
## proxy_challenge("", "0");
## exit;
## }
## if (!db_check_from()) {
## send_reply("403","Forbidden auth ID");
## exit;
## }
##
## consume_credentials();
##}
# record routing
if (!is_method("REGISTER|MESSAGE"))
record_route();
# tell the dialog module to monitor all the dialogs
if (is_method("INVITE")) {
create_dialog();
# publish for both legs
dialoginfo_set();
}
if !is_myself("$rd") {
# routing to other SIP domains
route(relay);
}
# SIP 2 SIP presence traffic
if (is_method("PUBLISH|SUBSCRIBE")) {
route(handle_presence);
exit;
}
if (is_method("REGISTER")) {
# Uncomment this if you want to use digest authentication
#if (!www_authorize("", "subscriber")) {
# www_challenge("", "0");
# exit;
#}
save("location");
exit;
}
# native SIP destinations are handled using our USRLOC DB
if(!lookup("location")) {
send_reply("404","Not Found");
exit;
}
route(relay);
}
route[relay]{
# send it out
if(!t_relay())
sl_reply_error();
exit;
}
route[handle_presence]
{
if(!t_newtran()){
sl_reply_error();
exit;
}
if (is_method("PUBLISH")) {
handle_publish();
} else
if (is_method("SUBSCRIBE")) {
handle_subscribe();
}
exit;
}
If all is configured and work correctly the signalling flow should be like this:
SUBSCRIBE sip:10.7.173.117:5060 SIP/2.0.
Via: SIP/2.0/UDP 10.2.4.38:32507;branch=z9hG4bK-524287-1---110512506789a2bf;rport.
Max-Forwards: 70.
Contact: <sip:444@10.2.4.38:32507;transport=UDP>.
To: <sip:555@10.7.173.117;transport=UDP>;tag=c240f1b3635b41dffa0f3680aaac059f-4ef0.
From: <sip:444@10.7.173.117;transport=UDP>;tag=7728b34f.
Call-ID: hunAu-cGsMqYYG0qFZn-oQ...
CSeq: 10 SUBSCRIBE.
Expires: 20.
Accept: application/dialog-info+xml.
Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE.
User-Agent: Z 5.1.8 rv2.8.52_blf.
Event: dialog.
Allow-Events: presence, kpml, talk.
Content-Length: 0
SIP/2.0 200 OK.
Via: SIP/2.0/UDP 10.2.4.38:32507;received=10.2.4.38;branch=z9hG4bK-524287-1---110512506789a2bf;rport=32507.
To: <sip:555@10.7.173.117;transport=UDP>;tag=c240f1b3635b41dffa0f3680aaac059f-4ef0.
From: <sip:444@10.7.173.117;transport=UDP>;tag=7728b34f.
Call-ID: hunAu-cGsMqYYG0qFZn-oQ...
CSeq: 10 SUBSCRIBE.
Expires: 20.
Contact: <sip:10.7.173.117:5060>.
Server: OpenSIPS (2.4.0-dev (x86_64/linux)).
Content-Length: 0
.
...................
NOTIFY sip:444@10.2.4.38:32507;transport=UDP SIP/2.0.
Via: SIP/2.0/UDP 10.7.173.117:5060;branch=z9hG4bK945c.a5fb1546.0.
To: <sip:444@10.7.173.117>;tag=7728b34f.
From: <sip:555@10.7.173.117>;tag=c240f1b3635b41dffa0f3680aaac059f-4ef0.
CSeq: 6 NOTIFY.
Call-ID: hunAu-cGsMqYYG0qFZn-oQ...
Max-Forwards: 70.
Content-Length: 145.
User-Agent: OpenSIPS (2.4.0-dev (x86_64/linux)).
Event: dialog.
Contact: <sip:10.7.173.117:5060>.
Subscription-State: active;expires=20.
Content-Type: application/dialog-info+xml.
.
<?xml version="1.0"?>
<dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info" version="5" state="full" entity="sip:555@10.7.173.117"/>
SIP/2.0 200 OK.
Via: SIP/2.0/UDP 10.7.173.117:5060;branch=z9hG4bK392.9422ed95.0.
Contact: <sip:444@10.2.4.38:32507;transport=UDP>.
To: <sip:444@10.7.173.117>;tag=0a60aa39.
From: <sip:ivaylo.vangelov@10.7.173.117>;tag=c240f1b3635b41dffa0f3680aaac059f-2fd2.
Call-ID: 9wW_Ev8ndg7sJUs1haVffg...
CSeq: 6 NOTIFY.
User-Agent: Z 5.1.8 rv2.8.52_blf.
Content-Length: 0.
................................
NOTIFY sip:444@10.2.4.38:32507;transport=UDP SIP/2.0.
Via: SIP/2.0/UDP 10.7.173.117:5060;branch=z9hG4bK53cf.514e06e2.0.
To: <sip:444@10.7.173.117>;tag=7728b34f.
From: <sip:555@10.7.173.117>;tag=c240f1b3635b41dffa0f3680aaac059f-4ef0.
CSeq: 12 NOTIFY.
Call-ID: hunAu-cGsMqYYG0qFZn-oQ...
Max-Forwards: 70.
Content-Length: 503.
User-Agent: OpenSIPS (2.4.0-dev (x86_64/linux)).
Event: dialog.
Contact: <sip:10.7.173.117:5060>.
Subscription-State: active;expires=13.
Content-Type: application/dialog-info+xml.
.
<?xml version="1.0"?>
<dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info" version="11" entity="sip:555@10.7.173.117" state="partial"><dialog id="lGpy18p2Bq3URnV0r1cUtQ.." call-id="lGpy18p2Bq3URnV0r1cUtQ.." direction="initiator"><state>confirmed</state><remote><identity>sip:333@10.7.173.117</identity><target uri="sip:333@10.7.173.117"/></remote><local><identity>sip:555@10.7.173.117;transport=UDP</identity><target uri="sip:555@10.7.173.117;transport=UDP"/></local></dialog></dialog-info>
SIP/2.0 200 OK.
Via: SIP/2.0/UDP 10.7.173.117:5060;branch=z9hG4bK53cf.514e06e2.0.
Contact: <sip:444@10.2.4.38:32507;transport=UDP>.
To: <sip:444@10.7.173.117>;tag=7728b34f.
From: <sip:555@10.7.173.117>;tag=c240f1b3635b41dffa0f3680aaac059f-4ef0.
Call-ID: hunAu-cGsMqYYG0qFZn-oQ...
CSeq: 12 NOTIFY.
User-Agent: Z 5.1.8 rv2.8.52_blf.
Content-Length: 0.