簡(jiǎn)介
本文檔主要介紹 SDK 接口參考信息,包括主要功能、接口函數(shù)和回調(diào)函數(shù)。
主要功能包括:SDK 初始化、設(shè)備登錄、實(shí)時(shí)預(yù)覽、云臺(tái)控制、語(yǔ)音對(duì)講、報(bào)警監(jiān)聽(tīng)、智能訂閱、
錄像回放和錄像下載等。
根據(jù)環(huán)境不同,開(kāi)發(fā)包包含的文件會(huì)不同,具體如下所示。
Windows 開(kāi)發(fā)包所包含的文件如下:
Linux 開(kāi)發(fā)包所包含的文件如下:
SDK 的功能庫(kù)和配置庫(kù)是必備庫(kù)。
功能庫(kù)是設(shè)備網(wǎng)絡(luò) SDK 的主體,主要用于網(wǎng)絡(luò)客戶(hù)端與各類(lèi)產(chǎn)品之間的通訊交互,負(fù)責(zé)遠(yuǎn)程
控制、查詢(xún)、配置及碼流數(shù)據(jù)的獲取和處理等。
配置庫(kù)針對(duì)配置功能的結(jié)構(gòu)體進(jìn)行打包和解析。
推薦使用播放庫(kù)進(jìn)行碼流解析和播放。
環(huán)境要求
1、推薦內(nèi)存:不低于 512 MB。
2、Jdk 使用版本:jdk1.6;jdk1.8
3、SDK 支持的系統(tǒng):
- Windows 10/Windows 8.1/Windows 7/vista/XP/2000 以及 Windows Server 2008/2003。
- Linux Red Hat/SUSE 等通用 Linux 系統(tǒng)
庫(kù)加載問(wèn)題及解決方法
目前提供 Windows(.dll)、Linux(.so)兩種平臺(tái)的動(dòng)態(tài)庫(kù)。其中 win 和 linux 分為 64 位、32 位版本。
而調(diào)用 C++動(dòng)態(tài)庫(kù)的主要的方式分為“直接使用 Java 項(xiàng)目”和“將 Java 項(xiàng)目作為其他項(xiàng)目的 jar
包依賴(lài)運(yùn)行”兩種。在加載庫(kù)的過(guò)程中會(huì)出現(xiàn)“找不到動(dòng)態(tài)庫(kù)”的相關(guān)錯(cuò)誤。
“找不到動(dòng)態(tài)庫(kù)”問(wèn)題的根本原因?yàn)榇a路徑和物理路徑不匹配。因?yàn)?linux 版本的動(dòng)態(tài)庫(kù)名稱(chēng)
相較于 Windows 版本多出 lib 前綴,故 Linux 環(huán)境下加載動(dòng)態(tài)庫(kù)需要注意 lib 的前綴,在拼接動(dòng)態(tài)
庫(kù)路徑時(shí)需要加上 lib 前綴。使用 java.io.tmpdir 方式實(shí)現(xiàn)路徑映射時(shí),需要注意此種方式優(yōu)先級(jí)
較低。
大華攝像頭Java SDK,完成攝像頭設(shè)備登錄、視頻錄像
下載大華攝像頭Java sdk
下載好項(xiàng)目部署所在服務(wù)器類(lèi)型的sdk,如果windows 與linux 都要部署或使用可以將兩個(gè)版本的sdk都下載下來(lái),然后共用一套java代碼,只需要判斷當(dāng)前系統(tǒng)類(lèi)型然后加載不同的libs就好了。
目錄結(jié)構(gòu)
doc是sdk的文檔存放路徑
libs是c++依賴(lài)庫(kù)
res是國(guó)際化相關(guān)配置
windows 的c++代碼
Linux的C++代碼
項(xiàng)目結(jié)構(gòu)
Common包與lib包為大華sdk封裝的代碼,直接copy過(guò)來(lái)就好
libs包下有一個(gè)jnajar包,這個(gè)jar包可以通過(guò)maven命令打入本地廠(chǎng)庫(kù)或者直接引入
按照demo的封裝,進(jìn)行自己的封裝,以下是api包下的代碼
登錄
代碼是否可用可直接運(yùn)行main方法
import com.netsdk.common.Res;
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits;
import com.sun.jna.Pointer;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Vector;
/**
* 設(shè)備登錄
*/
@Slf4j
@Data
public class DeviceLoginControl {
public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
public NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
public NetSDKLib.LLong m_hPlayHandleOne = new NetSDKLib.LLong(0);
private Vector<String> chnlist = new Vector<String>();
public NetSDKLib.LLong m_hPlayHandleTwo = new NetSDKLib.LLong(0);
// 設(shè)備信息
public NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
private NetSDKLib.LLong lRealHandle;
private String videoStoragePath;
private Long cycleTime;
private Long cleanCycle;
// 登陸句柄
public NetSDKLib.LLong m_hLoginHandle = new NetSDKLib.LLong(0);
private static boolean bInit = false;
private static boolean bLogopen = false;
public DeviceLoginControl() {
}
public DeviceLoginControl(NetSDKLib.fDisConnect disConnect, NetSDKLib.fHaveReConnect fHaveReConnect) {
init(disConnect, fHaveReConnect);
}
public boolean init(NetSDKLib.fDisConnect disConnect, NetSDKLib.fHaveReConnect haveReConnect) {
bInit = netsdk.CLIENT_Init(disConnect, null);
if (!bInit) {
log.info("Initialize SDK failed");
return false;
}
//打開(kāi)日志,可選
NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
File path = new File("./sdklog/");
if (!path.exists()) {
path.mkdir();
}
String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + ToolKits.getDate() + ".log";
setLog.nPrintStrategy = 0;
setLog.bSetFilePath = 1;
System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
System.out.println(logPath);
setLog.bSetPrintStrategy = 1;
bLogopen = netsdk.CLIENT_LogOpen(setLog);
if (!bLogopen) {
log.error("Failed to open NetSDK log");
}
// 設(shè)置斷線(xiàn)重連回調(diào)接口,設(shè)置過(guò)斷線(xiàn)重連成功回調(diào)函數(shù)后,當(dāng)設(shè)備出現(xiàn)斷線(xiàn)情況,SDK內(nèi)部會(huì)自動(dòng)進(jìn)行重連操作
// 此操作為可選操作,但建議用戶(hù)進(jìn)行設(shè)置
netsdk.CLIENT_SetAutoReconnect(haveReConnect, null);
//設(shè)置登錄超時(shí)時(shí)間和嘗試次數(shù),可選
int waitTime = 5000; //登錄請(qǐng)求響應(yīng)超時(shí)時(shí)間設(shè)置為5S
int tryTimes = 1; //登錄時(shí)嘗試建立鏈接1次
netsdk.CLIENT_SetConnectTime(waitTime, tryTimes);
// 設(shè)置更多網(wǎng)絡(luò)參數(shù),NET_PARAM的nWaittime,nConnectTryNum成員與CLIENT_SetConnectTime
// 接口設(shè)置的登錄設(shè)備超時(shí)時(shí)間和嘗試次數(shù)意義相同,可選
NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM();
netParam.nConnectTime = 10000; // 登錄時(shí)嘗試建立鏈接的超時(shí)時(shí)間
netParam.nGetConnInfoTime = 3000; // 設(shè)置子連接的超時(shí)時(shí)間
netParam.nGetDevInfoTime = 3000;//獲取設(shè)備信息超時(shí)時(shí)間,為0默認(rèn)1000ms
netsdk.CLIENT_SetNetworkParam(netParam);
return true;
}
public static void main(String[] args) throws IOException {
DeviceLoginControl deviceLoginControl = new DeviceLoginControl();
deviceLoginControl.login("ip", 37777, "username", "password");
}
public boolean login(String m_strIp, int m_nPort, String m_strUser, String m_strPassword) {
//IntByReference nError = new IntByReference(0);
//入?yún)? NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam = new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY();
pstInParam.nPort = m_nPort;
pstInParam.szIP = m_strIp.getBytes();
pstInParam.szPassword = m_strPassword.getBytes();
pstInParam.szUserName = m_strUser.getBytes();
//出參
NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam = new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY();
pstOutParam.stuDeviceInfo = m_stDeviceInfo;
//m_hLoginHandle = netsdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, 0, null, m_stDeviceInfo, nError);
m_hLoginHandle = netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam);
if (m_hLoginHandle.longValue() == 0) {
System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", m_strIp, m_nPort, ToolKits.getErrorCodePrint());
} else {
System.out.println("Login Success [ " + m_strIp + " ]");
}
return m_hLoginHandle.longValue() == 0 ? false : true;
}
public void realPlayByDataType() {
// 創(chuàng)建Stin對(duì)象 設(shè)置碼流格式 通道號(hào) 預(yù)覽類(lèi)型 用戶(hù)數(shù)據(jù) 保存文件名稱(chēng)
NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();
stIn.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS;
stIn.nChannelID = 0;
stIn.rType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay;
stIn.dwUser = null;
stIn.szSaveFileName = "D:\\DahuaResult\\result.flv"; // 轉(zhuǎn)換后的裸H264碼流文件名
// 創(chuàng)建Stout對(duì)象
NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();
// 預(yù)覽轉(zhuǎn)碼流保存
NetSDKLib.LLong lRealHandle = netsdk.CLIENT_RealPlayByDataType(m_hLoginHandle, stIn, stOut, 5000);
if (lRealHandle.longValue() != 0) {
System.out.println("RealPlayByDataType Succeed!");
} else {
System.err.printf("RealPlayByDataType Failed!Last Error[0x%x]\n", netsdk.CLIENT_GetLastError());
return;
}
try {
// 錄像時(shí)間 單位毫秒
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 停止預(yù)覽
netsdk.CLIENT_StopRealPlay(lRealHandle); // 必須停止拉流后,才會(huì)生成文件
}
public boolean logout() {
netsdk.CLIENT_StopRealPlayEx(this.m_hPlayHandleOne);
netsdk.CLIENT_StopRealPlayEx(this.m_hPlayHandleTwo);
if (m_hLoginHandle.longValue() == 0) {
return false;
}
boolean bRet = netsdk.CLIENT_Logout(m_hLoginHandle);
if (bRet) {
m_hLoginHandle.setValue(0);
}
for (int i = 0; i < m_stDeviceInfo.byChanNum; i++) {
chnlist.clear();
}
return true;
}
}
云臺(tái)控制
import com.netsdk.lib.NetSDKLib;
public class PtzControl {
public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
public static boolean ptzControlStart(NetSDKLib.LLong m_hLoginHandle, Integer NET_PTZ_ControlType) {
return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NET_PTZ_ControlType, 2, 4, 0, 0);
}
public static boolean ptzControlEnd(NetSDKLib.LLong m_hLoginHandle, Integer NET_PTZ_ControlType) {
return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NET_PTZ_ControlType, 0, 0, 0, 1);
}
/**
* 向上
*/
public static boolean ptzControlUpEnd(NetSDKLib.LLong m_hLoginHandle) {
return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL, 0, 0, 0, 1);
}
/**
* 向下
*/
public static boolean ptzControlDownEnd(NetSDKLib.LLong m_hLoginHandle) {
return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL, 0, 0, 0, 1);
}
/**
* 向左
*/
public static boolean ptzControlLeftEnd(NetSDKLib.LLong m_hLoginHandle) {
return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL, 0, 0, 0, 1);
}
/**
* 向右
*/
public static boolean ptzControlRightEnd(NetSDKLib.LLong m_hLoginHandle) {
return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL, 0, 0, 0, 1);
}
public static boolean ptzControl(NetSDKLib.LLong m_hLoginHandle, Integer NET_PTZ_ControlType) {
boolean b = netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NET_PTZ_ControlType, 0, 0, 0, 1);
return b;
}
}
錄像
import com.netsdk.lib.NetSDKLib;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
@Slf4j
public class VideoControl {
public static void startRealPlay() throws FileNotFoundException {
DeviceLoginControl deviceLoginControl = new DeviceLoginControl();
deviceLoginControl.login("192.168.0.108", 37777, "admin", "admin123");
NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();
stIn.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS;
stIn.nChannelID = 0;
stIn.rType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay;
File xfile = new File("a.dav");
FileOutputStream fos = new FileOutputStream(xfile);
stIn.cbRealData = new NetSDKLib.fRealDataCallBackEx() {
@Override
public void invoke(NetSDKLib.LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, int param, Pointer dwUser) {
// 指定回調(diào)流為PS格式
if (dwDataType == 1001) {
byte[] byteArray = pBuffer.getByteArray(0, dwBufSize);
try {
fos.write(byteArray);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
};
stIn.dwUser = null;
stIn.szSaveFileName = "D:\\result.flv"; // 轉(zhuǎn)換后的裸H264碼流文件名
// 創(chuàng)建Stout對(duì)象
NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();
// 預(yù)覽轉(zhuǎn)碼流保存
NetSDKLib.LLong lRealHandle = deviceLoginControl.netsdk.CLIENT_RealPlayByDataType(deviceLoginControl.m_hLoginHandle, stIn, stOut, 5000);
if (lRealHandle.longValue() != 0) {
System.out.println("RealPlayByDataType Succeed!");
} else {
System.err.printf("RealPlayByDataType Failed!Last Error[0x%x]\n", deviceLoginControl.netsdk.CLIENT_GetLastError());
}
}
public static void videoRecording(DeviceLoginControl deviceLoginControl) {
NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();
stIn.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS;
stIn.nChannelID = 0;
stIn.rType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay;
stIn.dwUser = null;
log.info("設(shè)備登錄信息:{}", deviceLoginControl);
stIn.szSaveFileName = deviceLoginControl.getVideoStoragePath() + new SimpleDateFormat("YYYYMMddHHmmssSSS").format(new Date()) + ".flv"; // 轉(zhuǎn)換后的裸H264碼流文件名
// 創(chuàng)建Stout對(duì)象
NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();
// 預(yù)覽轉(zhuǎn)碼流保存
NetSDKLib.LLong lRealHandle = deviceLoginControl.netsdk.CLIENT_RealPlayByDataType(deviceLoginControl.m_hLoginHandle, stIn, stOut, 5000);
if (lRealHandle.longValue() != 0) {
// System.out.println(Res.string().getAttach());
System.out.println("RealPlayByDataType Succeed!");
} else {
throw new RuntimeException("錄像失敗.{}");
}
try {
// 錄像時(shí)間 單位毫秒
Thread.sleep(deviceLoginControl.getCycleTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
// 停止預(yù)覽
deviceLoginControl.netsdk.CLIENT_StopRealPlay(lRealHandle); // 必須停止拉流后,才會(huì)生成文件
}
public static void videoRecording(Long cycleTime, String savePath, DeviceLoginControl deviceLoginControl) {
NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();
stIn.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS;
stIn.nChannelID = 0;
stIn.rType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay;
stIn.dwUser = null;
stIn.szSaveFileName = savePath + new SimpleDateFormat("YYYYMMddHHmmssSSS").format(new Date()) + ".flv"; // 轉(zhuǎn)換后的裸H264碼流文件名
// 創(chuàng)建Stout對(duì)象
NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();
// 預(yù)覽轉(zhuǎn)碼流保存
NetSDKLib.LLong lRealHandle = deviceLoginControl.netsdk.CLIENT_RealPlayByDataType(deviceLoginControl.m_hLoginHandle, stIn, stOut, 5000);
if (lRealHandle.longValue() != 0) {
System.out.println("RealPlayByDataType Succeed!");
} else {
throw new RuntimeException("錄像失敗.{}");
}
try {
// 錄像時(shí)間 單位毫秒
Thread.sleep(cycleTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 停止預(yù)覽
deviceLoginControl.netsdk.CLIENT_StopRealPlay(lRealHandle); // 必須停止拉流后,才會(huì)生成文件
}
public static void main(String[] args) throws FileNotFoundException {
DeviceLoginControl deviceLoginControl = new DeviceLoginControl();
deviceLoginControl.login("ip", 37777, "username", "password");
videoRecording(300000l, "", deviceLoginControl);
}
}
DeviceContext
import com.netsdk.api.DeviceLoginControl;
import com.netsdk.common.Res;
import com.netsdk.common.SavePath;
import com.netsdk.lib.NetSDKLib;
import com.sun.jna.Pointer;
import com.web.device.manage.entity.CameraDeviceEntity;
import com.web.device.manage.service.CameraDeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@Slf4j
@Component
public class DeviceContext {
@Resource
private CameraDeviceService cameraDeviceService;
private Map<String, DeviceLoginControl> deviceLogin = new ConcurrentHashMap<>();
/**
* 初始化登錄與重連
*/
@PostConstruct
private void init() {
List<CameraDeviceEntity> list = cameraDeviceService.list();
Map<String, List<CameraDeviceEntity>> collect = list.stream().collect(Collectors.groupingBy(CameraDeviceEntity::getIp));
for (CameraDeviceEntity cameraDevice : list) {
DeviceLoginControl deviceLoginControl = new DeviceLoginControl(new DisConnect(), new HaveReConnect());
if (loginRetry(cameraDevice, deviceLoginControl)) {
deviceLoginControl.setCycleTime(cameraDevice.getCycleTime());
deviceLoginControl.setVideoStoragePath(cameraDevice.getVideoStoragePath());
deviceLoginControl.setCleanCycle(cameraDevice.getCleanCycle());
deviceLogin.put(cameraDevice.getIp(), deviceLoginControl);
}
}
}
private boolean loginRetry(CameraDeviceEntity cameraDevice, DeviceLoginControl deviceLoginControl) {
boolean login = deviceLoginControl.login(cameraDevice.getIp(), cameraDevice.getTcpPort(), cameraDevice.getLoginName(), cameraDevice.getPassword());
if (!login) {
log.error("{},正在嘗試重連", cameraDevice.getIp());
int count = 0;
while (!deviceLoginControl.login(cameraDevice.getIp(), cameraDevice.getTcpPort(), cameraDevice.getLoginName(), cameraDevice.getPassword())) {
count++;
log.error("重連 第{}次,請(qǐng)檢查網(wǎng)絡(luò)或設(shè)備是否在線(xiàn).{}", count, cameraDevice.getIp());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
log.error("重連等待異常.{}", cameraDevice.getIp());
e.printStackTrace();
}
if (count >= 5) {
log.error("長(zhǎng)時(shí)間重連失敗,取消重連,請(qǐng)檢查網(wǎng)絡(luò)或設(shè)備是否在線(xiàn).{}", cameraDevice.getIp());
return false;
}
}
log.info("重連成功.{}", cameraDevice.getIp());
}
return true;
}
@Scheduled(fixedDelay = 300000)
public void initDevice() {
List<CameraDeviceEntity> list = cameraDeviceService.list();
list.forEach(f -> {
if (!deviceLogin.containsKey(f.getIp()) && !deviceLogin.containsKey("DisConnect-" + f.getIp())) {
DeviceLoginControl deviceLoginControl = new DeviceLoginControl(new DisConnect(), new HaveReConnect());
if (loginRetry(f, deviceLoginControl)) {
deviceLoginControl.setCycleTime(f.getCycleTime());
deviceLoginControl.setVideoStoragePath(f.getVideoStoragePath());
deviceLoginControl.setCleanCycle(f.getCleanCycle());
deviceLogin.put(f.getIp(), deviceLoginControl);
}
}
});
}
public Map<String, DeviceLoginControl> getDeviceLogin() {
return deviceLogin;
}
public class fCaptureReceiveCB implements NetSDKLib.fSnapRev {
BufferedImage bufferedImage = null;
public void invoke(NetSDKLib.LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) {
if (pBuf != null && RevLen > 0) {
String strFileName = SavePath.getSavePath().getSaveCapturePath();
System.out.println("strFileName = " + strFileName);
byte[] buf = pBuf.getByteArray(0, RevLen);
ByteArrayInputStream byteArrInput = new ByteArrayInputStream(buf);
try {
bufferedImage = ImageIO.read(byteArrInput);
if (bufferedImage == null) {
return;
}
ImageIO.write(bufferedImage, "jpg", new File(strFileName));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class DisConnect implements NetSDKLib.fDisConnect {
/**
* 斷線(xiàn)回調(diào)
*
* @param m_hLoginHandle
* @param pchDVRIP
* @param nDVRPort
* @param dwUser
*/
public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
if (deviceLogin.containsKey(pchDVRIP)) {
synchronized (deviceLogin) {
if (deviceLogin.containsKey(pchDVRIP)) {
DeviceLoginControl deviceLoginControl = deviceLogin.get(pchDVRIP);
deviceLogin.remove(pchDVRIP);
deviceLogin.put("DisConnect-" + pchDVRIP, deviceLoginControl);
}
}
}
Res.string().getDisConnectReconnecting();
}
}
private class HaveReConnect implements NetSDKLib.fHaveReConnect {
public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
if (deviceLogin.containsKey("DisConnect-" + pchDVRIP)) {
synchronized (deviceLogin) {
if (deviceLogin.containsKey("DisConnect-" + pchDVRIP)) {
DeviceLoginControl deviceLoginControl = deviceLogin.get("DisConnect-" + pchDVRIP);
deviceLogin.remove("DisConnect-" + pchDVRIP);
deviceLogin.put(pchDVRIP, deviceLoginControl);
}
}
}
Res.string().getOnline();
}
}
}
調(diào)用的接口
package com.web.device.manage.controller;
import com.fasterxml.jackson.core.type.TypeReference;
import com.netsdk.api.DeviceLoginControl;
import com.netsdk.api.PtzControl;
import com.netsdk.lib.NetSDKLib;
import com.web.common.constant.WebConstant;
import com.web.common.entity.web.Failure;
import com.web.common.entity.web.Result;
import com.web.common.utils.BeanUtils;
import com.web.common.web.BaseController;
import com.web.device.manage.DeviceContext;
import com.web.device.manage.entity.CameraDeviceEntity;
import com.web.device.manage.model.response.CameraDeviceResponseModel;
import com.web.device.manage.service.CameraDeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping(WebConstant.RequestMappingConstant.CAMERA_DEVICE)
public class CameraDeviceController extends BaseController {
@Resource
private CameraDeviceService cameraDeviceService;
@Resource
private RedisTemplate redisTemplate;
@Resource
private DeviceContext deviceContext;
@RequestMapping(WebConstant.RequestMappingConstant.LIST)
public Result list() {
return executor(e -> {
List<CameraDeviceEntity> cameraDevices = cameraDeviceService.list();
e.put("cameraDevices", BeanUtils.convertListToList(cameraDevices, new TypeReference<List<CameraDeviceResponseModel>>() {
}));
}, f -> Failure.instance(WebConstant.Code.ERROR, f.getMessage()));
}
@RequestMapping("/download")
public void download(@RequestBody Map<String, String> params, HttpServletResponse response) {
try {
// path是指想要下載的文件的路徑
File file = new File(params.get("path"));
log.info(file.getPath());
// 獲取文件名
String filename = file.getName();
// 獲取文件后綴名
String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
log.info("文件后綴名:" + ext);
// 將文件寫(xiě)入輸入流
FileInputStream fileInputStream = new FileInputStream(file);
InputStream fis = new BufferedInputStream(fileInputStream);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 設(shè)置response的Header
response.setCharacterEncoding("UTF-8");
//Content-Disposition的作用:告知瀏覽器以何種方式顯示響應(yīng)返回的文件,用瀏覽器打開(kāi)還是以附件的形式下載到本地保存
//attachment表示以附件方式下載 inline表示在線(xiàn)打開(kāi) "Content-Disposition: inline; filename=文件名.mp3"
// filename表示文件的默認(rèn)名稱(chēng),因?yàn)榫W(wǎng)絡(luò)傳輸只支持URL編碼的相關(guān)支付,因此需要將文件名URL編碼后進(jìn)行傳輸,前端收到后需要反編碼才能獲取到真正的名稱(chēng)
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(params.containsKey("name") ? params.get("name") : new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + "." + ext, "UTF-8"));
// 告知瀏覽器文件的大小
response.addHeader("Content-Length", "" + file.length());
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
outputStream.write(buffer);
outputStream.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
@RequestMapping(WebConstant.RequestMappingConstant.SET_CLEAN_CYCLE)
public Result setCleanCycle(@PathVariable("cycle") Integer cycle) {
return executor(e -> {
redisTemplate.opsForValue().set("cleanCycle", cycle);
}, f -> Failure.instance(WebConstant.Code.ERROR, f.getMessage()));
}
@RequestMapping(WebConstant.RequestMappingConstant.GET_CLEAN_CYCLE)
public Result getCleanCycle() {
return executor(e -> {
Object cleanCycle = redisTemplate.opsForValue().get("cleanCycle");
if (cleanCycle == null) {
redisTemplate.opsForValue().set("cleanCycle", 7);
e.put("cycle", 7);
} else {
e.put("cycle", cleanCycle);
}
}, f -> Failure.instance(WebConstant.Code.ERROR, f.getMessage()));
}
@RequestMapping(WebConstant.RequestMappingConstant.PTZ_CONTROL)
public Result ptzControl(@RequestBody Map<String, Object> params) {
return executor(e -> {
Map<String, DeviceLoginControl> deviceLogin = deviceContext.getDeviceLogin();
DeviceLoginControl deviceLoginControl = deviceLogin.get(params.get("deviceIp"));
if (!PtzControl.ptzControlStart(deviceLoginControl.getM_hLoginHandle(), (Integer) params.get("type"))) {
throw new RuntimeException("控制失敗");
}
Thread.sleep(500);
if (!PtzControl.ptzControlEnd(deviceLoginControl.getM_hLoginHandle(), (Integer) params.get("type"))) {
throw new RuntimeException("控制失敗");
}
}, f -> Failure.instance(WebConstant.Code.ERROR, f.getMessage()));
}
}
注意
libs的加載地址要指定文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-808417.html
碼云地址
dahua-device文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-808417.html
到了這里,關(guān)于大華攝像頭windows、linuxJavaSDK開(kāi)發(fā)使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!