pjsip架构介绍以及封装使用

PJSIP 开源库由一系列功能库所组成:

PJLIB 是系统抽象层  
PPJLIB-UTIL 提供有用的工具函数  
PJNATH 解决NAT 穿越问题  
PJMEDIA 和PJMEDIA-CODEC 负责SDP 协商、媒体编码和媒体传输  
PJSIP 是核心SIP 协议栈  
PJSIP-SIMPLE 实现Presence个人信息和即时消息  
PJSIP-UA 提供SIP 用户代理库  
PJSUA 位于最高层,整合了下层模块的全部功能。  

PJSIP 的每个功能库根据其所在的层次以及负责的功能都提供了丰富的编程接口,方便开发人员使用。

1.png

封装使用

之前项目中使用到这个库做可视对讲,我采用c++封装出了简易的调用接口:

2.jpg
3.jpg
1.jpg

链接:https://pan.baidu.com/s/1Q8y0t9O7ZeWdDGy9R3sEqQ 密码:80k5

pjsua介绍

PJSUA是一个开源的命令行SIP用户代理(软电话),用PJSIP协议,PJNATH,和PJMEDIA实现。 它虽然只有很简单的命令行界面,但是功能齐全。

SIP功能:

多个id(帐户注册);  
多个呼叫;
支持IPv6(在1.2版本中添加);
PRACK(100rel,RFC 3262);
UPDATE (RFC 3311);
OPTIONS;
呼叫保持;
呼叫转移;
简单的PIDF和XPIDF的支持(订阅/通知,RFC 3265,3856,3863);
自定义存在状态文本(RPID,RFC 4480);
支持PUBLISH(RFC 3903);
即时消息(消息)和消息组成指示(RFC 3428,3994);
支持UDP,TCP和TLS传输;
SIP服务器的DNS SRV(RFC 3263);
带INFO的DTMF(RFC 2976);
STUN(RFC 3489bis);
AKA认证(开发中,RFC 3310,4169)。  

媒体功能:

多个并发调用;
会议;
支持Speex,iLBC,GSM,G711,G722,和L16编解码;
宽带和超宽带编解码(Speex);
通过Intel的IPP库支持更多编解码:AMR-WB,AMR-NB,G.722.1(Siren7),G.723.1,G.726,G.728,G.729A;
立体声编解码(L16);
WAV文件播放,流媒体和录制;
支持RTCP协议;
通话质量监测;
RFC 2833;
自动应答,自动播放文件,自动循环RTP;
产生声音;
AEC(Accoustic回声消除);
自适应抖动缓冲器;
自适应静音检测;
PLC(包丢失隐藏);
丢包模拟;
每个RTP包中包含多个帧;
支持SRTP(安全RTP)  

NAT功能:

ICE(互动式连接建立,最新ICE草案);
STUN(最新的RFC3489双);
TURN(最新草案);
rport;
SIP的TCP和TLS保持活动;
自动检测和恢复SIP UDP地址的变更;
自动检测ICE媒体传输的变化;  

程序使用

用法:

PJSUA [选项] [SIP的URL调用]  

一般选项:

   --config-file=file     读取从文件的配置/参数;  
   --help         显示此帮助屏幕;  
   --version         显示版本信息;  

日志记录选项:

    --log-file=fname    日志文件名(默认是stderr);
    --log-level=N       设置日志的最大级别为N(0(无)6(跟踪))(默认值= 5);
    --app-log-level=N   设置日志的最大水平为stdout显示(默认值= 4);
    --color             运用丰富多彩的日志(在Win32默认开启);
    --no-color          禁用丰富多彩的日志;
    --light-bg          使用白底黑字的颜色(默认是黑暗的背景);

SIP帐户选项:

