package com.servlet.debug; import java.io.IOException; import java.io.PrintWriter; import java.net.DatagramPacket; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.naming.NamingException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.servlet.utilities.Fingerprint; import com.servlet.utilities.Location; import com.servlet.utilities.QueryWithContext; import com.servlet.utilities.RssiSample; /** * Servlet implementation class PositioningServlet */ @WebServlet("/DebugServlet") public class DebugServlet extends HttpServlet { private static final long serialVersionUID = 1L; DatagramPacket packet; private float timeOut = 5.0f; private long start; private Map mapGotchas = new HashMap(); private ArrayList currentDevices = new ArrayList(); /** * @see HttpServlet#HttpServlet() */ public DebugServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: Positioning"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.addHeader("x", Double.toString(100)); response.addHeader("y", Double.toString(100)); response.addHeader("z", Double.toString(0)); System.out.println("receivedDEBUG"); } public Location computeLocation(ArrayList fingerprintsArray, RssiSample sample){ double x = 0; double y = 0; double z = 0; ArrayList fingerprints = findThreeNearestLocations(fingerprintsArray, sample); double w0, w1, w2; w0 = 1.0/rssi_distance(fingerprints.get(0).getMeasurement(), sample); w1 = 1.0/rssi_distance(fingerprints.get(1).getMeasurement(), sample); w2 = 1.0/rssi_distance(fingerprints.get(2).getMeasurement(), sample); x = fingerprints.get(0).getLocation().getX()*w0 + fingerprints.get(1).getLocation().getX()*w1 + fingerprints.get(2).getLocation().getX()*w2; y = fingerprints.get(0).getLocation().getY()*w0 + fingerprints.get(1).getLocation().getY()*w1 + fingerprints.get(2).getLocation().getY()*w2; return new Location(x,y,z); } public ArrayList findThreeNearestLocations(ArrayList fingerprints, RssiSample sample){ HashMap hm = new HashMap(); ArrayList fpsorted = new ArrayList(); for (Fingerprint fp : fingerprints){ double d = rssi_distance(fp.getMeasurement(), sample); hm.put(fp, d); } // Sort in decreasing order int count = 1; LinkedHashMap lhm = sortHashMapByValues(hm); for (Entry e : lhm.entrySet()){ fpsorted.add(e.getKey()); if (count == 3){ break; } count++; } return fpsorted; } public LinkedHashMap sortHashMapByValues( HashMap passedMap) { List mapKeys = new ArrayList(passedMap.keySet()); List mapValues = new ArrayList(passedMap.values()); Collections.sort(mapValues); LinkedHashMap sortedMap = new LinkedHashMap(); Iterator valueIt = mapValues.iterator(); while (valueIt.hasNext()) { double val = valueIt.next(); Iterator keyIt = mapKeys.iterator(); while (keyIt.hasNext()) { Fingerprint key = keyIt.next(); double comp1 = passedMap.get(key); double comp2 = val; if (comp1 == comp2) { keyIt.remove(); sortedMap.put(key, val); break; } } } return sortedMap; } public double rssi_distance(RssiSample s1, RssiSample s2){ double d = 0; for (Entry e : s1.getRssi().entrySet()){ if (s2.getRssi().containsKey(e.getKey())){ d += Math.pow(e.getValue() - s2.getRssi().get(e.getKey()), 2); } else { d += Math.pow(e.getValue() + 95, 2); } } for (Entry e : s2.getRssi().entrySet()){ if (!s1.getRssi().containsKey(e.getKey())){ d += Math.pow(e.getValue() + 95, 2); } } return Math.sqrt(d); } }