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
以上很初略的代码。