Java实现轻量型Web服务器接收http协议提交的RFID读卡信息

news2024/9/23 11:23:27

  示例使用的读卡器:RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class httpserver {
    public static void main(String[] args) throws Exception{
        int listenport=80;                                         /*监听端口号*/
        if (args[0]!=null){listenport=Integer.parseInt(args[0]);}  //侦听自定义的端口

        try {
            ServerSocket ss = new ServerSocket(listenport);

            while (true) {
                String condition="";
                String ResponseStr="";

                Socket socket = ss.accept();                /*实例化客户端,固定套路,通过服务端接受的对象,生成相应的客户端实例*/
                BufferedReader bd = new BufferedReader(new InputStreamReader(socket.getInputStream()));     /*获取客户端输入流,就是请求过来的基本信息:请求头,换行符,请求体*/

                String requestHeader;
                int contentLength = 0;
                while ((requestHeader = bd.readLine()) != null && !requestHeader.isEmpty()) {   /*** 接受HTTP请求,并解析数据 */
                    System.out.println(requestHeader);

                    /*** 获得GET参数*/
                    if (requestHeader.startsWith("GET")) {
                        int begin = requestHeader.indexOf("?") + 1;
                        int end = requestHeader.indexOf("HTTP/");
                        condition = requestHeader.substring(begin, end);
                        ResponseStr=AnalyticHttpInfo(condition);
                    }
                    else {
                        /*** 获得POST参数* 1.获取请求内容长度*/
                        if (requestHeader.startsWith("Content-Length")) {
                            int begin = requestHeader.indexOf("Content-Lengh:") + "Content-Length:".length();
                            String postParamterLength = requestHeader.substring(begin + 1).trim();
                            contentLength = Integer.parseInt(postParamterLength);
                        }
                    }
                }

                StringBuffer sb = new StringBuffer();
                if (contentLength > 0) {
                    for (int i = 0; i < contentLength; i++) {
                        sb.append((char) bd.read());
                    }
                    System.out.println("POST parameter: " + sb.toString());
                    condition=sb.toString().replace("\r\n","");
                    condition=condition.replace("{","");        //可以引用JSON的Jar包来解析json数据,这里将它转一般字符串来处理
                    condition=condition.replace("}","");
                    condition=condition.replace(",","&");
                    condition=condition.replace(":","=");
                    condition=condition.replace("\"","");
                    ResponseStr=AnalyticHttpInfo(condition);      //解析读卡器上传的包序号、卡号、机号等信息,并生成回应字符串
                }

                /*发送回应信息*/
                PrintWriter pw = new PrintWriter(socket.getOutputStream());
                pw.println(ResponseStr);
                pw.flush();
                System.out.println("Response: "+ResponseStr+"\r\n");
            }
        } catch (IOException e) {
             e.printStackTrace();
        }
    }

    /*-解析读卡器上传的包序号、机号、卡类型、卡号、卡内数据、设备序列号、读卡状态 等信息,并生成回应字符串------------------------------*/
    static String AnalyticHttpInfo(String inputstr) throws Exception{
        String info="";
        String jihao="";
        String cardtype="";
        String card="";
        String data="";
        String dn="";
        String status="";

        String[] strArr = inputstr.split("&");
        for (int i=0;i<strArr.length;i++){
            String[] strPara= strArr[i].split("=");
            switch(strPara[0]){
                case "info":
                    info=strPara[1];        //接收到的数据包号,回应时要带入该包号才能正确回应
                    break;
                case "jihao":
                    jihao=strPara[1];       //设备机号(可自编)
                    break;
                case "cardtype":
                    cardtype=strPara[1];    //卡类型,1为ID卡,2为HID卡,3为T5557卡,4为EM4305卡,5为IC卡,6为二代证,7为15693卡,8为hid iclass卡
                    break;
                case "card":
                    card=strPara[1];        //接收到的原始16进制卡号,可根据需要自行转换成其他卡号
                    break;
                case "data":
                    data=strPara[1];        //读取卡片扇区内容
                    break;
                case "dn":
                    dn=strPara[1];          //设备硬件序列号,出厂时已固化,全球唯一
                    break;
                case "status":
                    status=strPara[1];      //读卡状态,如密码认证失败为12
                    break;
            }
        }
        //Response=1 是指定的回应头信息+接收到的包序号+发送到读卡器的显示文字,注意中文一定要转换编码,{}的文字可以着重显示+显示延时秒数+蜂鸣响声代码+固定组合语音代码
        return "Response=1,"+info+",{"+GetChineseCode("卡号")+":}"+(card+"         ").substring(0,12)+GetSysDT()+",20,2,0";
    }

    /*取电脑系统日期时间-------------------------------------------------------------------------------------------------*/
    static String GetSysDT() {
        Date date=new Date();
        SimpleDateFormat formatter=new SimpleDateFormat("yy-MM-dd HH:mm:ss");
        String TimeStr=formatter.format(date);
        return TimeStr;
    }

    /*获取中文编码信息----------------------------------------------------------------------------------------------*/
    static String GetChineseCode(String inputstr) throws Exception{
        byte[] Chinesecodearry = inputstr.getBytes("gb2312");
        int codelen=Chinesecodearry.length;
        String hexcode="";
        for (int i=0;i<codelen;i++) {
            if (i % 2 == 0) {hexcode=hexcode+"\\x";}
            String bytestr="00"+Integer.toHexString(Chinesecodearry[i] & 0xff);
            hexcode=hexcode+ bytestr.substring(bytestr.length() -2,bytestr.length());
        }
        return hexcode;
    }
}

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

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

