CMSServer.java 13.2 KB
package com.sincere.haikang;

import com.sincere.haikang.libutils.HCEHomeAlarm;
import com.sincere.haikang.libutils.HCEHomeCMS;
import com.sincere.haikang.server.AttendanceService;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class CMSServer implements ApplicationRunner {
    @Autowired
    AttendanceService attendanceService;

    //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 = "121.40.109.21";
    private String ip = "192.168.66.54";


    @Override
    public void run(ApplicationArguments args) {
        try {

            //CMS注册模块初始化
            boolean binit = hCEhomeCMS.NET_ECMS_Init();

            System.out.println("模块初始化:" + binit);

            //注册监听参数
            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();

//        initEhomeSS();
        } 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, "0", "1");
                } 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 = 0; //报警服务器类型:0- 只支持UDP协议上报,1- 支持UDP、TCP两种协议上报
//                pInBuffer.struTCPAlarmSever.wPort = 7662;
                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();


                sendCards(lUserID);
//                System.out.println("dwInLen:" + dwInLen + " lUserID:" + lUserID + " pUser:" + pUser);
//                lLoginID= lUserID;
//                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 = 7662;
        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 = 7662; //和报警服务器监听端口需要一致

        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);
    }

    private void sendCards(NativeLong lUserID) {

        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 = "SetFingerPrintCfg";
        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 = "<Params>\r\n" +
                "<ConfigCmd>SetFingerPrintCfg</ConfigCmd>\r\n" +
                "<ConfigParam1>111111</ConfigParam1>\r\n" +
                "<ConfigParam2>1</ConfigParam2>\r\n" +
                "<ConfigXML>\r\n" +
                "<FingerPrintCfg>\r\n" +
                "<readerNo>1</readerNo>\r\n" +
                "<fingerType></fingerType>\r\n" +
                "<fingerData></fingerData>\r\n" +
                "</FingerPrintCfg>\r\n" +
                "</ConfigXML>\r\n" +
                "</Params>";
        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(lUserID, struXMLCard, struXMLCard.size()))
        {
            int iErr = hCEhomeCMS.NET_ECMS_GetLastError();
            System.out.println("NET_ECMS_XMLConfig失败,错误号:" + iErr);
        }
        else
        {
            System.out.println("下发卡号成功,卡号:12345");
        }
    }

    /**
     * 报警服务返回监听
     */
    class EHomeMsgCallBack implements HCEHomeAlarm.EHomeMsgCallBack {
        @Override
        public boolean invoke(NativeLong iHandle, HCEHomeAlarm.NET_EHOME_ALARM_MSG pAlarmMsg, Pointer pUser) {
            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);

                String majirType = strXML.substring(strXML.indexOf("MajorType"), strXML.lastIndexOf("MajorType"));
                majirType = majirType.replace("MajorType>", "");
                majirType = majirType.replace("</", "");
                System.out.println("majirType:" + majirType);

                String cardNo = strXML.substring(strXML.indexOf("CardNo"), strXML.lastIndexOf("CardNo"));
                cardNo = cardNo.replace("CardNo>", "");
                cardNo = cardNo.replace("</", "");

                String deviceID = strXML.substring(strXML.indexOf("DeviceID"), strXML.lastIndexOf("DeviceID"));
                deviceID = deviceID.replace("DeviceID>", "");
                deviceID = deviceID.replace("</", "");

                String time = strXML.substring(strXML.indexOf("Time"), strXML.lastIndexOf("Time"));
                time = time.replace("Time>", "");
                time = time.replace("</", "");


                if (majirType.equals("0x1")) {//报警

                } else if (majirType.equals("0x2")) {//异常

                } else if (majirType.equals("0x3")) {//操作

                } else if (majirType.equals("0x4")) {//

                } else if (majirType.equals("0x5")) {//事件
//                    BigInteger bigInteger = new BigInteger(cardNo);
//                    cardNo = cardNo(bigInteger.toString(16)).toUpperCase();
                    System.out.println(String.format("设备号:%s 卡号:%s 时间:%s", deviceID, cardNo, time));
                }

//                System.out.println(strXML);
            }
            return true;
        }
    }


    /**
     * 卡号两两倒置
     *
     * @param cardDex
     * @return
     */
    private String cardNo(String cardDex) {

        String cardR = "";

        int length = cardDex.length();
        if (length != 8) {
            System.out.println("卡号格式不正确:" + cardDex);
            return cardDex;
        }
        while (length > 0) {
            length -= 2;
            cardR += cardDex.substring(length, length + 2);
        }

//        return Long.parseLong(cardR, 16) + "";
        return cardR;

    }

    /**
     *
     * @param deviceId
     * @param cardNo
     */
    public void sendUserInfo(String deviceId,String cardNo){
        System.out.println(deviceId);
    }
}