云通讯平台C#平台的VOIP接口初识教程

route211 2014-08-15 04:46:55
最近公司项目要用到VOIP网络通话功能和IM即时通信功能,公司的领导为我们提供了云通讯这个平台,让我们使用这个平台进行开发,但让我纳闷的是这个平台只有android和ios手机平台sdk,唯独没有windows phone 平台,而我是开发windows phone 平台,我心里就有点失落,后来,我联系了云通讯平台的商务,他回答是目前因为没有市场需求,还不打算开发这个平台,还需要等待。从那以后,我一直关注云通讯这个平台,希望有惊喜出现,可是没有。突然有一天,云通讯的技术人员在群里提供了一份C#的demo,我心里有点惊喜,我想,C#平台应该和windows phone 平台差不多吧,都是C#语言,于是,我下载下来研究了一下,并把使用的教程分享一下给大家。
首先,我打开了这个C# 平台的demo,发现还是第一个测试版本,有些功能还没有,但VOIP功能已经有了,我研究一下VOIP功能使用C#是如何实现的。这个项目的基本工程结构如下:

图1

其中那个CCPAppClient文件应该是与平台有关的接口方法类存放的地方了,打开它,看了一下CCPCall类,其中说明了与平台连接的状态,还有平台提供的相关功能,以及账号登陆成功与否的判断。代码如下:
private CCPCall()
{
cf.onConnected = onConnected;
cf.onConnectError = onConnectError;
cf.onIncomingCallReceived = onIncomingCallReceived;
cf.onCallProceeding = onCallProceeding;
cf.onCallAlerting = onCallAlerting;
cf.onCallAnswered = onCallAnswered;
cf.onMakeCallFailed = onMakeCallFailed;
cf.onCallPaused = onCallPaused;
cf.onCallPausedByRemote = onCallPausedByRemote;
cf.onCallReleased = onCallReleased;
cf.onCallTransfered = onCallTransfered;
cf.onDtmfReceived = onDtmfReceived;
cf.onLogInfo = onLogInfo;
cf.onResumed = onResumed;
cf.onNotifyGeneralEvent = onNotifyGeneralEvent;
cf.onRecordVoiceCallStatus = onRecordVoiceCallStatus;
cf.onCallMediaUpdateRequest = onCallMediaUpdateRequest;
cf.onCallMediaUpdateResponse = onCallMediaUpdateResponse;
cf.onFirewallPolicyEnabled = onFirewallPolicyEnabled;
cf.onRemoteVideoRatio = onRemoteVideoRatio;

//即时消息
cf.onReceiveInstanceMessage = onReceiveInstanceMessage;
cf.onSendInstanceMessage = onSendInstanceMessage;
cf.onDownloadAttached = onDownloadAttached;
cf.onConfirmInstanceMessage = onConfirmInstanceMessage;
cf.onRateOfProgressAttachMsgs = onRateOfProgressAttachMsgs;
cf.onRecordingTimeOut = onRecordingTimeOut;
cf.onFinishedPlaying = onFinishedPlaying;
cf.onRecordingAmplitude = onRecordingAmplitude;

//实时对讲
cf.onReceiveInterphoneMsg = onReceiveInterphoneMsg;
cf.onInterphoneState = onInterphoneState;
cf.onInterphoneExit = onInterphoneExit;
cf.onControlMicState = onControlMicState;
cf.onReleaseMicState = onReleaseMicState;
cf.onInterphoneMembers = onInterphoneMembers;

//双向回呼
cf.onCallBack = onCallBack;

//多人聊天室
cf.onReceiveChatroomMsg = onReceiveChatroomMsg;
cf.onChatroomState = onChatroomState;
cf.onChatroomExit = onChatroomExit;
cf.onChatrooms = onChatrooms;
cf.onChatroomMembers = onChatroomMembers;
cf.onChatroomInviteMembers = onChatroomInviteMembers;
cf.onChatroomRemoveMember = onChatroomRemoveMember;
cf.onChatroomDismiss = onChatroomDismiss;

//检查版本更新
cf.onCheckVersion = onCheckVersion;
cf.onDownloadUpdateFiles = onDownloadUpdateFiles;
cf.onRateOfProgressDownloadUpdateFiles = onRateOfProgressDownloadUpdateFiles;

//检测网络状态
cf.onCheckNetStat = onCheckNetStat;
cf.onRateOfCheckNetStat = onRateOfCheckNetStat;

//发送下行短信
cf.onSendSMS = onSendSMS;

//视频会议
cf.onReceiveVideoConferenceMsg = onReceiveVideoConferenceMsg;
cf.onVideoConferenceState = onVideoConferenceState;
cf.onVideoConferenceExit = onVideoConferenceExit;
cf.onVideoConferences = onVideoConferences;
cf.onVideoConferenceMembers = onVideoConferenceMembers;
cf.onVideoConferenceRemoveMember = onVideoConferenceRemoveMember;
cf.onVideoConferenceDismiss = onVideoConferenceDismiss;
cf.onSwitchRealScreenToVoip = onSwitchRealScreenToVoip;
cf.onSendLocalPortrait = onSendLocalPortrait;
cf.onGetPortraitsFromVideoConference = onGetPortraitsFromVideoConference;
cf.onDownloadVideoConferencePortraits = onDownloadVideoConferencePortraits;

//NativeMethods.CCPsetLogLevel(5);
initCCPRet = NativeMethods.CCPinit(ref cf);
//int ret = NativeMethods.CCPsetRing(System.Windows.Forms.Application.StartupPath+@"/ring.wav");
//ret = NativeMethods.CCPsetRingback(System.Windows.Forms.Application.StartupPath+@"/ringback.wav");
configInfo.readConfigFile();
}

