Hello Nick! I'm still learning more about Kamailio and how it works. This is being a lil bit hard to me because I don't understand too much about programming and all those "if's" and "else's", but I'll be happy to help you and provide you the information that I used to have y scenario working fine.
I spent a lot of time to have this scenario up and running in the way that I need, but here are the main documentation which I used: This link here explain how to have Registrar and Proxy in different servers. It helped me a lot to understand the message flow between the servers: http://www.kamailio.org/dokuwiki/doku.php/tutorials:openser-modular-install This here, shows how to enable the websockets in Kamailio. I think that is a good point to start: http://nil.uniza.sk/sip/kamailio/configuring-kamailio-4x-websocket Here I found a good example that shows how to have an Edge Proxy with websockets support: https://github.com/kamailio/kamailio/blob/master/examples/outbound/edge_websocket.cfg So, I got a mix of information and a lot of attempts and errors. BTW, many thanks to Daniel and Frank Carmickle that helped me a lot with my questions! If you need more help, please let me know! :-) *Bruno Emer* Mobile: +55 11 96540-0044 email: brunoe...@gmail.com <https://www.facebook.com/bruno.emer.5> <https://www.linkedin.com/profile/view?id=86461237&trk=spm_pic> <https://twitter.com/brunoemer_> <https://www.flickr.com/photos/122070309@N03/> <http://google.com/+BrunoEmer> <http://instagram.com/brunoemer_> 2014-09-24 10:52 GMT-03:00 Bruno Emer <brunoe...@gmail.com>: > Thanks again for your help, Daniel! > > Now my scenario is working! > I have two Edge Proxies and a single Registrar server pointing to a > external PostgreSQL database. > > My two users (alice and bob) are authenticated each one in a Edge Proxy > and I can start a session between then using WebSockets. I'm using WebRTC > (JSSIP) as a client to start the calls. > > :-) > > > > > > *Bruno Emer* > > Mobile: +55 11 96540-0044 > email: brunoe...@gmail.com > <https://www.facebook.com/bruno.emer.5> > <https://www.linkedin.com/profile/view?id=86461237&trk=spm_pic> > <https://twitter.com/brunoemer_> > <https://www.flickr.com/photos/122070309@N03/> > <http://google.com/+BrunoEmer> <http://instagram.com/brunoemer_> > > 2014-09-23 18:07 GMT-03:00 Bruno Emer <brunoe...@gmail.com>: > > Hello Guys! >> >> Good news about my tests here! >> I found some configurations relative to Outbound proxy and I get this >> working. Now, I can have two outbound proxies, one registrar and one >> database. I can register one user in the Outbound Proxy1 and one user in >> Outbound Proxy 2 and place a call between these users. >> >> But now I'm facing another problem! The ACK messages are not being >> delivered, so the session is being dropped after a few seconds. I think >> that the problem is in the Contact field. Trying to investigate it now! >> >> I'm not sure about how to change the message to deliver the ACK. Did >> someone had this problem before? >> >> In anycase, here is the routing configuration that I'm using in my >> Oubound proxy: >> >> >> request_route { >> if (($Rp == MY_WS_PORT || $Rp == MY_WSS_PORT) >> && !(proto == WS || proto == WSS)) { >> xlog("L_WARN", "SIP request received on $Rp\n"); >> sl_send_reply("403", "Forbidden"); >> exit; >> } >> >> route(REQINIT); >> >> if (is_method("CANCEL")) { >> if (t_check_trans()) { >> route(RELAY); >> } >> exit; >> } >> >> route(WITHINDLG); >> >> t_check_trans(); >> >> if (is_method("REGISTER")) { >> remove_hf("Route"); >> add_path(); >> $du = "sip:REGISTRAR_IP:REGISTRAR_PORT"; >> } else { >> if (is_method("INVITE|SUBSCRIBE|ACK")) >> record_route(); >> >> if (@via[2] == "") { >> # From client so route to registrar... >> >> if ($rU == $null) { >> sl_send_reply("484", "Address Incomplete"); >> exit; >> } >> remove_hf("Route"); >> $du = "sip:REGISTRAR_IP:REGISTRAR_PORT"; >> } else { >> # From registrar so route using "Route:" headers... >> >> if (!loose_route()) { >> switch($rc) { >> case -2: >> sl_send_reply("403", "Forbidden"); >> exit; >> default: >> xlog("L_ERR", "in request_route\n"); >> sl_reply_error(); >> exit; >> } >> } >> >> t_on_failure("FAIL_OUTBOUND"); >> } >> } >> >> route(RELAY); >> } >> >> route[RELAY] { >> if (!t_relay()) { >> sl_reply_error(); >> } >> exit; >> } >> >> route[REQINIT] { >> if (!mf_process_maxfwd_header("10")) { >> sl_send_reply("483","Too Many Hops"); >> exit; >> } >> >> if(!sanity_check("1511", "7")) >> { >> xlog("Malformed SIP message from $si:$sp\n"); >> exit; >> } >> } >> >> route[WITHINDLG] { >> if (has_totag()) { >> if (!loose_route()) { >> switch($rc) { >> case -2: >> sl_send_reply("403", "Forbidden"); >> exit; >> default: >> if (is_method("ACK")) { >> if ( t_check_trans() ) { >> record_route(); >> route(RELAY); >> exit; >> } else { >> exit; >> } >> } >> sl_send_reply("404","Not Found"); >> } >> } else { >> if (is_method("NOTIFY")) { >> record_route(); >> } >> route(RELAY); >> } >> exit; >> } >> } >> >> onreply_route { >> if (($Rp == MY_WS_PORT || $Rp == MY_WSS_PORT) >> && !(proto == WS || proto == WSS)) { >> xlog("L_WARN", "SIP response received on $Rp\n"); >> drop; >> } >> >> if (!t_check_trans()) { >> drop; >> } >> >> if ($rm == "REGISTER" && $rs >= 200 && $rs <= 299) { >> remove_hf("Flow-Timer"); >> if ($(hdr(Require)[*])=~"outbound") >> insert_hf("Flow-Timer: FLOW_TIMER\r\n", "Call-ID"); >> } >> } >> >> failure_route[FAIL_OUTBOUND] { >> if (t_branch_timeout() || !t_branch_replied()) { >> send_reply("430", "Flow Failed"); >> } >> } >> >> event_route[xhttp:request] { >> set_reply_close(); >> set_reply_no_connect(); >> >> if ($Rp != MY_WS_PORT >> #!ifdef WITH_TLS >> && $Rp != MY_WSS_PORT >> #!endif >> ) { >> xlog("L_WARN", "HTTP request received on $Rp\n"); >> xhttp_reply("403", "Forbidden", "", ""); >> exit; >> } >> >> xlog("L_DBG", "HTTP Request Received\n"); >> >> if ($hdr(Upgrade)=~"websocket" >> && $hdr(Connection)=~"Upgrade" >> && $rm=~"GET") { >> >> # Validate Host - make sure the client is using the correct >> # alias for WebSockets >> if ($hdr(Host) == $null || !is_myself("sip:" + $hdr(Host))) { >> xlog("L_WARN", "Bad host $hdr(Host)\n"); >> xhttp_reply("403", "Forbidden", "", ""); >> exit; >> } >> >> # Optional... validate Origin - make sure the client is from an >> # authorised website. For example, >> # >> # if ($hdr(Origin) != "http://communicator.MY_DOMAIN" >> # && $hdr(Origin) != "https://communicator.MY_DOMAIN") { >> # xlog("L_WARN", "Unauthorised client $hdr(Origin)\n"); >> # xhttp_reply("403", "Forbidden", "", ""); >> # exit; >> # } >> >> # Optional... perform HTTP authentication >> >> # ws_handle_handshake() exits (no further configuration file >> # processing of the request) when complete. >> if (ws_handle_handshake()) >> { >> # Optional... cache some information about the >> # successful connection >> exit; >> } >> } >> >> xhttp_reply("404", "Not Found", "", ""); >> } >> >> event_route[websocket:closed] { >> xlog("L_INFO", "WebSocket connection from $si:$sp has closed\n"); >> } >> >> >> >> >> Thanks again!!! >> >> >> >> *Bruno Emer* >> >> Mobile: +55 11 96540-0044 >> email: brunoe...@gmail.com >> <https://www.facebook.com/bruno.emer.5> >> <https://www.linkedin.com/profile/view?id=86461237&trk=spm_pic> >> <https://twitter.com/brunoemer_> >> <https://www.flickr.com/photos/122070309@N03/> >> <http://google.com/+BrunoEmer> <http://instagram.com/brunoemer_> >> >> 2014-09-22 12:40 GMT-03:00 Bruno Emer <brunoe...@gmail.com>: >> >> Hi, Daniel and Frank! >>> >>> Thanks for your support! >>> Now, I changed my scenario just a lil bit to make it easy to understand >>> and deploy. I'm doing the following: >>> >>> 1. Created a server using the "Outbound" module configuration >>> example, but add WebSocket support in it. (IP Address 192.168.1.16) >>> 2. Created a server running as Proxy and Registrar with WebSockets >>> support. (IP Address 192.168.1.15) >>> 3. Registered two users (bob and al...@enterprise.com) using WebRTC. >>> These users sent they Register requests to the Oubount server >>> (192.168.1.16). >>> 4. I'm also using an external postgres database to store the user >>> informations. In my proxy/registrar server, I've configurated >>> "modparam("usrloc", "db_mode", 3)", so it will not store data in memory. >>> >>> >>> After register the users in my scenario, I can see the following >>> information stored in my database (output of kamctl db show location): >>> >>> id | ruid | username | domain | >>> contact | received | path | >>> expires | q | callid | cseq | last_modified | >>> flags | cflags | user_agent | socket | methods | >>> instance | reg_id >>> >>> -----+----------------------+----------+----------------+------------------------------------------------+-----------------------+------+---------------------+----+------------------------+------+---------------------+-------+--------+-------------------+---------------------+---------+-------------------------------------------------+-------- >>> 277 | uloc-54203f71-10bd-2 | alice | enterprise.com | >>> sip:v4s0prah@o35ctmdnnruv.invalid;transport=ws | sip:192.168.1.16:5060 >>> | | 2014-09-22 15:31:21 | -1 | udb4shpe4dnm1jsl6016s5 | 82 | >>> 2014-09-22 15:26:21 | 0 | 0 | JsSIP 0.4.0-devel | udp: >>> 192.168.1.15:80 | 783 | >>> <urn:uuid:75c837d1-740a-4c62-baa0-56a06149699e> | 1 >>> 278 | uloc-54203f71-10bc-2 | bob | enterprise.com | >>> sip:lr78s270@0mkf6fgtprlh.invalid;transport=ws | sip:192.168.1.16:5060 >>> | | 2014-09-22 15:34:02 | -1 | 5mpl9q4bkuqsnpk8r316j5 | 82 | >>> 2014-09-22 15:29:02 | 0 | 0 | JsSIP 0.4.0-devel | udp: >>> 192.168.1.15:80 | 783 | >>> <urn:uuid:e92ef911-1ae4-45b1-bfc9-b5752b0f2fe1> | 1 >>> >>> >>> So, I can assume that both users are registered and ready to start >>> sessions. >>> >>> Now, when I try to start a new session between then (let's say bob >>> calling alice) what I get in the endpoint is the following message: >>> >>> SIP/2.0 500 I'm terribly sorry, server error occurred (1/SL) >>> Via: SIP/2.0/WS >>> 0mkf6fgtprlh.invalid;rport=33154;received=192.168.1.11;branch=z9hG4bK7711221 >>> To: <sip:al...@enterprise.com>;tag=94c1b96a0e6eb467885b5057e1e49f9e.1970 >>> From: <sip:b...@enterprise.com>;tag=on056iipql >>> Call-ID: 5e1pmj2fppbgg13doi4k >>> CSeq: 3989 INVITE >>> Server: kamailio (4.1.5 (x86_64/linux)) >>> Content-Length: 0 >>> >>> What I understood about this problem is that the Proxy server is trying >>> to forward the INVITE to the Outbound server and this server does not know >>> that to do with this message - like forward it to alice. >>> >>> I'm stucked in this step. >>> >>> Here you can find the configuration files that I'm using: >>> >>> Outbound Server: >>> https://mega.co.nz/#!Wlw2RL7S!G2YOP-1QbSCeNQddaAe3kyQMqz8yteZlZsAUpjZX4v4 >>> >>> Proxy Server: >>> https://mega.co.nz/#!qxAXTbbb!4zBjRtmADdl3rPCN2Yidd3xnZEjFahW3GSMb00w41xc >>> >>> >>> >>> Thanks again! >>> >>> Bruno Emer >>> >>> >>> >>> *Bruno Emer* >>> >>> Mobile: +55 11 96540-0044 >>> email: brunoe...@gmail.com >>> <https://www.facebook.com/bruno.emer.5> >>> <https://www.linkedin.com/profile/view?id=86461237&trk=spm_pic> >>> <https://twitter.com/brunoemer_> >>> <https://www.flickr.com/photos/122070309@N03/> >>> <http://google.com/+BrunoEmer> <http://instagram.com/brunoemer_> >>> >>> 2014-09-18 18:04 GMT-03:00 Bruno Emer <brunoe...@gmail.com>: >>> >>> Ok, Daniel! >>>> >>>> I am trying exactly what you said, but for some reason the proxy server >>>> can't forward the message back to the WebSocket server. I am getting >>>> "487 Unresolvable destination". Appears that my Proxy Server can't get data >>>> from usrloc. >>>> >>>> When I register an user using WebRTC I can see that the system stores >>>> the information in kamailio database and in the field "contact" it puts a >>>> string. The Proxy server is looking in database and just find this >>>> information. Actually, I'm trying to understand the entire process that >>>> envolves passing information from an Edge Server to a Proxy server that >>>> sends the Register information to another Registrar server (as I described >>>> before). The database is shared between all the servers, and they are in >>>> the same network. >>>> >>>> I just read the information in another topic, as you said, but I think >>>> that my case is a lil bit different from it. I you agree, I can post my >>>> configuration files here. Maybe this can help another users with the same >>>> problem! >>>> >>>> Thanks again!!! >>>> >>>> >>>> >>>> *Bruno Emer* >>>> >>>> Mobile: +55 11 96540-0044 >>>> email: brunoe...@gmail.com >>>> <https://www.facebook.com/bruno.emer.5> >>>> <https://www.linkedin.com/profile/view?id=86461237&trk=spm_pic> >>>> <https://twitter.com/brunoemer_> >>>> <https://www.flickr.com/photos/122070309@N03/> >>>> <http://google.com/+BrunoEmer> <http://instagram.com/brunoemer_> >>>> >>>> 2014-09-17 9:13 GMT-03:00 Bruno Emer <brunoe...@gmail.com>: >>>> >>>> Hello! >>>>> >>>>> I am relatively new to Kamailio and I'm trying to create a new >>>>> enviroment using it in my company. I am thinking about use Amazon to host >>>>> the servers and use OpsWorks to automatically escalate then if necessary. >>>>> To accomplish this, my idea is to separate the servers, using one >>>>> dedicated >>>>> server to run as WebSocket, one to run as proxy and one as a Registrar. >>>>> I'll be using just one database to store informations to all of my >>>>> servers. >>>>> With this, if I need more resources later, I can just create new servers >>>>> with the specific roles (WebSockets, Proxy, Registrar). >>>>> >>>>> By now, the idea is clear, but the point is that I don't know how to >>>>> separate the WebSockets server from the proxy server. Actually, I can do >>>>> this, but when I have one agent using a regular softphone and one agent >>>>> using WebSockets (with JSSIP) they are not able to establish a session if >>>>> the softphone user starts it. Now, I want to know if is there a way to use >>>>> two websockets servers, register users using both of then and start >>>>> sessions between then, with a separated proxy and registrar. >>>>> >>>>> Has anyone done this before? Is possible to use kamailio like this? >>>>> >>>>> >>>>> Thanks. >>>>> >>>>> >>>>> >>>>> *Bruno Emer* >>>>> >>>>> Mobile: +55 11 96540-0044 >>>>> email: brunoe...@gmail.com >>>>> <https://www.facebook.com/bruno.emer.5> >>>>> <https://www.linkedin.com/profile/view?id=86461237&trk=spm_pic> >>>>> <https://twitter.com/brunoemer_> >>>>> <https://www.flickr.com/photos/122070309@N03/> >>>>> <http://google.com/+BrunoEmer> <http://instagram.com/brunoemer_> >>>>> >>>> >>>> >>> >> >
_______________________________________________ SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list sr-users@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users