android实现onvif(rtsp)转GB28181

     现在因为众所周知的原因,海思的芯片价格疯狂的上涨, 行业的摄像机多采用华为海思的芯片,其制作成本水涨船高。

     我们其实可以通过一个低配的android盒子,装一个apk,就可以实现将普通的onvif摄像头转成GB28181的摄像头接入到GB28181平台,实现GB28181的联网共享。

     其数据流逻辑图如下:

由上图可知,通过android实现一个onvif转gb28181的网关,安装在android的设备上即可。该网关首先要具有onvif搜索功能,搜索到设备,通过设备的onvif用户名和密码,获取设备的rtsp url与设备信息,然后以GB28181视音频源设备的身份注册到GB28181平台,每个onvif设备以其一个通道的身份接入,比如局域网内有5个设备,那么转换为GB28181其实就是以一个带有5个视音频通道的设备注册到GB28181平台中。实现需要实现onvif的jni,同时实现gb28181设备端的JNI。由于GB28181设备端的其他文章已描述,可以参考文件https://blog.youkuaiyun.com/wangjie_jack/article/details/102968738

  本文着重描述onvif的jni接口,如下:

	public static native void OnvifInit(String  localip);

	public static native void OnvifUnInit();
    //查找设备
	public static native String[] OnvifDiscoveryDevice();
    //获取设备的媒体url
	public static native String OnvifGetUrl(String deviceurl, String user, String pwd);
    //获取设备信息
	public static native DeviceInformation  OnvifGetDeviceInformation(String jdevice_url, String user, String psw);

其中类DeviceInformation为设备信息类,定义如下:

package com.shiyue.onvif;

public class DeviceInformation
{
	public String szManufacturer;
	public String szModel;
	public String szFirmwareVersion;
	public String szSerialNumber;
	public String szHardwareId;

	public DeviceInformation(String Manufacturer, String Model,String FirmwareVersion,String SerialNumber,String HardwareId)
	{
		this.szManufacturer = Manufacturer;
		this.szModel = Model;
		this.szFirmwareVersion = FirmwareVersion;
		this.szSerialNumber = SerialNumber;
		this.szHardwareId = HardwareId;
	}
}

android基于onvif进行设备搜索代码如下:

//设备搜索
		ImageButton imageButton = findViewById(R.id.search);
		imageButton.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				progressSearch.setVisibility(View.VISIBLE);
				new Thread(new Runnable(){
					@Override
					public void run() {
						SYGbtDeviceApp.getInstance().urls = OnVifNative.OnvifDiscoveryDevice();
						if(SYGbtDeviceApp.getInstance().urls.length > 0)
						{
							SYGbtDeviceApp.getInstance().deviceurls = new String[SYGbtDeviceApp.getInstance().urls.length];
							System.arraycopy(SYGbtDeviceApp.getInstance().urls, 0, SYGbtDeviceApp.getInstance().deviceurls, 0, SYGbtDeviceApp.getInstance().urls.length);
						}
						Message msg = Message.obtain();
						msg.what = SYGbtDeviceApp.getInstance().urls.length ;
						sthandler.sendMessage(msg);
					}
				}).start();
			}
		});

输入onvif用户名和密码,获取设备的rtsp url代码如下:

	//弹用户名和密码对话框
					final int index = position;
					LayoutInflater factory = LayoutInflater.from(ActivityDevice.this);
					final View textOnvifView = factory.inflate(R.layout.dialog_set_user_pwd, null);
					final EditText edit_onvif_user = (EditText) textOnvifView.findViewById(R.id.onvif_user);
					final EditText edit_onvif_pwd  = (EditText)textOnvifView.findViewById(R.id.onvif_pwd);
					AlertDialog.Builder ad1 = new AlertDialog.Builder(ActivityDevice.this);
					ad1.setTitle("设置onvif用户密码:");
					ad1.setIcon(R.mipmap.set);
					ad1.setView(textOnvifView);
					ad1.setPositiveButton("保存", new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int i) {
							String url = OnVifNative.OnvifGetUrl(SYGbtDeviceApp.getInstance().urls[index], edit_onvif_user.getText().toString(), edit_onvif_pwd.getText().toString());
							if(url != null)
								SYGbtDeviceApp.getInstance().urls[index] = url;
							mAdapter.notifyDataSetChanged();

							//添加到map
							OnvifUser ou = new OnvifUser();
							ou.user = edit_onvif_user.getText().toString();
							ou.pwd = edit_onvif_pwd.getText().toString();
							SYGbtDeviceApp.getInstance().onvif_map.put(SYGbtDeviceApp.getInstance().deviceurls[index],ou);
						}
					});
					ad1.setNegativeButton("取消", new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int i) {

						}
					});
					ad1.show();// 显示对话框

 

