Unbuntu搭建pjsua实现自动拨号与自动播放语音

本文介绍了如何在Ubuntu上利用pjsua搭建自动拨号和播放语音的功能,涉及SIP协议的基础知识和pjsua的使用方法,包括注册过程、命令行操作以及自动拨号的实现。
摘要由CSDN通过智能技术生成

Unbuntu搭建pjsua实现自动拨号与自动播放语音

最近在工作的时候碰到了这么一个需求,要求实现自动拨号播放语音的功能。刚开始我想的是使用opensips搭建,搭建出来了之后发现只有一条命令行来发送消息的,并没有类似进行语音通话的命令行。我便去下了一个microsip,利用python脚本来实现自动拨号的功能,接着又出现一大问题便是如何发送语音包。一开始的想法是声卡的内录,但是碍于公司电脑没有内置声卡便打消了我这个想法。再后来想到是利用Pyaudio将音频文件解码通过消息的方式发送,用户接收到消息之后进行再编码进行播放,可发现microsip获取到的句柄下的控件id内容一直为空,解决无果之后只能放弃,一路走了不少弯路,直到了解到了pjsua。借此将我的经验分享出来,希望大家能少走一些弯路。

首先要对sip协议有一定的了解:

SIP(Session Initiation Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议。
它是一个基于文本的应用层控制协议,用于创建、修改和释放一个或多个参与者的会话。SIP 是一种源于互联网的IP 语音会话控制协议,具有灵活、易于实现、便于扩展等特点。

然后我们来看看他的报文组成:

INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob sip:bob@biloxi.com
From: Alice sip:alice@atlanta.com;tag=1928301774
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact: sip:alice@pc33.atlanta.com
Content-Type: application/sdp
Content-Length: 142

在文本消息的第一行,包含了请求的类型(INVITE)。在这行之后的是这个请求的头域。这个例子中包含了最少需要的头域集合。简单介绍一下:

VIA域

  包含了Alice接收发送请求的服务器地址(pc33.atlanta.com)。同样这个包含了一个分支参数来标志Alice和这个服务器的会话事务。

TO域

  包含了显示姓名(Bob)和一个SIP或者SIPS URI(sip:bob@biloxi.com)请求将首先传输到这个URI中。显示姓名(Display names)在RFC 2822中描述。

From域

  也同样包含一个显示姓名(Alice)和一个SIP或者SIPS URI(sip:alice@atlanta.com)这个URI用来标志请求的原始发起者。这个域也包含了一个TAG参数,这个TAG参数是一个随机字串(1928301774),是软电话(softphone)在URI上增加的一个随机串。用来做标志用途的

Call_ID

  包含一个全局的唯一标志,用来唯一标志这个呼叫,通过随机字串和softphone的自己名字或者IP抵制混和产生的。通过TO TAG, FROM TAG和CALL-ID完整定义了Alice和Bob之间的端到端的SIP关系,并且表示这个是一个对话性质的关系。

CSEQ或者Command Sequence

  包含了一个整数和一个请求名字。这个Cseq数字是顺序递增的。每当对话中发起一个新的请求都会引起这个数字的顺序递增。

Contact域

  包含一个SIP或者SIPS URI用来表示访问Alice的直接方式,通常由用户名和一个主机的全名(Fully Qualified Domain Name FQDN)组成。当FQDN作为首选的时候,许多终端用户由于不会由名字登记(而导致不能访问Alice的主机),所以IP地址是可选的。

 VIA域告诉大家本请求发送到哪里并且应答到哪里,Contract域告诉大家将来的请求将发送到哪里(奇怪…不是Alice发起的么,将来的请求应该是Bob才对啊)。

Max-Forwards:

 最大转发数量限制了通讯中转发的数量。它是由一个整数组成,每转发一次,整数减一。

Content-type

 包含了消息正文的描述(消息正文在本范例中没有列出)

Content-length

 包含消息正文的长度(字节数)

 完整的SIP包头域的定义在20节。会话的细节,比如媒体的类型,codec,或者采样速率,没有通过SIP来描述。这个可以通过SIP的消息正文来描述,可以通过其他定义的协议在正文中进行描述。有一种是会话描述协议(Session Descripotion Protocol SDP)(RFC2327[1])。这个SDP消息(没有在例子中列出)通过SIP的消息中传送,就像通过附件发送EMAIL一样,或者说通过HTTP传输的网页一样。

sip报文参考地址

了解了以上定义之后,便可以着手搭建pjsua环境
pjsua实在pjsip的基础上搭建的,所以要先去github上下载pjsip2.11.1
pjsip2.10下载地址

解压文件

tar -xvf pjproject-2.11.1.tar.gz -C ./#解压到当前目录
cd pjproject-2.11.1

编译

./configure
make dep
make
make install

接着启动pjsua

cd /pjproject-2.11.1/pjsip-apps/bin #切换到bin目录
./pjsua-x86_64-unknown-linux-gnu #启动pjsua

你会看到这么一个界面:

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值