1. 参考
本文在本篇文章基础上,记录一些踩坑点。
PJSIP使用流程,基于 simple_pjsua.c
2. 代码
2.1 配置
修改默认配置代码
SIP服务相关可参考本人前文:
Yealink&Linux | miniSIPServer使用说明 | 福大嵌入式实时系统课学习 | 音频通话
//服务器ip
#define SIP_DOMAIN "172.20.10.14"
//本地sip服务分机及密码
#define SIP_USER "100"
#define SIP_PASSWD "100"
//sip服务域名
#define SIP_REALM "myvoipapp.com"
2.2 main
这段代码提供了按下“m”拨打电话的功能。
/* If URL is specified, make call to the URL. */
if (argc > 1) {
pj_str_t uri = pj_str(argv[1]);
status = pjsua_call_make_call(acc_id, &uri, 0, NULL, NULL, NULL);
if (status != PJ_SUCCESS) error_exit("Error making call", status);
}
修改for循环,增加make call功能,对配置的分机进行呼叫。
/* Wait until user press "q" to quit. */
for (;;) {
char option[10];
char uri[100];
puts("Press 'h' to hangup all calls, 'q' to quit, 'm' to make call");
if (fgets(option, sizeof(option), stdin) == NULL) {
puts("EOF while reading stdin, will quit now..");
break;
}
if (option[0] == 'q')
break;
if (option[0] == 'h')
pjsua_call_hangup_all();
if (option[0] == 'm') {
puts("Enter SIP URI to call: ");
if (fgets(uri, sizeof(uri), stdin) == NULL) {
puts("Error reading SIP URI");
continue;
}
pj_str_t pj_uri = pj_str(uri);
status = pjsua_call_make_call(acc_id, &pj_uri, 0, NULL, NULL, NULL);
if (status != PJ_SUCCESS)
puts("Error making call");
}
}
3. 编译运行
3.1 Linux
- 程序位于 /pjsip-apps/src/samples/simple_pjsua.c
- 在 /pjsip-apps/bulid 路径下输入make,执行makefile进行编译。
- 在 /pjsip-apps/bin/samples/x86_64-unknown-linux-gnu 路径下,输入./simple_pjsua进行运行。
3.2 Windows
在Visual Studio中的使用可参考本人前文:
Windows&Linux | PJSIP使用说明 | 福大嵌入式实时系统课学习 | 音频通话
- 右键samples项目,点击设为启动项目。
- 右键samples项目,点击生成。
- 右键samples项目,点击在终端中打开。
- 在 \pjsip-apps\bin\samples\i386-win32-vc14-debug 路径下输入.\simple_pjsua进行运行。
4. 本地项目配置
- 本人将simple_pjsua.c移植到本地项目中,需要修改部分配置(Windows)。
4.1 解决方案
- 右键解决方案,添加现有项目,选择 \pjsip-apps\build 路径下的libpjproject.vcxproj进行添加。
- 右键本地项目,生成依赖项,项目依赖项,依赖于libpjproject。
4.2 项目属性
- 配置属性高级,字符集,使用多字节字符集
- C/C++常规,附加包含目录,根据实际包含目录路径修改。
…/pjproject-2.14.1/pjsip/include
…/pjproject-2.14.1/pjlib/include
…/pjproject-2.14.1/pjlib-util/include
…/pjproject-2.14.1/pjmedia/include
…/pjproject-2.14.1/pjnath/include
- 链接器输入,附加依赖项,根据本地项目路径修改。
Iphlpapi.lib
dsound.lib
dxguid.lib
netapi32.lib
mswsock.lib
ws2_32.lib
odbc32.lib
odbccp32.lib
ole32.lib
user32.lib
gdi32.lib
advapi32.lib
libpjproject-i386-Win32-vc14-Debug.lib
pjsua-lib-i386-Win32-vc14-Debug.lib
pjlib-i386-Win32-vc14-Debug.lib
pjlib-util-i386-Win32-vc14-Debug.lib
pjmedia-i386-Win32-vc14-Debug.lib
pjnath-i386-Win32-vc14-Debug.lib
- pjsua-lib:最高层次抽象API,该库是基于pjsip-ua及以下库做了高层次的分装。
- pjlib库:最底层、最基础的库,实现平台抽象和框架(数据结构、内存分配、文件I/O,线程同步等)
- pjlib-util库:封装常用算法,如MD5、CRC32等,以及json、xml格式解析
- pjmedia库:处理SDP协商、媒体编码和传输等
- pjnath库:处理NAT穿越问题
- 链接器常规,附加库目录,根据依赖项配置路径,这里只需要添加后六个lib文件的路径即可。