`

网页上Applet用javacomm20读取客户端串口

    博客分类:
  • Java
 
阅读更多
public class SerialHandleBean implements SerialPortEventListener
{
	CommPortIdentifier portId;
	SerialPort serialPort;
	private OutputStream out;
	private InputStream in;
	String Buf=null;// 缓存一条最新信息
	boolean hasData=false;// 标志有无新数据
	Thread readThread;
	static { 
		System.setSecurityManager(null);
	}
	private static SerialHandleBean serialBean=new SerialHandleBean();
	private SerialHandleBean()
	{
		
	}
	public static SerialHandleBean getInstance(){
		if (serialBean==null) {
			return new SerialHandleBean();
		}else{
			return serialBean;
		}
	}

	public int initialize(String portName, int baud) {
		int InitSuccess = 1;
		int InitFail = -1;

		try {
			portId = CommPortIdentifier.getPortIdentifier(portName);
			serialPort = (SerialPort) portId.open(portId.getName(), 1000);
			
			serialPort.addEventListener(this);
			serialPort.notifyOnDataAvailable(true);
			serialPort .notifyOnBreakInterrupt(true);
			in = serialPort.getInputStream();
			out = serialPort.getOutputStream();
			serialPort.setSerialPortParams(baud, SerialPort.DATABITS_8,
			SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
			
		} catch (PortInUseException e) {
			System.out.println("端口已经被占用!");
			e.printStackTrace();
			return InitFail;
		} catch (TooManyListenersException e) {
			System.out.println("端口监听者过多!");
			e.printStackTrace();
			return InitFail;
		} catch (UnsupportedCommOperationException e) {
			System.out.println("端口操作命令不支持!");
			e.printStackTrace();
			return InitFail;
		} catch (NoSuchPortException e) {
			System.out.println("端口不存在!");
			e.printStackTrace();
			return InitFail;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return InitSuccess;
	}
	
	public boolean hasData()
	{
		return hasData;
	}
	public String ReadPort()
	{
		if(hasData)
		{
			this.hasData=false;
			return this.Buf;
		}
		else
			return null;
	}
	public  void writeln(String command) throws Exception {
		out.write(hexStringToBytes(command));
		out.flush();
	}
	
	public  byte[] hexStringToBytes(String hexString) {  
	    if (hexString == null || hexString.equals("")) {  
	        return null;  
	    }  
	    hexString = hexString.toUpperCase();  
	    int length = hexString.length() / 2;  
	    char[] hexChars = hexString.toCharArray();  
	    byte[] d = new byte[length];  
	    for (int i = 0; i < length; i++) {  
	        int pos = i * 2;  
	        d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));  
	    }  
	    return d;  
	}  
	/** 
	 * Convert char to byte 
	 * @param c char 
	 * @return byte 
	 */  
	 private byte charToByte(char c) {  
	    return (byte) "0123456789ABCDEF".indexOf(c);  
	}  
	 //打印
	 public static void printHexString( byte[] b) {    
		   for (int i = 0; i < b.length; i++) {   
		     String hex = Integer.toHexString(b[i] & 0xFF);   
		     if (hex.length() == 1) {   
		       hex = '0' + hex;   
		     }   
		     System.out.print(hex.toUpperCase() );   
		   }   
		  
		}  
	public void ClosePort()
	{
		if(readThread!=null	)
			try {
				readThread.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		if(serialPort!=null)
			serialPort.close();
	}
	public String readResult()
	{
		String buf=null;
		try {
			while(in.available()>0)
			{
				buf=Integer.toHexString(in.read());
			}
			return buf;
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return buf;
	}
	public void serialEvent(SerialPortEvent event) {
		/**
		 * 事件类型:
		 * 
		 * BI -通讯中断.    CD -载波检测.    CTS -清除发送.    DATA_AVAILABLE -有数据到达.   
		 * DSR-数据设备准备好.    FE -帧错误.    OE -溢位错误.    OUTPUT_BUFFER_EMPTY
		 * -输出缓冲区已清空.    PE -奇偶校验错. RI - 振铃指示.
		 */
		switch(event.getEventType())
		{
			case SerialPortEvent.BI:
			case SerialPortEvent.OE:
			case SerialPortEvent.FE:
			case SerialPortEvent.PE:
			case SerialPortEvent.CD:
			case SerialPortEvent.CTS:
			case SerialPortEvent.DSR:
			case SerialPortEvent.RI:
			case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
				break;
			case SerialPortEvent.DATA_AVAILABLE:
				break;
		}
	}
	public OutputStream getOut() {
		return out;
	}

	public void setOut(OutputStream out) {
		this.out = out;
	}

	public InputStream getIn() {
		return in;
	}

	public void setIn(InputStream in) {
		this.in = in;
	}
	//调试用
	/*public static void main(String[] args) throws Exception {
		int i=0;
		SerialHandleBean serialBean=SerialHandleBean.getInstance();
		if (serialBean.initialize("COM1",38400)==1) {
			serialBean.writeln("aa");//22.548272,113.936916
			while(true){
				String result=serialBean.readResult();
				if (result!=null) {
					result=result.toUpperCase();
					if (result.equals("FF")) {
						System.out.println("successed!");
						serialBean.ClosePort();
						break;
					}else if(result.equals("F0")){
						System.out.println("failed!");
						serialBean.ClosePort();
						break;
					}
				}else{
					if (i==10) {
						serialBean.ClosePort();
						break;
					}
					Thread.sleep(1000);
					System.out.println("等待返回数据... "+i+" s");
					i++;
				}
			}
		}else{
			System.out.println("初始化失败!");
		}
	}*/
}
 
public class ListenApplet extends Applet {
	private static final long serialVersionUID = 4886560884272088075L;
	private SerialHandleBean serialBean;
	private String info;
	@Override
	public void init() {
		this.serialBean =SerialHandleBean.getInstance();
		if (serialBean.initialize("COM1",38400)==1) {
			info="Y";
		}else{
			info="N";
		}
	}
	public void paint(Graphics g){
    }
	public String writeSerial(String command){
		int i=0;
		String handleResult="";
		try {
			if (info.equals("Y")) {
				serialBean.writeln(command);
				while (true) {//114022936 25364861
					String result=serialBean.readResult();
					if (result!=null) {
						result=result.toUpperCase();
						if (result.equals("FF")) {
							handleResult="Y";
							System.out.println("successed!");
							serialBean.writeln("55");
							break;
						}else if(result.equals("F0")){
							handleResult="F";
							serialBean.writeln("55");
							System.out.println("failed!");
							break;
						}
					}else{
						if (i==10) {
							System.out.println("无法解码!解除状态!");
							serialBean.writeln("55");
							handleResult="S";
							break;
						}
						Thread.sleep(1000);
						i++;
						System.out.println("listening... "+i+" s");
					}
				}
				return handleResult;
			}else if(info.equals("N")){
				serialBean.ClosePort();
				init();
				System.out.println("未启动");
				return "N";
			}else{
				serialBean.ClosePort();
				init();
				System.out.println("info is null!");
				return "N";
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "N";
	}
	public String readSerial(){
		try {
			String result=serialBean.readResult();
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "N";
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	public SerialHandleBean getSerialBean() {
		return serialBean;
	}
	public void setSerialBean(SerialHandleBean serialBean) {
		this.serialBean = serialBean;
	}
}

 

客户端浏览器需要jre环境

生成证书及签名

请在命令行环境下执行以下的命令:
1、keytool -genkey -keystore command.store -alias command

2、keytool -export -keystore command.store -alias command-file command.cert

3、jarsigner -keystore command.store applet.jar command

修改${java.home}/jre/lib/security目录下的java.security,在下面添写第三行

policy.url.3=file:c: /admin/applet.policy

 

以上很初略的代码。

分享到:
评论
1 楼 rinniclyks 2013-02-25  
谢谢分享,这个对我来说很用,下午我试试看

相关推荐

    Applet读取客户端串口数据实例

    Applet是一种可嵌入到网页中的小型Java应用程序,能够在客户端浏览器中运行。这种特性使得Applet非常适合于读取客户端本地资源,如串口数据,而无需安装额外的软件。 #### 二、准备工作与环境搭建 在开始编写Applet...

    网页java applet串口通信读取RFID电子标签读写

    Java Applet串口通信允许Applet与本地计算机的硬件设备进行交互,如通过串行端口与RFID读卡器建立连接,从而读取或写入RFID标签的信息。 RFID技术是一种无线通信技术,它通过无线电频率信号识别特定目标并读写相关...

    利用comm.jar开发包实现Java与单片机全双工串口通信核心分析.pdf

    在本篇文章中,作者李佳宁和陈旭详细探讨了如何使用comm.jar开发包实现Java与单片机之间的全双工串口通信。全双工串口通信指的是可以在两个方向上同时传输数据,既可发送也可接收数据,这在实时性要求较高的应用中尤...

    java串口通信详解

    需要注意的是,在网络应用程序中使用串口API时可能会遇到更复杂的配置问题,例如Applet在网页上使用javacomm20读取客户端串口的情况,这些问题需要额外的研究和调试。 #### 2. 串口API概览 ##### 2.1 javax.comm....

    Java串口通信详解

    在实际应用中,可能会遇到跨平台兼容性问题,尤其是在Web应用程序或Applet中使用Java串口API时。解决这类问题通常需要深入了解操作系统和Java虚拟机的交互,以及对网络通信的理解。 总的来说,Java串口通信涉及的...

    java读写串口的资料

    在Java中,通过Java Communications API(Java Comm API)或第三方库如RXTX,我们可以实现对串口的操作。 1. **Java Communications API**:这是Java标准版(Java SE)的一部分,提供了一组接口和类来支持串口通信...

    win32comm.dll,comm.jar,javax.comm. properties

    以下将详细讲解“win32comm.dll”,“comm.jar”以及“javax.comm.properties”这三个关键元素,并介绍如何在Java Applet中使用它们来实现串口通信。 首先,"win32comm.dll"是Windows操作系统下的一个动态链接库...

    Java串口通信详解.doc

    Java串口通信是Java编程中实现设备间物理串行接口通信的一种技术。它在嵌入式系统、传感器网络以及PC与嵌入式设备交互等场景中广泛应用,特别是通过RS-232-C标准进行全双工通信。RS-232-C是一种广泛采用的串行通信...

    java串口通讯

    在某些情况下,可能需要使用IBM提供的`ibm-javacomm`包以获得更好的兼容性和性能。 在Java中实现串口通信时,通常会涉及到以下几个关键概念和步骤: 1. **获取串口标识符**: `CommPortIdentifier....

Global site tag (gtag.js) - Google Analytics