国网B接口语音对讲和广播技术探究及与GB28181差别

这篇具有很好参考价值的文章主要介绍了国网B接口语音对讲和广播技术探究及与GB28181差别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

接口描述

在谈国网B接口的语音广播和语音对讲的时候,大家会觉得,国网B接口是不是和GB28181大同小异?实际上确实信令有差别,但是因为要GB28181设备接入测的对接,再次做国网B接口就简单多了。

语音对讲和广播包括信令接口和媒体流接口,采用与“调阅实时视频”流程相同的机制,不同之处
在于用户发出的请求消息的 SDP 仅携带音频描述信息。
语音所采用的编解码算法为 ITU-T G.711A
语音对讲和广播,被调阅的平台无需进行音频分发行为。

接口流程

语音对讲和广播的接口流程如下:

国网B接口语音对讲和广播技术探究及与GB28181差别

主要功能流程如下:
a) F1:平台用户,对前端系统指定的前端系统摄像机发起实时音频的调阅请求,发送 INVITE 消
息,携带 SDP 内容,通过平台转发到前端系统。
b) F2:按照 SIP 要求,如前端系统在 0.5 s 内未处理该请求,则先发送 1xx 临时响应给平台。
c) F3:前端系统接受了调阅请求的操作,则发送携带 SDP 的 200 OK 响应到平台。
d) F4:平台发送 ACK 给前端系统,确认会话建立。
e) 实时语音流开始传输,前端设备/用户根据相应的解码器解码并语音输出。
f) F5:用户结束会话,平台发送 BYE 消息到前端系统。
g) F6:前端系统发送确认,将媒体通道拆线,会话结束。

接口参数

SIP头字段如下:

国网B接口语音对讲和广播技术探究及与GB28181差别

SIP响应码返回码如下:

国网B接口语音对讲和广播技术探究及与GB28181差别

SIP参数定义:

国网B接口语音对讲和广播技术探究及与GB28181差别 

国网B接口语音对讲和广播技术探究及与GB28181差别

 RTP 动态 Payload 定义如下:

国网B接口语音对讲和广播技术探究及与GB28181差别

 消息示例

INVITE sip:前端设备地址编码@前端系统所属平台域名或IP地址 SIP/2.0
From: <sip:用户地址编码@用户所属平台域名或IP地址>;tag=3101300
To: <sip:前端设备地址编码@前端系统所属平台域名或IP地址>
Contact: <sip:用户地址编码@用户所属平台域名或IP地址>
Call-ID: c47k42
Via: SIP/2.0/UDP 用户所属平台IP地址;branch=z9hG4bK
CSeq: 1 INVITE
Content-type: application/SDP
Content-Length: 消息体的长度
v=0
o=- 0 0 IN IP4 用户会话IP地址描述
s=-
c=IN IP4 用户媒体IP地址描述
m=audio 38564 RTP/AVP 8
a=rtpmap:8 PCMA/8000
a=sendrecv

 语音会话请求响应如下:

SIP/2.0 200 OK
From: <sip: 用户地址编码@用户所属平台域名或IP地址>;tag=3101300
To: <sip: 前端设备地址编码@前端系统所属平台域名或IP地址>;tag=20b0660
Contact: <sip: 用户地址编码@用户所属平台域名或IP地址>
Call-ID: c47k42
Via: SIP/2.0/UDP 用户所属平台IP地址;branch=z9hG4bK
CSeq: 1 INVITE
Content-type: application/SDP
Content-Length: 消息体的长度
v=0
o=- 0 0 IN IP4 前端设备会话IP地址描述
s=-
c=IN IP4 前端设备媒体IP地址描述
m=audio 1000 RTP/AVP 8
a=rtpmap:8 PCMA/8000
a=sendrecv

代码实现

    @Override
    public void ntsOnInviteTalk(String deviceId, SessionDescription sessionDescription) {
        handler_.postDelayed(new Runnable() {
            @Override
            public void run() {
                // 先振铃响应下
                gb28181_agent_.respondTalkInvite(180, device_id_);

                MediaSessionDescription audio_description = null;
                SDPRtpMapAttribute rtp_map_attribute = null;

                Vector<MediaSessionDescription> audio_des_list = session_description_.getAudioDescriptions();
                if (audio_des_list != null && !audio_des_list.isEmpty()) {
                    // 先尝试获取PCMA格式
                    for(MediaSessionDescription m : audio_des_list) {
                        if (m != null && m.isValidAddressType() && m.isHasAddress()) {
                            rtp_map_attribute = m.getRtpMapAttribute(SDPRtpMapAttribute.PCMA_ENCODING_NAME);
                            if (rtp_map_attribute != null) {
                                audio_description = m;
                                break;
                            }
                        }
                    }

                    // 如果没有PCMA格式,尝试获取PS格式
                    if (null == rtp_map_attribute) {
                        for(MediaSessionDescription m : audio_des_list) {
                            if (m != null && m.isValidAddressType() && m.isHasAddress()) {
                                rtp_map_attribute = m.getRtpMapAttribute(SDPRtpMapAttribute.PS_ENCODING_NAME);
                                if (rtp_map_attribute != null) {
                                    audio_description = m;
                                    break;
                                }
                            }
                        }
                    }
                }

                if (null == audio_description) {
                    gb28181_agent_.respondTalkInvite(488, device_id_);
                    Log.i(TAG, "ntsOnInviteTalk get audio description is null, response 488, device_id:" + device_id_);
                    return;
                }

                if (null == rtp_map_attribute ) {
                    gb28181_agent_.respondTalkInvite(488, device_id_);
                    Log.i(TAG, "ntsOnInviteTalk get rtp map attribute is null, response 488, device_id:" + device_id_);
                    return;
                }

                Log.i(TAG,"ntsOnInviteTalk, device_id:" +device_id_+", is_tcp:" + audio_description.isRTPOverTCP()
                        + " rtp_port:" + audio_description.getPort() + " ssrc:" + audio_description.getSSRC()
                        + " address_type:" + audio_description.getAddressType() + " address:" + audio_description.getAddress()
                        + " payload_type:" +   rtp_map_attribute.getPayloadType() + " encoding_name:" + rtp_map_attribute.getEncodingName());

                long rtp_sender_handle = libPublisher.CreateRTPSender(0);
                if (0 == rtp_sender_handle) {
                    gb28181_agent_.respondTalkInvite(488, device_id_);
                    Log.i(TAG, "ntsOnInviteTalk CreateRTPSender failed, response 488, device_id:" + device_id_);
                    return;
                }

                gb_talk_rtp_payload_type_  = rtp_map_attribute.getPayloadType();
                gb_talk_rtp_encoding_name_ = rtp_map_attribute.getEncodingName();

                Log.i(TAG, "gb_talk_rtp_payload_type: " + gb_talk_rtp_payload_type_ + " gb_talk_rtp_encoding_name: " + gb_talk_rtp_encoding_name_);

                gb_talk_rtp_encoding_name_ =  "PS";

                libPublisher.SetRTPSenderTransportProtocol(rtp_sender_handle, audio_description.isRTPOverUDP()?0:1);
                libPublisher.SetRTPSenderIPAddressType(rtp_sender_handle, audio_description.isIPv4()?0:1);
                //libPublisher.SetRTPSenderLocalPort(rtp_sender_handle, 0);
                libPublisher.SetRTPSenderLocalPort(rtp_sender_handle, audio_description.getPort());
                libPublisher.SetRTPSenderSSRC(rtp_sender_handle, audio_description.getSSRC());
                libPublisher.SetRTPSenderSocketSendBuffer(rtp_sender_handle, 256*1024); // 音频配置到256KB
                libPublisher.SetRTPSenderClockRate(rtp_sender_handle, rtp_map_attribute.getClockRate());
                libPublisher.SetRTPSenderDestination(rtp_sender_handle, audio_description.getAddress(), audio_description.getPort());

                gb_talk_is_receive_ = audio_description.isHasAttribute("sendrecv");

                Log.i(TAG, "gb_talk_is_receive: " + gb_talk_is_receive_);

                if (gb_talk_is_receive_) {
                    libPublisher.EnableRTPSenderReceive(rtp_sender_handle, 1);

                    // 收包SSRC, 暂时不设置, 因为部分平台ssrc不一致的
                    // libPublisher.SetRTPSenderReceiveSSRC(rtp_sender_handle, audio_description.getSSRC());

                    // 这个一定要设置
                    libPublisher.SetRTPSenderReceivePayloadType(rtp_sender_handle, gb_talk_rtp_payload_type_, gb_talk_rtp_encoding_name_, 2,  rtp_map_attribute.getClockRate());

                    // 目前发现某些平台 PS-PCMA 是8000, 不建议设置
                    if (gb_talk_rtp_encoding_name_.equals("PS")) {
                        libPublisher.SetRTPSenderReceivePSClockFrequency(rtp_sender_handle, 8000);
                     }

                    // 如果是PCMA编码, 采样率和通道可以先不设置
                    // libPublisher.SetRTPSenderReceiveAudioSamplingRate(rtp_sender_handle, 8000);
                    // libPublisher.SetRTPSenderReceiveAudioChannels(rtp_sender_handle, 1);
                }

                if (libPublisher.InitRTPSender(rtp_sender_handle) != 0 ) {
                    gb28181_agent_.respondTalkInvite(488, device_id_);
                    libPublisher.DestoryRTPSender(rtp_sender_handle);
                    return;
                }

                int local_port = libPublisher.GetRTPSenderLocalPort(rtp_sender_handle);
                if (0==local_port) {
                    gb28181_agent_.respondTalkInvite(488, device_id_);
                    libPublisher.DestoryRTPSender(rtp_sender_handle);
                    return;
                }

                Log.i(TAG,"ntsOnInviteTalk get local_port:" + local_port);

                String local_ip_addr = IPAddrUtils.getIpAddress(context_);

                MediaSessionDescription main_local_audio_des = new MediaSessionDescription(audio_description.getType());

                main_local_audio_des.addFormat(String.valueOf(rtp_map_attribute.getPayloadType()));
                main_local_audio_des.addRtpMapAttribute(rtp_map_attribute);

                main_local_audio_des.addAttribute(new SDPAttribute("sendonly"));
                if (audio_description.isRTPOverTCP()) {
                    // tcp主动链接服务端
                    main_local_audio_des.addAttribute(new SDPAttribute("setup", "active"));
                    main_local_audio_des.addAttribute(new SDPAttribute("connection", "new"));
                }

                main_local_audio_des.setPort(local_port);
                main_local_audio_des.setTransportProtocol(audio_description.getTransportProtocol());

                main_local_audio_des.setSSRC(audio_description.getSSRC());

                MediaSessionDescription sub_local_audio_des = null;
                if (gb_talk_is_receive_) {
                    sub_local_audio_des = new MediaSessionDescription(audio_description.getType());

                    sub_local_audio_des.addFormat(String.valueOf(rtp_map_attribute.getPayloadType()));
                    sub_local_audio_des.addRtpMapAttribute(rtp_map_attribute);

                    sub_local_audio_des.addAttribute(new SDPAttribute("recvonly"));
                    if (audio_description.isRTPOverTCP()) {
                        // tcp主动链接服务端
                        sub_local_audio_des.addAttribute(new SDPAttribute("setup", "active"));
                        sub_local_audio_des.addAttribute(new SDPAttribute("connection", "new"));
                    }

                    sub_local_audio_des.setPort(local_port);
                    sub_local_audio_des.setTransportProtocol(audio_description.getTransportProtocol());

                    sub_local_audio_des.setSSRC(audio_description.getSSRC());
                }

                if (!gb28181_agent_.respondTalkInviteOK(device_id_, audio_description.getAddressType(), local_ip_addr, main_local_audio_des, sub_local_audio_des) ) {
                    libPublisher.DestoryRTPSender(rtp_sender_handle);
                    Log.e(TAG, "ntsOnInviteTalk call respondPlayInviteOK failed.");
                    return;
                }

                gb_talk_rtp_sender_handle_ = rtp_sender_handle;
            }

            private String device_id_;
            private SessionDescription session_description_;

            public Runnable set(String device_id, SessionDescription session_des) {
                this.device_id_ = device_id;
                this.session_description_ = session_des;
                return this;
            }
        }.set(deviceId, sessionDescription),0);
    }

总结

国网B接口的语音广播和语音对讲,和GB28181的还是有些差别,B接口的语音广播和语音对讲,不需要先发broadcast过来,不用设备接入端发invite请求,而是电网平台侧发invite,类似实时视频请求播放流程,感兴趣的开发者,可以根据规范仔细解读研究。文章来源地址https://www.toymoban.com/news/detail-413218.html

到了这里,关于国网B接口语音对讲和广播技术探究及与GB28181差别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 深入探究语音识别技术:原理、应用与实现

    ❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈 (封面图由文心一格生成) 随着人工智能的快速发展,语音识别技术得到了

    2024年02月03日
    浏览(35)
  • ip网络广播对讲的特点

    随着科技的不断发展,通讯方式也在不断地变革。传统的对讲机已经无法满足现代化沟通的需求,特别是在大型企业、学校和安保等领域对讲机的局限性已经显现出来。而一种新型通讯方式:IP网络广播对讲正在逐渐受到人们的关注和使用。本篇文章将围绕IP网络广播对讲,从

    2024年02月06日
    浏览(43)
  • SIP视频对讲sip广播网关

    SV-PA2是专门对行业用户需求研发的一款SIP音视频对讲,媒体流传输采用标准IP/RTP/RTSP协议。它很好的继承了锐科达话机稳定性好、电信级音质的优点,且完美兼容当下所有基于SIP的主流IPPBX/软交换/IMS平台,如Asterisk, Broadsoft, 3CX, Elastix 等。它集多种功能接口于一体:对讲、广播

    2024年02月15日
    浏览(39)
  • IP广播对讲系统停车场解决方案

    IP广播对讲系统 停车场解决方案 一、需求分析     随着国民经济和社会的发展, 选择 坐车 出行的民众越来越多。在保护交通 安全 的同时,也给 停车场 服务部门提出了更高的要求 。人们 对 停车场系统 提出了更高的要求与挑战, 需要 停车场系统 提高工作效率与服务水

    2024年04月09日
    浏览(54)
  • 世邦通信 SPON IP网络对讲广播系统后门账户

    产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统login.php代码中存在固定的账户密码判断登录后台,攻击者可通过固定账户密码直接登录后台。

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

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

    2024年02月10日
    浏览(35)
  • SPON世邦 IP网络对讲广播系统 多处文件上传漏洞复现

    SPON世邦IP网络对讲广播系统是一种先进的通信解决方案,旨在提供高效的网络对讲和广播功能。 SPON世邦IP网络对讲广播系统 addscenedata.php、uploadjson.php、my_parser.php等接口处存在任意文件上传漏洞,未经身份验证的攻击者可利用此漏洞上传恶意后门文件,可导致服务器失陷。

    2024年02月03日
    浏览(41)
  • 网络对讲终端 网络音频终端 网络广播终端SV-7011V使用说明

      高速路sip广播对讲求助 隧道sip对讲调度SIP-7011 网络广播终端SV-7011 壁挂式对讲终端网络监听终端SIP广播终端 sip语音对讲终端SIP-7011 SV-7011网络对讲终端网络对讲、网络厂播、监听 SV-7101网络解码终端提供一路线路输出接功放或有源音箱。 SV-7102网络解码广播终端两路立体声,

    2024年02月02日
    浏览(45)
  • 世邦通信 SPON IP网络对讲广播系统getzoneterminaldata.php 未授权访问

    产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统getuserdata.php存在未授权访问漏洞,攻击者可通过该漏洞获取后台敏感数据。 资产测绘 icon_has

    2024年01月22日
    浏览(65)
  • LiveNVR监控流媒体Onvif/RTSP功能-支持语音对讲支持非国标摄像头SDK语音对讲GB28181级联国标平台非国标转国标语音对讲

    可以访问摄像头自己的页面,看是否能够对讲。可以看摄像头的音频编码页面,看看音频输入有没有mic的 音频输入 。如下: 确认摄像头的视频类型,是否是复合流。 LiveNVR - 通道配置,添加配置通道,通过 SDK类型接入 。音频输出选择 原始音频 ,如下: 播放后,可以看到云

    2024年02月11日
    浏览(78)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包