Java 双门双向门禁控制板实时监控源码

news/2024/5/18 14:09:31 标签: java, UDP, 实时门禁, 实时监控

 本示例使用设备:实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com)

java">package UdpDemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

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

import java.net.*;
import java.util.*;

//udp传输: 接收
/**步骤:---
 * 1、建立udp socket,设置接收端口
 * 2、预先创建数据存放的位置,封装
 * 3、使用receive阻塞式接收
 * 4、关闭资源
 * */

public class PosDemo {

    public static void main(String[] args) throws Exception{
        //Scanner input = new Scanner(System.in);
        String MyIpAdd=getIP();        //获取电脑网卡IP
        InetAddress Addip=InetAddress.getByName(MyIpAdd) ;
        DatagramSocket s = new DatagramSocket(39192);         /** 1、建立udp socket端点 */
        System.out.println("当前软件绑定的网卡:"+MyIpAdd+"\n\n");

        String SendInfStr="000";
        byte[] SendBuf = SendInfStr.getBytes();                    /** 2、提供发送数据,封装打包 000 为搜索在线设备的指令 */
        DatagramPacket dp = new DatagramPacket(SendBuf, SendBuf.length, InetAddress.getByName("255.255.255.255"), 39192);
        try {
            s.send(dp);
            System.out.println("SendTo ip::255.255.255.255\nport::39192\ndata::"+SendInfStr+"\n\n");
        } catch (IOException e) {
            System.out.println("发送失败: ");
            e.printStackTrace();
        }

        boolean i=true;
        while(i){
            String DevRecFramesStr;
            String DevBufferIpAddrStr;
            String DevBufferRemoteAddrStr;
            String DevBufferMachinStr;
            String DevBufferDatetimeStr;
            String DevBufferSerialNumStr;
            String DevBufferCardidStr;
            String DevBufferUseMoneryStr;
            String DevBufferUseTimeStr;
            String DevBufferStaryStr;
            String DevBufferRecordAddStr;
            String DevBufferAllNoStr;
            String DevBufferInputKeyStr;
            String DevBufferMaskStr;
            String DevBufferGatewayStr;
            String DevBufferGatewayStrMAC;
            String DevBufferRemoteAddrMACStr;
            String DevBufferPort;
            String DevBufferNumberDecStr;
            String DevBufferMACSearchStr;
            String DevBufferCommandStr;
            String DevBufferReaderStr;
            String DevBufferDoorNoStr;
            String DevBufferDelayStr;
            String DevBufferPasswPropStr;
            String DevBufferPassWStr;
            String DevBufferQrcodeInfStr;
            int j;

            byte [] bbuf = new byte [1024];             /**3、预先创建接收数据存放的位置,封装*/
            DatagramPacket rdp = new DatagramPacket(bbuf,bbuf.length);

            s.receive(rdp);                             /**4、使用receive阻塞式接收*/

            String ReceiveDataStr=new String(rdp.getData());
            String RemoteHostIP=rdp.getAddress().getHostAddress();
            int RemotePort=rdp.getPort();
            System.out.println("From ip::"+rdp.getAddress().getHostAddress()+"\nport::"+rdp.getPort()+"\ndata::"+ReceiveDataStr+"\n\n");

            String[] strArr = ReceiveDataStr.split("\\,");    /*分割接收到的数据后再分析、处理、返回指令 */

            switch(strArr[0]){
                case "100":                                       /*设备接收到搜索指令后返回的设备信息*/
                    if(strArr.length<9){
                        DevBufferIpAddrStr= strArr[1];          /*终端IP*/
                        DevBufferMaskStr= strArr[2];            /*掩码*/
                        DevBufferGatewayStr= strArr[3];         /*网关*/
                        DevBufferRemoteAddrStr= strArr[4];      /*远程服务器IP*/
                        DevBufferPort= strArr[5];               /*端口*/
                        DevBufferNumberDecStr= strArr[6];       /*设备序号*/
                    }else{
                        DevBufferIpAddrStr= strArr[1];          /*终端IP*/
                        DevBufferMaskStr= strArr[2];            /*掩码*/
                        DevBufferGatewayStr= strArr[3];         /*网关*/
                        DevBufferGatewayStrMAC= strArr[4];      /*网关MAC*/
                        DevBufferRemoteAddrStr= strArr[5];      /*远程服务器IP*/
                        DevBufferRemoteAddrMACStr= strArr[6];   /*远程服务器IPMAC*/
                        DevBufferMACSearchStr= strArr[7];       /*MAC搜索标识*/
                        DevBufferPort= strArr[8];               /*端口*/
                        DevBufferNumberDecStr= strArr[9];       /*设备模块序号*/
                        if(strArr.length>10){
                            DevBufferSerialNumStr= strArr[10];  /*设备唯一硬件序号*/
                        }

                        if(DevBufferRemoteAddrStr.compareTo("255.255.255.255")!=0 && DevBufferRemoteAddrStr.compareTo(MyIpAdd)!=0 ){
                            System.out.println("消费机的远程服务器IP不是指向当前网卡,请在消费机上 功能1>\7IP地址及端口设定 设定正确的网络参数!\n\n");
                            int Netcode=0;
                            Netcode=Netcode+1;     //+1  表示服务器MAC自动搜索        否则服务器MAC锁定
                            Netcode=Netcode+2;     //+2  表示网关MAC自动搜索          否则网关MAC锁定
                            Netcode=Netcode+4;     //+4  表示DHCP可自动获取IP         否则指定IP
                            Netcode=Netcode+8;     //+8  表示允许存储自动获取可用的IP    否则不存储

                            //根据现场的网络环境修改以下网络参数并传送到消费机上
                            //修改设备网络参数        消费机IP             掩码                   网关                   网关MAC                 远程服务器IP(广播)            远程服务器MAC             IP获取方式及MAC搜索方式                通讯端口            设备模块序号
                            SendInfStr="004,"+DevBufferIpAddrStr+","+DevBufferMaskStr+","+DevBufferGatewayStr+","+DevBufferGatewayStrMAC+",255.255.255.255,"+DevBufferRemoteAddrMACStr+","+ Integer.toString(Netcode).trim()+","+DevBufferPort+","+DevBufferNumberDecStr ;
                            SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);   //修改消费机网络参数的指令
                        }
                    }

                    break;
                case "101":                                 /*有设备开机的信号*/
                    DevRecFramesStr = strArr[1];            /*包序列号 */
                    DevBufferIpAddrStr = strArr[2];         /*终端IP  */
                    DevBufferRemoteAddrStr = strArr[3];     /*远程电脑指机IP*/
                    DevBufferMachinStr = strArr[4];         /*机号*/
                    DevBufferDatetimeStr = strArr[5];       /*日期时间*/
                    if(strArr.length>6){                    /*2018年以后的设备有唯一硬件序号*/
                        DevBufferSerialNumStr=strArr[6];
                    }

                    SendInfStr="001,"+DevRecFramesStr;       /*向设备发此数据表示已收到信息,否则设备会连续发三次*/
                    SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);

                    String SysNowTime=GetSysDT();           /*取系统时间*/
                    if(DevBufferDatetimeStr.substring(0,16).compareTo(SysNowTime.substring(0,16))!=0){
                        SendInfStr="003,"+DevBufferMachinStr+","+SysNowTime;       /*设备时钟与系统不符,更新设备时间*/
                        SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);
                    }

