北邮计算机网络实验-用开源代码实现一个SIP客户端


提示:以下是本篇文章正文内容,下面案例可供参考

一、背景知识

1.1 VOIP

VOIP:基于IP的语音传输(英语:Voice over Internet Protocol,缩写为VoIP)是一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议,也就是经由互联网来进行通信。也被称为IP电话(IP telephony)、互联网电话(Internet telephony)、宽带电话(broadband telephony)以及宽带电话服务(broadband phone service)等。
优势:广泛地采用Internet和全球IP互连的环境,提供比传统业务更多、更好的服务;在IP网络上便宜的传送语音、传真、视频、和数据等业务。
劣势:通话质量收到网络好坏影响;停电时无法使用;清晰度与传统的固话有差距(网络正常情况下,通话音质与传统电话无明显差距);安全私密性不高。
关键技术:信令技术,包括ITU-TH.323、IETF会话初始化协议SIP[4]、MGCP、H.248等;媒体编码技术,包括流行的G.723.1、G.729、MPEG-II多媒体压缩技术、MP4、H.264等;媒体实时传输技术,主要采用实时传输协议RTP。等等。


1.2 SIP协议

SIP是一种在IP网络上进行多媒体通信的简便通用的信令协议,是一个基于文本的应用层控制协议,用于创建、修改和释放一个或多个参与者的会话。
SIP通过以下逻辑功能来完成通信:
 用户定位功能:确定参与通信的终端用户位置。
 用户通信能力协商功能:确定参与通信的媒体终端类型和具体参数。
 用户是否参与交互功能:确定某个终端是否加入某个特定会话中。
 建立呼叫和控制呼叫功能:包括向被叫“振铃”、确定主叫和被叫的呼叫参数、呼叫重定向、呼叫转移、终止呼叫等。




1.3 实验要求

1. 用PJSIP开源代码实现一个SIP客户端。
2. 用实现的客户端完成在SIP呼叫中心上的注册和测试。
3. 实现其他更复杂的通信方式(比如视频等)。

二、实验准备

2.1实验环境

本实验的软件环境如下表所示:

在这里插入图片描述

2.2 PJSIP开源项目下载

