十大 VoIP IP 电话面试问题及答案,以及额外的 C# 软电话开发教程
这是一份VoIP相关面试题的列表,这些问题可能会被对VoIP感兴趣的雇主问到。文章还包含了一个简单的C#软电话示例项目,如果您想初步了解VoIP SIP软件开发领域,可以以此作为起点。
- 什么是VoIP?
- 为什么VoIP比传统电话服务更好?
- VoIP有哪些优势?
- VoIP是如何工作的?
- VoIP电话的实际成本是多少?
- 能否用VoIP PBX取代现有的传统企业PBX?
- 创建VoIP系统需要哪些设备?
- 哪些协议描述了VoIP连接?
- 如何开始VoIP编程?
- 如何拨打VoIP电话?
引言
随着VoIP技术的飞速发展,越来越多的公司对VoIP编程感兴趣,以改进其电信网络。因此,在某些情况下,需要基本的VoIP知识。所以,即使是在简单的软件开发人员面试中,也有可能遇到一些与VoIP相关的问题。
因此,我整理了一份潜在的VoIP相关问题列表,并添加了一个简单的C#软电话示例项目,如果您想初步了解这个软件开发领域,可以轻松上手。我的文章主要面向软件工程师,但也可能对网络工程师有用。
本面试指南包含VoIP主题中最常见的问题。如果您认为我的文章应该包含更多重要的问题,请随时在下方的“评论和问题”部分提出您的想法。
潜在的VoIP相关问题
VoIP代表Voice Over Internet Protocol或Voice Over IP。VoIP技术可以将模拟语音信号转换为数字数据,并通过Internet传输。 (可能存在更多发音方式,例如“vo-ipp”,但通常,行业内最常见的发音是单音节的“voyp”,类似于“voice”。)
由于其成本效益,VoIP在很大程度上越来越受欢迎,超过了传统的电话网络。VoIP可以将公司的月度电话费削减约50%。除了成本效益外,VoIP技术还确保了许多高级功能,如电话会议、IVR、呼叫转移、自动重拨、呼叫录音等,无需额外费用。
VoIP提供更便宜的国际长途费率,通常是传统电话公司收费的十分之一。
由于其便携性,VoIP是避免昂贵的酒店电话和手机漫游费用的一个非常好的选择。只需要高速宽带连接(和插入的适配器),任何人都可以通过您的本地号码联系到您,无论您身在何处。大多数时候,拨打给其他VoIP服务订阅者的内部通话是免费的,即使呼叫方位于世界不同地区。
通过使用Internet连接进行数据流量和语音通话,可以摆脱大多数Internet服务提供商通常收取的每月一次的费用。此外,基于Internet的语音和数据传输可以避免无线漫游费和长途费。
除了成本效益、丰富的服务以及上述地理边界的“消失”之外,VoIP还有许多其他好处,如下所示:
- VoIP技术能够检测和处理触摸音和DTMF响应
- VoIP系统可以轻松自动化
- VoIP系统允许多个编解码器
- VoIP提供丰富的媒体服务,因为这些系统可以使用更多文件格式
- VoIP比基于硬件的解决方案提供了更灵活的系统
- 大多数VoIP服务提供商会为其客户提供用户控制界面,通常是Web GUI,以便他们可以动态更改功能、选项和服务。
- VoIP协议运行在应用层,能够与电子邮件、Web浏览器、即时消息、社交网络应用程序等其他应用程序集成或协作。
VoIP通常基于SIP系统,这是公认的标准。任何SIP兼容设备都可以与其他设备通信。任何SIP电话都可以通过Internet呼叫另一个电话——无需额外设备。您只需将SIP电话插入Internet连接,进行配置,然后拨打对方号码即可。您也可以将传统的模拟电话连接到您的VoIP网络——在这种情况下,需要一个ATA设备。
在VoIP系统中,您的模拟语音被转换为数据包(小文件),然后通过Internet传输到接收者,并在另一端解码回您的语音。为了加快速度,这些数据包在传输前会被压缩,有点像压缩文件(当然会在对方那里解压)。
将模拟信号转换为数字数据的优点总结如下:数字格式更容易控制,因为它可以被压缩、路由、转换等。此外,数字信号比模拟信号更耐受噪声。服务质量(QoS)确保实时无错误的数据流,也允许交互式数据语音交换。
如果您只想使用VoIP与VoIP网络中的其他用户通信,您可以免费进行。但是,如果您想能够使用VoIP向VoIP网络外的或没有VoIP的人拨打和接听电话,您需要订阅VoIP服务提供商的套餐,并且可能还需要一个提供VoIP与传统电话网络之间桥梁的网关服务。
绝对可以。对于那些希望升级旧PBX系统的公司来说,VoIP是一个非常经济的选择,并且VoIP提供了传统PBX系统所没有的新功能。要更改为VoIP系统,公司可以购买IP PBX,但也可以将一些VoIP功能添加到现有的电话系统中。
开始使用VoIP非常简单。假设您已经拥有最重要的两样东西(一台Windows PC或Mac电脑和宽带Internet连接),您只需要以下几样东西即可开始:
- 一些电话或消息软件
- 一个麦克风
- 耳机或扬声器
当然,您也可以使用耳机而不是麦克风和扬声器,以便腾出双手。
为了选择使用哪种软件,值得考虑以下几点。在G-Talk或Yahoo Messenger中使用语音聊天可以被认为是VoIP,备受关注的Skype也是如此;但这些都是专有系统。您可以免费下载它们,但要与使用G-Talk的人通话,对方也需要有G-Talk。Yahoo和在很大程度上Skype也适用。它们使用自己的特殊系统,该系统不开放,并且不容易与其他系统连接。因此——特别是对于企业用户——更推荐使用像ConterPath X-Lite这样的软电话,并配合支持SIP的IP PBX或Internet服务提供商。
VoIP已经通过专有协议和基于开放标准的协议等多种方式实现。您可以在下方看到VoIP协议:
- H.323
- 媒体网关控制协议 (MGCP)
- 会话发起协议 (SIP)
- H.248 (也称为媒体网关控制 (Megaco))
- 实时传输协议 (RTP)
- 实时传输控制协议 (RTCP)
- 安全实时传输协议 (SRTP)
- 会话描述协议 (SDP)
- Asterisk中继交换 (IAX)
- Jingle XMPP VoIP扩展
- Skype协议
- Teamspeak
最常用的是SIP。会话发起协议是IETF信令协议,用于VoIP和其他文本和多媒体通信会话,例如通过Internet Protocol (IP)进行的语音和视频通话。
SIP可用于创建、修改和终止两人(单播)或多人(多播)会话。这些会话包括Internet电话呼叫、多媒体分发、多媒体会议、即时消息、文件传输和在线游戏。
创建任何VoIP应用程序的最佳方法是使用VoIP开发工具包。这些SDK旨在通过提供预先编写的VoIP组件来为您的VoIP项目提供后台支持。使用这些预先编写的组件非常有效和方便,因为您可以节省时间和金钱。(在下面将要描述的软电话开发过程中,Ozeki VoIP SIP SDK被用于此目的,它支持所有.NET编程语言,包括C#。)
要使用这些工具包,您必须在IDE中添加您首选的SDK作为引用。添加后,您可以访问能够定义软电话、呼叫录音机、IVR菜单系统、软件IP电话系统(PBX)等VoIP应用程序行为所需的所有VoIP组件。
为了能够通过您自己的软件应用程序拨打语音电话,您需要将您的系统连接到电话网络。这可以通过三种方式完成:
- 选项1:使用VoIP电话适配器
VoIP电话适配器是一种硬件设备,可以连接到您的以太网LAN或您的PC。有适用于GSM线路、标准模拟电话线路和ISDN线路的VoIP电话适配器。当您将此硬件连接到以太网LAN时,它将获得一个IP地址。您需要在您的VOIP SDK中配置此IP地址。 - 选项2:使用VoIP电话服务提供商提供的SIP账户
世界各地有许多VoIP电话服务提供商提供通过Internet提供的电话服务。您需要订阅他们的服务,您将获得一个SIP账户(包括IP地址、用户名和密码)。您需要在您的VoIP SDK中配置SIP账户详细信息。 - 选项3:使用您现有的办公室PBX,如果它是一个VoIP系统。
如果您已经有一个IP电话系统,您需要通过LAN将您的VoIP SDK连接到该系统。SDK可以使用SIP账户登录电话系统,并且可以像其他任何设备一样拨打电话。
代码示例:如何创建C#.NET软电话?
鉴于VoIP技术允许您通过Internet进行通信,您将需要一个使这种电信成为可能的设备。这就是为什么在每种VoIP应用程序中都需要一个软电话——即使它不需要GUI。如果您想开发一个简单的基于软件的VoIP电话、自动拨号程序或呼叫录音应用程序,显然需要一个电话。但对于其他应用程序(如IVR、PBX、呼叫中心等),也需要一个软电话来拨打和接听VoIP电话。
在接下来的部分,我将简要介绍如何使用C#.NET创建软电话。(下面解释的所有部分都可以参照已插入文本部分的代码片段。)
构建软电话
首先,您需要一些using语句。之后,您需要使用**ISoftPhone**和**IPhoneLine**接口创建一个软电话对象和一个电话线对象。然后,您需要指定将用于电话线的SIP账户(您可以在14-34行找到详细的解释——注释部分将有助于理解)。
完成SIP账户指定后,您需要定义软电话将注册到的PBX(见42行)。在大多数情况下,需要能够通过防火墙进行通信。43行显示了如何实现这一点。“None”在此行表示通信将在本地网络完成。
现在,您需要配置之前创建的**phoneLine**对象,以便能够通信并注册到PBX(见44-63行)。当应用程序运行时,电话线的状态可能会发生变化。为了跟踪这些变化,您需要监听它的改变事件。此任务的最后一步是调用**RegisterPhoneLine()**方法将电话线注册到软电话。如果需要注册,此方法还将发送SIP REGISTER命令。注册过程将在后台异步进行,您的程序将通过**mySoftphone_PhoneLineStateChanged**回调方法收到成功或失败的通知。如果电话线的状态是**RegistrationTimedOut**(注册允许时间已到)或**RegistrationFailed**(需要注册,但未能完成),将打印“Registration failed!”状态消息。如果电话线的状态是**RegistrationSucceeded**(需要注册且成功)或**NoRegNeeded**(无需注册),将打印“Registration succeeded - Online!”状态消息。
using System;
using System.Threading;
using Ozeki.VoIP;
using Ozeki.VoIP.SDK;
using Ozeki.Network.Nat;
namespace SIP_Register
{
class Program
{
static ISoftPhone mySoftphone; // softphone object
static IPhoneLine phoneLine; // phoneline object
private static void Main(string[] args)
{
//Create a softphone object with RTP port range 5000-10000, and SIP port 5060
mySoftphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000, 5060);
// SIP account registration data, (supplied by your VoIP service provider)
var registrationRequired = true;
var userName = "sipusername";
var displayName = "sipdisplayname";
var authenticationId = "authenticationid";
var registerPassword = "Password";
var domainHost = "pbxip.voipprovider.com";
var domainPort = 5060;
// Send SIP regitration request
mySoftphone_Register(mySoftphone, registrationRequired, displayName, userName, authenticationId, registerPassword,
domainHost, domainPort);
// prevents the termination of the application
while (true) Thread.Sleep(10);
}
static void mySoftphone_Register(ISoftPhone softphone, bool registrationRequired, string displayName, string userName,
string authenticationId, string registerPassword, string domainHost, int domainPort)
{
try
{
var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
var natConfiguration = new NatConfiguration(NatTraversalMethod.None);
phoneLine = softphone.CreatePhoneLine(account, natConfiguration);
phoneLine.PhoneLineStateChanged += mySoftphone_PhoneLineStateChanged;
softphone.RegisterPhoneLine(phoneLine);
}
catch (Exception ex)
{
Console.WriteLine("Error during SIP registration: " + ex.ToString());
}
}
static void mySoftphone_PhoneLineStateChanged(object sender, VoIPEventArgs<PhoneLineState> e)
{
if (e.Item == PhoneLineState.RegistrationTimedOut || e.Item == PhoneLineState.RegistrationFailed)
Console.WriteLine("Registration failed!");
if (e.Item == PhoneLineState.RegistrationSucceeded || e.Item == PhoneLineState.NoRegNeeded)
Console.WriteLine("Registration succeeded - Online!");
}
}
}
至此,第一步已完成。为了能够使用您自己的软电话拨打和接听电话,您只需在代码中添加几行,如下所示:
拨打电话
要拨打电话,首先需要创建一个呼叫对象,订阅呼叫的事件,然后调用呼叫对象的**Start()**方法。正如您在下面看到的,首先软电话会检查当前是否有活动呼叫。如果没有,将调用相应的方法。
if (call == null)
{
call = softphone.CreateCallObject(phoneLine, numberToDial);
WireUpCallEvents();
call.Start();
}
请注意,呼叫被处理为对象,更具体地说是**IPhoneCall**对象。
接听电话
软电话有一个**IncomingCall**事件。订阅此事件后,当有来电时,您将收到通知。当此事件发生时,您可以通过调用**Accept()**方法来接听呼叫(或通过调用**Reject()**方法来拒绝)。(要挂断任何呼叫,请使用呼叫对象的**HangUp()**方法。)
softphone.IncomingCall += softphone_IncomingCall; // Subscribe to the IncomingCall event
代码片段注释:请记住,上面的代码片段是使用Ozeki SDK预先编写的VoIP组件编写的。因此,如果您想尝试它们,需要安装其免费试用版。
结论
在我看来,在当今的商业世界中,如果您对系统网络感兴趣——无论您是CEO、系统管理员还是软件开发人员——基本的VoIP知识都是必不可少的。如果潜在雇主对VoIP有任何兴趣,在开发人员的求职面试中可能会要求具备一定水平的知识。在本文中,我将回顾最常见的VoIP相关面试问题,并提供一个简单的C#软电话示例项目,如果您想初步了解这个软件开发领域,可以以此作为起点。
进一步阅读和参考
为了撰写这份VoIP面试指南和这个简短的C#教程,我使用了以下知识库: