GB28181控制、传输流程和协议接口之注册|注销和技术实现

简介: 注册和注销基本要求 SIP客户端、网关、SIP设备、联网系统等 SIP代理(SIP UA)使用IETFRFC3261中定义的方法 15 GB/T28181—2016Register进行注册和注销。

注册和注销基本要求 SIP客户端、网关、SIP设备、联网系统等 SIP代理(SIP UA)使用IETFRFC3261中定义的方法 15 GB/T28181—2016Register进行注册和注销。


注册和注销时应进行认证,认证方式应支持数字摘要认证方式,高安全级别的宜支持数字证书的认证方式,数字证书的格式符合附录I中的规定。


SIP代理在注册过期时间到来之前,应向注册服务器进行刷新注册,刷新注册消息流程应与9.1.2.1 的流程描述一致,并遵循IETFRFC3261对刷新注册的规定。


若注册失败,SIP代理应间隔一定时间后继续发起注册过程,与上一次注册时间间隔应可调,一般情况下不应短于60s。


系统、设备注册过期时间应可配置,缺省值为86400s(1d),应在注册过期时间到来之前发送刷新注册消息,为SIP服务器预留适当刷新注册处理时间,注册过期时间不应短于3600s。


SIP代理注册成功则认为SIP服务器为在线状态,注册失败则认为SIP服务器为离线状态;SIP服务器在SIP代理注册成功后认为其为在线状态,SIP代理注册过期则认为其为离线状态。

注册流程

以基本注册流程为例,流程如下:

632e429e32d54901b49e36c29f7fa6a6.png

注册流程描述如下:


a) 1:SIP代理向SIP服务器发送 Register请求;


b) 2:SIP服务器向 SIP代理发送响应401,并在响应的消息头 WWW_Authenticate字段中给出适合SIP代理的认证体制和参数;


c) 3:SIP代理重新向SIP服务器发送Register请求,在请求的 Authorization字段给出信任书, 包含认证信息;


d) 4:SIP 服务器对请求进行验证,如果检查出 SIP 代理身份合法,向SIP代理发送成功响应 200OK,如果身份不合法则发送拒绝服务应答。


基于数字证书的双向认证注册不再赘述。

注销流程


a33ecfe5823d4f1b825b560fce2e8cdd.png

注销流程描述如下:


a) 1:SIP代理向SIP服务器发送Register请求,Expires字段的值为0,表示SIP代理要注销;


b) 2:SIP服务器向 SIP代理发送响应401,并在响应的消息头 WWW_Authenticate字段中给出适合SIP代理的认证体制和参数;


c) 3:SIP代理重新向SIP服务器发送 Register请求,在请求的 Authorization字段给出信任书, 包含认证信息,Expires字段的值为0;


d) 4:SIP 服务器对请求进行验证,如果检查出 SIP 代理身份合法,向 SIP 代理发送成功响应 200OK,如果身份不合法则发送拒绝服务应答。  

相关技术实现

    /*
     * CameraPublishActivity.java
     * initGB28181Agent 初始化参数
     *
     * WebSite: https://daniusdk.com
     * Github: https://github.com/daniulive/SmarterStreaming
     * 
     */
    private boolean initGB28181Agent() {
        if ( gb28181_agent_ != null )
            return  true;
        getLocation(context_);
        String local_ip_addr = IPAddrUtils.getIpAddress(context_);
        Log.i(TAG, "initGB28181Agent local ip addr: " + local_ip_addr);
        if ( local_ip_addr == null || local_ip_addr.isEmpty() ) {
            Log.e(TAG, "initGB28181Agent local ip is empty");
            return  false;
        }
        gb28181_agent_ = GBSIPAgentFactory.getInstance().create();
        if ( gb28181_agent_ == null ) {
            Log.e(TAG, "initGB28181Agent create agent failed");
            return false;
        }
        gb28181_agent_.addListener(this);
        // 必填信息
        gb28181_agent_.setLocalAddress(local_ip_addr);
        gb28181_agent_.setServerParameter(gb28181_sip_server_addr_, gb28181_sip_server_port_, gb28181_sip_server_id_, gb28181_sip_domain_);
        gb28181_agent_.setUserInfo(gb28181_sip_username_, gb28181_sip_password_);
        // 可选参数
        gb28181_agent_.setUserAgent(gb28181_sip_user_agent_filed_);
        gb28181_agent_.setTransportProtocol(gb28181_sip_trans_protocol_==0?"UDP":"TCP");
        // GB28181配置
        gb28181_agent_.config(gb28181_reg_expired_, gb28181_heartbeat_interval_, gb28181_heartbeat_count_);
        //com.gb.ntsignalling.Device gb_device = new com.gb.ntsignalling.Device("34020000001380000001", "安卓测试设备", Build.MANUFACTURER, Build.MODEL,
        //            "宇宙","火星1","火星", true);
        com.gb.ntsignalling.Device gb_device = new com.gb.ntsignalling.Device("33010752991327811433", "安卓测试设备", Build.MANUFACTURER, Build.MODEL,
                "宇宙","火星1","火星", true);
        if (mLongitude != null && mLatitude != null) {
            com.gb.ntsignalling.DevicePosition device_pos = new com.gb.ntsignalling.DevicePosition();
            device_pos.setTime(mLocationTime);
            device_pos.setLongitude(mLongitude);
            device_pos.setLatitude(mLatitude);
            gb_device.setPosition(device_pos);
            gb_device.setSupportMobilePosition(true); // 设置支持移动位置上报
        }
        gb28181_agent_.addDevice(gb_device);
/*
        com.gb28181.ntsignalling.Device gb_device1 = new com.gb28181.ntsignalling.Device("34020000001380000002", "安卓测试设备2", Build.MANUFACTURER, Build.MODEL,
                "宇宙","火星1","火星", true);
        if (mLongitude != null && mLatitude != null) {
            com.gb28181.ntsignalling.DevicePosition device_pos = new com.gb28181.ntsignalling.DevicePosition();
            device_pos.setTime(mLocationTime);
            device_pos.setLongitude(mLongitude);
            device_pos.setLatitude(mLatitude);
            gb_device1.setPosition(device_pos);
            gb_device1.setSupportMobilePosition(true);
        }
        gb28181_agent_.addDevice(gb_device1);
 */
        if (!gb28181_agent_.createSipStack()) {
            gb28181_agent_ = null;
            Log.e(TAG, "initGB28181Agent gb28181_agent_.createSipStack failed.");
            return  false;
        }
        boolean is_bind_local_port_ok = false;
        // 最多尝试5000个端口
        int try_end_port = gb28181_sip_local_port_base_ + 5000;
        try_end_port = try_end_port > 65536 ?65536: try_end_port;
        for (int i = gb28181_sip_local_port_base_; i < try_end_port; ++i) {
            if (gb28181_agent_.bindLocalPort(i)) {
                is_bind_local_port_ok = true;
                break;
            }
        }
        if (!is_bind_local_port_ok) {
            gb28181_agent_.releaseSipStack();
            gb28181_agent_ = null;
            Log.e(TAG, "initGB28181Agent gb28181_agent_.bindLocalPort failed.");
            return  false;
        }
        if (!gb28181_agent_.initialize()) {
            gb28181_agent_.unBindLocalPort();
            gb28181_agent_.releaseSipStack();
            gb28181_agent_ = null;
            Log.e(TAG, "initGB28181Agent gb28181_agent_.initialize failed.");
            return  false;
        }
        return true;
    }