PJSIP是一个开放源代码的SIP协议栈,支持多种SIP的扩展功能。PJSIP的官网地址为https://www.pjsip.org/。下载最新版本pjproject-2.10.zip。
现如今PJSIP的开源代码已经移动到了github平台。可以在github上找到项目的下载链接https://github.com/pjsip/pjproject.git
在pjsip的官网上可以找到pjsip的文档支持(https://trac.pjsip.org/repos/wiki/Getting-Started/Windows),我们可以参照文档来实现此开源项目的使用。

在这里插入图片描述

2.3 Visual Studio安装

在windows官网(https://visualstudio.microsoft.com/zh-hans/)上可以下载最新版本的Visual Studio 2019。因为我们可以下载社区版Visual Studio Community 2019,可以免费使用,不需要购买。
安装过程肿,选择安装.Net桌面开发和使用C++的桌面开发两个工作负载,安装成果后就可以用Visual Studio打开PJSIP的项目了。
VS集成安装了windows10 SDK,因此不需要再额外安装。
在这里插入图片描述


2.4 QT下载安装(实现视频通话)

Qt是一个由Qt Company开发的跨平台C++图形用户界面应用程序开发框架,在Qt的官网下载https://www.qt.io/。安装完成后需要将Qt目录添加到环境变量中。

在这里插入图片描述
在这里插入图片描述

2.5 下载SDL(实现视频通话)

SDL是 “Simple DirectMedia Layer”的缩写,SDL是一个开源的跨平台的多媒体库,封装了复杂的音视频底层操作,简化了音视频处理的难度。
下载最新版的SDL开发库,SDL官网:http://www.libsdl.org/download-2.0.php
在这里插入图片描述

2.6下载FFmpeg(实现视频通话)

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。下载最新的FFmpeg Builds,官网:https://ffmpeg.zeranoe.com/builds/,需要下载两个版本shared与dev版本。选择的编译平台是win32。

三、 实现在呼叫中心的注册

3.1 项目编译

解压pjproject-2.10.zip到文件夹,在解压出…/pjproject-2.10文件中找到pjproject-vs14.sln文件,双击通过VS打开。找到右侧的解决方案资源管理器,找到pjsua项目。右键将其设为启动项。点击上面的本地Windows调试器按钮,开始编译运行。
在这里插入图片描述

编译失败,遇到如下图错误,在…\pjproject-2.10\pjlib\include\pj下新建config_site.h空文件,重新编译运行。
在这里插入图片描述

编译完成后程序会直接运行,编译完成后在文件夹…\pjproject-2.10\pjsip-apps\bin中会生成可执行文件pjsua-i386-Win32-vc14-Debug.exe或pjsua-i386-Win32-vc14-Release.exe。
使用Win+R组合键调出运行,输入cmd打开命令提示符,cd进到…\pjproject-2.10\pjsip-apps\bin目录,使用以下命令行启动程序,老师服务器的网络不支持TCP。
pjsua-i386-Win32-vc14-Debug.exe –no-tcp
在这里插入图片描述在这里插入图片描述


3.2 呼叫中心注册

3.2.1 呼叫IVP

根据提示输入m,然后输入然后输入IVR的SIP地址sip:[email protected],提示音提示拨打电话成功。
在这里插入图片描述

3.2.2 注册组号

根据提示音进行注册。sip电话中的输入都需要先使用*调出DTMF,再进行输入。
输入数字尽可能快一些,不然会有影响需要重复操作。
注册流程如下:
(提示音选择注册或是登录)
*
1
(提示音提示输入学号)
*
2018111717#
(提示音重放学号,确认是否正确,1为正确,0为错误)
*
1
(组号是1628,请输入密码)
*
1628#
(最后IVR会提示注册成功。然后挂机)














3.2.3 登录

重新拨通VIP根据提示音进行登录、查询学号、录音及回放流程如下:
(提示音选择注册或是登录)
*
2
(提示音提示输入组号)
*
1628#
(提示音提示输入密码)
*
1628#
(提示音选择1录音或回放 2回放 3查询学号)
*
3
(提示音播放学号2018111717,提示音选择1录音或回放 2回放 3查询学号)
*
1
(提示音提示在哔后开始录音,#结束)
录音
*
#
(提示音选择1录音或回放 2回放 3查询学号)
*
2
回放
(超时挂机)























四、实现视频电话

4.1 编译pjsip的底层支持

4.1.1 文件准备

将ffmpeg与SDL解压到…/pjproject-2.10目录下。
在这里插入图片描述
…/pjproject-2.10/ffmpeg-4.2.1-win32-dev文件中有include和lib目录。
将ffmpeg-4.2.1-win32-shared\bin其中的bin目录下全部dll文件复制到C:\Windows\SysWOW64目录下。
在…\pjproject-2.10\ffmpeg-4.2.1-win32-dev\include\libavcodec目录下的avcodec.h头文件中添加如下一行:
#define FF_INPUT_BUFFER_PADDING_SIZE 32




pjproject-2.10\SDL2-2.0.12文件夹下有include和lib目录。
将…\pjproject-2.10\SDL2-2.0.12\lib\x86其中的全部dll文件复制到C:\Windows\SysWOW64目录下。
在…/pjproject-2.10/pjlib/include/pj/路径下的config_site.h文件中,填入如下语句:
#define PJMEDIA_HAS_VIDEO 1
#define PJMEDIA_VIDEO_DEV_HAS_SDL 1
#define PJMEDIA_VIDEO_DEV_HAS_DSHOW 1
#define PJMEDIA_HAS_FFMPEG 1





4.1.2 建立链接

用Visual Studio打开pjproject-vs14.sln项目。在pjmedia、pjmedia-codec、pjmedia-videodev、pjsua、pjsystest、pjmedia_test这几个工程中添加ffmpeg、SDL的include和lib路径。
在解决方案资源管理器中选择上述项目,右键点击属性,左上角的配置改成Debug,在C/C+±>常规->附加包含目录中添加如下路径:
…/…/ ffmpeg-4.2.1-win32-dev/include
…/…/ SDL2-2.0.12/include
在这里插入图片描述



在链接器->常规->附加库目录中添加如下路径,
如果没有链接器,就在文档管理程序->常规->附加库目录中添加如下路径:
…/…/ ffmpeg-4.2.1-win32-dev/lib
…/…/ SDL2-2.0.12/lib/x86
在这里插入图片描述
在这里插入图片描述




特别的,需要在pjsua项目属性的链接器->命令行->其它选项中额外添加如下文字来忽略一个警告错误。
/SAFESEH:NO
在这里插入图片描述

点击本地Windows调试器按钮,开始编译运行。
将项目配置改成Release,再将上述过程重新进行一遍。
点击本地Windows调试器按钮,编译出Release版本的lib文件。
在…\pjproject-2.10\pjsip-apps\bin中生成解决方案。
在这里插入图片描述



4.2 编译pjsip的图形界面

打开…\pjproject\pjsip-apps\src\vidgui\vidgui.pro文件,做如下修改:
在这里插入图片描述
使用Win+R组合键调出运行,输入cmd打开命令提示符,cd进到…\pjproject\pjsip-apps\src\vidgui目录,使用如下命令生成VS项目文件:
qmake -tp vc


报错:cannot run compiler ‘cl’。解决方法:把本地安装的vs的安装程序中的cl应用插件和程序添加到电脑的环境变量中去,选择对应的msvc的对应位数,如图:
…/Visual Studio\2019\VC\Tools\MSVC\14.28.29333\bin\Hostx64\x86
在这里插入图片描述
再输入命令cl出现如下文字说明问题已解决。
在这里插入图片描述
重新输入命令qmake -tp vc,成功后生成下列文件:
在这里插入图片描述
打开vcxproj.vcxproj文件,模仿4.1.2节在此工程中添加ffmpeg、SDL的include和lib路径。注意,仍然需要在链接器->命令行->其它选项中额外添加“/SAFESEH:NO”来忽略一个警告错误。
分别使用Debug和Release的方法进行编译,编译失败,出现如下错误:
在这里插入图片描述
将pjproject-2.9\pjsip-apps\src\vidgui中的vidwin.cpp中37行的setAttribute(Qt::WA_PaintOutsidePaintEvent);注释掉。这句是针对directX11版本的。
将vidgui.cpp中296行的toAscii().data()改成toLatin1()。这是因为在Qt5中,Qstring对象没有toAscii()方法。
重新分别使用Debug和Release的方法进行编译,成功运行后即出现视频电话的图形界面。
在…/pjproject-2.10\pjsip-apps\src\vidgui\release路径下我们可以找到新编译好的vidgui.exe可执行文件,双击也可实现运行。
在这里插入图片描述
在…/pjproject-2.10\pjsip-apps\src\vidgui文件夹下的vidgui.cpp以及vidwin.cpp中可以自定义图形界面样式,在修改样式之后需要使用Debug和Release的方法重新进行编译:
在这里插入图片描述















4.3 发布可执行文件并跨机通话测试

4.3.1 添加依赖库

在…/pjproject-2.10\pjsip-apps\src\vidgui\release路径下我们可以找到新编译好的vidgui.exe可执行文件,双击即可实现运行。但将这个exe发送到其他没有安装qt的平台时,就会无法运行,我们需要找到可执行文件的依赖库,并打包到一起。
在…/Qt/Qt5.14.0/Tools/QtCreator/bin中找到如下文件:
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll



在…/Qt/Qt5.14.0/Tools/QtCreator/bin/plugins中找到如下文件:
platforms/全部文件(包含文件夹)

在…/pjproject/ffmpeg-4.2.1-win32-shared/bin中找到如下文件:
avcodec-58.dll
avdevice-58.dll
avfilter-7.dll
avformat-58.dll
avutil-56.dll
postproc-55.dll
swresample-3.dll
swscale-5.dll







在…/ pjproject-2.10/ SDL2-2.0.12/lib/x86中找到如下文件:
SDL2.dll

将这些文件连同vidgui.exe放在同一目录下,可执行文件就可以运行了。
在这里插入图片描述

4.3.2 通话测试

主叫用户输入被叫地址sip:[email protected]:5080(ip换成被叫IP)。
在这里插入图片描述
主叫点击Call开始拨打电话,状态栏从Ready改变为CALLING。
被叫收到电话接入,出现了Answer和Hangup按钮。
被叫接通电话,出现视频窗口,Url显示被叫sip地址。自此实现了语言和画面的传输。




总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,https://download.csdn.net/download/Track0_0/13244133
这里面有可下载的实验报告、源码、基础录音版以及视频版可执行文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章