闲碎记事本 闲碎记事本
首页
  • JAVA
  • Cloudflare
  • 学完再改一遍UI
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YAN

我要偷偷记录...
首页
  • JAVA
  • Cloudflare
  • 学完再改一遍UI
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • java

    • SpringBoot

    • SpringSecurity

    • MybatisPlus

    • Netty

    • sip

      • SIP使用
        • java中集成
          • 引入maven坐标
          • 基础方法
          • 配置SIP
          • StackLoggerImpl 示例
          • ServerLoggerImpl 示例
          • 简单示例
          • SIPProcessorObserver 示例
        • 信令格式
          • 请求
          • 响应
          • 待续...
      • GB28181
      • GB35114
      • SM2工具类
      • SM3工具类
      • 证书构建
      • 使用注解实现XML构建与解析
      • 流媒体服务器
      • FFmpeg
    • 其他

  • linux

  • docker

  • redis

  • nginx

  • mysql

  • 其他

  • 环境搭建

  • 知识库
  • java
  • sip
YAN
2024-01-08
目录

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: &lt;sip:34020000001320000001@4101050000>;tag=224638776
To: &lt;sip:34020000001320000001@4101050000>
Call-ID: 78046639
CSeq: 1 REGISTER
Contact: &lt;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信息,用于协商媒体参数。

# 待续...

上次更新: 2025/05/14, 01:34:05
关于LengthFieldBasedFrameDecoder的一些记录
GB28181

← 关于LengthFieldBasedFrameDecoder的一些记录 GB28181→

最近更新
01
Caddy操作指南
04-25
02
Swap空间
04-22
03
Alist使用
04-21
更多文章>
Theme by Vdoing | Copyright © 2022-2025 YAN | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式