initGB28181Agent() 完成基础化参数配置后,就开始发Register;


和注册相关的状态反馈如下:

    @Override
    public void ntsRegisterOK(String dateString) {
        Log.i(TAG, "ntsRegisterOK Date: " + (dateString!= null? dateString : ""));
    }
    @Override
    public void ntsRegisterTimeout() {
        Log.e(TAG, "ntsRegisterTimeout");
    }
    @Override
    public void ntsRegisterTransportError(String errorInfo) {
        Log.e(TAG, "ntsRegisterTransportError error:" + (errorInfo != null?errorInfo :""));
    }

注销的话,Expires字段的值为0即可。

相关文章
|
3月前
|
监控 JavaScript 应用服务中间件
匿名用户访问的接口或者无登录态场景下接口防刷的解决方案
匿名用户访问的接口或者无登录态场景下接口防刷的解决方案
41 0
|
7月前
|
监控 Android开发
GB28181状态信息报送解读及Android端国标设备接入技术实现
今天主要聊聊GB/T28181状态信息报送这块,先回顾下协议规范相关细节,然后再针对代码实现,做个简单的说明。
102 0
|
8月前
|
安全 开发者
直播平台开发协议分析篇(一):会话初始化协议SIP
直播平台开发的SIP协议今天的分析就到这里,大家不难看出,SIP协议关乎着直播平台的实时通信和多方互动能否正常提供服务,确保用户能够以高质量和稳定性进行音视频交流,从而创造更丰富的直播体验。
直播平台开发协议分析篇(一):会话初始化协议SIP
|
9月前
|
存储 算法 芯片
ov2640子设备核心操作详细分析
ov2640子设备核心操作详细分析
176 0
|
存储 云计算 数据中心
ABB DSAX452 无需用户的直接主动管理
ABB DSAX452 无需用户的直接主动管理
ABB DSAX452 无需用户的直接主动管理
|
物联网
设备通过https通道的动态预注册
目前阿里云物联网平台,设备通过https协议只支持预注册,不支持免预注册。https只支持直连设备的消息上行,不适用于网关子设备。
185 0
|
算法 物联网
设备通过mqtt通道的动态免预注册
一型一密认证方式下,同一产品下所有设备可以烧录相同的设备标志信息,即所有设备包含相同的产品证书(ProductKey和ProductSecret)。设备发送激活请求时,物联网平台会进行身份确认,认证通过后,下发设备接入所需信息。
340 0
|
存储 算法 安全
设备通过mqtt通道的动态预注册
在物联网平台为产品开启动态注册功能后,直连设备可使用一型一密安全认证方式完成动态注册,通过MQTT通信协议连接物联网平台。设备先基于TLS建立与物联网平台的连接,获取MQTT连接所需的设备密钥,再断开连接,然后重新建立MQTT连接进行通信。
448 1
|
存储 数据采集 开发框架
ModStartCMS v5.1.0 数据采集接口,登录自动注册
ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议,免费且不限制商业使用。
87 0
|
物联网 API
设备端和服务端检测设备是否在线的方法
使用物联网时,有时设备端和服务端都需要检测设备是否在线。
1055 0