环境: window10_x64 & vs2022
pjsip版本: 2.14.1
 
之前整理过pjsip 2.10的编译及python使用示例:
 
今天整理下pjsip 2.14.1的编译、接口说明,以及在vs2022环境下基于 c/c++ 使用pjsua进行注册、呼叫、挂机的示例,并提供相关资源下载。

一、源码获取及编译

1. 下载pjsip源代码

也可直接从pjsip官网给的github地址下载:

2. 使用VS2022编译

 双击pjproject-vs14.sln
为了防止编译报错,首先进入这个目录:
pjproject-2.14.1\pjlib\include\pj
复制 config_site_sample.h 这个文件 config_site.h

编译:

二、数据结构说明

这里列举下pjsua常用的数据结构。
1)pjsua_config
主要用于配置UA的回调函数。
2)pjsua_logging_config
用于配置日志属性
3)pjsua_transport_config
用于配置本地绑定的socket属性,比如监听端口等。
4)pjsua_acc_config
用于配置sip账号信息,比如用户名、密码、注册地址等。 

三、接口说明

 这里列举下pjsua常用接口。
 
1)pjsua_create

功能

创建pjsua实例,在调用其它函数之前需要调用该函数;
使用完毕(返回PJ_SUCCESS时),需要调用pjsua_destroy函数。
完整声明如下:
pj_status_t pjsua_create(void)

参数

返回值

  PJ_SUCCESS , 成功
  其它值 , 失败
 
2)pjsua_config_default

功能

用于初始化pjsua配置。
完整声明如下:
void pjsua_config_default(pjsua_config *cfg)

参数

cfg : 需要初始化的pjsua配置指针

返回值

 
3)pjsua_logging_config_default

功能

用于初始化pjsua的日志配置。
完整声明如下:
void pjsua_logging_config_default(pjsua_logging_config *cfg)

参数

cfg : 需要初始化的pjsua日志配置指针

返回值

无 
4)pjsua_init

功能

使用指定的配置初始化pjsua,所有配置参数都是可选的,如果没有指定相关配置则使用默认配置。
完整声明如下:
pj_status_t pjsua_init(const pjsua_config *ua_cfg, const pjsua_logging_config *log_cfg, const pjsua_media_config *media_cfg)

参数

ua_cfg : user agent配置
log_cfg : 日志配置
media_cfg : 媒体配置

返回值

  PJ_SUCCESS : 成功
  其它值 : 失败 
5)pjsua_transport_config_default

功能

初始化udp配置信息。
完整声明如下:
void pjsua_transport_config_default(pjsua_transport_config *cfg)

参数

cfg : 需要初始化的udp配置指针

返回值

 
6)pjsua_transport_create

功能

根据传入的配置信息创建并启动sip transport(会绑定本地sip端口,并进行socket监听)。
完整声明如下:
pj_status_t pjsua_transport_create(pjsip_transport_type_e type, const pjsua_transport_config *cfg, pjsua_transport_id *p_id)

参数

type : transport类型,可选参数有 PJSIP_TRANSPORT_UDP 、 PJSIP_TRANSPORT_TCP 、 PJSIP_TRANSPORT_TLS 等。
cfg : 需要使用的udp配置
p_id : 可选参数,用于接收transport ID

返回值

  PJ_SUCCESS : 成功
  其它值 : 失败
 7)pjsua_start

功能

启动pjsua实例。
完整声明如下:
pj_status_t pjsua_start(void)

参数

返回值

  PJ_SUCCESS : 成功
  其它值 : 失败
8)pjsua_acc_config_default

功能

初始化pjsua的账号信息。
完整声明如下:
void pjsua_acc_config_default(pjsua_acc_config *cfg)

参数

cfg : 需要初始化的pjsua账号配置

返回值

 
9)pjsua_acc_add
功能
添加pjsua账号,并进行注册。
完整声明如下:
pj_status_t pjsua_acc_add(const pjsua_acc_config *acc_cfg, pj_bool_t is_default, pjsua_acc_id *p_acc_id)

参数

