1.Library:RXTXComm.jar
/*
* GPSSerialPortScaner.java
* Copyright (C) 2009 <JustinLei@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
package org.lambdasoft.serial.gps;
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;
import java.io.InputStream;
import java.util.Enumeration;
import org.lambdasoft.ui.dialog.BubbleDialog;
import org.lambdasoft.ui.systray.statusbar.StatusBar;
import org.lambdasoft.util.StringUtils;
/**
* @author lei.tang (justinlei@gmail.com)
* @date 2010-3-8
* @version
*/
public class GPSSerialPortScaner {
private static GPSSerialPortScaner finder;
private static final int SCANTIME = 2000;
private static final int[] PORTSPEED = new int[]{4800,9600};
private GPSSerialPortScaner() {}
public static GPSSerialPortScaner getScaner() {
if(finder == null)
finder = new GPSSerialPortScaner();
return finder;
}
public String scan() {
BubbleDialog.getBubble().display("GPS设备自动搜索中",false,false);
for (int speed : PORTSPEED) {
String port = scan(speed);
if(StringUtils.isNotEmpty(port))
return port;
}
return null;
}
@SuppressWarnings("unchecked")
public String scan(Integer speed) {
StatusBar statusBar = StatusBar.getBar();
Enumeration<CommPortIdentifier> commons = CommPortIdentifier.getPortIdentifiers();
CommPortIdentifier com = null;
CommPort serialPort = null;
while (commons.hasMoreElements()) {
com = commons.nextElement();
if(statusBar != null)
statusBar.setGPSInfo("扫描GPS设备:" + com.getName() + " 扫描速率:" + speed);
try {
serialPort = com.open("PortOpener", 10);
} catch (PortInUseException piue) {
serialPort = null;
continue;
}
if (com.getPortType() == CommPortIdentifier.PORT_SERIAL) {
SerialPort sp = (SerialPort) serialPort;
try {
// Settings for B&G Hydra
sp.setSerialPortParams(speed.intValue(), SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException ucoe) {
serialPort = null;
continue;
}
}
try {
InputStream input = serialPort.getInputStream();
int readChar = -1;
long currentTime = System.currentTimeMillis();
while((System.currentTimeMillis() - currentTime) <= SCANTIME) {
if((readChar = input.read()) == -1) {
continue;
}
if((char)readChar == '$') {
StringBuilder builder = new StringBuilder();
for (int j = 0; j < 5; j++) {
builder.append((char)(input.read()));
}
String head = builder.toString();
if(head.equals("GPGGA")) {
serialPort.close();
if(statusBar != null) {
String successMsg = "GPS设备在端口" + com.getName() +"初始化成功,速率: " + speed;
BubbleDialog.getBubble().display(successMsg,false,true);
statusBar.setGPSInfo(successMsg);
}
return com.getName();
}
}
}
} catch (Exception e) {
return null;
}
serialPort.close();
}
if(serialPort != null)
serialPort.close();
return null;
}
}