                    break;

                case "150":                                 /*接收到实时考勤门禁机刷卡数据*/
                    DevRecFramesStr = strArr[1];            /*包序列号 */
                    DevBufferIpAddrStr = strArr[2];         /*终端IP  */
                    DevBufferRemoteAddrStr = strArr[3];     /*远程电脑指机IP*/
                    DevBufferMachinStr = strArr[4];         /*机号*/
                    DevBufferCardidStr= strArr[5];          /*卡号*/
                    DevBufferReaderStr= strArr[6];          /*读头号*/
                    DevBufferDoorNoStr= strArr[7];          /*门或继电器号*/
                    DevBufferDelayStr= strArr[8];           /*门磁未关秒数,0表示已关*/
                    DevBufferPasswPropStr= strArr[9];       /*密码属性(0密码无效,1刷卡后按密码,2补签密码,3开门密码,4防迫胁密码)*/
                    DevBufferPassWStr= strArr[10];          /*密码(最多8位数字)*/
                    DevBufferUseTimeStr= strArr[11];        /*刷卡时间*/
                    if(strArr.length>12){                    /*2018年以后的设备有唯一硬件序号*/
                        DevBufferSerialNumStr=strArr[12];
                    }

                    SendInfStr="001,"+DevRecFramesStr;      /*向设备发此数据表示已收到信息,否则设备会连续发三次*/
                    SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);

                    /*用050指令返回开门成功,051指令返回开门失败,正式系统开发时要有重发机制 */
                    /*SendInfStr="051," + DevBufferMachinStr + "," + DevBufferCardidStr+ ",卡号:"+DevBufferCardidStr+"\\n姓名:张三丰  \\n状态:状态:无效卡\\n,20,1,3" */
                    SendInfStr="050," + DevBufferMachinStr + "," + DevBufferCardidStr+ ",卡号:"+DevBufferCardidStr+"\\n姓名:张三丰  \\n状态:欢迎关临\\n,20,1,0," + DevBufferReaderStr + "," + DevBufferDoorNoStr + ",5,20" ;
                    SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);

                default:    //更多的指令说明请参看通讯协议说明
            }
        }

        s.close();                                     /**5、关闭资源*/
    }

    /*---------------------------------------------------------------------------------------------------------电脑向设备回复信息*/
    static void SendInfToDiv(DatagramSocket s,String Sendinf,String RemoIp,int RemoPro) throws Exception{
        //DatagramSocket s1 = new DatagramSocket(0);                  /** 1、建立udp socket端点 */

        byte[] SendBuf = Sendinf.getBytes("gb2312");         /** 2、提供发送数据,封装打包 */
        DatagramPacket dp1 = new DatagramPacket(SendBuf, SendBuf.length, InetAddress.getByName(RemoIp), RemoPro);
        try {
            s.send(dp1);
            System.out.println("SendTo ip::"+RemoIp+"\nport::"+String.valueOf(RemoPro)+"\ndata::"+Sendinf+"\n\n");
        } catch (IOException e) {
            System.out.println("发送失败: ");
            e.printStackTrace();
        }
        //s1.close();
    }

    /*---------------------------------------------------------------------------------------------------------判断字符串是不是一个日期时间格式*/
    static boolean IsDateTime(String inputstr) {
        Date date=null;
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try{
            date=formatter.parse(inputstr);
            return true;
        }catch (Exception e) {
            return false;
        }
    }

    /*--------------------------------------------------------------------------------------------------------------------取电脑系统日期时间*/
    static String GetSysDT() {
        Date date=new Date();
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String TimeStr=formatter.format(date);
        return TimeStr;
    }
    /*----------------------------------------------------------------------------------------------------------------------------取电脑IP*/
    public static String getIP() {
        Enumeration<NetworkInterface> netInterfaces;
        ArrayList<String> IpAddList = new ArrayList<String>();
        try {
            netInterfaces = NetworkInterface.getNetworkInterfaces();    // 拿到所有网卡
            InetAddress ip;
            while (netInterfaces.hasMoreElements()) {
                NetworkInterface ni = netInterfaces.nextElement();
                Enumeration<InetAddress> addresses = ni.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    ip = addresses.nextElement();
                    if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(':') == -1) {
                        IpAddList.add(ip.getHostAddress());
                        System.out.println((IpAddList.size() - 1) + "" + " " + ni.getName() + " " + ip.getHostAddress());
                    }
                }
            }
        } catch (Exception e) {

        }

        if (IpAddList.isEmpty()) {
            return "127.0.0.1";
        } else {
            return IpAddList.get(1);    //如有多张网卡,请选择与设备相连的网卡,否则无法与设备正常通讯
        }
    }
}

 


