SIP使用
SIP(Session Initiation Protocol)是一种用于建立、修改和终止多媒体会话(例如,语音和视频通话)的通信协议。它是一个应用层协议,通常用于互联网电话(VoIP)和实时通信应用。SIP允许参与会话的各方进行协商、协调和管理通信会话。
# java中集成
# 引入maven坐标
<dependency>
<groupId>javax.sip</groupId>
<artifactId>jain-sip-ri</artifactId>
<version>1.3.0-91</version>
</dependency>
# 基础方法
# 配置SIP
点击查看
public class DefaultProperties {
public static Properties getProperties(String ip, boolean sipLog) {
// 完整配置参考 gov.nist.javax.sip.SipStackImpl,需要下载源码 gov/nist/javax/sip/SipStackImpl.class
// sip消息的解析在 gov.nist.javax.sip.stack.UDPMessageChannel的processIncomingDataPacket方法
Properties properties = new Properties();
properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP");
properties.setProperty("javax.sip.IP_ADDRESS", ip);
// 关闭自动会话
properties.setProperty("javax.sip.AUTOMATIC_DIALOG_SUPPORT", "off");
// 接收所有notify请求,即使没有订阅
properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true");
properties.setProperty("gov.nist.javax.sip.AUTOMATIC_DIALOG_ERROR_HANDLING", "false");
properties.setProperty("gov.nist.javax.sip.CANCEL_CLIENT_TRANSACTION_CHECKED", "true");
// 为_NULL _对话框传递_终止的_事件
properties.setProperty("gov.nist.javax.sip.DELIVER_TERMINATED_EVENT_FOR_NULL_DIALOG", "true");
// 会话清理策略
properties.setProperty("gov.nist.javax.sip.RELEASE_REFERENCES_STRATEGY", "Normal");
// 处理由该服务器处理的基于底层TCP的保持生存超时
properties.setProperty("gov.nist.javax.sip.RELIABLE_CONNECTION_KEEP_ALIVE_TIMEOUT", "60");
// 获取实际内容长度,不使用header中的长度信息
properties.setProperty("gov.nist.javax.sip.COMPUTE_CONTENT_LENGTH_FROM_MESSAGE_BODY", "true");
// 线程可重入
properties.setProperty("gov.nist.javax.sip.REENTRANT_LISTENER", "true");
// 定义应用程序打算多久审计一次 SIP 堆栈,了解其内部线程的健康状况(该属性指定连续审计之间的时间(以毫秒为单位))
properties.setProperty("gov.nist.javax.sip.THREAD_AUDIT_INTERVAL_IN_MILLISECS", "30000");
// 需要接入当前引入的日志配置
properties.setProperty("gov.nist.javax.sip.STACK_LOGGER", "com.sip.conf.StackLoggerImpl");
properties.setProperty("gov.nist.javax.sip.SERVER_LOGGER", "com.sip.conf.ServerLoggerImpl");
properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "true");
return properties;
}
}
# StackLoggerImpl 示例
public class StackLoggerImpl implements StackLogger {}
# ServerLoggerImpl 示例
public class ServerLoggerImpl implements ServerLogger {}
# 简单示例
public static void main(String[] args) {
SipStackImpl sipStack = (SipStackImpl) SipFactory.getInstance().createSipStack(DefaultProperties.getProperties(monitorIp, IS_LOG));
SIPProcessorObserver sipProcessorObserver = new SIPProcessorObserver();
//TCP模式
ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "TCP");
SipProviderImpl tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint);
tcpSipProvider.addSipListener(sipProcessorObserver);
//UDP模式
ListeningPoint udpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "UDP");
SipProviderImpl udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint);
udpSipProvider.addSipListener(sipProcessorObserver);
}
# SIPProcessorObserver 示例
public class SIPProcessorObserver implements SipListener {
//处理SIP 请求事件
public void processRequest(RequestEvent var1){};
//处理SIP 响应事件
public void processResponse(ResponseEvent var1){};
//处理SIP 超时事件
public void processTimeout(TimeoutEvent var1){};
//处理SIP IO异常事件
public void processIOException(IOExceptionEvent var1){};
//处理SIP 事务终止事件
public void processTransactionTerminated(TransactionTerminatedEvent var1){};
//处理SIP 对话终止事件
public void processDialogTerminated(DialogTerminatedEvent var1){};
}
# 信令格式
# 请求
示例
REGISTER sip:41010500002000000001@4101050000 SIP/2.0
Via: SIP/2.0/UDP 192.168.31.68:5060;rport=5060;branch=z9hG4bK1555480323;received=192.168.31.68
From: <sip:34020000001320000001@4101050000>;tag=224638776
To: <sip:34020000001320000001@4101050000>
Call-ID: 78046639
CSeq: 1 REGISTER
Contact: <sip:34020000001320000001@192.168.31.68:5060>
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0
请求行(Request Line): 包括请求方法(如INVITE、REGISTER、BYE等)和请求的URI(统一资源标识符)。
头部字段(Headers): 包含了一系列头部字段,用于传递关于请求的元数据信息。常见的头部字段包括:
Via: 标识消息的传输路径。 From: 标识请求的发起者。 To: 标识请求的目标。 Call-ID: 标识一次通信会话。 CSeq: 包含请求的序列号和请求方法。 空行: 用于分隔头部字段和消息体。
消息体(Body): 包含请求的实际数据,例如SDP(Session Description Protocol)信息,用于协商媒体参数。
# 响应
SIP 响应(Response): 状态行(Status Line): 包括三个部分,分别是协议版本、状态码和状态短语。 例如:SIP/2.0 200 OK 表示成功处理请求。
头部字段(Headers): 同样包含了一系列头部字段,传递关于响应的元数据信息,类似于请求头。
常见的头部字段如Via、From、To、Call-ID、CSeq等。 空行: 分隔头部字段和消息体。
消息体(Body): 包含响应的实际数据,例如SDP信息,用于协商媒体参数。
# 待续...
上次更新: 2024/11/05, 08:29:31