环境: 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. JAVA SDK防反编译处理(原创)

    一.前言 网上找的资料是加密Jar包,运行时需要输入密码才能运行,这种方式的加密仅仅能于有main函数入口的加密,而不能满足对外提供SDK.我们的需求是对class文件加密防反编译,但又不影响别人二次 ...

  2. Mac 上几款 Telegram App 的区别

    Mac App Store 上有 Telegram 和 Telegram Lite 两款应用,而 Homebrew 上有 telegram 和 telegram-desktop 两款应用.下面介绍一下 ...

  3. Java异常详解(全文干货)

    介绍 Throwable Throwable 是 Java 语言中所有错误与异常的超类. Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常 ...

  4. 在 SQLAlchemy 中对数据异步处理的时候,获得关联集合的处理方式

    我们在定义SQLAlchemy对象模型的关系的时候,用到了relationship 来标识关系,其中 lazy 的参数有多种不同的加载策略,本篇随笔介绍它们之间的关系,以及在异步处理中的一些代码案例. ...

  5. 使用 nuxi init 创建全新 Nuxt 项目

    title: 使用 nuxi init 创建全新 Nuxt 项目 date: 2024/9/6 updated: 2024/9/6 author: cmdragon excerpt: 摘要:本文介绍了 ...

  6. HTML – script async defer

    参考 Youtube – #3 JavaScript Loading Strategies (async and defer) | JavaScript Full Tutorial no async ...

  7. Identity – Introduction & Scaffold

    主要参考: Introduction to Identity on ASP.NET Core Start by command dotnet new webapp --auth Individual ...

  8. ASP.NET Core – Middleware

    前言 MIddleware 就是中间件, ASP.NET Core 是用来处理 http request 的. 当 request 抵到 server 就进入了 Middleware pipe. 每个 ...

  9. mongo集群同步数据异常,手动同步节点副本数据

    转载请注明出处: 数据同步方案 当副本集节点的复制进程落后太多,以至于主节点覆盖了该节点尚未复制的 oplog 条目时,副本集节点就会变为"陈旧".节点跟不上,就会变得" ...

  10. SpringMVC——SSM整合——表现层数据封装

    表现层数据封装 设置统一数据返回结果类 注意:Result类中的字段并不是固定的,可以根据需要自行增减提供若干个构造方法,方便操作 返回结果类 package com.cqupt.controller ...