RTC Client V1.3 Receiving sent instant messages
Hello all,I have trouble getting an RTC SIP client I have written to receive a message sent to it by another client. I know that the other client does send the message because I can see the message sent using "SIP SNOOP" (which is a tool available for LCS server). I am using the following code to send the message :
public
void DoSendIM(IRTCBuddy destBuddy,string message)
{try
{
RTCCore.IRTCSession session = client.CreateSession(
RTCCore.RTC_SESSION_TYPE.RTCST_IM,null,profile,0);
try
{
session.AddParticipan(destBuddy.PresentityURI,destBuddy.Name);
session.SendMessage("try sending:",message,0);
}
catch(COMException COMex)
{
throw(COMex);
}
}
catch(Exception ex)
{
throw(ex);
}
}
After sending the message I see "603 decline" on my SIP-SNOOP. But I do see my message sent. Why is my destination client not receiving the message ?
What is the sequence of events that should be handled by the destination client so that it can receive messages ?
I added an event handler as follows but it still doesn't help:
case RTC_EVENT.RTCE_MESSAGING:
this.OnRTCMessagingEvent((IRTCMessagingEvent)rtcEvent);
break;
I am beginning to think that perhaps I should also handle session changed events or participant events but I am not sure how...
I would appreciate any advice you could give me...
Many thanks ,
Jon
Hi,
I'm having the same problem that you had. Can u send me the code with the solution because I tried everything and I can't seem to receive IM, wich means I can't trigger ther RTCE_MESSAGING event. My mail is rafl@sapo.pt.
Kind Regards
My applications is the following:
private
void button1_Click(object sender, System.EventArgs e) {
RTC_Client =
new RTCClientClass(); RTC_Client.Initialize();
RTC_Client.EventFilter =
(
0x00000100 |
0x00040000 |
0x00000001 |
0x00000080 |
0x00000010 |
0x00000400 |
0x00000002 |
0x00010000 |
0x00000008 |
0x00000004 |
0x00000200 |
0x00080000 |
0x00000800 |
0);
//portas TCP e UDP respectivamente RTC_Client.set_AllowedPorts(0x00000002, RTCCORELib.RTC_LISTEN_MODE.RTCLM_BOTH );
//Definir o Awser mode RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_APPLICATION, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_REJECT );
RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_IM, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_ACCEPT );
RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_MULTIPARTY_IM, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_ACCEPT );
RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_PC_TO_PC, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_REJECT );
RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_PC_TO_PHONE, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_REJECT );
RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_PHONE_TO_PHONE, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_REJECT );
displayName = "Servi?o de Notifica??es";
domain = "basebancamcgcx";
server = "gcxbbptusr301";
userAccount = "msftdev04";
userPassword = "dev04msft";
domainURI = "basebancamcgcx.pt";
buddyNamespace = "rtcService";
timeout = 6000000;
/* ?RTC_Client.LocalUserName
"msftdev16"
?RTC_Client.LocalUserURI
"sip:BBDEV_JBRAGA"
*/
RTC_Client.GetProfile(userAccount,userPassword,userAccount + "@" + domainURI,server,2,0); //Cria??o do gestor de eventos RTC_Client.IRTCEventNotification_Event_Event +=
new IRTCEventNotification_EventEventHandler(RTC_IRTCEventNotification_Event_Event); #region
bla RTC_Session = RTC_Client.CreateSession(RTCCORELib.RTC_SESSION_TYPE.RTCST_MULTIPARTY_IM , null,null, 0); //Adicionar um participante à sess?o RTC_Session.AddParticipant(domainURI,userAccount);
RTC_Session.SendMessage("asasas","asasasas",0);
//RL //Cria??o do event manager //Para criar um event manager relacionado com o componente RTC, deve implementar-se //o interface IRTCEventNotification_Event }
private void RTC_IRTCEventNotification_Event_Event(RTC_EVENT RTCEvent, object pEvent) {
switch (RTCEvent) {
case RTC_EVENT.RTCE_SESSION_STATE_CHANGE: IRTCSessionStateChangeEvent sessionEvent =
null; sessionEvent = (IRTCSessionStateChangeEvent)pEvent;
OnIRTCSessionStateChangeEvent(sessionEvent);
Receber_Teste("RTCE_SESSION_STATE_CHANGE");
break; case RTC_EVENT.RTCE_MESSAGING: IRTCMessagingEvent messagingEvent =
null; messagingEvent = (IRTCMessagingEvent)pEvent;
OnIRTCMessaging(messagingEvent);
Receber_Teste("RTCE_MESSAGING");
break; case RTC_EVENT.RTCE_BUDDY: Receber_Teste("RTCE_BUDDY");
break; case RTC_EVENT.RTCE_MEDIA: Receber_Teste("RTCE_MEDIA");
IRTCMediaEvent mediaEvent =
null; mediaEvent = (IRTCMediaEvent)pEvent;
OnIRTCMediaEvent(mediaEvent);
break; case RTC_EVENT.RTCE_CLIENT: Receber_Teste("RTCE_CLIENT");
break; case RTC_EVENT.RTCE_PROFILE: IRTCProfileEvent2 profileEvent =
null; profileEvent = (IRTCProfileEvent2)pEvent;
OnRTCProfileEvent(profileEvent);
Receber_Teste("RTCE_PROFILE");
break; case RTC_EVENT.RTCE_REGISTRATION_STATE_CHANGE: Receber_Teste("RTCE_REGISTRATION_STATE_CHANGE");
break; case RTC_EVENT.RTCE_GROUP: Receber_Teste("RTCE_GROUP");
break; case RTC_EVENT.RTCE_SESSION_OPERATION_COMPLETE: IRTCSessionOperationCompleteEvent SessionOperationCompleteEvent =
null; SessionOperationCompleteEvent = (IRTCSessionOperationCompleteEvent)pEvent;
OnIRTCSessionOperationComplete(SessionOperationCompleteEvent);
Receber_Teste("RTCE_SESSION_OPERATION_COMPLETE");
break; }
}
private void OnIRTCSessionStateChangeEvent(IRTCSessionStateChangeEvent sessionEvent) {
RTC_SESSION_STATE sessionState;
sessionState = sessionEvent.State;
switch(sessionState) {
case RTC_SESSION_STATE.RTCSS_INCOMING: RTC_Client.PlayRing(RTC_RING_TYPE.RTCRT_PHONE,
true); RTC_Session.Answer();
break; case RTC_SESSION_STATE.RTCSS_INPROGRESS: RTC_Client.PlayRing(RTC_RING_TYPE.RTCRT_PHONE,
true); RTC_Session.Answer();
break; }
}
private void OnIRTCMediaEvent(IRTCMediaEvent mediaEvent) {
RTC_MEDIA_EVENT_TYPE mediaType;
IVideoWindow videoWindow =
null; mediaType = mediaEvent.EventType;
switch(mediaType) {
case RTC_MEDIA_EVENT_TYPE.RTCMET_STARTED: videoWindow = RTC_Client.get_IVideoWindow(RTC_VIDEO_DEVICE.RTCVD_RECEIVE);
videoWindow.SetWindowPosition(50,50,400,380);
videoWindow.Visible = 1;
break; case RTC_MEDIA_EVENT_TYPE.RTCMET_STOPPED: videoWindow = RTC_Client.get_IVideoWindow(RTC_VIDEO_DEVICE.RTCVD_RECEIVE);
videoWindow.SetWindowPosition(50,50,400,380);
videoWindow.Visible = 0;
videoWindow =
null; break; }
}
private void OnIRTCMessaging(IRTCMessagingEvent messagingEvent) {
switch(messagingEvent.EventType) {
case RTC_MESSAGING_EVENT_TYPE.RTCMSET_STATUS : switch( messagingEvent.UserStatus) {
case RTC_MESSAGING_USER_STATUS.RTCMUS_IDLE: break; case RTC_MESSAGING_USER_STATUS.RTCMUS_TYPING: break; }
break; case RTC_MESSAGING_EVENT_TYPE.RTCMSET_MESSAGE: messageReceivedFromUserUri = messagingEvent.Participant.UserURI; messageHeader = messagingEvent.MessageHeader;
message = messagingEvent.Message;
MessageBox.Show(messageReceivedFromUserUri + " : " + message );
break; }
}
private void OnRTCProfileEvent(IRTCProfileEvent2 profileEvent) {
switch (profileEvent.EventType) {
case RTC_PROFILE_EVENT_TYPE.RTCPFET_PROFILE_GET: if (profileEvent.StatusCode == 0 ) {
RTCProfile = (IRTCProfile2)profileEvent.Profile;
RTCProfile.AllowedAuth = 0x00010000 | 0x00000004 | 0x00000008;
RTC_Presence = RTC_Client;
RTC_Presence.EnablePresenceEx(RTCProfile,
null,0); RTC_Presence.OfferWatcherMode = RTC_OFFER_WATCHER_MODE.RTCOWM_OFFER_WATCHER_EVENT;
RCT_Provisioning.EnableProfileEx (RTCProfile,0x0000000F,0x0000000F);
RTC_Presence.SetLocalPresenceInfo(RTC_PRESENCE_STATUS.RTCXS_PRESENCE_OFFLINE,"Teste");
else {
MessageBox.Show("N?o tem perfil");
}
break; }
}
private void OnIRTCSessionOperationComplete(IRTCSessionOperationCompleteEvent sessionOpCompleteEvent) {
System.Diagnostics.Debug.WriteLine("SessionOperationComplete");
Hi,
I'm having the same problem that you had. Can u send me the code with the solution because I tried everything and I can't seem to receive IM, wich means I can't trigger ther RTCE_MESSAGING event. My mail is rafl@sapo.pt.
Kind Regards
My applications is the following:
private
void button1_Click(object sender, System.EventArgs e) {
RTC_Client =
new RTCClientClass(); RTC_Client.Initialize();
RTC_Client.EventFilter =
(
0x00000100 |
0x00040000 |
0x00000001 |
0x00000080 |
0x00000010 |
0x00000400 |
0x00000002 |
0x00010000 |
0x00000008 |
0x00000004 |
0x00000200 |
0x00080000 |
0x00000800 |
0);
//portas TCP e UDP respectivamente RTC_Client.set_AllowedPorts(0x00000002, RTCCORELib.RTC_LISTEN_MODE.RTCLM_BOTH );
//Definir o Awser mode RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_APPLICATION, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_REJECT );
RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_IM, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_ACCEPT );
RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_MULTIPARTY_IM, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_ACCEPT );
RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_PC_TO_PC, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_REJECT );
RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_PC_TO_PHONE, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_REJECT );
RTC_Client.set_AnswerMode( RTCCORELib.RTC_SESSION_TYPE.RTCST_PHONE_TO_PHONE, RTCCORELib.RTC_ANSWER_MODE.RTCAM_AUTOMATICALLY_REJECT );
displayName = "Servi?o de Notifica??es";
domain = "basebancamcgcx";
server = "gcxbbptusr301";
userAccount = "msftdev04";
userPassword = "dev04msft";
domainURI = "basebancamcgcx.pt";
buddyNamespace = "rtcService";
timeout = 6000000;
/* ?RTC_Client.LocalUserName
"msftdev16"
?RTC_Client.LocalUserURI
"sip:BBDEV_JBRAGA"
*/
RTC_Client.GetProfile(userAccount,userPassword,userAccount + "@" + domainURI,server,2,0); //Cria??o do gestor de eventos RTC_Client.IRTCEventNotification_Event_Event +=
new IRTCEventNotification_EventEventHandler(RTC_IRTCEventNotification_Event_Event); #region
bla RTC_Session = RTC_Client.CreateSession(RTCCORELib.RTC_SESSION_TYPE.RTCST_MULTIPARTY_IM , null,null, 0); //Adicionar um participante à sess?o RTC_Session.AddParticipant(domainURI,userAccount);
RTC_Session.SendMessage("asasas","asasasas",0);
//RL //Cria??o do event manager //Para criar um event manager relacionado com o componente RTC, deve implementar-se //o interface IRTCEventNotification_Event }
private void RTC_IRTCEventNotification_Event_Event(RTC_EVENT RTCEvent, object pEvent) {
switch (RTCEvent) {
case RTC_EVENT.RTCE_SESSION_STATE_CHANGE: IRTCSessionStateChangeEvent sessionEvent =
null; sessionEvent = (IRTCSessionStateChangeEvent)pEvent;
OnIRTCSessionStateChangeEvent(sessionEvent);
Receber_Teste("RTCE_SESSION_STATE_CHANGE");
break; case RTC_EVENT.RTCE_MESSAGING: IRTCMessagingEvent messagingEvent =
null; messagingEvent = (IRTCMessagingEvent)pEvent;
OnIRTCMessaging(messagingEvent);
Receber_Teste("RTCE_MESSAGING");
break; case RTC_EVENT.RTCE_BUDDY: Receber_Teste("RTCE_BUDDY");
break; case RTC_EVENT.RTCE_MEDIA: Receber_Teste("RTCE_MEDIA");
IRTCMediaEvent mediaEvent =
null; mediaEvent = (IRTCMediaEvent)pEvent;
OnIRTCMediaEvent(mediaEvent);
break; case RTC_EVENT.RTCE_CLIENT: Receber_Teste("RTCE_CLIENT");
break; case RTC_EVENT.RTCE_PROFILE: IRTCProfileEvent2 profileEvent =
null; profileEvent = (IRTCProfileEvent2)pEvent;
OnRTCProfileEvent(profileEvent);
Receber_Teste("RTCE_PROFILE");
break; case RTC_EVENT.RTCE_REGISTRATION_STATE_CHANGE: Receber_Teste("RTCE_REGISTRATION_STATE_CHANGE");
break; case RTC_EVENT.RTCE_GROUP: Receber_Teste("RTCE_GROUP");
break; case RTC_EVENT.RTCE_SESSION_OPERATION_COMPLETE: IRTCSessionOperationCompleteEvent SessionOperationCompleteEvent =
null; SessionOperationCompleteEvent = (IRTCSessionOperationCompleteEvent)pEvent;
OnIRTCSessionOperationComplete(SessionOperationCompleteEvent);
Receber_Teste("RTCE_SESSION_OPERATION_COMPLETE");
break; }
}
private void OnIRTCSessionStateChangeEvent(IRTCSessionStateChangeEvent sessionEvent) {
RTC_SESSION_STATE sessionState;
sessionState = sessionEvent.State;
switch(sessionState) {
case RTC_SESSION_STATE.RTCSS_INCOMING: RTC_Client.PlayRing(RTC_RING_TYPE.RTCRT_PHONE,
true); RTC_Session.Answer();
break; case RTC_SESSION_STATE.RTCSS_INPROGRESS: RTC_Client.PlayRing(RTC_RING_TYPE.RTCRT_PHONE,
true); RTC_Session.Answer();
break; }
}
private void OnIRTCMediaEvent(IRTCMediaEvent mediaEvent) {
RTC_MEDIA_EVENT_TYPE mediaType;
IVideoWindow videoWindow =
null; mediaType = mediaEvent.EventType;
switch(mediaType) {
case RTC_MEDIA_EVENT_TYPE.RTCMET_STARTED: videoWindow = RTC_Client.get_IVideoWindow(RTC_VIDEO_DEVICE.RTCVD_RECEIVE);
videoWindow.SetWindowPosition(50,50,400,380);
videoWindow.Visible = 1;
break; case RTC_MEDIA_EVENT_TYPE.RTCMET_STOPPED: videoWindow = RTC_Client.get_IVideoWindow(RTC_VIDEO_DEVICE.RTCVD_RECEIVE);
videoWindow.SetWindowPosition(50,50,400,380);
videoWindow.Visible = 0;
videoWindow =
null; break; }
}
private void OnIRTCMessaging(IRTCMessagingEvent messagingEvent) {
switch(messagingEvent.EventType) {
case RTC_MESSAGING_EVENT_TYPE.RTCMSET_STATUS : switch( messagingEvent.UserStatus) {
case RTC_MESSAGING_USER_STATUS.RTCMUS_IDLE: break; case RTC_MESSAGING_USER_STATUS.RTCMUS_TYPING: break; }
break; case RTC_MESSAGING_EVENT_TYPE.RTCMSET_MESSAGE: messageReceivedFromUserUri = messagingEvent.Participant.UserURI; messageHeader = messagingEvent.MessageHeader;
message = messagingEvent.Message;
MessageBox.Show(messageReceivedFromUserUri + " : " + message );
break; }
}
private void OnRTCProfileEvent(IRTCProfileEvent2 profileEvent) {
switch (profileEvent.EventType) {
case RTC_PROFILE_EVENT_TYPE.RTCPFET_PROFILE_GET: if (profileEvent.StatusCode == 0 ) {
RTCProfile = (IRTCProfile2)profileEvent.Profile;
RTCProfile.AllowedAuth = 0x00010000 | 0x00000004 | 0x00000008;
RTC_Presence = RTC_Client;
RTC_Presence.EnablePresenceEx(RTCProfile,
null,0); RTC_Presence.OfferWatcherMode = RTC_OFFER_WATCHER_MODE.RTCOWM_OFFER_WATCHER_EVENT;
RCT_Provisioning.EnableProfileEx (RTCProfile,0x0000000F,0x0000000F);
RTC_Presence.SetLocalPresenceInfo(RTC_PRESENCE_STATUS.RTCXS_PRESENCE_OFFLINE,"Teste");
else {
MessageBox.Show("N?o tem perfil");
}
break; }
}
private void OnIRTCSessionOperationComplete(IRTCSessionOperationCompleteEvent sessionOpCompleteEvent) {
System.Diagnostics.Debug.WriteLine("SessionOperationComplete");
Hi,
I am trying to follow the steps you have given for IM sample. I am not getting any error but the problem here is that I am not getting session status as connected and perhaps till the time its not connected, it won't even send message. Session state is Inprogress in the start and then Disconnected.
Also would like to know, that is it neccessary to register on SIP?
Below is my code:
on FormLoad
g_objRTCClient = New RTCCORELib.RTCClient
' RTCClient needs to be initialized before any other method can be called on it.Call g_objRTCClient.Initialize()
' Set the EventFilter to accept events.
g_objRTCClient.EventFilter = MY_RTC_EVENTFILTERS
' Register the outgoing interface that will receive the events.
g_objRTCClientWithEvents = g_objRTCClient
' Prepare for outgoing calls and listen for incoming sessions on both a dynamic port
' and a well-know static port.
g_objRTCClient.ListenForIncomingSessions = RTCCORELib.RTC_LISTEN_MODE.RTCLM_BOTH
on click of send button:
Dim strDestURI As String strDestURI = Trim(TextBox2.Text)
g_objSession = g_objRTCClient.CreateSession(RTCCORELib.RTC_SESSION_TYPE.RTCST_IM, vbNullString, Nothing, 0)
'(2) Add participant to initiate call.
g_objParticipant = g_objSession.AddParticipant(strDestURI, "Any Name")
MsgBox(g_objSession.State)
g_objSession.SendMessage("HI", TextBox3.Text, 0)
and then EventHandler
Private Sub g_objRTCClientWithEvents_Event(ByVal RTCEvent As RTCCORELib.RTC_EVENT, ByVal pEvent As Object) Handles g_objRTCClientWithEvents.Event ' Call appropriate procedure to handle each type of event
Select Case RTCEvent
Case RTCCORELib.RTC_EVENT.RTCE_MESSAGING
OnRTCMessagingEvent(pEvent)
Case RTCCORELib.RTC_EVENT.RTCE_SESSION_STATE_CHANGE
Call SessionStateEvent(pEvent)
End Select But RTC_MESSAGING Event is never called up only.
Would appreciate if you can help me urgently on this.
Thanks and Regards,
Ekta