这些代码的提供与Rest API中的CCPCall类相似,于是,我就明白了这个类是供应用程序调用的接口类。接着,我找了一下配置文件,在config文件下,这个配置是ini格式,与Rest API的配置文件格式不一样,但配置的条件是一样,还是那主账号,子账号之类的东西,如图2所示:

图2

这里有些纳闷,那个setting.ini文件是干嘛用的,打开来什么代码都没有,不管它,先配置好,运行一下,结果,弹出登录界面,如果已经配置好账号,它就会显示主账号和token,在下拉框可以选择子帐号进行登陆测试。如图3:

图3

进入后,我看到了主界面,在左侧有功能菜单选择,由于功能不完善,这里只选择网络电话进行测试,理解一下它的实现。如下图4:

图4

在网络电话的左边面板,看到了VOIP电话和落地电话两个功能。在这里只测试VOIP功能,先来看看代码是,如下:
private void voipcall_btn_Click(object sender, EventArgs e)
{
string calledvoip = calledvoip_comboBox.Text;
if (calledvoip.Length == 0)
{
MessageBox.Show("请输入或选择要拨打的VoIP账号");
}
else
{
string callid = CCPCall.instance.makeCall(CALL_Type.VOICE_CALL, calledvoip);
Console.WriteLine("makeCall callid=" + callid);
if (callid != null)
{
VoipDialogForm voipForm = new VoipDialogForm();
voipForm.callid = callid;
voipForm.called = calledvoip;
updateStatus = new updateVoIPStatus(voipForm.updateVoIPCallStatus);
callfailed = new makecallFailed(voipForm.onMakecallFailed);
voipForm.ShowDialog();
updateStatus = null;
callfailed = null;
}
else
{
MessageBox.Show("拨打失败,callid为空");
}
}
}

从上面代码中可以看到实现VOIP功能主要调用了刚才CCPCall类中的makeCall方法,我想这个方法正是打网络电话的功能需要的方法吧。跟踪进去,代码如下:

public string makeCall(CALL_Type callType, string called)
{
IntPtr callid = NativeMethods.CCPmakeCall((int)callType, called);
string strCallid = Marshal.PtrToStringAnsi(callid);
callingCallid = strCallid;
return strCallid;
}

从上面代码中可以NativeMethods的方法,这个就是调用本地的CCPAppClient.dll方法,如下:

[DllImport("CCPAppClient.dll", EntryPoint = "CCPmakeCall", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr CCPmakeCall(int callType, string called);

到这里我有些疑惑,这个dll既然可以这样调用,那么在windows phone 平台是否可以同样这样调用呢?我没有试过,有时间真想试试。今天,还是继续讲C#平台是怎么实现VOIP的,继续往下看,我们知道了这样调用云通讯平台的接口方法,在填入我的伙伴VOIP账号来运行一下,测试一下通话,如图5:

图5

这样就开始通话中,也可以按挂机键挂机。对方就可以接到我打来的电话,通过云通讯平台,方便地实现了VOIP网络通话功能。
总结一下,demo例子,虽然看起来简单,上层应用是C#代码,使用C#代码调用云平台提供的dll库,另外,我大致看了一下,调用其它功能的接口方法也类似,就是NativeMethods里面提供了一系列dll内部封装的方法。但是,由于那个例子中dll有好几个,其他几个不知道干什么用,只知道CCPAppClient.dll是有用的。还有能不能把这个dll放到windows phone平台中进行类似的调用,不知道行不行,很想试试,如果可以的话,那网络电话就可以实现了,呵呵。看了这个例子,我受益还是挺大的,不仅知道了C#平台上如何调用云通讯平台的接口方法,还明白了C#如何调用本地dll的方法。感谢平台为我提供这么好的学习平台,最后,希望您们能尽快出像安卓和ios一样的windows phone 平台,我的项目还需要您的帮助。
...全文
2253 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinjinl2012 2016-06-27
  • 打赏
  • 举报
回复
代码能给一份不,学习下
程序员鼓励师 2014-08-16
  • 打赏
  • 举报
回复
海兰 2014-08-16
  • 打赏
  • 举报
回复

2,245

社区成员

发帖
与我相关
我的任务
社区描述
OpenAPI
社区管理员
  • OpenAPI社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