--use-ims           开启和这个账号相关的3GPP/IMS设置;
--use-srtp=N        是否使用SRTP?  0:不使用, 1:可选, 2:强制使用 (默认:0);
--srtp-secure=N     SRTP 是否需要安全的SIP? 0:不需要, 1:tls方式, 2:sips (默认:1);
--registrar=url     设置注册服务器的URL;
--id=url            设置本地账户的URL
--contact=url       选择性的覆盖联系人信息
--contact-params=S  给指定的联系URI添加S参数
--proxy=url         可选择的访问代理服务器的URL                     
--reg-timeout=SEC   注册时间间隔 (default 55)
--realm=string      设置域
--username=string   设置用户名
--password=string   设置密码
--publish           发PUBLISH
--use-100rel        需要可靠的临时响应(100rel)
--auto-update-nat=N n为0或1来启用/禁用SIP遍历后面对称NAT(默认1)
--next-cred         添加其他凭据  

SIP帐户控制:

--next-account      添加更多的账户

传输选项:

--ipv6              使用IPv6
--local-port=port   端口
--ip-addr=IP        ip地址
--bound-addr=IP     绑定端口
--no-tcp            禁用TCP传输
--no-udp            禁用UDP传输
--nameserver=NS     域名服务器
--outbound=url      设置全局代理服务器的URL,可以指定多次
--stun-srv=name     设置STUN服务器主机或域名

TLS选项:

--use-tls           启用TLS传输(默认不开启)
--tls-ca-file       指定TLS CA文件(默认为无)
--tls-cert-file     指定TLS证书文件(默认为无)
--tls-privkey-file  指定TLS私钥文件(默认值=无)
--tls-password      指定TLS私钥文件密码(默认为无)
--tls-verify-server 验证服务器的证书(默认=没有)
--tls-verify-client 验证客户端的证书(默认=没有)
--tls-neg-timeout   指定超时(默认值无)
--tls-srv-name      指定TLS服务器名称为多宿主服务器(可选)  

媒体选项:

--add-codec=name    手工添加编解码(默认开启所有)
--dis-codec=name    禁用某个编解码
--clock-rate=N      覆盖会议桥时钟频率
--snd-clock-rate=N  覆盖音频设备时钟频率
--stereo            音频设备及会议桥开通立体声模式
--null-audio        使用NULL音频设备
--play-file=file    在会议桥中注册WAV文件
--play-tone=FORMAT  向会议桥注册音调,格式是'F1,F2,ON,OFF',其中F1,F2为频率,
        ON,OFF=on/off ,可以指定多次。
--auto-play         自动播放文件(仅来电)
--auto-loop         自动循环传入RTP到传出RTP
--auto-conf         自动加入会议
--rec-file=file     录音文件(扩展名可以使.wav 或者 .mp3)
--auto-rec          自动记录通话
--quality=N         指定媒介质量(0-10,默认6)
--ptime=MSEC        覆盖编解码器ptime的毫秒的
--no-vad            停用VAD方案/沉默探测器(默认启用VAD)
--ec-tail=MSEC      设置回波抵消尾长度(默认值256)
--ec-opt=OPT        选择回波抵消算法(0 =默认,1 = SPEEX,2 =抑制)
--ilbc-mode=MODE    设置iLBC语音编解码器模式(20或30,默认是30)
--capture-dev=id    音频捕获的设备ID(默认值= -1)
--playback-dev=id   音频播放设备ID(默认值= -1)
--capture-lat=N     音频捕获延迟(毫秒,默认值= 100)
--playback-lat=N    音频播放延迟(毫秒,默认值= 100)
--snd-auto-close=N  闲置N秒后自动关闭音频设备
                  指定n = -1(默认)禁用此功能。
                  指定即时关闭不使用时,N = 0。
--no-tones          禁用听见声音
--jb-max-size       指定最大值抖动缓冲(帧,默认= 1)

媒体传输选项:

