环境: 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. .net core mvc 跳转LoginPath时端口缺失

    在使用nginx部署.net core mvc的程序时,假如我使用的是5002端口,并且当访问站点时如果未登录,则跳转到登录页面.可是最后却发现跳转的时候端口丢失了,那是因为我配置的是       p ...

  2. AArch64 汇编学习笔记

    PIE(Position Independent Executable,位置无关的可执行文件)通过随机化可执行文件各个部分在虚拟内存中的地址使得攻击者无法通过预测地址进行恶意行为. 汇编开发工具: a ...

  3. Go context 介绍

    在 Go 编程语言中,context 包提供了一个用于在 goroutine 之间传递上下文信息的方法.它通常用于控制 goroutine 的生命周期.传递请求范围内的数据.以及处理超时或取消信号.c ...

  4. 记录荒废了三年的四年.net开发的第三次面试,苏州斯莱克

    现在就业的确崩了 这次面试的时间是8月28号.距离上一次面试已经过去了一个月了,距离开始找工作已经过去了2个月.没多少找工作经验的我也体会到了什么叫就业崩了. 看了一线码农的采访计划后,我也把苏州列为 ...

  5. 一个Java类在运行时候,变量是怎么在JVM中分布的呢?

    JVM学习第三篇思考:一个Java类在Jvm内存中是怎么存在的 又名:Java虚拟机的内存模型(JMM)是什么样的. 通过前面两篇文章的学习,我们知道了一个Java类的生命周期及类加载器.我们可以得到 ...

  6. 【YashanDB数据库】YAS-02024 lock wait timeout, wait time 0 milliseconds

    [标题]错误码处理 [问题分类]锁等待超时 [关键字]YAS-02024 [问题描述]执行语句时候,因锁等待超时执行语句失败 [问题原因分析]数据库默认锁等待时间为0秒,如果执行语句存在锁等待过长会执 ...

  7. freebsd 上硬盘操作

    列出硬盘 # egrep 'ad[0-9]|cd[0-9]' /var/run/dmesg.boot or # geom disk list or # camcontrol devlist 查看cac ...

  8. Failed to convert value of type 'java.lang.String' to required type

    DEBUG 微信小程序Java后台 Failed to convert value of type 'java.lang.String' to required type 产生这种条件的原因一般是使用 ...

  9. ASP.NET Core – Custom Input formatters For Partial Update and Handle Under-posting

    前言 之前的文章有谈过关于 ASP.NET Core 处理 under-posting 的方式. 它会使用 class default value. 许多时候这可能不是我们期望的. 比如当我们想要 p ...

  10. EF Core – QueryFilter & Interception

    主要参考 Global Query Filters Interceptors QueryFilter QueryFilter 就是默认过滤, 非常适合用来做 Soft Delete builder.H ...