web.xml 配置listener实现RXTX串口通信(读卡器)

来源:互联网 发布:程序员个人简历范文 编辑:程序博客网 时间:2024/05/14 16:08

开发背景:监听读卡器获得刷卡卡号,判断卡号,实现对呀操作。
一、RXTX多线程获得读卡器信息。
1.1下载RXTXcomm,下载地址:http://rxtx.qbang.org/wiki/index.php/Download
这里写图片描述

1.2解压rxtx-2.2pre2-bins.zip;我们需要的是里面的
RXTXcomm.jar和win64下的rxtxSerial.dll两个文件;

1.3把rxtxSerial.dll文件放入C:\Windows\System32;

1.4把RXTXcomm.jar文件放到到%JAVA_HOME%\jre\lib\ext;
JAVA_HOME 的java版本以cmd>java -version 为准:
我目前使用过的jdk

这就是我目前使用的JDK,他和我环境变量里面配置的%JAVA_HOME%路径不一样,我的%JAVA_HOME%是JDK1.8;所以是以java -version下面的版本为主

2、编写监听代码,写成implements Runnable

import gnu.io.*;import java.io.IOException;import java.io.InputStream;import java.util.Enumeration;import java.util.TooManyListenersException;public class SerialPortReader implements Runnable,SerialPortEventListener {    private static final String DEMONAME = "串口测试";    /**     * 检测系统中可用的端口     */    private CommPortIdentifier portId;    /**     * 枚举类     */    private Enumeration portList;    /**     * 输入流     */    private static InputStream inputStream;    /**     * RS-232的串行口     */    private SerialPort serialPort;    /**     * 串口返回信息     */    private static String test = "";    int baudRate=57600;    /**     * 初始化     *     * @param     */    public void init() {        //获取系统中可用的端口        portList = CommPortIdentifier.getPortIdentifiers();        while (portList.hasMoreElements()) {            portId = (CommPortIdentifier) portList.nextElement();            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL && portId.getName().equals("COM4")) {                System.out.println("发现端口:"+portId.getName());                try {                    serialPort = (SerialPort) portId.open(DEMONAME,2000);                    //设置串口监听                    serialPort.addEventListener(new SerialPortReader());                    //设置开启监听                    serialPort.notifyOnDataAvailable(true);                    //设置波特率、数据位、停止位、检验位                    serialPort.setSerialPortParams(baudRate,                            SerialPort.DATABITS_8,                            SerialPort.STOPBITS_1,                            SerialPort.PARITY_NONE);                    //获取输入流                    inputStream = serialPort.getInputStream();                } catch (PortInUseException e) {                    e.printStackTrace();                } catch (TooManyListenersException e) {                    e.printStackTrace();                } catch (UnsupportedCommOperationException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    /**     * 监听函数     * @param serialPortEvent     */    public void serialEvent(SerialPortEvent serialPortEvent) {        switch (serialPortEvent.getEventType()) {            //获取到有效信息            case SerialPortEvent.DATA_AVAILABLE :                readComm();                close();                break;            default:                break;        }    }    /**     * 读取串口信息     */    private void readComm() {        byte[] readBuffer = new byte[18];        try {            int len = 0;            while ((len = inputStream.read(readBuffer)) != -1) {                test += new String(readBuffer,0, len).trim();                break;            }            System.out.println("读取的信息:"+printHexString(readBuffer));        } catch (IOException e) {            e.printStackTrace();        }    }    /**字节数组转16进制     * @param b     * @return     */    private String printHexString(byte[] b) {        StringBuffer sbf=new StringBuffer();        for (int i = 0; i < b.length; i++) {            String hex = Integer.toHexString(b[i] & 0xFF);            if (hex.length() == 1) {                hex = '0' + hex;            }            sbf.append(hex.toUpperCase()+"  ");        }        return sbf.toString().trim();    }    private void close() {        serialPort.close();    }    public void run() {        init();    }    public static void main(String[] args) {        Thread s = new Thread(new SerialPortReader());        s.start();    }}

注意:web.xml里面的现成不能带参数;

二、配置Listener
1、写SerialPortListener类实现ServletContextListener接口

package com.bm.controller.converter;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;public class SerialPortListener implements ServletContextListener {    public void contextInitialized(ServletContextEvent sce) {        System.out.println("SerialPortListener Startup!");        Thread s = new Thread(new SerialPortReader());        s.start();        System.out.println("SerialPortListener end....!");    }    public void contextDestroyed(ServletContextEvent sce) {    }}

2、配置Listener

<!--读卡器串口线程listener-->    <listener>      <listener- class>com.bm.controller.converter.SerialPortListener</listener-class>    </listener>

这里写图片描述

启动Tomcat;成功监听到串口数据!

原创粉丝点击