acc_cfg : 账号配置信息,比如sip账号id、密码、注册地址等。
is_default : 是否是默认账户
p_acc_id : 用于接收account id数据

返回值

  PJ_SUCCESS : 成功
  其它值 : 失败
 
10)pjsua_call_make_call

功能

使用指定账号进行外呼,需要使用sip uri格式。
完整声明如下:
pj_status_t pjsua_call_make_call(pjsua_acc_id acc_id, const pj_str_t *dst_uri, const pjsua_call_setting *opt, void *user_data, const pjsua_msg_data *msg_data, pjsua_call_id *p_call_id)

参数

acc_id : 账号id
dst_uri : 需要外呼的sip uri,比如 sip:1000@192.168.137.100:5060
opt : 呼叫设置
user_data : 需要附加的用户数据
msg_data : INVITE请求里面扩展的header头,NULL时不设置
p_call_id : 用于接收call id的指针

返回值

  PJ_SUCCESS : 成功
  其它值 : 失败
 
11)pjsua_msg_data_init
功能
初始化pjsua_msg_data类型数据。
完整声明如下:
void pjsua_msg_data_init(pjsua_msg_data *msg_data)

参数

msg_data : 需要初始化的变量

返回值

 
12)pjsua_call_hangup

功能

挂机操作,挂断指定呼叫。
完整声明如下:
pj_status_t pjsua_call_hangup(pjsua_call_id call_id, unsigned code, const pj_str_t *reason, const pjsua_msg_data *msg_data)

参数

call_id : 需要挂断呼叫的call id
code : 挂机sip状态码,比如 200、603 等
reason : 挂机原因
msg_data : 需要添加的消息头

返回值

  PJ_SUCCESS : 成功
  其它值 : 失败

四、基于MFC的示例

 这里基于MFC实现个简单软电话,实现注册、呼叫、挂机等基础功能。

工程名称: pjPhone

工程目录:

1、添加依赖库

把编译好的lib库文件放在depends目录:

2、配置工程属性

 1)配置include目录;

完整内容可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20241112 获取。
2)配置lib库目录;

完整内容可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20241112 获取。
3)配置链接lib库;

完整内容可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20241112 获取。

3、编译及使用

 这里使用的是静态链链接,编译后不需要额外的dll文件。
编译后的二进制文件可直接运行。
1)注册效果

2)呼叫效果

3)接听效果

可运行的二进制文件(pjPhone.exe)及打包的工程文件(pjsipTest2-vs2022.7z),可从文末提供的渠道获取。

五、资源获取

本文涉及资源可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20241112 获取。

pjsip编译、说明及vs2022使用示例的更多相关文章

  1. Linux内核编译中的各类错误示例

    1. do_gettimeofday()函数的使用 linux发行版:Ubuntu22.04 linux内核:5.15.0-52-generic 预编译内核:linux-6.0.1 添加在linux- ...

  2. 搭建基于MinGW平台的《OpenGL蓝皮书(OpenGL SuperBibe 5th)》示例代码编译环境

    副标题:搭建基于MinGW平台的<OpenGL超级宝典>(OpenGL蓝皮书第5版)GLTools 编译环境.示例代码:Triangle.cpp @ SB5.zip 以下内容以及方法均参考 ...

  3. win10 x64 VS2017 PJSIP 视频通话编译流程

    win10 x64 VS2017 PJSIP 视频通话编译流程 1. 下载PJSIP源码 PJSIP源码下载地址:https://www.pjsip.org/ 2. 阅读一遍官方的文档 文档地址:ht ...

  4. IOS 之 PJSIP 笔记(二) iPJSUA 的简单使用

    上一篇在编译完之后,就很不负责的结束了,本篇就对 PJSIP 库中提供的一个示例 iPJSUA 的使用,做一个简单的介绍.也能解除很多人对官方文档的一个困扰,起码我是被困扰过了. 首先,要确保你的 P ...

  5. OpenSceneGraph 编译 error LNK2019:unresolved external symbol 错误

    在编译 OpenSceneGraph 的一个简单示例时, #include <osgViewer/Viewer> #include <osgDB/ReadFile> void ...

  6. hello-weapp 微信小程序最简示例教程

    打开微信小程序官方开发文档,最好全篇看一遍,基本上就会了. 点击文档中 工具 选项卡中 下载工具页面 下载对应系统版本的微信开发者工具 注意:脱离微信开发者工具是不能调试的 好了,安装下工具即可打开, ...

  7. SlidingMenu的编译及使用

    1. 在github上有一个效果不错的开源库,SlidingMenu 最新的代码下载下来后,ExampleListActivity项目会报错:      No resource found that ...

  8. 即时编译和打包您的 Groovy 脚本(转)

    在本文中将会涉及到: 使用 CliBuilder 来实现对命令行选项的支持,脚本执行时所需要的参数将通过命令行选项的方式传递. 使用 GroovyClassLoader 加载 Groovy class ...

  9. 【.net 深呼吸】细说CodeDom(9):动态编译

    知道了如果构建代码文档,知道了如何生成代码,那么编译程序集就很简单了. CodeDomProvider 类提供了三个可以执行编译的方法: 1.CompileAssemblyFromSource——这个 ...

  10. 如何将一段文本编译成C#内存程序的过程

    string code = null; // 1. 生成要编译的代码.(示例为了简单直接从程序集内的资源中读取) Stream stram = typeof(CodeDOM).Assembly .Ge ...

