环境: 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. Linux CentOS 7 安装 Kafka 2.8.2 - 单机版 & JDK 11 & 切换 JDK版本

    目录 安装 JDK 11 安装 Kafka 下载 Kafka 2.8.2 防火墙 修改配置 运行测试 自启动 验证端口 Kafka 从 2.6.0 开始,默认使用 Java 11 , 3.0.0 开始 ...

  2. 线性dp:大盗阿福(打家劫舍)

    大盗阿福 本题与leetcode198题--打家劫舍的题意一模一样,阅读完本文以后可以尝试以下题目 力扣题目链接) 题目叙述: 阿福是一名经验丰富的大盗.趁着月黑风高,阿福打算今晚洗劫一条街上的店铺. ...

  3. 安装nvm,并通过nvm安装nodejs

    转载请注明出处: 1.安装nvm 打开终端,然后运行以下命令来下载并安装nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39 ...

  4. 检测 NAT 类型

    使用 pystun3 pystun3 是一个用于获取 NAT 类型和外部 IP 的 Python STUN 客户端 安装: pip install pystun3 使用: pystun3 结果: NA ...

  5. JVM笔记六-堆区知识之对象生命周期和GC的关系

    通过上一篇文章的学习,我们对JVM堆区有了初步的认识,接下来,我们继续展开讲解堆区. 对象生命周期和GC的关系. 我们已经知道了,堆区的新生区分成了三个部分:伊甸园区.幸存者0区.幸存者1区. 其中0 ...

  6. python 读取mysqlDB中指定的表名的DDL语句

    注意: 1. 此python文件不要起名为mysql,会跟import的包名重复,python mysql.py运行报错 2.如果需要带端口号,请加database后加上, port="33 ...

  7. 详解JVM 内存结构与实战调优总结

    详解JVM 内存结构与实战调优总结 GC优化案例做个总结: 1在进行GC优化之前,需要确认项目的架构和代码等已经没有优化空间.我们不能指望一个系统架构有缺陷或者代码层次优化没有穷尽的应用,通过GC优化 ...

  8. Qml 实现瀑布流布局

    [写在前面] 最近在刷掘金的时候看到一篇关于瀑布流布局的文章,然鹅他们的实现都是前端的那套,就想着 Qml 有没有类似实现. 结果百度了一圈也没有( T_T Qml 凉了凉了 ),于是,我按照自己理解 ...

  9. web前端常用的五种方式搭建本地静态html页面服务器

    方式一:live-server live-server是一款npm工具,可以在项目目录启动一个node服务,然后直接在浏览器中预览,并且自动全局监听实时更新. 两种安装方式: 全局安装 npm i l ...

  10. sublime text2自动编译编译less文件为css,并让less文件高亮的两种方法

    方法一:通过命令安装 1.打开sublime,ctrl+shift+p打开命令面板,找到package control:install Package,然后选择less2css,回车.2.继续ctrl ...