--use-ice           使用ICE(默认:不使用)
--ice-no-host       禁用ICE主机候选(默认:no)
--ice-no-rtcp       禁用RTCP组件(默认:no)
--rtp-port=N        RTP尝试端口基数(默认4000)
--rx-drop-pct=PCT   Drop PCT percent of RX RTP (for pkt lost sim, default: 0)
--tx-drop-pct=PCT   Drop PCT percent of TX RTP (for pkt lost sim, default: 0)
--use-turn          Enable TURN relay with ICE (default:no)
--turn-srv          TURN服务器的域或主机名称
--turn-tcp          使用TCP连接到TURN服务器(默认:no)
--turn-user         TURN用户名
--turn-passwd       TURN密码

好友名单(可以是多个):

--add-buddy url     添加指定的URL到好友列表中

用户代理选项:

--auto-answer=code  自动接听来电的应答代码(如200)
--max-calls=N       最大并发呼叫数(默认:4,最大:255)
--thread-cnt=N      工作线程数目(默认:1)
--duration=SEC      设置最大通话时间(默认是:没有限制)
--norefersub        转接通话时禁止事件订阅
--use-compact-form  最小的SIP消息大小
--no-force-lr       允许使用严格路由
--accept-redirect=N 指定如何处理呼叫重定向响应(3XX)。
                   0:拒绝,1:自动(默认),2:询问  

命令介绍

呼叫命令

m    产生一个呼叫
M    向同一个地址产生多个呼叫
a    响应呼叫(发送100-699)
h    挂断当前呼叫(ha为挂断所有)
H    呼叫保持
v    恢复通话(解除呼叫保持)
U    发送UPDATE请求
],[ 呼叫翻页(前一个/下一个)
x    呼叫转移
X    呼叫替换
#    发送DTMF(RFC238)
*    发送DTMF(SIP INFO)
dq    显示当前通话质量
S    给远端主机发送任意请求

即时通讯

+b    添加好友
-b  删除好友
i      发送即时消息
s    订阅(好友)当前状态
u    取消订阅(好友)当前状态
t      在线状态切换
T     设置在线状态

媒体命令

cl  列出端口
cc  连接端口
cd  断开端口
V      调节音量
Cp  优先编码器

帐户

+a  添加
-a  删除
!a  修改
rr  重新注册
ru  反注册
>      下一个(循环)
<      前一个(循环)

状态和设置

d    显示状态
dd    显示状态详情
dc    显示配置
f    保存配置

其它命令:

q                退出
L                重新加载
sleep MS        暂停键盘输入(毫秒)
echo [0|1|TXT]    控制echo命令(0:禁用,1:启用,TXT :回显)
n                探测NAT网络  

PJSUA的使用

1、简单点对点

  启动: $ ./pjsua
  呼叫:$ ./pjsua sip:192.168.0.10
  默认端口:5060  

2、向服务器注册

单帐户注册:

  $ ./pjsua --id sip:alice@example.com --registrar sip:example.com \
  --realm * --username alice --password secret  

多帐户注册:

  $ ./pjsua --id sip:bob@provider1.com --registrar sip:provider1.com \
  --realm provider.1.com --username bob --password secret \
  --next-account \
  --id sip:bob@provider2.com --registrar sip:provider2.com \
  --realm provider2.com --username bob --password secret

3、自动应答并播放wav文件:

  $ pjsua --play-file PROMPT.WAV --auto-answer 200 --auto-play --auto-loop \
  --max-calls 100  

4、从文件加载:

文件(alice.cfg)内容:

# This is a comment in the config file.
--id sip:alice@example.com
--registrar sip:example.com
--realm *
--username alice
--password secret  

使用:

$ ./pjsua --config-file alice.cfg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,256评论 0 9
  • 0 操作成功完成。1 功能错误。2 系统找不到指定的文件。3 系统找不到指定的路径。4 系统无法打开文件...
    ccq_inori阅读 2,819评论 0 0
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,093评论 1 32
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,726评论 0 10
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,833评论 0 5