package com.netsdk.demo.customize; import java.io.File; import java.util.Arrays; import java.util.Scanner; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib.LLong; import com.netsdk.lib.NetSDKLib.NET_IN_ATTACH_STATE; import com.netsdk.lib.NetSDKLib.NET_OUT_ATTACH_STATE; import com.netsdk.lib.NetSDKLib.NET_OUT_BURN_GET_STATE; import com.netsdk.lib.ToolKits; import com.netsdk.lib.NetSDKLib.*; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; // 刻录 public class Burner { static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; //////////////////////////////////////////////////////////////// String m_strIp ="172.10.1.240";// "172.11.1.17"; int m_nPort = 37777; String m_strUser = "admin"; String m_strPassword = "admin123";//"admin123"; //////////////////////////////////////////////////////////////// private String burnerName = "/dev/sg1"; private NetSDKLib.NET_DEVICEINFO_Ex deviceinfo = new NetSDKLib.NET_DEVICEINFO_Ex(); private static LLong loginHandle = new LLong(0); //登陆句柄 private static LLong lBurnSession = new LLong(0); private static LLong lAttachBurnStateHandle = new LLong(0); private volatile static boolean m_bNeetStop = false; //附件刻录下载完成标志 // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数 public static class fDisConnectCB implements NetSDKLib.fDisConnect{ public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){ System.out.printf("Device[%s] Port[%d] Disconnect!\n" , pchDVRIP , nDVRPort); } } // 网络连接恢复,设备重连成功回调 // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数 public static class HaveReConnect implements NetSDKLib.fHaveReConnect { public void invoke(LLong loginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); } } private static fDisConnectCB m_DisConnectCB = new fDisConnectCB(); private static HaveReConnect haveReConnect = new HaveReConnect(); public void EndTest() { System.out.println("End Test"); if( loginHandle.longValue() != 0) { netsdkApi.CLIENT_Logout(loginHandle); StopBurn(); } System.out.println("See You..."); netsdkApi.CLIENT_Cleanup(); System.exit(0); } public void InitTest() { // 初始化SDK库, 在启动工程的时候调用,只需要调用一次即可,属于初始化sdk的库 netsdkApi.CLIENT_Init(m_DisConnectCB, null); // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作 // 此操作为可选操作,但建议用户进行设置 netsdkApi.CLIENT_SetAutoReconnect(haveReConnect, null); //设置登录超时时间和尝试次数,可选 int waitTime = 5000; //登录请求响应超时时间设置为5S int tryTimes = 3; //登录时尝试建立链接3次 netsdkApi.CLIENT_SetConnectTime(waitTime, tryTimes); // 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime // 接口设置的登录设备超时时间和尝试次数意义相同,可选 NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM(); netParam.nConnectTime = 10000; //登录时尝试建立链接的超时时间 netsdkApi.CLIENT_SetNetworkParam(netParam); // 打开日志,可选 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); File path = new File("."); String logPath = path.getAbsoluteFile().getParent() + "\\sdk_log\\" + System.currentTimeMillis() + ".log"; setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); setLog.bSetPrintStrategy = 1; setLog.nPrintStrategy = 0; boolean bLogopen = netsdkApi.CLIENT_LogOpen(setLog); if (!bLogopen) { System.err.println("Failed to open NetSDK log !!!"); } // 向设备登入 int nSpecCap = 0; Pointer pCapParam = null; IntByReference nError = new IntByReference(0); loginHandle = netsdkApi.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser , m_strPassword ,nSpecCap,pCapParam, deviceinfo,nError); if(loginHandle.longValue() != 0) { System.out.printf("Login Device[%s] Port[%d]Success!\n" , m_strIp , m_nPort); System.out.println("通道号个数:"+deviceinfo.byChanNum); } else { System.out.printf("Login Device[%s] Port[%d]Fail. %s\n" , m_strIp , m_nPort , ToolKits.getErrorCode()); EndTest(); } } /** * 查询刻录机信息 */ public void QueryBurnDevice() { NET_BURNING_DEVINFO burnDevInfo = new NET_BURNING_DEVINFO(); IntByReference retLen = new IntByReference(0); burnDevInfo.write(); if (!netsdkApi.CLIENT_QueryDevState(loginHandle, NetSDKLib.NET_DEVSTATE_BURNING_DEV, burnDevInfo.getPointer(), burnDevInfo.size(), retLen, 3000)) { System.err.println("查询刻录机信息失败, " + ToolKits.getErrorCode()); return; } burnDevInfo.read(); PrintStruct.print(burnDevInfo); } /** * 弹出刻录机光驱门 */ /*public void EjectBurner() { NET_CTRL_BURNERDOOR ctrlBurn = new NET_CTRL_BURNERDOOR(); ctrlBurn.szBurnerName = new Memory(NetSDKLib.NET_BURNING_DEV_NAMELEN); ctrlBurn.szBurnerName.write(0, burnerName.getBytes(), 0, burnerName.getBytes().length); // ctrlBurn.bSafeEject = 1; ctrlBurn.write(); if (netsdkApi.CLIENT_ControlDevice(loginHandle, NetSDKLib.CtrlType.CTRLTYPE_CTRL_EJECT_BURNER, ctrlBurn.getPointer(), 3000)) { System.out.println("弹出刻录机光驱门成功!"); }else { System.err.println("弹出刻录机光驱门失败!" + ToolKits.getErrorCode()); } } /** * 关闭刻录机光驱门 */ /*public void CloseBurner() { NET_CTRL_BURNERDOOR ctrlBurn = new NET_CTRL_BURNERDOOR(); ctrlBurn.szBurnerName = new Memory(NetSDKLib.NET_BURNING_DEV_NAMELEN); ctrlBurn.szBurnerName.write(0, burnerName.getBytes(), 0, burnerName.getBytes().length); ctrlBurn.write(); if (netsdkApi.CLIENT_ControlDevice(loginHandle, NetSDKLib.CtrlType.CTRLTYPE_CTRL_CLOSE_BURNER, ctrlBurn.getPointer(), 3000)) { System.out.println("关闭刻录机光驱门成功!"); }else { System.err.println("关闭刻录机光驱门失败!" + ToolKits.getErrorCode()); } }*/ /** * 打开刻录会话 */ public boolean StartBurnSession() { if (lBurnSession.longValue() != 0) { return true; } NET_IN_START_BURN_SESSION stuInParam = new NET_IN_START_BURN_SESSION(); NET_OUT_START_BURN_SESSION stuOutParam = new NET_OUT_START_BURN_SESSION(); stuInParam.nSessionID = 0; lBurnSession = netsdkApi.CLIENT_StartBurnSession(loginHandle, stuInParam, stuOutParam, 3000); if(lBurnSession.longValue() != 0) { System.out.println("打开刻录会话成功!"); } else { System.err.println("打开刻录会话失败, " + ToolKits.getErrorCode()); return false; } return true; } /** * 关闭刻录会话 */ public void StopBurnSession() { if (lBurnSession.longValue() != 0) { netsdkApi.CLIENT_StopBurnSession(lBurnSession); } } // 画中画通道号最大值 int allchannel; /** * 开始刻录 */ public void StartBurn() { //使能下发 System.out.println("num: "+allchannel); String command = NetSDKLib.CFG_CMD_JUDICATURE; int channel = -1; CFG_JUDICATURE_INFO[] stuCfg = new CFG_JUDICATURE_INFO[allchannel+1]; for (int i = 0; i < stuCfg.length; ++i) { stuCfg[i] = new CFG_JUDICATURE_INFO(); } int flg = ToolKits.GetDevConfig(loginHandle, channel, command, stuCfg); System.out.println("个数:"+flg); for (int i = 0; i < stuCfg.length; i++) { stuCfg[i].bAttachFileEn=0; } if(ToolKits.SetDevConfig(loginHandle, channel, command, stuCfg)) { System.out.println("设置使能成功"); }else{ System.err.println("设置使能失败, " + ToolKits.getErrorCode()); }; if (!StartBurnSession()) { return; } NET_IN_START_BURN stuInParam = new NET_IN_START_BURN(); NET_OUT_START_BURN stuOutParam = new NET_OUT_START_BURN(); stuInParam.dwDevMask = 1; // 刻录设备掩码, 按位表示多个刻录设备组合 stuInParam.emMode = NET_BURN_MODE.BURN_MODE_SYNC; // 刻录模式 stuInParam.emPack = NET_BURN_RECORD_PACK.BURN_PACK_MP4; // 刻录流格式 stuInParam.nChannelCount = 1; // 刻录通道信息 stuInParam.nChannels[0] = 0; // 刻录通道 stuInParam.emExtMode = 1; // 额外刻录模式 if (netsdkApi.CLIENT_StartBurn(lBurnSession, stuInParam, stuOutParam, 30000)) { System.out.println("开始刻录成功!"); } else { System.err.println("开始刻录失败, " + ToolKits.getErrorCode()); } } // 打开刻录会话, 返回刻录会话句柄,pstInParam与pstOutParam内存由用户申请释放 // CLIENT_NET_API LLONG CALL_METHOD CLIENT_StartBurnSession(LLONG lLoginID, const NET_IN_START_BURN_SESSION* pstInParam, NET_OUT_START_BURN_SESSION *pstOutParam, int nWaitTime); /** * 监听刻录状态 */ public void AttachBurnState() { if (lBurnSession.longValue() == 0 || lAttachBurnStateHandle.longValue() != 0) { return; } NET_IN_ATTACH_STATE stIn = new NET_IN_ATTACH_STATE(); stIn.szDeviceName = new Memory(NetSDKLib.NET_BURNING_DEV_NAMELEN); stIn.szDeviceName.write(0, burnerName.getBytes(), 0, burnerName.getBytes().length); stIn.cbAttachStateEx = AttachBurnStateCB.getInstance(); // 回调函数 stIn.lBurnSession = lBurnSession; NET_OUT_ATTACH_STATE stOut = new NET_OUT_ATTACH_STATE(); lAttachBurnStateHandle = netsdkApi.CLIENT_AttachBurnState(loginHandle, stIn, stOut, 3000); if(lAttachBurnStateHandle.longValue() != 0) { System.out.println("监听刻录状态成功!"); } else { System.err.println("监听刻录状态失败, " + ToolKits.getErrorCode()); } } /** * 监听刻录状态回调 */ private static class AttachBurnStateCB implements fAttachBurnStateCBEx { private AttachBurnStateCB() {} private static class AttachBurnStateCBHolder { private static AttachBurnStateCB instance = new AttachBurnStateCB(); } public static AttachBurnStateCB getInstance() { return AttachBurnStateCBHolder.instance; } @Override public void invoke(LLong lLoginID, LLong lAttachHandle, NET_OUT_BURN_GET_STATE pBuf, int nBufLen, Pointer dwUser) { System.out.println("监听到刻录状态: " + pBuf.emState); // 参见NET_BURN_STATE } } /** * 刻录进度回调 */ private static class BurnFileCB implements fBurnFileCallBack { private BurnFileCB() {} private static class BurnFileCBHolder { private static BurnFileCB instance = new BurnFileCB(); } public static BurnFileCB getInstance() { return BurnFileCBHolder.instance; } @Override public void invoke(LLong lLoginID, LLong lUploadHandle, int nTotalSize, int nSendSize, Pointer dwUser){ if (lUploadHandle.intValue() ==0 || lLoginID.intValue() == 0){ System.out.println((lUploadHandle.intValue() ==0) +" "+(lLoginID.intValue() == 0) +" finished"); m_bNeetStop=true; } if (nTotalSize == nSendSize){ System.out.println("finished"); m_bNeetStop=true; } double percent=((double)nSendSize/(double)nTotalSize)*100; double frac=percent-Math.floor(percent); //小数部分 percent=Math.floor(percent); if(1-frac<10e-2){ percent+=1; frac=1-frac; } //上传进度 if(frac<10e-2) System.out.println("Send: "+(double)nSendSize+"\tTotal: "+(double)nTotalSize +"\t\t"+"Upload progress: "+(int)percent+"%"); // if(nSendSize==-2){ // System.out.println("上传失败,上传需要先开始刻录(并最好稍作等待)"); // m_bNeetStop=true; // } } } /** * 取消监听刻录状态 */ public void DetachBurnState() { if(lAttachBurnStateHandle.longValue() != 0) { netsdkApi.CLIENT_DetachBurnState(lAttachBurnStateHandle); lAttachBurnStateHandle.setValue(0); } } /** * 获取刻录状态 */ public void BurnGetState() { NET_IN_BURN_GET_STATE stIn = new NET_IN_BURN_GET_STATE(); NET_OUT_BURN_GET_STATE stOut = new NET_OUT_BURN_GET_STATE(); if(netsdkApi.CLIENT_BurnGetState(lBurnSession, stIn, stOut, 3000)) { PrintStruct.print(stOut); } else { System.err.println("获取刻录状态失败!" + ToolKits.getErrorCode()); } } /** * 暂停刻录 */ public void PauseBurn() { if (lBurnSession.longValue() == 0) { System.err.println("请先开始刻录"); return; } if (netsdkApi.CLIENT_PauseBurn(lBurnSession, 1)) { System.out.println("暂停刻录成功!"); } else { System.err.println("暂停刻录失败, " + ToolKits.getErrorCode()); } } /** * 恢复刻录 */ public void ResumeBurn() { if (lBurnSession.longValue() == 0) { System.err.println("请先开始刻录"); return; } if (netsdkApi.CLIENT_PauseBurn(lBurnSession, 0)) { System.out.println("恢复刻录成功!"); } else { System.err.println("恢复刻录失败, " + ToolKits.getErrorCode()); } } /** * 停止刻录 */ public void StopBurn() { if (lBurnSession.longValue() != 0) { netsdkApi.CLIENT_StopBurn(lBurnSession); StopBurnSession(); } } /** * 查询画中画通道信息 */ public void QueryPicInPic() { IntByReference retLen = new IntByReference(0); int nSize = 4 * 1024; Pointer p = new Memory(nSize); p.clear(nSize); if (!netsdkApi.CLIENT_QueryDevState(loginHandle, NetSDKLib.NET_DEVSTATE_PICINPIC_CHN, p, nSize, retLen, 3000)) { System.err.println("查询画中画通道信息失败, " + ToolKits.getErrorCode()); return; } int nNum = retLen.getValue()/4; System.out.println("画中画通道个数: " + nNum); int[] channels = new int[nNum]; p.read(0, channels, 0, nNum); if(nNum>0) { for (int c : channels) { System.out.println(c); } Arrays.parallelSort(channels); allchannel = channels[channels.length-1]; } } /** * 查询设备在线状态 */ public void QueryOnlineState() { IntByReference retLen = new IntByReference(0); Pointer p = new Memory(Integer.SIZE); p.clear(Integer.SIZE); if (!netsdkApi.CLIENT_QueryDevState(loginHandle, NetSDKLib.NET_DEVSTATE_ONLINE, p, Integer.SIZE, retLen, 3000)) { System.err.println("查询设备在线状态失败, " + ToolKits.getErrorCode()); return; } int []a = new int[1]; p.read(0, a, 0, 1); System.out.println(a[0]); } /** * 刻录配置 */ public void SetJudicature() { String command = NetSDKLib.CFG_CMD_JUDICATURE; int channel = 0; CFG_JUDICATURE_INFO stuCfg = new CFG_JUDICATURE_INFO(); // 获取 if(ToolKits.GetDevConfig(loginHandle, channel, command, stuCfg)) { System.out.println("案件编号叠加使能 : " + stuCfg.bCaseNoOsdEn); if (stuCfg.bCaseNoOsdEn == 1) { System.out.println("案件编号 :" + new String(stuCfg.szCaseNo).trim()); } // 设置,在获取的基础上设置 stuCfg.bCaseNoOsdEn = 1; // 案件编号叠加使能 String caseNo = "AJBH001"; // 案件编号 System.arraycopy(caseNo.getBytes(), 0, stuCfg.szCaseNo, 0, caseNo.getBytes().length); if(ToolKits.SetDevConfig(loginHandle, channel, command, stuCfg)) { System.out.println("设置刻录配置成功!"); } else { System.err.println("设置刻录配置失败!" + ToolKits.getErrorCode()); } } else { System.err.println("设置刻录配置失败!" + ToolKits.getErrorCode()); } } /** * 刻录密码修改 */ public void SetJudicatureSecret() { String command = NetSDKLib.CFG_CMD_JUDICATURE; int channel = 0; CFG_JUDICATURE_INFO stuCfg = new CFG_JUDICATURE_INFO(); // 获取 if(ToolKits.GetDevConfig(loginHandle, channel, command, stuCfg)) { System.out.println("愿密码:"+new String(stuCfg.szPassword).trim()); System.out.println("愿密码长度:"+stuCfg.nPasswordLen); System.out.println("请输入新密码(支持数字和英文字母):"); Scanner read=new Scanner(System.in); byte[] newPwd=read.next().getBytes(); int newlen=newPwd.length; // stuCfg.szPassword=newPwd; stuCfg.nPasswordLen=newlen; System.arraycopy(newPwd, 0, stuCfg.szPassword, 0, newlen); if(ToolKits.SetDevConfig(loginHandle, channel, command, stuCfg)) { System.out.println("修改刻录密码成功!"); } else { System.err.println("修改刻录密码失败!" + ToolKits.getErrorCode()); } } else { System.err.println("修改刻录密码失败!" + ToolKits.getErrorCode()); } } //附件刻录 public void UploadFileBurned(){ //使能下发 String command = NetSDKLib.CFG_CMD_JUDICATURE; int channel = 0; CFG_JUDICATURE_INFO stuCfg = new CFG_JUDICATURE_INFO(); if(ToolKits.GetDevConfig(loginHandle, channel, command, stuCfg)) { // System.out.println("原使能:"+stuCfg.bAttachFileEn); stuCfg.bAttachFileEn=1; // System.out.println("新使能:"+stuCfg.bAttachFileEn); if(ToolKits.SetDevConfig(loginHandle, channel, command, stuCfg)) System.out.println("下发使能成功!"); else System.err.println("下发使能失败!" + ToolKits.getErrorCode()); } else { System.err.println("下发使能失败!" + ToolKits.getErrorCode()); } NET_IN_FILEBURNED_START stIn = new NET_IN_FILEBURNED_START(); Scanner read=new Scanner(System.in); System.out.println("请输入要刻录的文件名:"); //即要上传的附件 String szFilename=read.next(); stIn.szFilename = new Memory(128); //文件名 char[128] stIn.szFilename.write(0, szFilename.getBytes(), 0, szFilename.getBytes().length); //szMode System.out.println("请选择上传方式:\n" + "1.append, 追加模式,此时刻录文件名固定为 FILE.zip ,filename被忽\n" + "2.evidence, 证据等大附件, 要求单独刻录的光盘内"); String szMode=read.nextInt()==1?"append":"evidence"; stIn.szMode = new Memory(16); stIn.szMode.write(0, szMode.getBytes(), 0, szMode.getBytes().length); // read.close(); 不可关闭,否则会退出main方法 stIn.szDeviceName = new Memory(NetSDKLib.NET_BURNING_DEV_NAMELEN); stIn.szDeviceName.write(0, burnerName.getBytes(), 0, burnerName.getBytes().length); // stIn.dwUser=null; stIn.cbBurnPos = BurnFileCB.getInstance(); if (!StartBurnSession()) { System.err.println("open lBurnSession Error"); return; } stIn.lBurnSession = lBurnSession; NET_OUT_FILEBURNED_START stOut = new NET_OUT_FILEBURNED_START(); //开始刻录附件上传 LLong lStartUploadFileBurnedHandle=netsdkApi.CLIENT_StartUploadFileBurned(loginHandle, stIn, stOut, 3000); if(0 == lStartUploadFileBurnedHandle.intValue()){ System.err.println("开始刻录附件上传失败, " + ToolKits.getErrorCode()); return ; } //刻录上传附件 boolean bRet = netsdkApi.CLIENT_SendFileBurned(lStartUploadFileBurnedHandle); if(! bRet){ System.err.println("上传刻录附件失败, " + ToolKits.getErrorCode()); return ; } else System.out.println("上传刻录附件成功, "); //刻录附件上传停止 while(!m_bNeetStop); bRet = netsdkApi.CLIENT_StopUploadFileBurned(lStartUploadFileBurnedHandle); if (bRet != true) System.err.println("刻录附件上传停止失败, " + ToolKits.getErrorCode()); else System.out.println("刻录附件上传停止成功"); } public void RunTest() { System.out.println("Run Test"); CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this , "查询刻录机信息" , "QueryBurnDevice")); // menu.addItem(new CaseMenu.Item(this , "弹出刻录机光驱门" , "EjectBurner")); // 设备暂不支持 // menu.addItem(new CaseMenu.Item(this , "关闭刻录机光驱门" , "CloseBurner")); menu.addItem(new CaseMenu.Item(this , "开始刻录" , "StartBurn")); menu.addItem(new CaseMenu.Item(this , "监听刻录状态" , "AttachBurnState")); menu.addItem(new CaseMenu.Item(this , "取消监听刻录状态" , "DetachBurnState")); menu.addItem(new CaseMenu.Item(this , "获取刻录状态" , "BurnGetState")); menu.addItem(new CaseMenu.Item(this , "暂停刻录" , "PauseBurn")); menu.addItem(new CaseMenu.Item(this , "恢复刻录" , "ResumeBurn")); menu.addItem(new CaseMenu.Item(this , "停止刻录" , "StopBurn")); menu.addItem(new CaseMenu.Item(this , "查询画中画通道" , "QueryPicInPic")); menu.addItem(new CaseMenu.Item(this , "查询设备在线状态" , "QueryOnlineState")); menu.addItem(new CaseMenu.Item(this , "刻录配置" , "SetJudicature")); menu.addItem(new CaseMenu.Item(this , "刻录密码修改" , "SetJudicatureSecret")); menu.addItem(new CaseMenu.Item(this , "附件刻录" , "UploadFileBurned")); // menu.addItem(new CaseMenu.Item(this , "打开刻录会话" , "StartBurnSession")); // menu.addItem(new CaseMenu.Item(this , "关闭刻录会话" , "StopBurnSession")); menu.run(); } public static void main(String[]args) { Burner demo = new Burner(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } }