基于SIP协议的VOIP电话的开发
VOIP(Voice Over IP)概念
指网络电话或者IP电话。按照开发出的产品种类分为软电话和硬电话。
软电话是指用软件实现,运行在电脑,手机的软件形式的电话。
硬电话指办公桌上可以拿起拨打的电话。
SIP概念
SIP(session initiation protocal)会话发起协议指应用层控制协议。用于创建,修改,释放一个或者多个会话。
VOIP和SIP关系
VOIP可以通过SIP协议实现电话功能。除了SIP还有H323,MGCP,Megaco这些协议栈来实现。
经过一段时间的调研,我们采用了实现sip协议栈的开源框架peers来实现。
peers是用Java开发的。github地址: ymartineau/peers
先看下模块结构图:
按照我们业务要求,只需要去掉gui这个模块,把功能模块集成到项目中就可以实现要求。这样降低了开发的成本。
peers的目录结构:
demo
package net.sourceforge.peers.demo;
import java.net.SocketException;
import net.sourceforge.peers.Config;
import net.sourceforge.peers.FileLogger;
import net.sourceforge.peers.Logger;
import net.sourceforge.peers.javaxsound.JavaxSoundManager;
import net.sourceforge.peers.sip.core.useragent.SipListener;
import net.sourceforge.peers.sip.core.useragent.UserAgent;
import net.sourceforge.peers.sip.syntaxencoding.SipUriSyntaxException;
import net.sourceforge.peers.sip.transport.SipRequest;
import net.sourceforge.peers.sip.transport.SipResponse;
public class EventManager implements SipListener {
private UserAgent userAgent;
private SipRequest sipRequest;
private CommandsReader commandsReader;
public EventManager() throws SocketException {
Config config = new CustomConfig();
Logger logger = new FileLogger(null);
JavaxSoundManager javaxSoundManager = new JavaxSoundManager(false, logger, null);
userAgent = new UserAgent(this, config, logger, javaxSoundManager);
new Thread() {
public void run() {
try {
userAgent.register();
} catch (SipUriSyntaxException e) {
e.printStackTrace();
}.start();
commandsReader = new CommandsReader(this);
commandsReader.start();
// commands methods
public void call(final String callee) {
new Thread() {
@Override
public void run() {
try {
sipRequest = userAgent.invite(callee, null);
} catch (SipUriSyntaxException e) {
e.printStackTrace();
}.start();
public void hangup() {
new Thread() {
@Override
public void run() {
userAgent.terminate(sipRequest);
}.start();
// SipListener methods
@Override
public void registering(SipRequest sipRequest) { }
@Override
public void registerSuccessful(SipResponse sipResponse) { }
@Override
public void registerFailed(SipResponse sipResponse) { }
@Override
public void incomingCall(SipRequest sipRequest, SipResponse provResponse) { }
@Override
public void remoteHangup(SipRequest sipRequest) { }
@Override
public void ringing(SipResponse sipResponse) { }
@Override
public void calleePickup(SipResponse sipResponse) { }
@Override
public void error(SipResponse sipResponse) { }
public static void main(String[] args) {
try {
new EventManager();