开发接听语音机器人用到的sip相关知识
1、项目背景
我们公司最近在开发这样一个业务:买房人给房产经纪人的隐私号码(X号码)打电话,30s内经纪人没有接起,会把用户的电话接入到语音机器人端,语音机器人提醒用户《有什么需要留言的么》,用户留言,然后将用户的相关留言回传给业务方,方便经纪人接听电话。
2、实现逻辑
经纪人30s未接起电话,虚拟号码的供应商会给将电话打给我们提供的固话,我们的固话提供商会发送sip信令到我们约定好的机器和端口,从而建立sip连接进行会话。
其中涉及sip协议的内容包括:怎样监听指定机器端口的sip信令,sip信令怎么将两个电话绑定起来进行通话。
2.1、sip监听
java提供一些sip监听的工具类:SipStack、SipProvider、SipFactory、SipListerner
protected void createListenPoint(String listenerName, String serverName, String ip, Integer port) throws PeerUnavailableException, InvalidArgumentException, TransportNotSupportedException, ObjectInUseException, TooManyListenersException { logger.info("init listener{} begin !!!", listenerName); this.strListenerName = listenerName; // 设置SipStack参数 Properties properties = new Properties(); properties.setProperty("javax.sip.STACK_NAME", serverName); properties.setProperty("javax.sip.IP_ADDRESS", ip); SipFactory sipFactory = SipFactory.getInstance(); sipFactory.setPathName("gov.nist"); sipStack = sipFactory.createSipStack(properties); ProtocolObjects.init(sipFactory); // 创建SipProvider对象 ListeningPoint udp = sipStack.createListeningPoint(ip, port, ProtocolObjects.transport); provider = sipStack.createSipProvider(udp); // 设置监听 provider.addSipListener(this); logger.info("init listener{} end !!!", listenerName); }
SipListener是基础接口,ip、端口监听到request信令会把请求包装未RequestEvent事件。
package javax.sip; import java.util.EventListener; public interface SipListener extends EventListener { void processRequest(RequestEvent var1); void processResponse(ResponseEvent var1); void processTimeout(TimeoutEvent var1); void processIOException(IOExceptionEvent var1); void processTransactionTerminated(TransactionTerminatedEvent var1); void processDialogTerminated(DialogTerminatedEvent var1); }