Java UDP Socket 实时在线刷卡扫码POS消费机门禁控制板服务端示例源码

本示例使用的设备:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.52de2c1bYG0BuO&ft=t&id=17021194999

一、获取本电脑所有网卡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(0);    //如有多张网卡,请选择与设备相连的网卡,否则无法与设备正常通讯}
}

二、服务端开启UDP端口接收消费机提交的请求

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;public class Main {public static void main(String[] args) throws Exception{String MyIpAdd=getIP();        //获取电脑网卡IPint MyPort=39192;              //监听端口  InetAddress Addip=InetAddress.getByName(MyIpAdd) ;DatagramSocket s = new DatagramSocket(MyPort);            /** 1、建立udp socket端点 */System.out.println("当前系统绑定的网卡:"+MyIpAdd+":"+String.format("%d",MyPort));while(true){byte [] bbuf = new byte [1024];                       /**2、预先创建接收数据存放的位置,封装*/DatagramPacket rdp = new DatagramPacket(bbuf,bbuf.length);s.receive(rdp);                                       /**3、使用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("\\,");    /*分割接收到的数据后再分析、处理、返回指令 */}}
}

三、接收到消费机上传的刷卡数据

if (strArr[0].equals("102")){				/*接收到直接刷卡的信息*/DevRecFramesStr = strArr[1];            /*包序列号 */DevBufferIpAddrStr = strArr[2];         /*终端IP  */DevBufferRemoteAddrStr = strArr[3];     /*远程电脑指机IP*/DevBufferMachinStr = strArr[4];         /*机号*/DevBufferCardidStr = strArr[5];         /*卡号*/if(strArr.length>6){                    /*2018年以后的设备有唯一硬件序号*/DevBufferSerialNumStr=strArr[6];}SendInfStr="001,"+DevRecFramesStr;       /*向设备发此数据表示已收到信息,否则设备会连续发三次*/SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);/*此处加入业务对数据库的查、增、删、减操作*//*009指令返回持卡人信息*/SendInfStr="009," + DevBufferMachinStr + ",卡号:" + DevBufferCardidStr + "\\n姓名:张三丰\\n余额:888.88\\n状态:卡可正常使用\\n,20,1,0" ;SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);
}

四、接收到消费机上传的现金支付请求

if (strArr[0].equals("103")){				/*接收到 输入消费金额后刷卡、消费机定额消费、消费机计次消费 的上传信息 */DevRecFramesStr = strArr[1];            /*包序列号 */DevBufferIpAddrStr = strArr[2];         /*终端IP  */DevBufferRemoteAddrStr = strArr[3];     /*远程电脑指机IP*/DevBufferMachinStr = strArr[4];         /*机号*/DevBufferCardidStr = strArr[5];         /*卡号*/DevBufferUseMoneryStr= strArr[6];       /*消费金额*/DevBufferUseTimeStr= strArr[7];         /*消费时间*/if(strArr.length>8){                    /*2018年以后的设备有唯一硬件序号*/DevBufferSerialNumStr=strArr[8];}SendInfStr="001,"+DevRecFramesStr;       /*向设备发此数据表示已收到信息,否则设备会连续发三次*/SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);/*此处加入业务对数据库的查、增、删、减操作*//*008指令返回本次消费成功,006指令返回本次消费失败,正式系统开发时要有重发机制*/SendInfStr="008," + DevBufferMachinStr + "," + DevBufferCardidStr+ ","+DevBufferUseMoneryStr+"," + "姓名:张三丰 {123.45}\\n,20,0,1" ;SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);
}

五、接收到消费机上传的计次消费请求

if (strArr[0].equals("104")){				/*接收到 计次消费模式下,终端刷卡后设备向电脑发送此信息 */DevRecFramesStr = strArr[1];            /*包序列号 */DevBufferIpAddrStr = strArr[2];         /*终端IP  */DevBufferRemoteAddrStr = strArr[3];     /*远程电脑指机IP*/DevBufferMachinStr = strArr[4];         /*机号*/DevBufferCardidStr = strArr[5];         /*卡号*/DevBufferUseTimeStr= strArr[6];         /*消费时间*/if(strArr.length>7){                    /*2018年以后的设备有唯一硬件序号*/DevBufferSerialNumStr=strArr[7];}SendInfStr="001,"+DevRecFramesStr;       /*向设备发此数据表示已收到信息,否则设备会连续发三次*/SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);/*此处加入业务对数据库的查、增、删、减操作*//*008指令返回本次消费成功,006指令返回本次消费失败,正式系统开发时要有重发机制*/SendInfStr="006," + DevBufferMachinStr + "," + DevBufferCardidStr+ "," + "姓名:张三丰 \\n余额:123.45\\n状态:累计次数超出\\n,20,0,14" ;SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);
}

