package com.sincere.haikang; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.sincere.haikang.bean.AttendanceInfoBean; import com.sincere.haikang.bean.PlaceAttendance; import com.sincere.haikang.dao.DeviceDao; import com.sincere.haikang.dao.UserDao; import com.sincere.haikang.libutils.HCEHomeAlarm; import com.sincere.haikang.libutils.HCEHomeCMS; import com.sincere.haikang.server.AttendanceService; import com.sincere.haikang.utils.ApiHelper; import com.sincere.haikang.utils.FileUtils; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.io.*; import java.math.BigInteger; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; @Component public class CMSServer implements ApplicationRunner { @Autowired AttendanceService attendanceService; @Autowired DeviceDao deviceDao; @Autowired UserDao userDao; @Value("${studentSingleImgBasePath}") private String studentSingleImgBasePath;//图片目录 //121.40.109.21 HCEHomeCMS hCEhomeCMS = HCEHomeCMS.INSTANCE; FRegisterCallBack fRegisterCallBack = new FRegisterCallBack(); ;//注册回调函数实现 EHomeMsgCallBack cbEHomeMsgCallBack;//报警监听回调函数实现 //注册监听参数 static HCEHomeCMS.NET_EHOME_CMS_LISTEN_PARAM struCMSListenPara = new HCEHomeCMS.NET_EHOME_CMS_LISTEN_PARAM(); private String ip; { try { ip = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } } @Value("${attendanceHost}") private String host; @Value("${SchoolPwd}") private String pwd; @Value("${SchoolAccount}") private String account; /** * 存档设备id和登录信息 */ public static Map deviceAndLoginIdMap = new HashMap<>(); @Override public void run(ApplicationArguments args) { try { //CMS注册模块初始化 boolean binit = hCEhomeCMS.NET_ECMS_Init(); System.out.println("模块初始化:" + binit + " ip:" + ip); //注册监听参数 if (fRegisterCallBack == null) { fRegisterCallBack = new FRegisterCallBack(); } hCEhomeCMS.NET_ECMS_SetLogToFile(3, "C:/lib/EHomeSDKLog", false);//记录日志 //注册服务器的ip和端口 struCMSListenPara.struAddress.szIP = "0.0.0.0".getBytes(); struCMSListenPara.struAddress.wPort = 7660; struCMSListenPara.fnCB = fRegisterCallBack; //启动监听,接收设备注册信息 NativeLong lListen = hCEhomeCMS.NET_ECMS_StartListen(struCMSListenPara); if (lListen.intValue() < -1) { // JOptionPane.showMessageDialog(null, "NET_zlib1ECMS_StartListen failed, error code:" + hCEhomeCMS.NET_ECMS_GetLastError()); hCEhomeCMS.NET_ECMS_Fini(); System.out.println("启动注册监听:失败"); return; } else { System.out.println("启动注册监听:成功"); } initAlarmListener(); // initEhomeSSListener(); } catch (Exception e) { e.printStackTrace(); System.out.println("启动监听:" + e.toString()); } } public class FRegisterCallBack implements HCEHomeCMS.DEVICE_REGISTER_CB { public boolean invoke(NativeLong lUserID, int dwDataType, Pointer pOutBuffer, int dwOutLen, HCEHomeCMS.NET_EHOME_SERVER_INFO pInBuffer, int dwInLen, Pointer pUser) { if (dwDataType == 0) { HCEHomeCMS.NET_EHOME_DEV_REG_INFO strDevRegInfo = new HCEHomeCMS.NET_EHOME_DEV_REG_INFO(); strDevRegInfo.write(); Pointer pDevRegInfo = strDevRegInfo.getPointer(); pDevRegInfo.write(0, pOutBuffer.getByteArray(0, strDevRegInfo.size()), 0, strDevRegInfo.size()); strDevRegInfo.read(); try { //+" "+ new String(strDevRegInfo.sDeviceSerial, "utf-8") System.out.println("注册设备信息:" + new String(strDevRegInfo.byDeviceID, "utf-8") + " lUserID:" + lUserID); String deviceId = new String(strDevRegInfo.byDeviceID, "utf-8").trim(); String zIp = new String(strDevRegInfo.struDevAdd.szIP, "utf-8").trim(); int port = strDevRegInfo.struDevAdd.wPort; String time = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()); attendanceService.insert(deviceId, "23", zIp, port + "", time, "-1", "1"); deviceAndLoginIdMap.put(deviceId, lUserID); FileUtils.getInstance().writeLogs("设备注册ID:" + deviceId + " 对应登录id:" + lUserID, FileUtils.devices); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } pInBuffer.dwSize = pInBuffer.size(); /*这里加判断即可,可以通过byDeviceID、sDeviceSerial、sDevName 进行判断 if(strDevRegInfo.dwDevType == 1) { pInBuffer.dwAlarmServerType = 3; } else { pInBuffer.dwAlarmServerType = 1; } */ //报警服务器IP地址设置 byte[] byIP = ip.getBytes(); System.arraycopy(byIP, 0, pInBuffer.struUDPAlarmSever.szIP, 0, byIP.length); pInBuffer.dwAlarmServerType = 1; //报警服务器类型:0- 只支持UDP协议上报,1- 支持UDP、TCP两种协议上报 pInBuffer.struTCPAlarmSever.wPort = 7661; // pInBuffer.struUDPAlarmSever.wPort = 7662; //存储服务器IP地址设置 // pInBuffer.dwPicServerType = 3; // System.arraycopy(byIP, 0, pInBuffer.struPictureSever.szIP, 0, byIP.length); // pInBuffer.struPictureSever.wPort = 7667; pInBuffer.write(); dwInLen = pInBuffer.size(); // System.out.println("dwInLen:" + dwInLen + " lUserID:" + lUserID + " pUser:" + pUser); // jTextFieldDevNo.setText(new String(strDevRegInfo.byDeviceID)); } return true; } } /** * 报警服务器监听 */ static HCEHomeAlarm mHCEHomeAlarm = HCEHomeAlarm.INSTANCE; static HCEHomeAlarm.NET_EHOME_ALARM_LISTEN_PARAM net_ehome_alarm_listen_param = new HCEHomeAlarm.NET_EHOME_ALARM_LISTEN_PARAM(); private void initAlarmListener() { boolean bRet = mHCEHomeAlarm.NET_EALARM_Init(); if (!bRet) { System.out.println("NET_EALARM_Init failed!"); } if (cbEHomeMsgCallBack == null) { cbEHomeMsgCallBack = new EHomeMsgCallBack(); } net_ehome_alarm_listen_param.struAddress.szIP = "0.0.0.0".getBytes(); net_ehome_alarm_listen_param.struAddress.wPort = 7661; net_ehome_alarm_listen_param.fnMsgCb = cbEHomeMsgCallBack; net_ehome_alarm_listen_param.pUserData = null; net_ehome_alarm_listen_param.byProtocolType = 1; net_ehome_alarm_listen_param.byUseCmsPort = 1; NativeLong ARMListen = mHCEHomeAlarm.NET_EALARM_StartListen(net_ehome_alarm_listen_param); if (ARMListen.intValue() < 0) { System.out.println("启动报警监听失败"); // JOptionPane.showMessageDialog(null, "NET_EALARM_StartListen失败, error code:" + hCEhomeCMS.NET_ECMS_GetLastError()); return; } else { System.out.println("启动报警监听成功" + ARMListen.intValue()); // JOptionPane.showMessageDialog(null, "启动报警监听成功"); } HCEHomeCMS.NET_EHOME_AMS_ADDRESS struAMSAddr = new HCEHomeCMS.NET_EHOME_AMS_ADDRESS(); struAMSAddr.dwSize = struAMSAddr.size(); struAMSAddr.byEnable = 1;//是否启用:0-关闭CMS接收报警功能,1-开启CMS接收报警功能 String strAmsAddr = ip; System.arraycopy(strAmsAddr.getBytes(), 0, struAMSAddr.struAddress.szIP, 0, strAmsAddr.length()); struAMSAddr.struAddress.wPort = 7661; //和报警服务器监听端口需要一致 struAMSAddr.write(); boolean setAMSAddr = hCEhomeCMS.NET_ECMS_SetSDKLocalCfg(1, struAMSAddr.getPointer()); if (!setAMSAddr) { System.out.println("设置回环地址:" + hCEhomeCMS.NET_ECMS_GetLastError()); } System.out.println("设置回环地址:" + hCEhomeCMS.NET_ECMS_GetLastError() + " setAMSAddr:" + setAMSAddr); } /** * 下发卡号 */ public synchronized void sendCards(String clint_id, String cardNo, String name, String clint_type, int valid) { if (!deviceAndLoginIdMap.containsKey(clint_id)) { FileUtils.getInstance().writeLogs("该学校下不存在该设备:" + clint_id, FileUtils.sendNodevice); } else { HCEHomeCMS.NET_EHOME_XML_CFG struXMLCfg = new HCEHomeCMS.NET_EHOME_XML_CFG(); HCEHomeCMS.NET_DVR_STRING_POINTER stringRequestCard = new HCEHomeCMS.NET_DVR_STRING_POINTER(); stringRequestCard.read(); String strRequestCard = "SETDEVICECONFIG"; stringRequestCard.byString = strRequestCard.getBytes(); stringRequestCard.write(); struXMLCfg.pCmdBuf = stringRequestCard.getPointer(); struXMLCfg.dwCmdLen = stringRequestCard.byString.length; struXMLCfg.write(); // int valid = 1;//0:删除;1:有效 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); String startTime = simpleDateFormat.format(new Date()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.YEAR, 5); String endTime = simpleDateFormat.format(calendar.getTime()); HCEHomeCMS.NET_DVR_STRING_POINTER struConfigXMLInput = new HCEHomeCMS.NET_DVR_STRING_POINTER(); struConfigXMLInput.read(); // Long.parseLong(cardNo, 16) String strConfigXMLCard = "\n" + "SetCardCfg\n" + "" + cardNo + "\n" + "0\n" + "0\n" + "0\n" + "\n" + "\n" + "" + valid + "\n" + "1\n" + "1\n" + "1\n" + "\n" + "" + startTime + "\n" + "" + endTime + "\n" + "\n" + "MTIzNDU20\n" + "1\n" + "1\n" + ""; String nameAfter = "\n" + "\n" + "\n" + ""; try { byte[] nameBeforBy = strConfigXMLCard.getBytes("utf-8"); byte[] nameBy = name.getBytes("utf-8"); byte[] nameAfterBy = nameAfter.getBytes("utf-8"); int xmlLength = nameBeforBy.length + nameBy.length + nameAfterBy.length;//字节总长度 byte[] resultBy = new byte[xmlLength]; System.arraycopy(nameBeforBy, 0, resultBy, 0, nameBeforBy.length); System.arraycopy(nameBy, 0, resultBy, nameBeforBy.length, nameBy.length); System.arraycopy(nameAfterBy, 0, resultBy, nameBeforBy.length + nameBy.length, nameAfterBy.length); struConfigXMLInput.byString = resultBy; struConfigXMLInput.write(); // System.out.println("InPut:"+ strConfigXMLCard); struXMLCfg.pInBuf = struConfigXMLInput.getPointer(); struXMLCfg.dwInSize = struConfigXMLInput.byString.length; struXMLCfg.dwRecvTimeOut = 5000; struXMLCfg.dwSendTimeOut = 5000; struXMLCfg.write(); HCEHomeCMS.NET_DVR_STRING_POINTER struConfigXMLOutput = new HCEHomeCMS.NET_DVR_STRING_POINTER(); struConfigXMLOutput.write(); struXMLCfg.pOutBuf = struConfigXMLOutput.getPointer(); struXMLCfg.dwOutSize = struConfigXMLOutput.size(); struXMLCfg.write(); HCEHomeCMS.NET_DVR_STRING_POINTER stringXMLStatus = new HCEHomeCMS.NET_DVR_STRING_POINTER(); stringXMLStatus.write(); struXMLCfg.pStatusBuf = stringXMLStatus.getPointer(); struXMLCfg.dwStatusSize = stringXMLStatus.size(); struXMLCfg.write(); NativeLong lLoginID = deviceAndLoginIdMap.get(clint_id); if (!hCEhomeCMS.NET_ECMS_XMLConfig(lLoginID, struXMLCfg, struXMLCfg.size())) { int iErr = hCEhomeCMS.NET_ECMS_GetLastError(); FileUtils.getInstance().writeLogs("用户下发失败:" + iErr + " 设备ID:" + clint_id + " 用户:" + name + " 卡号:" + cardNo, FileUtils.sendUserErrTxt); System.out.println("NET_ECMS_XMLConfig失败,错误号:" + iErr); return; } else { struXMLCfg.read(); struConfigXMLOutput.read(); FileUtils.getInstance().writeLogs("用户下发成功" + " 设备ID:" + clint_id + " 用户:" + name + "输出xml:" + new String(struConfigXMLOutput.byString, "utf-8").trim(), FileUtils.sendUserSucTxt); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } /** * 获取指纹信息 */ public void getFingerPrint(String clint_id, String cardNo) { HCEHomeCMS.NET_EHOME_XML_CFG struXMLCard = new HCEHomeCMS.NET_EHOME_XML_CFG(); HCEHomeCMS.NET_DVR_STRING_POINTER stringRequestCard = new HCEHomeCMS.NET_DVR_STRING_POINTER(); stringRequestCard.read(); String strRequestCard = "GETDEVICECONFIG"; stringRequestCard.byString = strRequestCard.getBytes(); stringRequestCard.write(); struXMLCard.pCmdBuf = stringRequestCard.getPointer(); struXMLCard.dwCmdLen = stringRequestCard.byString.length; struXMLCard.write(); HCEHomeCMS.NET_DVR_STRING_POINTER struConfigXMLCard = new HCEHomeCMS.NET_DVR_STRING_POINTER(); struConfigXMLCard.read(); String strConfigXMLCard = "\n" + "GetFingerPrint\n" + "" + cardNo + "\n" + "1,2,3,4,5,6,7,8,9,10\n" + "1\n" + "0\n" + ""; struConfigXMLCard.byString = strConfigXMLCard.getBytes(); struConfigXMLCard.write(); struXMLCard.pInBuf = struConfigXMLCard.getPointer(); struXMLCard.dwInSize = struConfigXMLCard.byString.length; struXMLCard.dwRecvTimeOut = 5000; struXMLCard.dwSendTimeOut = 5000; struXMLCard.write(); HCEHomeCMS.NET_DVR_STRING_POINTER stringOutCard = new HCEHomeCMS.NET_DVR_STRING_POINTER(); stringOutCard.write(); struXMLCard.pOutBuf = stringOutCard.getPointer(); struXMLCard.dwOutSize = stringOutCard.size(); struXMLCard.write(); HCEHomeCMS.NET_DVR_STRING_POINTER stringStatusCard = new HCEHomeCMS.NET_DVR_STRING_POINTER(); stringStatusCard.write(); struXMLCard.pStatusBuf = stringStatusCard.getPointer(); struXMLCard.dwStatusSize = stringStatusCard.size(); struXMLCard.write(); int i = struXMLCard.size(); if (!hCEhomeCMS.NET_ECMS_XMLConfig(deviceAndLoginIdMap.get(clint_id), struXMLCard, struXMLCard.size())) { int iErr = hCEhomeCMS.NET_ECMS_GetLastError(); System.err.println("获取指纹信息,错误号:" + iErr + "card:" + cardNo); } else { stringOutCard.read(); try { System.out.println("获取指纹信息成功:" + new String(stringOutCard.byString, "utf-8").trim()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } /** * 删除指纹机信息 * * @param clint_id * @param cardNo */ public void deleteFingerPrintByCardNo(String clint_id, String cardNo) { HCEHomeCMS.NET_EHOME_XML_CFG struXMLCard = new HCEHomeCMS.NET_EHOME_XML_CFG(); HCEHomeCMS.NET_DVR_STRING_POINTER stringRequestCard = new HCEHomeCMS.NET_DVR_STRING_POINTER(); stringRequestCard.read(); String strRequestCard = "SETDEVICECONFIG"; stringRequestCard.byString = strRequestCard.getBytes(); stringRequestCard.write(); struXMLCard.pCmdBuf = stringRequestCard.getPointer(); struXMLCard.dwCmdLen = stringRequestCard.byString.length; struXMLCard.write(); HCEHomeCMS.NET_DVR_STRING_POINTER struConfigXMLCard = new HCEHomeCMS.NET_DVR_STRING_POINTER(); struConfigXMLCard.read(); String strConfigXMLCard = "\r\n" + "DelFingerPrintByCardNo\r\n" + "" + cardNo + "\r\n" + "\n" + "" + 1 + "\n" + "" + "1,2,3,4,5,6,7,8,9,10" + "\n" + "\n" + ""; struConfigXMLCard.byString = strConfigXMLCard.getBytes(); struConfigXMLCard.write(); struXMLCard.pInBuf = struConfigXMLCard.getPointer(); struXMLCard.dwInSize = struConfigXMLCard.byString.length; struXMLCard.dwRecvTimeOut = 5000; struXMLCard.dwSendTimeOut = 5000; struXMLCard.write(); HCEHomeCMS.NET_DVR_STRING_POINTER stringOutCard = new HCEHomeCMS.NET_DVR_STRING_POINTER(); stringOutCard.write(); struXMLCard.pOutBuf = stringOutCard.getPointer(); struXMLCard.dwOutSize = stringOutCard.size(); struXMLCard.write(); HCEHomeCMS.NET_DVR_STRING_POINTER stringStatusCard = new HCEHomeCMS.NET_DVR_STRING_POINTER(); stringStatusCard.write(); struXMLCard.pStatusBuf = stringStatusCard.getPointer(); struXMLCard.dwStatusSize = stringStatusCard.size(); struXMLCard.write(); int i = struXMLCard.size(); if (!hCEhomeCMS.NET_ECMS_XMLConfig(deviceAndLoginIdMap.get(clint_id), struXMLCard, struXMLCard.size())) { int iErr = hCEhomeCMS.NET_ECMS_GetLastError(); System.err.println("删除指纹,错误号:" + iErr + "card:" + cardNo); } else { System.out.println("删除指纹成功"); } } /** * 报警服务返回监听 */ class EHomeMsgCallBack implements HCEHomeAlarm.EHomeMsgCallBack { @Override public boolean invoke(NativeLong iHandle, HCEHomeAlarm.NET_EHOME_ALARM_MSG pAlarmMsg, Pointer pUser) { try { if (pAlarmMsg.dwXmlBufLen != 0) { HCEHomeAlarm.NET_EHOME_XML_DATA strXMLData = new HCEHomeAlarm.NET_EHOME_XML_DATA(); strXMLData.write(); Pointer pPlateInfo = strXMLData.getPointer(); pPlateInfo.write(0, pAlarmMsg.pXmlBuf.getByteArray(0, strXMLData.size()), 0, strXMLData.size()); strXMLData.read(); String strXML = new String(strXMLData.byXMLData); FileUtils.getInstance().writeLogs("报警内容:" + strXML, FileUtils.baojingneirong); //主类型 String majirType = strXML.substring(strXML.indexOf("MajorType"), strXML.lastIndexOf("MajorType")).trim(); majirType = majirType.replace("MajorType>", ""); majirType = majirType.replace("", ""); minorType = minorType.replace("", ""); cardNo = cardNo.replace("", ""); deviceID = deviceID.replace("", ""); time = time.replace(" 0) { if (cardNo.length() >= 10) { FileUtils.getInstance().writeLogs("学生id异常:" + deviceID + " 卡号:" + cardNo + " minorType:" + minorType, FileUtils.qiandaoErr); return true; } cardNo = userDao.getStudent_Num(cardNo); // BigInteger bigInteger = new BigInteger(cardNo); // cardNo = String.format("%08x", bigInteger); //16进制取8位,不够补0 // cardNo = cardNo(cardNo).toUpperCase(); // System.out.println("cardNo:"+cardNo+" minorType:"+minorType); if (deviceID != null && !deviceID.isEmpty() && !StringUtils.isEmpty(cardNo)) { cardNo = new BigInteger(cardNo, 16).toString(); System.out.println(String.format("设备号:%s 卡号:%s 时间:%s", deviceID, cardNo, time)); PlaceAttendance placeAttendance = deviceDao.getPlaceAttendance(deviceID); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String info = String.format("", simpleDateFormat.format(new Date()), deviceID, cardNo, time, "-1"); AttendanceInfoBean attendanceInfoBean = new AttendanceInfoBean(); attendanceInfoBean.setInfo(info); attendanceInfoBean.setIsControl(0); attendanceInfoBean.setPwd(pwd); attendanceInfoBean.setUsername(account); String jsonResult = JSON.toJSONString(attendanceInfoBean); if (placeAttendance == null) {//出入校 String urlXST = host + "api/XiaoAnCommon/SendXST"; String result1 = ApiHelper.doPost(urlXST, new HashMap(), jsonResult); JSONObject jsonObject = JSONObject.parseObject(result1); if ((int) jsonObject.get("status") == 1) FileUtils.getInstance().writeLogs("出入校签到成功:" + deviceID + " 卡号:" + cardNo, FileUtils.qiandaoSuccess); else FileUtils.getInstance().writeLogs("出入校签到失败:" + deviceID + " 卡号:" + cardNo + " result1:" + result1, FileUtils.qiandaoErr); System.out.println("urlXST:" + result1);//{"status":1,"message":null,"data":"0"} } else {//出入寝室 String urlHXY = host + "api/XiaoAnCommon/SendHXY"; String result2 = ApiHelper.doPost(urlHXY, new HashMap(), jsonResult); JSONObject jsonObject = JSONObject.parseObject(result2); if ((int) jsonObject.get("status") == 1) FileUtils.getInstance().writeLogs("出入寝签到成功:" + deviceID + " 卡号:" + cardNo, FileUtils.qiandaoSuccess); else FileUtils.getInstance().writeLogs("出入寝签到失败:" + deviceID + " 卡号:" + cardNo + " result1:" + result2, FileUtils.qiandaoErr); FileUtils.getInstance().writeLogs("出入寝签到:" + deviceID + " 卡号:" + cardNo + " result2:" + result2 + " 传入参数:" + jsonResult, FileUtils.qinshiResult); System.out.println("urlHXY:" + result2); } } } else System.out.println("卡号为空"); } } } catch (Exception e) { e.printStackTrace(); } return true; } } }