⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oldplacelabstumblerlogspotter.java

📁 一个基于PlaceLab的室内和室外的智能导航系统
💻 JAVA
字号:
/* * Created on Jun 1, 2004 */package org.placelab.spotter;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.util.Calendar;import java.util.Date;import java.util.Hashtable;import java.util.SimpleTimeZone;import java.util.StringTokenizer;import java.util.Vector;import org.placelab.core.BeaconReading;import org.placelab.core.Coordinate;import org.placelab.core.Measurement;import org.placelab.core.StumblerMeasurement;import org.placelab.core.TwoDCoordinate;import org.placelab.core.Types;import org.placelab.core.WiFiReading;import org.placelab.util.Cmdline;import org.placelab.util.Logger;import org.placelab.util.NumUtil;import org.placelab.util.StringUtil;public class OldPlacelabStumblerLogSpotter extends LogSpotter {	private BufferedReader reader;	private Coordinate lastPos;	private long lastGPS;	private String filename;		private BeaconReading nextReading;	private long nextTs = -1;	private Vector v;	private int gpsThreshold = GPS_THRESHOLD;	public static int GPS_THRESHOLD = 5000;		public static boolean done = false;	public int lineNum = 0;		public OldPlacelabStumblerLogSpotter(String file) {		filename = file;	}	public void open() throws SpotterException {		try {			reader = new BufferedReader(new FileReader(filename));		} catch (FileNotFoundException e) {			throw new SpotterException(e);		}		//lastLat = lastLon = 0.0;		lastPos = TwoDCoordinate.NULL;		lastGPS = 0;		nextReading = null;		nextTs = -1;		v = new Vector();	}	public void close() {		if (reader != null) {			try {				reader.close();			} catch (IOException e) {			}			reader = null;		}	}	public void setGPSThreshold(int millis) { gpsThreshold = millis; }	public int getGPSThreshold() { return gpsThreshold; }		public Measurement getMeasurementFromLog() {	    long curTs = nextTs;		if (reader == null) {			done = true;		    return null;		}		if (nextReading != null) {			v.add(nextReading);		}		int version = 0;		String line = null;		while (true) {			try {				line = reader.readLine();				if (line == null) {					reader.close();					reader = null;					done = true;					WiFiReading wrs[] = new WiFiReading[v.size()];					for (int i=0; i<v.size(); i++) {						wrs[i] =(WiFiReading) v.get(i);					}					StumblerMeasurement sm = new StumblerMeasurement(curTs,							lastPos.createClone(),							wrs);					return sm;				}				lineNum++;				//System.out.println("line :" + line);								StringTokenizer st = new StringTokenizer(line);				if (st.countTokens() < 3)					continue;				String type = st.nextToken();				String stamp = st.nextToken();				if (type.equalsIgnoreCase("wifi")) {					String parse =						line.substring(line.indexOf('\t', "WIFI\tX".length()) + 1);										// backwards compatibility for pre-rewhack style logs					if(parse.startsWith("TIME")) {					    parse = parse.substring(parse.indexOf(' ', "TIME=X".length()) + 1);					}										int index = 0;										if(!parse.startsWith("BSSID = ")) {					    Logger.println("parse doesn't start with bssid", Logger.HIGH);					    continue;					}					parse = parse.substring("BSSID = ".length());					index = parse.indexOf(' ');					String bssid = parse.substring(0, index);					parse = parse.substring(index + 1);										if(!parse.startsWith("SSID = '")) {					    Logger.println("parse doesn't start with ssid", Logger.HIGH);					    continue;					}					parse = parse.substring("SSID = '".length());					//XXX: ugly hack for SSID like SSID = 'Stefan's Network', i am assuming 					//     the format of the following field of SSID is "' RSSID = " 					index = parse.indexOf("' RSSI = ");					//index = parse.indexOf('\'');					String ssid = parse.substring(0, index);					parse = parse.substring(index + 1);										if(!parse.startsWith(" RSSI = ")) {					    Logger.println("parse doesn't start with rssi", Logger.HIGH);					    continue;					}					parse = parse.substring(" RSSI = ".length());					index = parse.indexOf(' ');					String rssi = parse.substring(0, index);					parse = parse.substring(index + 1);															String[] junk = StringUtil.split(parse, ' ');					if(junk.length < 4) {					    Logger.println("bogus end junk length " + parse, Logger.HIGH);					    continue;					}					String wep = junk[1];					String inf = junk[3];										long timestamp = Long.parseLong(stamp);					if (timestamp > lastGPS + gpsThreshold)						lastPos = Types.newCoordinate();					//lastLat = lastLon = 0.0;					StumblerMeasurement sm = null;										WiFiReading newM = 					    new WiFiReading(bssid, ssid, Integer.parseInt(rssi), 					            wep.equalsIgnoreCase("true"),					            inf.equalsIgnoreCase("true"));					nextTs = timestamp;					if (curTs != nextTs) {						WiFiReading wrs[] = new WiFiReading[v.size()];						for (int i=0; i<v.size(); i++) {							wrs[i] =(WiFiReading) v.get(i);						}						nextReading = null;						sm = new StumblerMeasurement(curTs, lastPos.createClone(),wrs);//								new FloatTwoDCoordinate(CoordinateFrame.GPS,lastLat,lastLon),//								wrs);						v.clear();					}					v.add(newM);					if(sm != null) return sm;									} else if (type.equalsIgnoreCase("gps")) {					String parse = line.substring(line.indexOf('\t', "GPS\tX".length()) + 1);					String[] junk = StringUtil.split(parse, ' ');					Hashtable fields = new Hashtable();					for (int n = 0; n + 2 < junk.length; n += 3) {						fields.put(junk[n], junk[n + 2]);					}					// workarounds for various different log file versions below					String status = (String) fields.get("STATUS");					if(status == null) {					    status = (String)fields.get(NMEASentence.STATUS);					}										lastGPS = Long.parseLong(stamp);					Logger.println("LastGPS: " + stamp, Logger.HIGH);					if (status != null && status.equalsIgnoreCase("a")) {						String lat = (String) fields.get(NMEASentence.LATITUDE);						if(lat == null) {						    lat = (String)fields.get("LATITUDE");						}						String lon = (String) fields.get(NMEASentence.LONGITUDE);						if(lon == null) {						    lon = (String)fields.get("LONGITUDE");						}						String latHem = (String) fields.get(NMEASentence.LATITUDEHEMISPHERE);						if(latHem == null) {						    latHem = (String)fields.get("LATITUDEHEMISPHERE");						}						String lonHem = (String) fields.get(NMEASentence.LONGITUDEHEMISPHERE);						if(lonHem == null) {						    lonHem = (String)fields.get("LONGITUDEHEMISPHERE");						}						    						/*						lastLat =							fromNMEA(								Double.parseDouble(lat),								(String) fields.get("LATITUDEHEMISPHERE"));						lastLon =							fromNMEA(								Double.parseDouble(lon),								(String) fields.get("LONGITUDEHEMISPHERE"));						*/												lastPos=Types.newCoordinateFromNMEA(lat,latHem,lon,lonHem);												Logger.println("GPS lat: " + lastPos.getLatitudeAsString() + " lon: " + lastPos.getLongitudeAsString(), Logger.HIGH);					} else {					    Logger.println("GPS without fix", Logger.HIGH);					    lastPos = Types.newCoordinate(); // null by default						//lastLat = lastLon = 0.0;					}				}			} catch (Exception e) {				e.printStackTrace();				System.err.println("Error parsing line:" + line);			}		}	}		// This main will convert a placelab log format into netwstumbler's old format	public static void main(String args[]) {		Cmdline.parse(args);				String log = Cmdline.getArg("log");		String out = Cmdline.getArg("outputfile");		try {			OldPlacelabStumblerLogSpotter ps = 				new OldPlacelabStumblerLogSpotter(Cmdline.getArg("log"));			PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(Cmdline.getArg("outputfile"),false)));			try {				ps.open();			} catch (SpotterException e1) {				e1.printStackTrace();				return;			}		boolean headerPrinted = false;  							Calendar c = Calendar.getInstance(new SimpleTimeZone(0, "GMT"));			while (true) {				StumblerMeasurement sm=null;				try {					sm = (StumblerMeasurement)ps.getMeasurement();				} catch (SpotterException e2) {					e2.printStackTrace();					continue;				}				if(sm == null) {				    if(done) break;				    else continue;				}				Logger.println(Integer.toString(sm.numberOfReadings()), Logger.HIGH);				for (int i = 0; i < sm.numberOfReadings(); i++) {						WiFiReading wr = (WiFiReading)sm.getReading(i);						Date d = new Date(sm.getTimestamp());						c.setTime(d);						if (!headerPrinted) {							headerPrinted = true;														pw.println("# $Creator: Network Stumbler Version 0.3.30");							pw.println("# $Format: wi-scan with extensions");							pw.println("# Latitude\tLongitude\t( SSID )\tType\t( BSSID )\tTime (GMT)\t[ SNR Sig Noise ]\t# ( Name )\tFlags\tChannelbits\tBcnIntvl");							pw.println("# $DateGMT: " + c.get(Calendar.YEAR) + "-" + blah(c.get(Calendar.MONTH) + 1) + "-" + blah(c.get(Calendar.DAY_OF_MONTH)));						}						String sss;						if (wr.getRssi() == 0) {							sss = "[ 0 0 0]";						} else {							sss = "[ 10 " + (-wr.getRssi()) + " " + ((-wr.getRssi())-10) + " ]";						}						pw.println(						        //((TwoDCoordinate)sm.getPosition()).getLatitudeAsString() + "\t" +						        //((TwoDCoordinate)sm.getPosition()).getLongitudeAsString() + "\t" +							jingoLat(((TwoDCoordinate)sm.getPosition()).getLatitude()) + "\t" +							jingoLon(((TwoDCoordinate)sm.getPosition()).getLongitude()) + "\t" +							"( " + wr.getSsid() + " )" + "\t" + (wr.getIsInfrastructure() ? "BBS" : "adhoc") + 							"\t( " + wr.getBssid() + " )" + "\t" +							blah(c.get(Calendar.HOUR_OF_DAY)) + ":" + blah(c.get(Calendar.MINUTE)) + ":" + blah(c.get(Calendar.SECOND)) + " (GMT)" + "\t" +							sss + "\t" +							"# ( )" + "\t" +							"0051" + "\t" +							"0040" + "\t" +							"0");// N 55.8614150  W 4.2486717 ( bcwgroup )  BBS ( 00:41:05:cc:8d:9f ) 08:40:40 (GMT)  [ 0 0 0 ] # (  )  0051  0040  0				}				pw.flush();			} 		} catch (IOException e) {			System.err.println("error: " + e.getMessage());		}	}		public static String jingoLat(double d) {	    if(Double.isNaN(d)) {	        return "N " + "0.0";	    }		if (d < 0) {			return "S " + NumUtil.doubleToString(-d, 7);		} else {			return "N " + NumUtil.doubleToString(d, 7);		}	}	public static String jingoLon(double d) {	    if(Double.isNaN(d)) {	        return "E " + "0.0";	    }		if (d < 0) {			return "W " + NumUtil.doubleToString(-d, 7);		} else {			return "E " + NumUtil.doubleToString(d, 7);		}	}			public static String blah(int i) {		if (i >=10) {		  return "" + i;		} else {			return "0" + i;		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -