SIP协议及其简单介绍

这篇具有很好参考价值的文章主要介绍了SIP协议及其简单介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

SIP(Session Initiation Protocol,会话初始化协议)是一个应用层协议,用于在互联网上创建、修改和终止多媒体会话。SIP是一个客户端/服务器协议,允许在不同终端设备之间建立实时通信,包括语音、视频、消息等。SIP也可以用于呼叫控制和呼叫管理。

流程

SIP流程

SIP协议的流程如下:

  • SIP客户端向SIP服务器发送请求,请求建立会话,SIP请求可以是INVITE、REGISTER、ACK、BYE、CANCEL等。

  • SIP服务器接收到请求,进行鉴权验证,判断请求是否合法。

  • 如果请求合法,则SIP服务器向客户端发送回复,回复可以是1xx、2xx、3xx、4xx、5xx、6xx等。

  • SIP客户端接收到回复,根据回复内容判断请求是否成功,如果成功则继续会话,如果失败则终止会话。

在会话过程中,SIP客户端和服务器之间可以交换多个请求和回复,直到会话结束。

两台设备建立会话

下面是两台设备进行 SIP 通话的详细流程,包括涉及 SIP 服务器的部分:

  • 设备 A 向 SIP 服务器发送 INVITE 消息:设备 A 通过 SIP 协议向 SIP 服务器发送 INVITE 消息,该消息包含了设备 A 的 SIP 地址和设备 A 希望建立会话的相关信息,例如媒体类型、编码和传输协议等。

  • SIP 服务器向设备 B 发送 INVITE 消息:SIP 服务器收到设备 A 的 INVITE 消息后,会向设备 B 发送 INVITE 消息,该消息包含了设备 A 的 SIP 地址以及设备 B 的 SIP 地址和相关信息。

  • 设备 B 回复 100 Trying 消息:设备 B 收到 INVITE 消息后,向 SIP 服务器发送 100 Trying 消息作为回复,表示设备 B 已经接收到 INVITE 消息并正在处理中。

  • SIP 服务器将 100 Trying 消息转发给设备 A:SIP 服务器将设备 B 发送的 100 Trying 消息转发给设备 A,让设备 A 知道设备 B 已经接收到 INVITE 消息并正在处理中。

  • 设备 B 向 SIP 服务器发送回复消息:设备 B 分析 INVITE 消息中包含的信息,并向 SIP 服务器发送回复消息,例如 180 Ringing 或 200 OK 等。

  • SIP 服务器将回复消息转发给设备 A:SIP 服务器将设备 B 发送的回复消息转发给设备 A,让设备 A 知道设备 B 的回复。

  • 设备 A 收到回复消息后,发送 ACK 消息:设备 A 收到设备 B 的回复消息后,如果该回复消息是 200 OK,则设备 A 将向 SIP 服务器发送 ACK 消息作为回复。如果回复消息是 180 Ringing,则设备 A 将等待设备 B 向其发送进一步的消息。

  • 建立媒体通道:设备 A 和设备 B 成功建立会话后,将启动媒体通道来进行实时音视频传输。

  • 会话结束:当通话结束时,设备 A 或设备 B 将向 SIP 服务器发送 BYE 消息来终止会话。SIP 服务器将将 BYE 消息转发给另一个设备,并回复 200 OK 消息作为回应,然后关闭媒体通道。

总的来说,SIP 通话涉及到 SIP 服务器来协调会话的建立和终止。设备 A 向 SIP 服务器发送 INVITE 消息来启动会话,SIP 服务器将 INVITE 消息转发给设备 B,设备 B 向 SIP 服务器发送回复消息,SIP 服务器将回复消息

原理

SIP协议的原理介绍如下:

SIP协议的工作原理类似于HTTP协议,SIP协议也采用了客户端/服务器模式。SIP协议定义了一系列请求和回复消息,这些消息由SIP客户端和SIP服务器之间交换,用于建立、修改和终止多媒体会话。

SIP协议中定义了多种消息头,用于传递会话相关信息,例如会话描述、呼叫控制、媒体类型等。SIP协议中也支持会话的路由和重定向,可以通过多个SIP服务器将请求路由到目标终端设备。

SIP协议中还定义了一些状态码,用于指示请求或回复的状态。例如,1xx状态码表示请求已收到但还未完成,2xx状态码表示请求已成功完成,3xx状态码表示需要进一步处理请求,4xx状态码表示请求无效,5xx状态码表示服务器内部错误,6xx状态码表示目标设备无法接受请求。

以下是一个基本的C++代码实例,用于创建和处理SIP通话。请注意,这只是一个示例代码,您需要根据您的具体情况进行修改和适应。

#include <iostream>
#include <pjsua2.hpp>

using namespace pj;

// 用于处理SIP通话的类
class MyCall : public Call
{
public:
    // 当通话状态发生变化时被调用
    virtual void onCallState(OnCallStateParam &prm)
    {
        CallInfo ci = getInfo();

        // 如果通话被接通
        if (ci.state == PJSIP_INV_STATE_CONFIRMED) {
            std::cout << "Call connected" << std::endl;
        }
    }

    // 当接收到音频数据包时被调用
    virtual void onAudioMediaState(OnAudioMediaStateParam &prm)
    {
        AudioMedia *aud_med = NULL;

        // 找到音频媒体
        for (unsigned i = 0; i < prm.medias.size(); i++) {
            if (prm.medias[i].type == PJMEDIA_TYPE_AUDIO) {
                aud_med = dynamic_cast<AudioMedia *>(prm.medias[i].media.get());
                break;
            }
        }

        // 如果找到音频媒体
        if (aud_med) {
            // 激活音频媒体
            AudioMedia::startTransmit(*aud_med, "/dev/null");
        }
    }
};

// 用于处理SIP账户的类
class MyAccount : public Account
{
public:
    // 当新来电时被调用
    virtual void onIncomingCall(OnIncomingCallParam &prm)
    {
        MyCall *call = new MyCall(*this, prm.callId);
        CallOpParam prm;
        prm.statusCode = PJSIP_SC_OK;
        call->answer(prm);
    }
};

int main(int argc, char *argv[])
{
    // 初始化PJSUA2库
    Endpoint ep;
    ep.libCreate();

    // 配置PJSUA2库
    EpConfig ep_cfg;
    ep.libInit(ep_cfg);

    // 创建UDP传输对象
    TransportConfig tcfg;
    tcfg.port = 5060;
    ep.transportCreate(PJSIP_TRANSPORT_UDP, tcfg);

    // 启动PJSUA2库
    ep.libStart();

    // 创建SIP账户
    MyAccount acc;
    AccConfig acc_cfg;
    acc_cfg.idUri = "sip:username@domain.com";
    acc_cfg.regConfig.registrarUri = "sip:domain.com";
    acc_cfg.sipConfig.proxies.push_back("sip:proxy.domain.com");
    acc.create(acc_cfg);

    // 等待程序退出
    std::cout << "Press ENTER to quit..." << std::endl;
    std::cin.get();

    // 销毁PJSUA2库
    ep.libDestroy();

    return 0;
}

在此示例中,MyCall 类用于处理SIP通话,MyAccount 类用于处理SIP账户。main 函数初始化PJSUA2库,并创建一个UDP传输对象。然后,它创建一个SIP账户,并等待程序退出。当SIP账户收到新的呼入通话时,MyAccount 类会创建一个新的 MyCall 对象来处理
通话。 MyCall 类处理通话状态变化事件和音频数据包,当通话接通时打印一条消息,当收到音频数据包时将其传输到 /dev/null。

请注意,这只是一个简单的示例代码,实际的SIP通话实现需要更多的细节和处理来确保正确的通信。

使用场景

SIP协议的使用场景如下:

实时通信:SIP协议可以用于实现实时通信,包括语音、视频、消息等。例如,可以使用SIP协议在不同终端设备之间建立语音通话或视频会议。

呼叫控制:SIP协议可以用于呼叫控制和呼叫管理。例如,可以使用SIP协议将呼叫路由到目标终端设备,或者使用SIP协议终止呼叫。

电话系统:SIP协议可以用于构建电话系统。例如,可以使用SIP协议将电话呼入路由到IP电话或传统电话网,也可以使用SIP协议实现语音信箱和呼叫转移等电话功能。

联网设备:SIP协议可以用于联网设备之间的通信。例如,可以使用SIP协议在IoT设备之间传递命令和数据。
总之,SIP协议是一个非常重要的应用层协议,被广泛用于实时通信和呼叫控制。SIP协议具有灵活性和可扩展性,可以满足不同的应用需求。文章来源地址https://www.toymoban.com/news/detail-674033.html

到了这里,关于SIP协议及其简单介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • sip网络号角喇叭 sip音柱 POE供电广播音箱 ip网络防水对讲终端 sip网络功放

    SV-7042TP网络号角喇叭 一、描述   SV-7042TP 是 我 司的一款SIP 网络号角喇叭 ,具有10/100M以太网接口,内置有一个高品质扬声器,将网络音源通过自带的功放和喇叭输出播放,可达到功率 30 W。 SV-7042TP 作为SIP系统的播放终端,可用于需要广播播放的场所,例如智慧城市、校园广

    2024年02月12日
    浏览(54)
  • Sip网络音频对讲广播模块, sip网络寻呼话筒音频模块

    Sip网络音频对讲广播模块, sip网络寻呼话筒音频模块 一、模块介绍 SV-2101VP和 SV-2103VP网络音频对讲广播模块 是一款通用的独立SIP音频功能模块,可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 该模块支持多种网络协议和音频编解码协议,可

    2024年02月10日
    浏览(35)
  • 使用python发送sip协议的OPTIONS

    环境:Windows10_x64  Python版本 :3.9.2   sip协议提供了OPTIONS请求方法可用于探测对端状态,今天记录下Windows10环境下使用python3.9简单实现sip协议的options功能(udp承载)的过程,并提供示例代码及相关资源下载,可从如下渠道获取: 关注微信公众号(聊聊博文,文末可扫码)后

    2024年02月10日
    浏览(32)
  • janus模块介绍-SIP Gateway

    默认的SIP GateWay也是https协议,端口为8088或者8089 如果需要在自己搭建的测试服务上测试SIP GateWay模块,则也需要修改为wss 具体改动如下: 找到/opt/janus/share/janus/demos/siptest.js 然后重启janus服务,执行 打开测试网页,在demos中找到SIP Gateway,点击start开始运行。 点击f12可以看到d

    2024年04月29日
    浏览(29)
  • Sip - Ubuntu 配置 miniSIPServer 服务器(测试用)

    客户提供的账号过期了,简单搭建 SIP 服务器,以便测试使用。个人认为这个配置起来最为简单,且测试功能足够。 官网miniSIPServer - 基于 Windows 以及 Linux 平台的 VoIP (SIP) 服务器软件. miniSIPServer 可能是最容易使用的 VoIP(SIP) 服务器软件,VoIP 领域专家可以轻松部署丰富的企业通

    2024年02月02日
    浏览(44)
  • sip消息拆包原理及组包流程

    操作系统 :CentOS 7.6_x64      freeswitch版本 :1.10.9 sofia-sip版本: sofia-sip-1.13.14   freeswitch使用sip协议进行通信,当sip消息超过mtu时,会出现拆包的情况,这里整理下sip消息拆包原理及组包流程。  简单来说:拆包的原因是,sip消息过长,超过mtu值。  具体原理可以参考《TCP/

    2023年04月08日
    浏览(24)
  • 阿里云服务器安装asterisk开源sip软交换服务器

    阿里云服务器安装asterisk开源sip软交换服务器 1、使用./contrib/scripts/install_prereq install自动安装依赖环境,此处是重要步骤。 2、版本的问题 centos版本:CentOS Linux release 7.5.1804 (Core) asterisk版本:16.0.0 当5060不能监听的时候更换版本 3、启动后的报错不需要理会,非必要模块会拒绝

    2024年02月06日
    浏览(63)
  • JAIN SIP API详解与GB28181服务器实现

    目录 一 JAIN SIP API 1 摘要 2 关于JAIN SIP API 3 API概述 3.1 maven坐标 3.2 类/接口 3.3 Message接口 3.4 Request接口 3.5 Response接口 4 即时通讯程序 4.1 TextClient代码概述 4.2 Message Processor 4.3 SIP协议栈 4.4 发送SIP请求 4.5 发送会话消息 4.6 接收SIP响应 4.7 接收SIP请求 4.8 处理错误 4.9 小节 二 GB2818

    2024年02月09日
    浏览(127)
  • WebRTC+Kamamilio+rtpengine+Websocket SIP服务器搭建教程

    发现国内使用SIP的资料真的很少,由于公司需要使用语音视频电话,在网上找了一大圈也没找到相关案例,最后自己折腾出一个方案,故此分享出来。 开始之前不得不介绍一下这五个东西。 Kamamilio 是 OpenSER 的前身,是C语言写的一个Sip服务,支持在 在Linux/UNIX系统上运行,优

    2024年02月15日
    浏览(76)
  • JAIN SIP API详解与GB28181服务器实现【保姆级源码教程】

    目录 一 JAIN SIP API 1 摘要 2 关于JAIN SIP API 3 API概述 3.1 maven坐标 3.2 类/接口 3.3 Message接口 3.4 Request接口 3.5 Response接口 4 即时通讯程序 4.1 TextClient代码概述 4.2 Message Processor 4.3 SIP协议栈 4.4 发送SIP请求 4.5 发送会话消息 4.6 接收SIP响应 4.7 接收SIP请求 4.8 处理错误 4.9 小节 二 GB2818

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包