相关文章

Java-day07(面向对象-3,4)

继承 将多个类中共有的属性&#xff0c;方法剥离出来单独创建一个共有类&#xff0c;当需要使用共有的属性与方法时&#xff0c;就可以通过继承(extends)来调用共有的属性与方法。通过"class A extends B" 来实现类的继承&#xff08;子类&#xff1a;A 父类&#x…

手把手教你 使用SpringBoot 实现业务数据动态脱敏

文章目录 什么是数据脱敏静态数据脱敏动态数据脱敏 需求实现1. 切面AOP实现脱敏是否脱敏注解定义切入点测试单条记录结果多条记录结果分页记录结果 2. 自定义注解和自定义消息转换器实现数据脱敏自定义DataDesensitization注解定义脱敏类型枚举实现AnnotationFormatterFactory接…

SAP度量单位转换功能

针对今天N2项目提出业务痛点&#xff1a;物料30011110的基本单位是KG&#xff0c;在XXX的BOM里单位是G&#xff0c;由于物料没配单位转换关系&#xff0c;但系统又能正常进行转换&#xff0c;开发需要技术支持。 经专项调查&#xff0c;G和KG的转换是SAP相同量纲转换标准功能&…

econml双机器学习实现连续干预和预测

连续干预 在这个示例中&#xff0c;我们使用LinearDML模型&#xff0c;使用随机森林回归模型来估计因果效应。我们首先模拟数据&#xff0c;然后模型&#xff0c;并使用方法来effect创建不同干预值下的效应&#xff08;Conditional Average Treatment Effect&#xff0c;CATE&…

现在转行搞嵌入式找工作难不难啊?

对于应届生来说&#xff0c;嵌入式开发的经验不会有太多&#xff0c;所以要求也不会太高。 嵌入式开发常用的是C语言&#xff0c;所以需要你有扎实的功底&#xff0c;这一点很重要&#xff0c;数据结构算法&#xff0c;指针&#xff0c;函数&#xff0c;网络编程 有了上面的基…

微服务——数据同步

问题分析 mysql和redis之间有数据同步问题&#xff0c;ES和mysql之间也有数据同步问题。 单体项目可以在crud时就直接去修改&#xff0c;但在微服务里面不同的服务不行。 方案一 方案二 方案三 总结 导入酒店管理项目 倒入完成功启动后可以看见数据成功获取到了 声明队列和…

word横向页面侧面页码设置及转pdf后横线变竖线的解决方案

在处理材料的时候&#xff0c;会遇到同一个文档里自某一页开始&#xff0c;页面布局是横向的&#xff0c;这时候页码要设置在侧面&#xff0c;方法是双击页脚&#xff0c;然后在word工具栏上选择“插入”——>“文本框”——>“绘制竖版文本框”&#xff0c;然后在页面左…

Air001基于Arduino点灯实验

Air001基于Arduino点灯实验 &#x1f449;&#x1f3fb;Arduino平台环境搭建可以参考&#xff1a;https://wiki.luatos.com/chips/air001/Air001-Arduino.html &#x1f516;使用国内的json&#xff0c;安装不仅成功率高还非常的快速。&#xff08;当然取决于个人网络环境&…

