消费机 水控机 售饭机 电梯门禁 门禁机
快速寻找产品(请输入产品型号或名称的关键词):
首页> 技术文档

技术文档

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

发布者:广州荣士电子有限公司         发布时间: 2023-8-9 


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


 
上一篇:Python 双门双向门禁控制板实时监控源码 下一篇:轻松读写NDEF标签
     
Guangzhou Rong Shi Electronics Co., Ltd., China 广州荣士电子有限公司 备案/许可证编号:粤ICP备11063836号
TEL  020-22307058    020-82301718
消费机
隐私政策

消费机 水控机 售饭机 电梯门禁 门禁机

网站地图 xml