package com.sandu.ximon.admin.newnova.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.sandu.common.execption.BusinessException; import com.sandu.common.util.SpringContextHolder; import com.sandu.ximon.admin.newnova.conf.FilePathConfig; import com.sandu.ximon.admin.newnova.param.NewNovaStatusParam; import com.sandu.ximon.admin.newnova.param.ProgramPrarm; import com.sandu.ximon.admin.newnova.vo.*; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.dao.bo.NewNovaInfoBo; import com.sandu.ximon.dao.domain.NewNovaLed; import com.sun.jna.Native; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** * @author LiuHaoNan * @date 2022/11/9 */ public class NovaAPIUtil { private FilePathConfig filePathConfig; private Map loginSn = new HashMap(); private ViplexCore instance = null; private static NovaAPIUtil instanceUtil = null; private static String loginInfo = null; private NovaAPIUtil() { filePathConfig = SpringContextHolder.getBean(FilePathConfig.class); String rootDir = filePathConfig.getOutPutPath(); instance = (ViplexCore) Native.loadLibrary(filePathConfig.getStringPath(), ViplexCore.class); System.setProperty("jna.encoding", "UTF-8"); System.out.println("保存路径:" + rootDir); rootDir = rootDir.replaceAll("\\\\", "/"); String companyInfo = "{\"company\":\"NovaStar\",\"phone\":\"029-68216000\",\"email\":\"hr@novastar.tech\"}"; instance.nvSetDevLang("Java"); System.out.println("nvInit(sdk 初始化):"); System.out.println(instance.nvInit(rootDir, companyInfo)); // login("MZVA51930N2113017308");//todo 手动登录还是自动登录 } public static NovaAPIUtil getInstanceUtil() { if (instanceUtil == null) { synchronized (NovaAPIUtil.class) { if (instanceUtil == null) { instanceUtil = new NovaAPIUtil(); } } } return instanceUtil; } /** * 登录 */ public StatusVO login(String sn) { StatusVO searchVO = new StatusVO(); System.out.println("ViplexCore Demo nvSearchTerminalAsync(搜索) begin... "); CountDownLatch countDownLatch1 = new CountDownLatch(1); instance.nvSearchTerminalAsync(new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { searchVO.setStatusCode(code); searchVO.setStatusData(data); loginInfo = data; System.out.println("\nViplexCore 搜索 code:" + code); System.out.println("\nViplexCore 搜索 data:" + data); countDownLatch1.countDown(); } }); try { countDownLatch1.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } if (loginSn.get(sn) != null && loginSn.get(sn)) { return new StatusVO(0); } if (!loginInfo.contains(String.format("\"sn\":\"%s\",", sn))) { //未搜索到屏幕 登录不成功 return new StatusVO(10086); } StatusVO statusVO = new StatusVO(); System.out.println("ViplexCore Demo nvLoginAsync(登录) begin... "); String loginParam = String.format("{\"sn\":\"%s\",\"username\":\"admin\",\"rememberPwd\":0,\"password\":\"123456\",\"loginType\":0}", sn); CountDownLatch countDownLatch2 = new CountDownLatch(1); instance.nvLoginAsync(loginParam, new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { statusVO.setStatusCode(code); statusVO.setStatusData(data); System.out.println("\nViplexCore Demo code:" + code); System.out.println("\nViplexCore Demo data:" + data); countDownLatch2.countDown(); } }); try { countDownLatch2.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } if (statusVO.getStatusCode() != 0) { System.out.println("ViplexCore " + sn + " nvLoginAsync(登录) 失败!"); System.out.println("错误码:" + statusVO.getStatusCode()); } else { //登陆成功之后存入map保存登录信息 loginSn.put(sn, true); } return statusVO; } /** * 创建节目 */ public StatusVO createPro(ProWHVO proWHVO) throws InterruptedException { String createProgram = JSON.toJSONString(proWHVO); System.out.println("ViplexCore Demo nvCreateProgramAsync(创建节目) begin... "); StatusVO statusVO = new StatusVO(); CountDownLatch countDownLatch = new CountDownLatch(1); try { instance.nvCreateProgramAsync(createProgram, new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { statusVO.setStatusCode(code); statusVO.setStatusData(data); System.out.println("\nViplexCore 创建节目 code:" + code); System.out.println("\nViplexCore 创建节目 data:" + data); if (code == 0) { JSONObject result = JSON.parseObject(data); //创建节目成功 设置状态信息为节目id statusVO.setStatusData(String.valueOf(result.getJSONObject("onSuccess").getIntValue("programID"))); } countDownLatch.countDown(); } }); countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (Exception e) { } return statusVO; } /** * 编辑节目 * * @param pid * @param pageInfo * @return */ public StatusVO editProgram(int pid, Map pageInfo) { ProgramInfoVO programInfoVO = new ProgramInfoVO(); programInfoVO.setProgramID(pid); programInfoVO.setPageInfo(pageInfo); System.out.println("ViplexCore Demo nvSetPageProgramAsync(编辑节目) begin... "); StatusVO statusVO = new StatusVO(); CountDownLatch countDownLatch = new CountDownLatch(1); instance.nvSetPageProgramAsync(JSON.toJSONString(programInfoVO), new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { statusVO.setStatusCode(code); statusVO.setStatusData(data); System.out.println("\nViplexCore 编辑节目 code:" + code); System.out.println("\nViplexCore 编辑节目 data:" + data); countDownLatch.countDown(); } }); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } return statusVO; } /** * 生成节目 * * @param pid * @return */ public StatusVO genrateProgram(int pid) { ProGenrateVO proGenrateVO = new ProGenrateVO(); proGenrateVO.setProgramID(pid); proGenrateVO.setOutPutPath(filePathConfig.getOutPutPath()); System.out.println("ViplexCore Demo nvMakeProgramAsync(生成节目) begin... "); StatusVO statusVO = new StatusVO(); CountDownLatch countDownLatch = new CountDownLatch(1); instance.nvMakeProgramAsync(JSON.toJSONString(proGenrateVO), new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { statusVO.setStatusCode(code); statusVO.setStatusData(data); System.out.println("\nViplexCore 生成节目 code:" + code); System.out.println("\nViplexCore 生成节目 data:" + data); countDownLatch.countDown(); } }); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } return statusVO; } /** * 发布节目 * * @param * @return */ public List trasfromProgram(ProgramPrarm pageInfo) { TransfromProgramVO transfromProgramVO = new TransfromProgramVO(); transfromProgramVO.setProgramName("节目01"); //设置节目内容 TransfromProgramVO.SendProgramFilePathsDTO sendProgramFilePaths = new TransfromProgramVO.SendProgramFilePathsDTO(); //节目 sendProgramFilePaths.setProgramPath(filePathConfig.getOutPutPath() + "/program" + pageInfo.getProgramID()); //文件 Map mediasPath = new HashMap(); mediasPath.put("C:/Users/Administrator/Desktop/novaWin/demo/java/test.png", "test.png"); sendProgramFilePaths.setMediasPath(mediasPath); transfromProgramVO.setSendProgramFilePaths(sendProgramFilePaths); //节目标识 transfromProgramVO.setDeviceIdentifier(SecurityUtils.getUserId().toString()); transfromProgramVO.setInsertPlay(pageInfo.getInsertPlay()); transfromProgramVO.setStartPlayAfterTransferred(pageInfo.getStartPlayAfterTransferred()); List svoList = new ArrayList<>(); System.out.println("ViplexCore Demo nvStartTransferProgramAsync(发送节目) begin... "); // System.out.println(trasfromProgram); // instance.nvStartTransferProgramAsync(trasfromProgram, callBack); // String trasfromProgram = String.format( // "{\"sn\": \"%s\",\"iconPath\": \"\",\"iconName\": \"\",\"sendProgramFilePaths\": {\"programPath\": \"%s/program13\",\"mediasPath\": {\"C:/Users/Administrator/Desktop/novaWin/demo/java/test.png\": \"test.png\"}},\"programName\": \"jiemu1\",\"deviceIdentifier\": \"Demo\",\"startPlayAfterTransferred\": true,\"insertPlay\": true}", // g_sn, // rootDir); pageInfo.getSnList().forEach(sn -> { CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { if (transfromProgramVO == null) { return; } transfromProgramVO.setSn(sn); System.out.println(transfromProgramVO); //推送结果 TrasfromStatusVO trasfromStatusVO = new TrasfromStatusVO(); trasfromStatusVO.setSn(sn); instance.nvStartTransferProgramAsync(JSON.toJSONString(transfromProgramVO), new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { trasfromStatusVO.setStatusCode(code); trasfromStatusVO.setStatusData(data); System.out.println("\nViplexCore 发送节目 code:" + code); System.out.println("\nViplexCore 发送节目 data:" + data); //节目发布成功 if (trasfromStatusVO.getStatusCode() == 0) { countDownLatch.countDown(); svoList.add(trasfromStatusVO); } else if (trasfromStatusVO.getStatusCode() != 65362) { //上传失败 System.out.println("上传失败"); svoList.add(trasfromStatusVO); countDownLatch.countDown(); } } }); } }).start(); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } }); return svoList; } /** * 查询在线状态 * * @return */ public List getOnlineStatus(List newNovaListBos) { //设置开关屏状态 newNovaListBos.forEach(led -> { //获取信息之前先登录 CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { StatusVO login = login(led.getSn()); if (login.getStatusCode() == 0) { //登陆成功 设置为在线 led.setIsOnline(1); led.setOnlineSign(1); } else { led.setIsOnline(0); } countDownLatch.countDown(); } }).start(); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } }); return newNovaListBos; } /** * 查询屏幕基本信息 */ public NewNovaLed getInfo(NewNovaLed led) { System.out.println("ViplexCore Demo nvGetProductInfoAsync(获取屏幕信息) begin... "); StatusVO login = login(led.getSn()); StatusVO result = new StatusVO(); if (login.getStatusCode() == 0) { CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { //推送结果 TrasfromStatusVO trasfromStatusVO = new TrasfromStatusVO(); trasfromStatusVO.setSn(led.getSn()); instance.nvGetProductInfoAsync("{\n" + " \"sn\":\"" + led.getSn() + "\"\n" + "}", new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { result.setStatusCode(code); result.setStatusData(data); System.out.println("\nViplexCore 获取屏幕信息 code:" + code); System.out.println("\nViplexCore 获取屏幕信息 data:" + data); countDownLatch.countDown(); } }); } }).start(); try { countDownLatch.await(30000, TimeUnit.MICROSECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } } else { throw new BusinessException("设备登录失败,经检查设备是否连接"); } NewNovaInfoBo newNovaInfoBo = JSON.parseObject(result.getStatusData(), NewNovaInfoBo.class); led.setInfo(newNovaInfoBo); System.out.println(JSON.toJSONString(led.getInfo()) + "--------"); return led; } /** * 获取开关屏状态 */ public List getScreenPowerState(List newNovaLsit) { System.out.println("ViplexCore Demo nvGetScreenPowerStateAsync(获取屏幕开关) begin... "); newNovaLsit.forEach(newNova -> { CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { //推送结果 instance.nvGetScreenPowerStateAsync("{\n" + " \"sn\":\"" + newNova.getSn() + "\"\n" + "}", new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { System.out.println("\nViplexCore 获取屏幕开关 code:" + code); System.out.println("\nViplexCore 获取屏幕开关 data:" + data); if (code == 0 && data.contains("OPEN")) { newNova.setScreenPower(1); } countDownLatch.countDown(); } }); } }).start(); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } }); return newNovaLsit; } /** * 获取音量 */ public List getVolumeState(List newNovaLsit) { System.out.println("ViplexCore Demo nvGetVolumeAsync(获取音量) begin... "); newNovaLsit.forEach(newNova -> { CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { //推送结果 instance.nvGetVolumeAsync("{\n" + " \"sn\":\"" + newNova.getSn() + "\"\n" + "}", new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { System.out.println("\nViplexCore 获取音量 code:" + code); System.out.println("\nViplexCore 获取音量 data:" + data); if (code == 0) { newNova.setVolume((BigDecimal) JSON.parseObject(data, Map.class).get("ratio")); } countDownLatch.countDown(); } }); } }).start(); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } }); return newNovaLsit; } /** * 设置音量 */ public boolean setVolume(NewNovaStatusParam param) { System.out.println("ViplexCore Demo nvSetScreenBrightnessAsync(Volume) begin... "); CountDownLatch countDownLatch = new CountDownLatch(1); StatusVO login = login(param.getSn()); if (login.getStatusCode() == 0) { String jsonStr = "{\n" + " \"sn\":\"" + param.getSn() + "\",\n" + " \"screenBrightnessInfo\":{\n" + " \"ratio\":" + param.getVolume() + "\n" + " }\n" + "}"; instance.nvSetVolumeAsync(jsonStr, new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { System.out.println("\nViplexCore Volume code:" + code); System.out.println("\nViplexCore Volume data:" + data); countDownLatch.countDown(); if (code == 0) { login.setStatusCode(10086); } } }); try { countDownLatch.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } } if (login.getStatusCode() == 10086) { return true; } else { return false; } } /** * 获取亮度 */ public List getScreenBrightness(List newNovaLsit) { System.out.println("ViplexCore Demo nvGetScreenBrightnessAsync(获取亮度) begin... "); newNovaLsit.forEach(newNova -> { CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { //推送结果 instance.nvGetScreenBrightnessAsync("{\n" + " \"sn\":\"" + newNova.getSn() + "\"\n" + "}", new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { System.out.println("\nViplexCore 获取亮度 code:" + code); System.out.println("\nViplexCore 获取亮度 data:" + data); if (code == 0) { newNova.setBrightness((BigDecimal) JSON.parseObject(data, Map.class).get("ratio")); } countDownLatch.countDown(); } }); } }).start(); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } }); return newNovaLsit; } /** * 设置亮度 */ public boolean setScreenBrightness(NewNovaStatusParam param) { System.out.println("ViplexCore Demo nvSetScreenBrightnessAsync(设置亮度) begin... "); CountDownLatch countDownLatch = new CountDownLatch(1); StatusVO login = login(param.getSn()); if (login.getStatusCode() == 0) { String jsonStr = "{\n" + " \"sn\":\"" + param.getSn() + "\",\n" + " \"screenBrightnessInfo\":{\n" + " \"ratio\":" + param.getBrightness() + "\n" + " }\n" + "}"; instance.nvSetScreenBrightnessAsync(jsonStr, new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { System.out.println("\nViplexCore 设置亮度 code:" + code); System.out.println("\nViplexCore 设置亮度 data:" + data); countDownLatch.countDown(); if (code == 0) { login.setStatusCode(10086); } } }); try { countDownLatch.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } } if (login.getStatusCode() == 10086) { return true; } else { return false; } } /** * 获取同步 */ public List getSync(List newNovaLsit) { System.out.println("ViplexCore Demo nvGetSyncPlayAsync(获取同步) begin... "); newNovaLsit.forEach(newNova -> { CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { //推送结果 instance.nvGetSyncPlayAsync("{\n" + " \"sn\":\"" + newNova.getSn() + "\"\n" + "}", new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { System.out.println("\nViplexCore 获取亮度 code:" + code); System.out.println("\nViplexCore 获取亮度 data:" + data); if (code == 0) { newNova.setSync(1); } countDownLatch.countDown(); } }); } }).start(); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } }); return newNovaLsit; } /** * 设置同步 */ public List setSync(NewNovaStatusParam param) { System.out.println("ViplexCore Demo nvSetSyncPlayAsync(设置同步) begin... "); if (param.getNovaList() == null || param.getNovaList().size() == 0) { throw new BusinessException("同步设备不能为空 !"); } param.getNovaList().forEach(newNova -> { CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { //推送结果 instance.nvSetSyncPlayAsync("{\n" + " \"sn\":\"" + newNova.getSn() + "\",\n" + " \"enable\":" + param.isSync() + "\n" + "}", new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { System.out.println("\nViplexCore 设置同步 code:" + code); System.out.println("\nViplexCore 设置同步 data:" + data); if (code == 0) { newNova.setStatus(true); } countDownLatch.countDown(); } }); } }).start(); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } }); return param.getNovaList(); } /** * 重启 */ public List reboot(NewNovaStatusParam param) { System.out.println("ViplexCore Demo nvSetReBootTaskAsync(重启) begin... "); if (param.getNovaList() == null || param.getNovaList().size() == 0) { throw new BusinessException("重启设备不能为空 !"); } param.getNovaList().forEach(newNova -> { CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { //推送结果 instance.nvSetReBootTaskAsync("{\n" + " \"sn\":\"" + newNova.getSn() + "\",\n" + " \"taskInfo\":{\n" + " \"type\":\"REBOOT\",\n" + " \"source\":{\n" + " \"type\":0,\n" + " \"platform\":4\n" + " },\n" + " \"executionType\":\"IMMEDIATELY\",\n" + " \"reason\":\"Just to reboot\",\n" + " \"conditions\":[\n" + " {\n" + " \"cron\":[\n" + " \"0 15 10 ? * *\",\n" + " \"0 0 12 * * ?\"\n" + " ],\n" + " \"enable\":false\n" + " }\n" + " ]\n" + " }\n" + "}", new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { System.out.println("\nViplexCore 重启 code:" + code); System.out.println("\nViplexCore 重启 data:" + data); if (code == 0) { newNova.setStatus(true); } countDownLatch.countDown(); } }); } }).start(); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } }); return param.getNovaList(); } /** * ntp对时 */ public List ntp(NewNovaStatusParam param) { System.out.println("ViplexCore Demo nvSetNetTimingInfoAsync(ntp) begin... "); if (param.getNovaList() == null || param.getNovaList().size() == 0) { throw new BusinessException("对时设备不能为空 !"); } param.getNovaList().forEach(newNova -> { CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { //推送结果 instance.nvSetNetTimingInfoAsync("{\n" + " \"sn\":\"" + newNova.getSn() + "\",\n" + " \"TimingInfo\":{\n" + " \"source\":{\n" + " \"type\":1,\n" + " \"platform\":1\n" + " },\n" + " \"taskArray\":[\n" + " {\n" + " \"type\":\"NTP_CONFIG\",\n" + " \"action\":4,\n" + " \"data\":{\n" + " \"enable\":" + param.isNtp() + ",\n" + " \"server\":\"http://ntpsss.net\"\n" + " }\n" + " }\n" + " ]\n" + " }\n" + "}", new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { System.out.println("\nViplexCore 重启 code:" + code); System.out.println("\nViplexCore 重启 data:" + data); if (code == 0) { newNova.setStatus(true); } countDownLatch.countDown(); } }); } }).start(); try { countDownLatch.await(30000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } }); return param.getNovaList(); } }