Windows安装Redis

自己电脑做个测试&#xff0c;需要用到Redis&#xff0c;把安装过程记录下&#xff0c;方便有需要的人 1、找到下载地址&#xff1a;Releases microsoftarchive/redis GitHub Windows的Redis需要到GitHub上下载&#xff1a; 2、下载完后设置密码&#xff0c;打开文件夹&…

RemObjects Suite Subscription for Delphi Crack

RemObjects Suite Subscription for Delphi Crack Delphi的RemObjects套件订阅提供了一种方便且经济高效的方式&#xff0c;可以随时了解所有RemObjects Delphi产品的最新情况。它允许您访问所有当前和即将推出的产品&#xff0c;而不必担心错过重要的更新或新产品。当您的平台…

医院智慧运营管理数字化方案

近年来&#xff0c;随着医院的发展规模不断扩大&#xff0c;其人、财、物、技术等资源的配置活动愈加复杂&#xff0c;资产管理、成本管理、收支核算管理、资金预算管理、绩效管理等经济活动日常管理也日益繁重&#xff0c;医院对于数字化提升精细化管理的需求也愈发迫切。 国…

块、行内块水平垂直居中

1.定位实现水平垂直居中 <div class"outer"><div class"test inner1">定位实现水平垂直居中</div></div><style>.outer {width: 300px;height: 300px;border: 1px solid gray;margin: 100px auto 0;position: relative;}.te…

DeepSort算法简介

SORT算法 SORT(Simple Online and Realtime Tracking)算法是一种目标追踪算法&#xff0c;其简单有效&#xff0c;基于IOU来匹配&#xff0c;并且融入了卡尔曼滤波和匈牙利算法来降低ID Switch(可以说&#xff0c;追踪算法的目标只有两个&#xff1a;1.提高速度 2.降低ID Swit…

JMeter有对手了?RunnerGo这些功能真不错!

当谈到对于性能测试的需求时&#xff0c;JMeter和RunnerGo在测试场景设置、执行性能测试、性能测试结果分析等方面都提供了很多功能&#xff0c;但两个工具仍然存在一些区别。以下是详细的比较分析&#xff1a; 层次分明的模块化设计告别文件管理混乱&#xff1a; JMeter的设…

SpringBoot异步框架

参考&#xff1a;解剖SpringBoot异步线程池框架_哔哩哔哩_bilibili 1、 为什么要用异步框架&#xff0c;它解决什么问题&#xff1f; 在SpringBoot的日常开发中&#xff0c;一般都是同步调用的。但经常有特殊业务需要做异步来处理&#xff0c;例如&#xff1a;注册新用户&…

idea找不到DataBase

一、我想把数据库跟我的idea链接&#xff0c;结果发现找不到。如图。 二、解决方案 找到 file ---setting 找到plugin------找到marketplace 我的已经出现了

贪心-leetcode409最长回文串

贪心-leetcode409最长回文串 思考&#xff1a; 总的思路&#xff1a;从数字中选择个数是偶数的去union&#xff0c;最后如果有过奇数则多union一个作为中心&#xff1b;从数组中select然后feasible是如果该数字为偶数则union到两边&#xff0c;如果为奇数则按照偶数处理再给中…

Java版企业电子招标采购系统源码—企业战略布局下的采购寻源tbms

​ 项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以…

分布式 - 消息队列Kafka:Kafka生产者发送消息的分区策略

文章目录 1. PartitionInfo 分区源码2. Partitioner 分区器接口源码3. 自定义分区策略4. 轮询策略 RoundRobinPartitioner5. 黏性分区策略 UniformStickyPartitioner6. hash分区策略7. 默认分区策略 DefaultPartitioner 分区的作用就是提供负载均衡的能力&#xff0c;或者说对数…

【Shell编程】Linux Shell编程入门:输入输出、变量、条件判断、函数和运算

在Linux操作系统中&#xff0c;Shell编程是一项非常重要的技能。通过Shell编程&#xff0c;我们可以自动化执行各种任务&#xff0c;提高工作效率。无论是系统管理、数据处理还是软件开发&#xff0c;都离不开Shell脚本的应用。本篇博客将带领大家深入了解Shell编程的基础知识&…