本人遇到的問題描述:我的電腦是64位系統,32位jdk,剛開始下載了64位的SDK,一直報 :Unable to load library 'HCNetSDK': ÕҲ»µ½ָ¶¨ 這種錯,后來更換了32位的 SDK,成功,所以應該和 jdk 版本有關系和電腦系統沒關系。
引入:log4j-1.2.16.jar,quartz-2.2.1.jar,slf4j-api-1.6.6.jar,slf4j-log4j12-1.6.6.jar
將 SDK 中的庫文件全部放到 src 文件夾下,引入 SDK 中的兩個 jar:examples.jar,jna.jar
import java.io.File; import java.io.UnsupportedEncodingException; public class HCNetSDKPath { public static String DLL_PATH; static{ String path=(HCNetSDKPath.class.getResource("/").getPath()).replaceAll("%20", " ").substring(1).replace("/", "\\"); try { DLL_PATH= java.net.URLDecoder.decode(path,"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }
更改 HCNetSDK.java:
將:HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("../lib/HCNetSDK", HCNetSDK.class);
改為:HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HCNetSDKPath.DLL_PATH+"HCNetSDK.dll", HCNetSDK.class);
將:boolean NET_DVR_CaptureJPEGPicture_NEW(NativeLong lUserID, NativeLong lChannel, NET_DVR_JPEGPARA lpJpegPara, String sJpegPicBuffer, int dwPicSize, IntByReference lpSizeReturned);
改為:boolean NET_DVR_CaptureJPEGPicture_NEW(NativeLong lUserID, NativeLong lChannel, NET_DVR_JPEGPARA lpJpegPara, ByteBuffer sJpegPicBuffer, int dwPicSize, IntByReference lpSizeReturned);
import com.sun.jna.NativeLong; public class MonitorCameraInfo { String CameraIp; int CameraPort; String UserName; String UserPwd; NativeLong UserId; NativeLong Channel; public String getCameraIp() { return CameraIp; } public int getCameraPort() { return CameraPort; } public String getUserName() { return UserName; } public String getUserPwd() { return UserPwd; } public NativeLong getUserId() { return UserId; } public NativeLong getChannel() { return Channel; } public void setCameraIp(String cameraIp) { CameraIp = cameraIp; } public void setCameraPort(int cameraPort) { CameraPort = cameraPort; } public void setUserName(String userName) { UserName = userName; } public void setUserPwd(String userPwd) { UserPwd = userPwd; } public void setUserId(NativeLong userId) { UserId = userId; } public void setChannel(NativeLong channel) { Channel = channel; } }
import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.sxtb.ai.HCNetSDK.NET_DVR_DEVICEINFO_V30; import com.sxtb.ai.HCNetSDK.NET_DVR_IPPARACFG; import com.sxtb.ai.HCNetSDK.NET_DVR_JPEGPARA; import com.sxtb.ai.HCNetSDK.NET_DVR_WORKSTATE_V30; public class TestQuartz implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException { TestQuartz tqQuartz = new TestQuartz(); try { tqQuartz.getImages(); } catch (IOException e) { e.printStackTrace(); } } public void getImages() throws IOException{ final TestQuartz app = new TestQuartz(); final MonitorCameraInfo cameraInfo = new MonitorCameraInfo(); cameraInfo.setCameraIp("192.168.1.64"); cameraInfo.setCameraPort(8000); cameraInfo.setUserName("admin"); cameraInfo.setUserPwd("admin@123"); app.getDVRConfig(cameraInfo); app.getDVRPic(cameraInfo); } public void getDVRConfig(MonitorCameraInfo cameraInfo) { HCNetSDK sdk = HCNetSDK.INSTANCE; //判斷攝像頭是否開啟 if (!sdk.NET_DVR_Init()) { System.out.println("SDK初始化失敗"); return; } NET_DVR_DEVICEINFO_V30 devinfo = new NET_DVR_DEVICEINFO_V30();// 設備信息 //登錄信息 NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getCameraIp(), (short) cameraInfo.getCameraPort(), cameraInfo.getUserName(), cameraInfo.getUserPwd(), devinfo); cameraInfo.setUserId(id);// 返回一個用戶編號,同時將設備信息寫入devinfo if (cameraInfo.getUserId().intValue() < 0) { System.out.println("設備注冊失敗"); return; } //DVR工作狀態 NET_DVR_WORKSTATE_V30 devwork = new NET_DVR_WORKSTATE_V30(); if (!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devwork)) { // 返回Boolean值,判斷是否獲取設備能力 System.out.println("返回設備狀態失敗"); } IntByReference ibrBytesReturned = new IntByReference(0);// 獲取IP接入配置參數 NET_DVR_IPPARACFG ipcfg = new NET_DVR_IPPARACFG();//IP接入配置結構 ipcfg.write(); Pointer lpIpParaConfig = ipcfg.getPointer(); //獲取相關參數配置 sdk.NET_DVR_GetDVRConfig(cameraInfo.getUserId(), HCNetSDK.NET_DVR_GET_IPPARACFG, new NativeLong(0), lpIpParaConfig, ipcfg.size(), ibrBytesReturned); ipcfg.read(); System.out.print("IP地址:" + cameraInfo.getCameraIp()); System.out.println("|設備狀態:" + devwork.dwDeviceStatic);// 0正常,1CPU占用率過高,2硬件錯誤,3未知 //System.out.println("ChanNum"+devinfo.byChanNum); // 顯示模擬通道 for (int i = 0; i < devinfo.byChanNum; i++) { System.out.print("Camera" + i + 1);// 模擬通道號名稱 System.out.print("|是否錄像:" + devwork.struChanStatic[i].byRecordStatic);// 0不錄像,不錄像 System.out.print("|信號狀態:" + devwork.struChanStatic[i].bySignalStatic);// 0正常,1信號丟失 System.out.println("|硬件狀態:" + devwork.struChanStatic[i].byHardwareStatic);// 0正常,1異常 } //注銷用戶 sdk.NET_DVR_Logout(cameraInfo.getUserId());//釋放SDK資源 sdk.NET_DVR_Cleanup(); } //抓拍圖片 public void getDVRPic(MonitorCameraInfo cameraInfo) throws IOException { //設置通道號,其中1正常,-1不正常 NativeLong chanLong = new NativeLong(1); cameraInfo.setChannel(chanLong); //System.out.println("Channel:"+chanLong); long startTime = System.currentTimeMillis(); HCNetSDK sdk = HCNetSDK.INSTANCE; if (!sdk.NET_DVR_Init()) { System.out.println("SDK初始化失敗"); return; } NET_DVR_DEVICEINFO_V30 devinfo = new NET_DVR_DEVICEINFO_V30();// 設備信息 //注冊設備 NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getCameraIp(), (short) cameraInfo.getCameraPort(), cameraInfo.getUserName(), cameraInfo.getUserPwd(), devinfo); cameraInfo.setUserId(id);// 返回一個用戶編號,同時將設備信息寫入devinfo if (cameraInfo.getUserId().intValue() < 0) { System.out.println("設備注冊失敗"+sdk.NET_DVR_GetLastError()); return; } else { System.out.println("id:" + cameraInfo.getUserId().intValue()); } NET_DVR_WORKSTATE_V30 devwork = new NET_DVR_WORKSTATE_V30(); if (!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devwork)) { // 返回Boolean值,判斷是否獲取設備能力 System.out.println("返回設備狀態失敗"); } //System.out.println("設備注冊耗時:[" + (System.currentTimeMillis() - startTime) + "]"); startTime = System.currentTimeMillis(); //圖片質量 NET_DVR_JPEGPARA jpeg = new NET_DVR_JPEGPARA(); // 設置圖片的分辨率 jpeg.wPicSize = 2; // 設置圖片質量 jpeg.wPicQuality = 2; IntByReference a = new IntByReference(); //設置圖片大小 ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024); // 創建文件目錄和文件 SimpleDateFormat sd = new SimpleDateFormat("yyyyMMdd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = new Date(); //按照每天設置一個目錄 String fileName = "D:/CapturePicture/" + sd.format(date); File files = new File(fileName); if(!files.exists()){ files.mkdirs(); } //按照日期文件夾放入圖片 String fileNameString = fileName+"/"+sdf.format(date)+".jpg"; System.out.println("抓拍圖片存儲路徑:" + fileNameString); File file = new File(fileNameString); // 抓圖到內存,單幀數據捕獲並保存成JPEG存放在指定的內存空間中 //需要加入通道 boolean is = sdk.NET_DVR_CaptureJPEGPicture_NEW(cameraInfo.getUserId(), cameraInfo.getChannel(), jpeg, jpegBuffer, 1024 * 1024, a); //System.out.println("Channel:"+cameraInfo.getChannel()); System.out.println("抓圖到內存耗時:[" + (System.currentTimeMillis() - startTime) + "ms]"); // 抓圖到文件 //boolean is = sdk.NET_DVR_CaptureJPEGPicture(cameraInfo.UserId,cameraInfo.Channel,jpeg, fileNameString); if (is) { System.out.println("抓取成功,返回長度:" + a.getValue()); } else { System.out.println("抓取失敗:"+sdk.NET_DVR_GetLastError()); } //startTime = System.currentTimeMillis(); // 存儲本地,寫入內容 BufferedOutputStream outputStream = null; try { outputStream = new BufferedOutputStream(new FileOutputStream(file)); outputStream.write(jpegBuffer.array(), 0, a.getValue()); outputStream.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("存儲本地耗時:[" + (System.currentTimeMillis() - startTime) + "ms]"); sdk.NET_DVR_Logout(cameraInfo.getUserId()); sdk.NET_DVR_Cleanup(); } }
import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; /** * 創建調度任務並執行 * */ public class MainScheduler { @SuppressWarnings("unused") public static void main(String[] args) throws Exception { MainScheduler mainScheduler = new MainScheduler(); MainScheduler.schedulerJob(); } //創建調度器 public static Scheduler getScheduler() throws Exception{ SchedulerFactory schedulerFactory = new StdSchedulerFactory(); return schedulerFactory.getScheduler(); } public static void schedulerJob() throws Exception{ //創建任務 JobDetail jobDetail = JobBuilder.newJob(TestQuartz.class).withIdentity("job1", "group1").build(); //創建觸發器,每5s執行一次,如果是分鍾,則把withIntervalInSeconds(intervalInSeconds)改成withIntervalInMinutes(intervalInMinutes) Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group3").withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build(); Scheduler scheduler = getScheduler(); //將任務及其觸發器放入調度器 scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } }
log4j.properties 文件: log4j.rootLogger=CONSOLE,FILE log4j.addivity.org.apache=true # \u5E94\u7528\u4E8E\u63A7\u5236\u53F0 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=INFO log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.Encoding=GBK log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # \u6BCF\u5929\u65B0\u5EFA\u65E5\u5FD7 log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=D:/log4j/log log4j.appender.A1.Encoding=GBK log4j.appender.A1.Threshold=DEBUG log4j.appender.A1.DatePattern='.'yyyy-MM-dd log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n #\u5E94\u7528\u4E8E\u6587\u4EF6 log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=D:/log4j/file.log log4j.appender.FILE.Append=false log4j.appender.FILE.Encoding=GBK log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # \u5E94\u7528\u4E8E\u6587\u4EF6\u56DE\u6EDA log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.CONSOLE_FILE.Encoding=GBK log4j.appender.ROLLING_FILE.MaxFileSize=10KB log4j.appender.ROLLING_FILE.MaxBackupIndex=1 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #\u81EA\u5B9A\u4E49Appender log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender log4j.appender.im.host = mail.cybercorlin.net log4j.appender.im.username = username log4j.appender.im.password = password log4j.appender.im.recipient = yyflyons@163.com log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #\u5E94\u7528\u4E8Esocket log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n # Log Factor 5 Appender log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 # \u53D1\u9001\u65E5\u5FD7\u7ED9\u90AE\u4EF6 log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From=yyflyons@163.com log4j.appender.MAIL.SMTPHost=www.wusetu.com log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=yyflyons@126.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n