基于SIP协议的VOIP电话的开发

5 年前

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();