六、接收到消费机上传的记账消费记录

if (strArr[0].equals("105")){				/*接收到 脱网记账消费记录,消费机开启记账功能,有脱机记账消费记录网络恢复正常自动向电脑发送此信息 */DevRecFramesStr = strArr[1];            /*包序列号 */DevBufferIpAddrStr = strArr[2];         /*终端IP  */DevBufferRemoteAddrStr = strArr[3];     /*远程电脑指机IP*/DevBufferMachinStr = strArr[4];         /*机号*/DevBufferCardidStr = strArr[5];         /*卡号*/DevBufferUseMoneryStr= strArr[6];       /*消费金额*/DevBufferUseTimeStr= strArr[7];         /*消费时间*/DevBufferStaryStr= strArr[8];           /*消费方式  0扣费 1计次*/DevBufferRecordAddStr= strArr[9];       /*记录地址标识*/DevBufferAllNoStr= strArr[10];          /*总计录数*/if(strArr.length>11){                   /*2018年以后的设备有唯一硬件序号*/DevBufferSerialNumStr=strArr[11];}SendInfStr="001,"+DevRecFramesStr;       /*向设备发此数据表示已收到信息,否则设备会连续发三次*/SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);if(!IsDateTime(DevBufferUseTimeStr)){      /*判断消费时间是否正确*/DevBufferUseTimeStr= "9999-99-99 99:99:99";   /*如果消费时间不正确,需更为 9999-99-99 99:99:99 才能将此条记录删除 */}/*清除设备内当前这条已上传的记录,驱动设备继续上传剩下的记录*/SendInfStr="011," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + DevBufferUseMoneryStr + "," + DevBufferUseTimeStr + "," + DevBufferRecordAddStr;SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);   执行此指令将清除消费机内当前已上传的记录,清除后消费机继续将后一条记录上传,直到全部记㥆上传完毕
}

七、接收到消费机上传的按键信息

if (strArr[0].equals("106")){				/*接收到设备的按键信息*/DevRecFramesStr = strArr[1];            /*包序列号 */DevBufferIpAddrStr = strArr[2];         /*终端IP  */DevBufferRemoteAddrStr = strArr[3];     /*远程电脑指机IP*/DevBufferMachinStr = strArr[4];         /*机号*/DevBufferInputKeyStr= strArr[5];        /*按键信息*/if(strArr.length>6){                    /*2018年以后的设备有唯一硬件序号*/DevBufferSerialNumStr=strArr[6];}SendInfStr="001,"+DevRecFramesStr;      /*向设备发此数据表示已收到信息,否则设备会连续发三次*/SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);
}

八、接收到消费机上传的扫码支付请求 