打开demo app,搜索后会出现设备的url列表,点击输入onvif用户名和密码后会变成rtsp的url,如下图:

点击列表中指定的设备列表,可以进行设备的实时视频预览,如下图:

如果点击接入平台,注册到GB28181平台上后,平台上会出现1个带有5个视频通道的设备,点击任意通道都可以通过GB28181协议预览视频,如下图(以视跃的realgbs平台为例):

demo可免费下载并免费试用,下载地址

 

更多信息

e-mail: yujesoft@163.com

tel: 13971177602

web:www.founu.com

 

 

<think>好的,我现在需要帮助用户找到海康威视综合管理平台与大华综合管理平台对接的实例或方案。用户提到了API和SDK,所以我需要先回顾一下系统级指令中的引用内容,看看有没有相关的信息。 首先,查看引用[1],里面提到了海康威视SDK的对接,包括初始化、注册、功能调用等步骤,还提到大华的SDK需要登陆。这可能意味着两个平台的SDK有不同的接口和认证方式,对接时需要注意各自的API文档。 引用[2]是关于Android平台前端设备接入的流程,涉及信令交互如Register、Catalog、KeepAlive和Invite请求。虽然主要针对设备端,但可能对平台间的信令互通有参考价值,比如SDP消息体的处理。 接下来,我需要分析用户的具体需求。用户想将两个不同的综合管理平台对接,可能需要实现数据互通或功能整合。常见的对接方式包括API调用、SDK集成、中间件或协议换。 可能的挑战包括不同平台的认证机制差异、数据格式不一致、网络配置问题等。例如,海康使用注册而大华使用登陆,需要分别处理。此外,实时视频流码和回放可能需要处理不同的编码格式或流媒体协议。 解决方案方面,可以建议用户查阅两个平台的开放平台文档,寻找是否有标准的接口,比如国标GB/T28181,这可能帮助实现跨平台互通。如果没有,可能需要开发中间层进行协议换,或者利用第三方码工具处理视频流。 最后,用户可能需要具体的实例或代码参考。引用[1]中的代码下载地址可能包含一些功能示例,虽然是大华的,但可以借鉴部分逻辑。同时,建议用户联系厂商技术支持,获取定制化方案,并参考行业论坛寻找类似案例。</think>### 海康威视与大华综合管理平台对接方案分析 #### 1. **对接基础路径** - **API/SDK直连**:两平台均提供开放API接口(海康iSecure Center、大华DHOP平台),需分别调用其SDK实现功能互通[^1]。 - 海康SDK初始化需调用`NET_DVR_Init`和`NET_DVR_Login_V40` - 大华SDK使用`CLIENT_Init`和`CLIENT_LoginEx`进行设备登陆 - **中间件换**:若协议不兼容,需开发协议换中间层,如将海康的ISAPI协议换为大华的DHIOP协议 - **国标协议互通**:通过GB/T28181-2016协议实现级联,两平台均需支持该标准[^2] #### 2. **关键代码示例(伪代码)** ```python # 海康设备注册示例(C++ SDK封装) hik_session = HikSDK.initialize() hik_login_id = hik_session.login(ip="192.168.1.64", user="admin", pwd="hik123") # 大华设备登陆示例 dahua_client = DahuaSDK.Client() dahua_client.login(device_ip="10.0.0.128", port=37777, user="admin", pwd="dh456") # 视频流发中间层 def stream_relay(hik_stream, dahua_protocol): decoded_frame = HikDecoder(hik_stream) encoded_frame = DahuaEncoder(decoded_frame, protocol=dahua_protocol) return encoded_frame ``` #### 3. **常见问题解决方案** | 问题类型 | 海康侧处理 | 大华侧处理 | |----------------|-------------------------------------|-------------------------------------| | 设备认证失败 | 检查`NET_DVR_Login_V40`返回值 | 验证`CLIENT_LoginEx`错误码 | | 视频流无法解析 | 使用海康码库`PlayM4_ConvertToJpeg`| 调用大华`CLIENT_DecodeFrame` | | 事件同步延迟 | 订阅ISAPI事件接口 | 配置DHOP事件推送服务 | #### 4. **网络拓扑建议** ``` 海康NVR ---RTSP流---> [协议换网关] ---ONVIF流---> 大华CMS |__GB28181信令__| |__SIP信令__| ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值