随机推荐

  1. C#模拟键盘输入、键状态和监听键盘消息

    模拟键盘输入 模拟键盘输入的功能需要依赖Windows函数实现,这个函数是SendInput,它是专门用来模拟键盘.鼠标等设备输入的函数. 另外和键盘输入相关的函数还有SendKeys,它是Syste ...

  2. P7706 文文的摄影布置 题解

    P7706 文文的摄影布置 题解 原题 读完题,发现是线段树.单点修改+区间查询. 不过查询的值有些奇怪,就是了,我们考虑用线段树维护这个 ψ 值(下称待求值). 对于一个区间的待求值,大概有四种情况 ...

  3. 最简!手把手带你完美删除Vmware虚拟机!

    Vmware虚拟机最简完美删除教程 你还在苦于无法完美删除Vmware虚拟机吗?你还在为自己千疮百孔的系统而烦恼吗?你还在为想要重做Vmware但没删干净各种报错而烦操吗?但今天之后这些问题都将不是问 ...

  4. 怎样防止浏览器自动将http网址转变为https

    Chrome 浏览器 地址栏中输入 chrome://net-internals/#hsts 在 Delete domain security policies 中输入项目的域名,并 Delete 删 ...

  5. LogBack 没有打印日志

    背景: 某日进行测试,新增了一行日志(项目使用的是logback) 报错: 无,就是不打印日志 解决: 经过仔细查看代码,发现之前的人写代码的时候 在其它类里面,将 private final Log ...

  6. java基础 -线程(基础)的 笔记

    581,多线程机制 因为需要敌人的坦克可以自由移动并发射子弹,我们的坦克可以移动并发射子弹,这些要用到线程的知识. 根据JConsole监控线程执行情况,发现,主线程执行完了,子线程还没有执行完,并不 ...

  7. Go runtime 调度器精讲(二):调度器初始化

    原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 上一讲 介绍了 Go 程序初始化的过程,这一讲继续往下看,进入调度器的初始化过程. 接着上一讲的执行过程,省略一些不相关的代码,执行到 runt ...

  8. 全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback

    全网最适合入门的面向对象编程教程:47 Python 函数方法与接口-回调函数 Callback 摘要: 回调函数是编程中一种非常常见的模式,用于将函数作为参数传递给其他函数或方法.这种模式在 Pyt ...

  9. 【论文解读】System 2 Attention提高大语言模型客观性和事实性

    一.简要介绍       本文简要介绍了论文"System 2 Attention (is something you might need too) "的相关工作.基于trans ...

  10. ASP.NET Core Library – CsvHelper

    前言 平常都是用 Excel 的多, 但这一次遇到 Google Ads. 谷歌嘛, 当然不喜欢微软的 Excel. 硬是要求 CSV. 没办法, 只能找 Library 搞一搞了. 参考 Docs ...