if (strArr[0].equals("128")){				/*接收到消费金额及扫码信息*/DevRecFramesStr = strArr[1];            /*包序列号 */DevBufferIpAddrStr = strArr[2];         /*终端IP  */DevBufferRemoteAddrStr = strArr[3];     /*远程电脑指机IP*/DevBufferMachinStr = strArr[4];         /*机号*/DevBufferCommandStr = strArr[5];        /*口令*/DevBufferUseMoneryStr= strArr[6];       /*消费金额*/DevBufferUseTimeStr= strArr[7];         /*消费时间*/DevBufferQrcodeInfStr="";if(strArr.length>9){                    //防止二维码信息中有分隔符,for(j=9;j<strArr.length-1;j++){DevBufferQrcodeInfStr=DevBufferQrcodeInfStr+strArr[j];}DevBufferQrcodeInfStr=DevBufferQrcodeInfStr.trim();DevBufferSerialNumStr=strArr[strArr.length-1];       /*2018年以后的设备有唯一硬件序号*/}SendInfStr="001,"+DevRecFramesStr;      /*向设备发此数据表示已收到信息,否则设备会连续发三次*/SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);/*此处加入业务对数据库的查、增、删、减操作*//*008指令返回本次消费成功,006指令返回本次消费失败,正式系统开发时要有重发机制*/SendInfStr="008," + DevBufferMachinStr + "," + DevBufferCommandStr+ ","+DevBufferUseMoneryStr+"," + "正在进行扫码支付..{请不要按动键盘!    \n},5,0,1" ;SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);
}

九、接收到消费机开机信号

if (strArr[0].equals("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];}String SysNowTime=GetSysDT();           /*取系统时间*/if(DevBufferDatetimeStr.substring(0,16).compareTo(SysNowTime.substring(0,16))!=0){SendInfStr="003,"+DevBufferMachinStr+","+SysNowTime;       /*设备时钟与系统不符,更新设备时间*/SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);}
}

门禁控制板介绍: https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.52de2c1bIqEgQP&ft=t&id=599136536796

十、接收到门禁控制板的刷卡开门请求

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

十一、服务端回应消费机的指令 

static void SendInfToDiv(DatagramSocket s,String Sendinf,String RemoIp,int RemoPro) throws Exception{byte[] SendBuf = Sendinf.getBytes("gb2312");         /** 发送数据,封装打包 */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();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85909.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB基础应用精讲-【数模应用】层次分析法(AHP)(附MATLAB和python代码实现)

目录 前言 算法原理 什么是层次分析法(AHP) 注意事项 基本原理 算法步骤 1建立层次结构 2构建判断矩阵 3计算权重向量 4一致性检验 SPSSAU AHP层次分析案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解惑 数据如何录入? 如何…

Macintosh小电脑、小手机 | openKylin最新硬件创意形态首次亮相!

近期&#xff0c;OpenAtom openKylin&#xff08;简称 “openKylin”&#xff09;社区与嘉立创旗下的立创开发板团队展开深度技术合作&#xff0c;成功完成立创・泰山派1开发板与openKylin 2.0操作系统的兼容适配。5月24日&#xff0c;嘉立创“第三届开源硬件星火会”在深圳盛大…

基于Spring Boot的计算机考研交流系统的设计与实现

基于Spring Boot的计算机考研交流系统的设计与实现 随着计算机科学的发展&#xff0c;越来越多的学生选择考研来提高自己的专业水平。然而&#xff0c;考研的过程中&#xff0c;学生们面临着各种问题&#xff0c;如学习资料的获取、交流平台的缺乏等。为了更好地满足这些需求&…

技术逐梦之旅:从C语言到Vue的成长之路

董翔&#xff0c;一个对软件技术充满热忱的00后。从初次在屏幕上敲出"Hello World"的激动&#xff0c;到如今能够独立开发完整Web应用的从容&#xff0c;我的编程之路见证了技术的迭代与自我的蜕变。 作为软件专业的学生&#xff0c;我始终坚信"技术是解决问题…

Qt QMap数据清除测试(验证QMap内存正确释放方法)

环境 Qt C (msvc编译环境) 测试代码 //定义 动子信息 &#xff08;可放在.cpp文件 中&#xff09; struct MoverInfo{uint32_t ID;double PartPosition;uint16_t ModuleID;uint32_t PartID;uint32_t TrackID;uint32_t TrackID2; };//使用Windows任务管理器查看内存使用情况//…

【安全咨询】

安全咨询服务是一个专业领域&#xff0c;旨在帮助个人和组织识别、评估和管理各种安全风险&#xff0c;保护其人员、资产、信息和运营安全。 一、安全咨询 1.1 服务的核心目标 ​识别风险&#xff1a;​​ 发现潜在的、可能对组织或个人造成损害的威胁和漏洞。​评估威胁&am…

vue+elementUI实现固定table超过设定高度显示下拉条

解决方案&#xff1a; 在表格上添加了style"height: px;"和:max-height""&#xff0c;这两个设置共同作用使表格在内容超过 设定高度时显示滚动条配合css使用 高度值可根据实际需求调整 <el-table:data"biddData"style"width: 100%;…

UNet改进(5):线性注意力机制(Linear Attention)-原理详解与代码实现

引言 在计算机视觉领域&#xff0c;UNet架构因其在图像分割任务中的卓越表现而广受欢迎。近年来&#xff0c;注意力机制的引入进一步提升了UNet的性能。本文将深入分析一个结合了线性注意力机制的UNet实现&#xff0c;探讨其设计原理、代码实现以及在医学图像分割等任务中的应…

Unity技能编辑器深度构建指南:打造专业级战斗系统

本文为技术团队提供完整的技能编辑器开发指南&#xff0c;涵盖核心架构设计、资源管线搭建和协作工作流实现&#xff0c;帮助您构建专业级的战斗技能系统。 一、核心架构设计 1. 基础框架搭建 专用场景模板&#xff1a; 创建SkillEditorTemplate.unity场景 核心节点&#xff…

《游戏工业级CI/CD实战:Jenkins+Node.js自动化构建与本地网盘部署方案》

核心架构图 一、游戏开发CI/CD全流程设计 工作流时序图 二、Jenkins分布式构建配置 1. 节点管理&#xff08;支持Win/Linux/macOS&#xff09; // Jenkinsfile 分布式配置示例 pipeline {agent {label game-builder // 匹配带标签的构建节点}triggers {pollSCM(H/5 * * * *)…

Python内存使用分析工具深度解析与实践指南(上篇)

文章目录 引言1. sys.getsizeof()功能程序示例适用场景 2. pandas.Series.memory_usage()功能程序示例适用场景 3. pandas.Series.memory_usage(deepTrue)功能程序示例适用场景注意事项 4. pympler.asizeof()功能安装程序示例适用场景 5. tracemalloc&#xff08;标准库&#x…

Python 使用 Requests 模块进行爬虫

目录 一、请求数据二、获取并解析数据四、保存数据1. 保存为 CSV 文件2. 保存为 Excel 文件打开网页图片并将其插入到 Excel 文件中 五、加密参数逆向分析1. 定位加密位置2. 断点调试分析3. 复制相关 js 加密代码&#xff0c;在本地进行调试&#xff08;难&#xff09;4. 获取 …

MySQL行转列、列转行

要达到的效果&#xff1a; MySQL不支持动态行转列 原始数据&#xff1a; 以行的方式存储 CREATE TABLE product_sales (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(50) NOT NULL,category VARCHAR(50) NOT NULL,sales_volume INT NOT NULL,sales_date DATE N…

云创智称YunCharge充电桩互联互通平台使用说明讲解

云创智称YunCharge充电桩互联互通平台使用说明讲解 一、云创智称YunCharge互联互通平台简介 云创智称YunCharge&#xff08;YunCharge&#xff09;互联互通平台&#xff0c;旨在整合全国充电桩资源&#xff0c;实现多运营商、多平台、多用户的统一接入和管理&#xff0c;打造开…

HTML+JS实现类型excel的纯静态页面表格,同时单元格内容可编辑

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>在线表格</title><style>table {border…

Gartner金融AI应用机会雷达-学习心得

一、引言 在当今数字化时代,人工智能(AI)技术正以前所未有的速度改变着各个行业,金融领域也不例外。财务团队面临着如何从AI投资中获取最大价值的挑战。许多首席财务官(CFO)和财务领导者期望在未来几年增加对AI的投入并从中获得更多收益。据调查,90%的CFO和财务领导者预…

像素着色器没有绘制的原因

背景 directX调用了 draw&#xff0c;顶点着色器运行&#xff0c;但是像素着色器没有运行。 原因 光栅化阶段被剔除 说明&#xff1a;如果几何图元&#xff08;如三角形&#xff09;在光栅化阶段被剔除&#xff0c;像素着色器就不会被调用。常见剔除原因&#xff1a; 背面…

jenkins对接、jenkins-rest

https://www.bilibili.com/video/BV1RqNRz5Eo6 Jenkins是一款常见的构建管理工具&#xff0c;配置好后操作也很简单&#xff0c;只需去控制台找到对应的项目&#xff0c;再输入分支名即可 如果每次只发个位数的项目到也还好&#xff0c;一个个进去点嘛。但如果一次要发几十个项…

北斗导航深度接入小程序打车:高精度定位如何解决定位漂移难题?

你有没有遇到过这样的尴尬&#xff1a; 在写字楼、地下车库或密集楼群中叫车&#xff0c;系统显示的位置和你实际所在位置差了几十米甚至上百米&#xff1b;司机因为找不到你而绕圈&#xff0c;耽误时间还多花平台费用&#xff1b;有时明明站在A出口&#xff0c;司机却跑到B口…

MySQL 主要集群解决方案

MySQL 主要有以下几种集群解决方案&#xff0c;每种方案针对不同的应用场景和需求设计&#xff1a; 1. MySQL Replication&#xff08;主从复制&#xff09; 类型&#xff1a;异步/半同步复制架构&#xff1a;单主多从特点&#xff1a; 读写分离&#xff0c;主库写&#xff0c…