http://www.niftyadmin.cn/n/5188294.html

相关文章

【风险管理】MT4外汇交易新手指南:掌握资金管理的重要性

外汇交易作为全球最大的金融市场之一&#xff0c;吸引了越来越多的投资者参与其中。然而&#xff0c;对于新手来说&#xff0c;外汇交易充满了潜在的风险和挑战。为了帮助新手更好地了解和应对这些风险&#xff0c;本文将重点介绍MT4外汇交易中的风险管理&#xff0c;尤其强调资…

Snipaste安装及使用方法

Snipaste安装及使用方法 Snipaste安装及使用方法Snipaste 介绍Snipaste下载Snipaste使用方法 Snipaste安装及使用方法 Snipaste 介绍 Snipaste是一个截图工具&#xff0c;它可以帮助用户快速截取屏幕上的任意区域&#xff0c;并提供一些简单的编辑功能。用户可以使用Snipaste…

读取PDF中指定数据写入EXCEL文件

使用Java读取文件夹中的PDF文件,再读取文件中的指定的字体内容,然后将内容写入到Excel文件中,其中包含一些正则判断,可以忽略,字体以Corbel字体为例。 所需要的maven依赖为: <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel…

RocketMQ中的消息种类以及消费模式

RocketMQ中的消息种类以及消费模式 前言消息的种类按消息的发送方式同步消息异步消息单向消息 按消息的种类普通消息&#xff08;Normal Message&#xff09;顺序消息&#xff08;Orderly Message&#xff09;延时消息&#xff08;Delay Message&#xff09;事务消息&#xff0…

Linux网络之传输层协议tcp/udp

文章目录 目录 一、再谈端口号 1.端口号划分 2.知名端口号 3.netstat&#xff0c;pidof 二、UDP协议 1.udp协议格式 2.udp特点 3.基于udp的应用层协议 三、TCP协议 1.tcp报头 确认应答机制&#xff08;ACK) 超时重传机制 连接管理机制&#xff08;三次握手四次挥…

BUUCTF [BJDCTF2020]认真你就输了 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 来源&#xff1a;https://github.com/BjdsecCA/BJDCTF2020 密文&#xff1a; 下载附件&#xff0c;解压得到一个.xls文件。 解题思路&#xff1a; 1、双击文件&#xff0c;提示“10.xls”的文件格式和扩展名不匹配…

基于STC12C5A60S2系列1T 8051单片的IIC总线器件数模芯片PCF8591实现数模转换应用

基于STC12C5A60S2系列1T 8051单片的IIC总线器件数模芯片PCF8591实现数模转换应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍IIC总线器件数模芯片PCF8591介绍通过按…

7.docker运行redis容器

1.准备redis的配置文件 从上一篇运行MySQL容器我们知道&#xff0c;需要给容器挂载数据卷&#xff0c;来持久化数据和配置&#xff0c;相应的redis也不例外。这里我们以redis6.0.8为例来实际说明下。 1.1 查找redis的配置文件redis.conf 下面这个网址有各种版本的配置文件供…