[Freeswitch-dev] bridging calls using mod_managed
Michael Lutz
mytemike72 at gmail.com
Wed Jan 4 21:34:58 MSK 2012
Hi Michael,
Here it is:
2012-01-04 19:25:09.900945 [ERR] switch_cpp.cpp:1227 =============>
...A-Leg is answered
2012-01-04 19:25:09.925947 [DEBUG] switch_core_session.c:875 Send signal
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway} [BREAK]
2012-01-04 19:25:09.925947 [DEBUG] switch_core_session.c:875 Send signal
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway} [BREAK]
2012-01-04 19:25:09.925947 [DEBUG] switch_core_session.c:875 Send signal
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway} [BREAK]
2012-01-04 19:25:09.925947 [DEBUG] switch_core_session.c:875 Send signal
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway} [BREAK]
2012-01-04 19:25:09.925947 [DEBUG] sofia.c:5494 Channel
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway} entering state
[completed][200]
2012-01-04 19:25:09.925947 [DEBUG] sofia.c:5494 Channel
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway} entering state
[ready][200]
2012-01-04 19:25:09.985953 [DEBUG] switch_core_session.c:875 Send signal
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway} [BREAK]
2012-01-04 19:25:10.005955 [INFO] sofia.c:819
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway} Update Callee
ID to "HW-MIKE-TC01" <{MyOriginatingNumber}>
2012-01-04 19:25:10.005955 [DEBUG] sofia.c:7276 dispatched freeswitch event
for INFO
2012-01-04 19:25:10.125967 [DEBUG] switch_rtp.c:3204 Correct ip/port
confirmed.
2012-01-04 19:25:10.906045 [INFO] switch_channel.c:2708
sofia/external/{MyDestinationNumber}@{MyDestinationGateway} Flipping CID
from "" <{MyOutboundOriginatingNumber}> to "Outbound Call"
<{MyDestinationNumber}>
2012-01-04 19:25:10.906045 [DEBUG] switch_ivr_bridge.c:1613 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) State Change
CS_SOFT_EXECUTE -> CS_HIBERNATE
2012-01-04 19:25:10.906045 [DEBUG] switch_core_session.c:1180 Send signal
sofia/external/{MyDestinationNumber}@{MyDestinationGateway} [BREAK]
2012-01-04 19:25:10.906045 [DEBUG] switch_ivr_bridge.c:1615 (
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway}) State Change
CS_EXECUTE -> CS_HIBERNATE
2012-01-04 19:25:10.906045 [DEBUG] switch_cpp.cpp:1227 AppFunction is in
hangupCallback.
2012-01-04 19:25:10.906045 [ERR] switch_cpp.cpp:1227 =============>
HandleHangUp();
2012-01-04 19:25:10.906045 [ERR] switch_cpp.cpp:1227 =============>
Finalizing call in CDR table
2012-01-04 19:25:10.906045 [DEBUG] switch_core_state_machine.c:362 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) Running State
Change CS_HIBERNATE
2012-01-04 19:25:10.906045 [DEBUG] switch_core_state_machine.c:432 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) State HIBERNATE
2012-01-04 19:25:10.906045 [DEBUG] mod_sofia.c:222
sofia/external/{MyDestinationNumber}@{MyDestinationGateway} SOFIA HIBERNATE
2012-01-04 19:25:10.906045 [DEBUG] switch_ivr_bridge.c:749 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) State Change
CS_HIBERNATE -> CS_RESET
2012-01-04 19:25:10.906045 [DEBUG] switch_core_session.c:1180 Send signal
sofia/external/{MyDestinationNumber}@{MyDestinationGateway} [BREAK]
2012-01-04 19:25:10.906045 [DEBUG] switch_core_state_machine.c:432 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) State
HIBERNATE going to sleep
2012-01-04 19:25:10.906045 [DEBUG] switch_core_state_machine.c:362 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) Running State
Change CS_RESET
2012-01-04 19:25:10.906045 [DEBUG] switch_core_state_machine.c:413 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) State RESET
2012-01-04 19:25:10.906045 [DEBUG] mod_sofia.c:166
sofia/external/{MyDestinationNumber}@{MyDestinationGateway} SOFIA RESET
2012-01-04 19:25:10.906045 [DEBUG] switch_ivr_bridge.c:734
sofia/external/{MyDestinationNumber}@{MyDestinationGateway} CUSTOM RESET
2012-01-04 19:25:10.906045 [DEBUG] switch_ivr_bridge.c:741 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) State Change
CS_RESET -> CS_SOFT_EXECUTE
2012-01-04 19:25:10.906045 [DEBUG] switch_core_session.c:1180 Send signal
sofia/external/{MyDestinationNumber}@{MyDestinationGateway} [BREAK]
2012-01-04 19:25:10.906045 [DEBUG] switch_core_state_machine.c:413 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) State RESET
going to sleep
2012-01-04 19:25:10.906045 [DEBUG] switch_core_state_machine.c:362 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) Running State
Change CS_SOFT_EXECUTE
2012-01-04 19:25:10.906045 [DEBUG] switch_core_state_machine.c:423 (
sofia/external/{MyDestinationNumber}@{MyDestinationGateway}) State
SOFT_EXECUTE
2012-01-04 19:25:10.906045 [DEBUG] mod_sofia.c:584 SOFIA SOFT_EXECUTE
2012-01-04 19:25:10.906045 [DEBUG] switch_ivr_bridge.c:759
sofia/external/{MyDestinationNumber}@{MyDestinationGateway} CUSTOM
SOFT_EXECUTE
2012-01-04 19:25:10.906045 [DEBUG] switch_core_session.c:1180 Send signal
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway} [BREAK]
2012-01-04 19:25:10.906045 [DEBUG] switch_core_session.c:791 Send signal
sofia/internal/{MyOriginatingNumber}@{MyOriginatingGateway} [BREAK]
2012-01-04 19:25:10.906045 [DEBUG] switch_core_session.c:791 Send signal
sofia/external/{MyDestinationNumber}@{MyDestinationGateway} [BREAK]
2012-01-04 19:25:10.906045 [ERR] switch_cpp.cpp:1227 =============>
apiResult=+OK 29319eca-87df-437b-8e52-92a0427f12b2
2012-01-04 19:25:10.906045 [ERR] switch_cpp.cpp:1227 =============> As long
as both legs are Ready(), we wait......
2012-01-04 19:25:10.906045 [ERR] switch_cpp.cpp:1227 =============> There
is one leg no longer ready...
2012-01-04 19:25:10.906045 [ERR] switch_cpp.cpp:1227 =============> Session
A NO LONGER ready...
2012-01-04 19:25:10.906045 [ERR] switch_cpp.cpp:1227 =============> Session
B still ready...
this is done with this piece of code:
private string simpleCall(string route, string orig, int timeout)
{
string obCause = "ERROR";
Debug("Creating the new session...");
ManagedSession leg_b = new
ManagedSession("{ignore_early_media=true,origination_caller_id_number=" +
orig + ",originate_timeout=20}sofia/external/"+route);
if (leg_b.Ready())
{
Debug("Session_B ready!");
string fsuuid_b = leg_b.GetVariable("uuid");
Debug("Waiting for B-Leg to answer and A-Leg not to
hangup...");
while (!leg_b.answered() && leg_a.Ready() ) { /* Ringing...
*/ }
if (leg_b.answered())
{
Debug("...B-Leg is answered");
AnswerCall(leg_a);
while (!leg_a.answered()) { }
Debug("...A-Leg is answered");
leg_a.sleep(1000, 0);
string apiResult =
fsApi.ExecuteString(string.Format("uuid_bridge {1} {0}", leg_a.GetUuid(),
leg_b.GetUuid()));
Debug("apiResult="+apiResult);
obCause = "SUCCESS";
Debug("As long as both legs are Ready(), we
wait......");
while (leg_b.Ready() && leg_a.Ready())
{
// Play(leg_b, "Test\\dir-no_matching_results.wav");
// Play(leg_a, "Test\\dir-no_matching_results.wav");
}
Debug("There is one leg no longer ready...");
if (leg_a.Ready()) { Debug("Session A still ready...");
} else { Debug("Session A NO LONGER ready...");}
if (leg_b.Ready()) { Debug("Session B still ready...");
} else { Debug("Session B NO LONGER ready...");}
}
else
{
Debug("A-Leg aborted while dialing...");
}
if (leg_b.Ready())
{
Debug("B-Leg still here, so hanging up B-Leg...");
leg_b.Hangup("NORMAL_CALL_CLEARING");
leg_b.destroy();
}
}
else
{
obCause = leg_b.hangupCause();
}
Debug("SimpleCall() ended with: " + obCause);
return obCause;
}
Thanks,
Mike.
2012/1/4 Michael Giagnocavo <mgg at giagnocavo.net>
> Can you paste the debug log from FreeSWITCH when this happens?****
>
> ** **
>
> *From:* freeswitch-dev-bounces at lists.freeswitch.org [mailto:
> freeswitch-dev-bounces at lists.freeswitch.org] *On Behalf Of *Michael Lutz
> *Sent:* Wednesday, January 04, 2012 10:10 AM
> *To:* freeswitch-dev at lists.freeswitch.org
> *Subject:* [Freeswitch-dev] bridging calls using mod_managed****
>
> ** **
>
> Hi, ****
>
> I've been working with FS for some time now, and are progressing. I am
> working on a platform (in/ivr) which is handled by .net managed code
> completely. I am using just 1 application which is always launched on
> incomming calls.
> This application immedeately connects with my MSSQL server and checks
> validity of gateways, inbound number etc. Also a cdr is written and updated
> periodically while the call is active.
> I have als set the HandleHangUp handler to finalize the cdr and call when
> the calller disconnects.
> This whole mechanism works as a charm. This application then plays
> voicefiles, getdigits, and everything as I would expect.
> Hoewever at some point I want to dialout to an external number and connect
> these two calls together.
> I do not want to leave the originating .net app as long as my incomming
> caller is still online (to update the cdr and finalize the call). While
> these two are connected I need to update my database periodicaly
> (keepalive).
> I have been looking the internet to find what I need but i can't get it to
> work 100%. In fact everything works, but when I bridge the two calls
> together it fails.****
>
>
> I use the following and this whole peace of code actually works, it dials
> out, aborts when someone hangsup and when the b_leg picks up they both get
> audiofile turn by turn.... It even checks outbuond status and maps this to
> the original call. (so really acts like a switch).****
>
> Debug("Got a route=>"+route+", Let the network play
> the ringtone...");
> leg_a.Execute("ring_ready", "");****
>
> Debug("Creating the new session...");
> ManagedSession leg_b = new
> ManagedSession("sofia/external/"+route); // route holds
> {destinationNumber}@{myExternalGateway}
> if (leg_b.Ready())
> {
> Debug("Session_B ready!");
> string fsuuid_b = leg_b.GetVariable("uuid");****
>
> Debug("Waiting for B-Leg to answer and A-Leg not
> to hangup...");
> while (!leg_b.answered() && leg_a.Ready() ) { /*
> Ringing... */ }****
>
> if (leg_b.answered())
> {
> Debug("...B-Leg is answered");
> AnswerCall(leg_a);
> while (!leg_a.answered()) { }
> Debug("...A-Leg is answered");****
>
> // ****** BRIDGE SHOULD BE HERE ****** ****
>
> Debug("As long as both legs are Ready(), we
> wait......");
> while (leg_b.Ready() && leg_a.Ready())
> {
> Play(leg_b,
> "Test\\dir-no_matching_results.wav"); // REMOVE WHEN BRIDGED
> Play(leg_a,
> "Test\\dir-no_matching_results.wav"); // REMOVE WHEN BRIDGED
> }****
>
> Debug("There is one leg no longer ready...");
> if (leg_a.Ready()) { Debug("Session A still
> ready..."); } else { Debug("Session A NO LONGER ready...");}
> if (leg_b.Ready()) { Debug("Session B still
> ready..."); } else { Debug("Session B NO LONGER ready...");}
> }
> else
> {
> Debug("A-Leg aborted while dialing...");
> }****
>
> if (leg_b.Ready())
> {
> Debug("B-Leg still here, so hanging up
> B-Leg...");
> leg_b.Hangup("NORMAL_CALL_CLEARING");
> leg_b.destroy();
> }
> }
> else
> {
> string obCause = leg_b.hangupCause();****
>
> leg_a.HangUp(obCause);
> Debug("Route failed with: "+obCause);
> }
> return true;****
>
> Of course I need to bridge the two calls together so they can speak to
> each other.. I am trying to bridge the call at "// ****** BRIDGE SHOULD BE
> HERE ****** " like this:****
>
> leg_a.sleep(1000, 0);
> string apiResult = fsApi.ExecuteString(string.Format("uuid_bridge {1}
> {0}", leg_a.GetUuid(), leg_b.GetUuid()));
> Debug("apiResult="+apiResult);****
>
> The console log shows "+OK {guid of leg_a} ****
>
> but at the very same moment the incomming calls is beging hung up, (I can
> see the Debug message of my HandleHangUp() at exactly the as me time as the
> apiResult of the bridge.
> I have checked without bridge to check if codecs are the the same and they
> both are PCMU 8000.
> Please any help is appreciated! I have been trying to make this work for
> over a week now, but it won''t work.****
>
> note. I have also tried originate with the api, but gives me the same
> problem when I try to bridge these two legs together...****
>
> ****
>
> Best Regards,****
>
> Mike.****
>
> _________________________________________________________________________
> Professional FreeSWITCH Consulting Services:
> consulting at freeswitch.org
> http://www.freeswitchsolutions.com
>
>
>
>
> Official FreeSWITCH Sites
> http://www.freeswitch.org
> http://wiki.freeswitch.org
> http://www.cluecon.com
>
> FreeSWITCH-dev mailing list
> FreeSWITCH-dev at lists.freeswitch.org
> http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev
> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-dev
> http://www.freeswitch.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-dev/attachments/20120104/b935e0ce/attachment-0001.html
Join us at ClueCon 2011 Aug 9-11, 2011
More information about the FreeSWITCH-dev
mailing list