最近公司项目要用到VOIP网络通话功能和IM即时通信功能,公司的领导为我们提供了云通讯这个平台,让我们使用这个平台进行开发,但让我纳闷的是这个平台只有android和ios手机平台sdk,唯独没有windows phone 平台,而我是开发windows phone 平台,我心里就有点失落,后来,我联系了云通讯平台的商务,他回答是目前因为没有市场需求,还不打算开发这个平台,还需要等待。从那以后,我一直关注云通讯这个平台,希望有惊喜出现,可是没有。突然有一天,云通讯的技术人员在群里提供了一份C#的demo,我心里有点惊喜,我想,C#平台应该和windows phone 平台差不多吧,都是C#语言,于是,我下载下来研究了一下,并把使用的教程分享一下给大家。
首先,我打开了这个C# 平台的demo,发现还是第一个测试版本,有些功能还没有,但VOIP功能已经有了,我研究一下VOIP功能使用C#是如何实现的。这个项目的基本工程结构如下:
其中那个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所示:
这里有些纳闷,那个setting.ini文件是干嘛用的,打开来什么代码都没有,不管它,先配置好,运行一下,结果,弹出登录界面,如果已经配置好账号,它就会显示主账号和token,在下拉框可以选择子帐号进行登陆测试。如图3:
进入后,我看到了主界面,在左侧有功能菜单选择,由于功能不完善,这里只选择网络电话进行测试,理解一下它的实现。如下图4:
在网络电话的左边面板,看到了VOIP电话和落地电话两个功能。在这里只测试VOIP功能,先来看看代码是,如下:
private void voipcall_btn_Click(object sender, EventArgs e)
{
string calledvoip = calledvoip_comboBox.Text;
if (calledvoip.Length == 0)