pjsip(Portable Embedded Open Source SIP Stack)是一个开源的嵌入式SIP协议栈,用于开发基于SIP协议的实时通信应用程序,比如VoIP电话软件。
在移动开发中,pjsip被广泛应用于Android平台的VoIP电话开发,它主要提供了以下功能:
1. SIP注册:允许终端用户注册到SIP服务器,从而获取一个SIP地址,使其能够与其他用户通信。
2. 呼叫:允许终端用户发起呼叫请求,向其他SIP终端发出INVITE消息,建立一条音频或视频呼叫。
3. 媒体:允许音频或视频通讯并提供一些配置选项。使用pjsip,你可以选择使用音频或视频通讯,还可以配置音频或视频的编码格式、音频设备等。
4. 网络协议:在协议栈底层实现了网络连接和数据传输等基础功能,使得SIP应用能够被许多平台使用。
接下来,我们来详细介绍一下pjsip在Android开发中的使用。
1. pjsip环境搭建
pjsip官网提供了一些编译和打包好的Android库和示例应用,你可以从GitHub下载或从pjsip官网下载。
为了构建pjsip,你需要先构建一些依赖库:
```
sudo apt-get install build-essential automake autoconf libtool libasound2-dev libpulse-dev libssl-dev libevent-dev libgtk2.0-dev libavcodec-dev libavutil-dev libswscale-dev libgsm1-dev libspeex-dev libspeexdsp-dev libopus-dev libsasl2-dev
```
接着,你需要下载pjsip源码、编译和打包pjsip库和pjsip示例应用:
```
./configure-android
make dep
make
./configure-android --use-ndk-cflags --with-opus
make dep
make
make install
```
2. pjsip接口介绍
pjsip提供了一套完整的C语言API,使得我们可以在Android平台上使用它的各种功能。以下是pjsip API的常用部分:
- pjlib:提供了跨平台的常规编程功能,如内存管理、线程、定时器等。
- pjsip:提供了SIP实现,可以用于呼叫处理、消息传递、状态管理等。
- pjmedia:提供了音频、视频媒体功能,可以用于媒体流处理、音视频编解码、RTP协议等。
- pjnath:提供了网络遍历和地址转换功能,可以用于NAT穿透、ICE等应用。
- pjtransport:提供了SIP协议运输层压缩和加密功能,可以用于TCP、UDP、TLS、SRTP等协议。
3. 示例代码实现
接下来,我们将通过一个简单的Android应用程序示例来说明如何使用pjsip库。在实现之前,你需要下载并安装pjsip的库,然后执行以下步骤:
步骤一:创建Android项目
在Android Studio中创建一个空白项目,然后在项目中创建一个Activity类,比如MainActivity。
Step Two: 添加pjsip库依赖项
打开build.gradle文件,并添加以下依赖项:
```
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':pjsip-android')
}
```
其中,`:pjsip-android`改成你下载的pjsip库文件夹的名称。
步骤三:添加pjsip初始化代码
在MainActivity类中添加以下代码来初始化pjsip:
```
static {
System.loadLibrary("pjsua2");
}
private MyApp m_myApp;
private void initPj() {
m_myApp = new MyApp();
m_myApp.init();
}
```
其中,`MyApp`类是被用于封装pjsip应用程序的自定义类。
步骤四:添加pjsip注册代码
添加以下代码来注册SIP账户并向目标用户发起一个呼叫:
```
try {
Endpoint ep = m_myApp.getEndpoint();
AccountConfig cfg = new AccountConfig();
cfg.setIdUri("sip:alice@127.0.0.1");
AuthCredInfo cred_info = new AuthCredInfo("alice", "*", "password");
cfg.getSipConfig().getAuthCreds().add(cred_info);
cfg.getNatConfig().setIceEnabled(false);
Account acc = new Account();
acc.create(cfg);
MyCall myCall = new MyCall(m_myApp);
acc.addSink(myCall);
myCall.makeCall("sip:bob@127.0.0.1");
} catch (Exception e) {
e.printStackTrace();
}
```
其中,`MyCall`是用于呼叫处理的自定义类,它继承自pjsip的`Call`类。
步骤五:运行Android应用程序
最后可以运行Android应用程序并测试pjsip的功能了,你可以尝试注册SIP账户、向目标用户发起呼叫等操作。