赞
踩
现在因为众所周知的原因,海思的芯片价格疯狂的上涨, 行业的摄像机多采用华为海思的芯片,其制作成本水涨船高。
我们其实可以通过一个低配的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.csdn.net/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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。