现在因为众所周知的原因,海思的芯片价格疯狂的上涨, 行业的摄像机多采用华为海思的芯片,其制作成本水涨船高。
我们其实可以通过一个低配的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: [email protected]
tel: 13971177602
web:www.founu.com