当前位置: 首页 > news >正文

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

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

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

相关文章:

  • 【全开源】填表问卷统计预约打卡表单系统+uniapp前端
  • 亚马逊认证考试系列 - 第一部份:基础服务 - AWS SAA C03
  • GPT-1 与 BERT 架构
  • Duende Identity Server学习之一:认证服务器及一个Oidc/OAuth认证、用于Machine 2 Machine的客户端
  • 前端开发面试题总结-vue3框架篇(二)
  • LangServer 与 Langgraph 融合架构:构建智能语言服务系统
  • 一种新的参数高效微调方法-LoRI
  • Armbian 开机启动点灯脚本
  • Unix ODBC和Mysql ODBC
  • 【论文笔记】【强化微调】TinyLLaVA-Video-R1:小参数模型也能视频推理
  • `customRef` 在实战中的使用:防抖、计算属性缓存和异步数据获取
  • 广州华锐互动:以技术创新引领虚拟现实体验新高度
  • 基于机器学习的侧信道分析(MLSCA)Python实现(带测试)
  • 【Linux】Ubuntu 24.04 远程桌面控制
  • RA4M2开发涂鸦模块CBU(2)----配置按键开启LED
  • 神经中枢革命:对象模型耦合CMMM,AI进化引擎重塑PLM-实现智能工厂从卓越级到领航级的自驱跃迁,打造制造业数字进化操作系统
  • 【批量文件查找】根据文件名清单一次性查找多个文件复制到指定位置,批量查找文件的使用步骤和注意事项
  • WevServer实现:异步日志写与HTTP连接
  • [muduo] ThreadPool | TcpClient | 异步任务 | 通信测试
  • 基于Python、tkinter、sqlite3 和matplotlib的校园书店管理系统
  • 高端大气企业网站模板/友情链接是啥意思
  • 怎么查有做网站的公司/成都网站建设seo
  • 网站开发页面设计过程/网络营销知名企业
  • 成华区微信网站建设推广/it培训班大概需要多少钱
  • 帝国cms小说网站模板下载地址/seo推广怎么收费
  • 做网站推销好做吗/百度人工服务24小时