From 53954f959568d516fdfd51ec4b2b448dfacf63b9 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 7 Jun 2017 17:12:57 +0200 Subject: [PATCH] Modification serveur pour effectuer les mesures avec RssiSample plutot qu'avec des gaussiennes --- positioning_server.iml | 16 ++++++++++++++++ src/main/java/core/repository/RssiRecord.java | 35 ++++++++++++++++------------------- src/main/java/core/repository/TempRssi.java | 38 ++++++++++++++++++-------------------- src/main/java/core/service/PositioningService.java | 62 +++++++++++++++++++++++++++++++------------------------------- 4 files changed, 81 insertions(+), 70 deletions(-) diff --git a/positioning_server.iml b/positioning_server.iml index 27dda37..f89be75 100644 --- a/positioning_server.iml +++ b/positioning_server.iml @@ -47,5 +47,21 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/core/repository/RssiRecord.java b/src/main/java/core/repository/RssiRecord.java index 863a727..c96e09e 100644 --- a/src/main/java/core/repository/RssiRecord.java +++ b/src/main/java/core/repository/RssiRecord.java @@ -11,8 +11,7 @@ import java.io.Serializable; public class RssiRecord implements Serializable { @Id @GeneratedValue private int id; - - + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "id", nullable = false) private Location loc; @@ -21,17 +20,15 @@ public class RssiRecord implements Serializable { @JoinColumn(name = "id", nullable = false) private AccessPoint ap; - private Double avg; - private Double stdDev; + private Double val; public RssiRecord () { } - public RssiRecord(Location loc, AccessPoint ap, Double avg, Double stdDev){ + public RssiRecord(Location loc, AccessPoint ap, Double val){ this.loc = loc; this.ap = ap; - this.avg = avg; - this.stdDev = stdDev; + this.val = val; } public Location getLoc () { @@ -49,20 +46,20 @@ public class RssiRecord implements Serializable { public void setAp (final AccessPoint ap) { this.ap = ap; } - - public Double getAvg () { - return avg; + + public int getId() { + return id; } - - public void setAvg (final Double avg) { - this.avg = avg; + + public void setId(int id) { + this.id = id; } - - public Double getStdDev () { - return stdDev; + + public Double getVal() { + return val; } - - public void setStdDev (final Double stdDev) { - this.stdDev = stdDev; + + public void setVal(Double val) { + this.val = val; } } diff --git a/src/main/java/core/repository/TempRssi.java b/src/main/java/core/repository/TempRssi.java index 84688ed..6f648bd 100644 --- a/src/main/java/core/repository/TempRssi.java +++ b/src/main/java/core/repository/TempRssi.java @@ -16,18 +16,24 @@ public class TempRssi { private AccessPoint ap; private String client_mac_addr; - private Double avg, stdDev; + private Double val; public TempRssi () {} - public TempRssi (final AccessPoint accessPoint, final String clientMacAddr, final double avg, - final double stdDev) { + public TempRssi (final AccessPoint accessPoint, final String clientMacAddr, final double val) { ap = accessPoint; client_mac_addr = clientMacAddr; - this.avg = avg; - this.stdDev = stdDev; + this.val = val; } - + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + public AccessPoint getAp () { return ap; } @@ -43,20 +49,12 @@ public class TempRssi { public void setClient_mac_addr (final String client_mac_addr) { this.client_mac_addr = client_mac_addr; } - - public Double getAvg () { - return avg; - } - - public void setAvg (final Double avg) { - this.avg = avg; - } - - public Double getStdDev () { - return stdDev; + + public Double getVal() { + return val; } - - public void setStdDev (final Double stdDev) { - this.stdDev = stdDev; + + public void setVal(Double val) { + this.val = val; } } diff --git a/src/main/java/core/service/PositioningService.java b/src/main/java/core/service/PositioningService.java index 0a599cc..fb98d73 100644 --- a/src/main/java/core/service/PositioningService.java +++ b/src/main/java/core/service/PositioningService.java @@ -30,18 +30,19 @@ public class PositioningService { List clientRssi = hibDao.getTempRssi(debDao.getMacAddr(ipAddr)); if(clientRssi.size()>=3) { + Location bestLoc = null; - double bestLocProbability = -1; + double bestLocDistance = -1; + for (Location loc : hibDao.getLocations()) { //Liste des RSSISample pour une position donnée, chaque RSSISample étant //assossié à un AccessPoint List rssis = hibDao.getRssiRecord(loc.getId()); - - - double currentLocProbability = probability(clientRssi, rssis, DEFAULT_POSITIONING_PRECISION); - if (bestLocProbability == -1 || currentLocProbability > bestLocProbability) { + + double currentLocDistance = rssiDistance(clientRssi, rssis); + if (bestLocDistance == -1 || currentLocDistance < bestLocDistance) { bestLoc = loc; - bestLocProbability = currentLocProbability; + bestLocDistance = currentLocDistance; } } return bestLoc; @@ -49,52 +50,51 @@ public class PositioningService { return null; } - private double probability(List temps, List rssis, double precision){ + private double rssiDistance(List temps, List rssis){ try { - double probability = 1; + double distance = 0; for (TempRssi temp : temps) { RssiRecord rssi = find(temp.getAp().getMac_addr(), rssis); - probability*=gauss_probability(temp.getAvg(), temp.getStdDev(), rssi.getAvg(), rssi.getStdDev(), precision); + if(rssi!=null) + distance+=(temp.getVal()- rssi.getVal())*(temp.getVal()- rssi.getVal()); + else + distance+=(temp.getVal()+95)*(temp.getVal()+95); } - return probability; + + for(RssiRecord rssi : rssis){ + if(containsMacAddr(rssi.getAp().getMac_addr(), temps)) + distance+=(rssi.getVal()+95)*(rssi.getVal()+95); + } + + + return Math.sqrt(distance); }catch(IllegalArgumentException e){ e.printStackTrace(); return -1; } } - private double gauss_probability(double avg1, double std1, double avg2, double std2, double precision){ - final double - valDebut = Math.min(avg1-3*std1, avg2-3*std2), - valFin = Math.max(avg1+3*std1, avg2+3*std2); - double - rectDebut = valDebut, - rectFin = valDebut+precision, - probabilite = 0; - - do{ - probabilite+=Math.min( gauss(avg1, std1, (rectDebut+rectFin)/2), gauss(avg2, std2, (rectDebut+rectFin)/2)); - rectDebut = rectFin; - rectFin+=precision; - }while(rectFin rrs){ final List results = new ArrayList<>(); rrs.stream().filter(rr->rr.getAp().getMac_addr().equals(macAddr)).forEach(rr->results.add(rr)); switch(results.size()){ case 0: - throw new IllegalArgumentException("No matching RssiRecord for mac address <"+macAddr+">"); + return null; case 1: return results.get(0); default : throw new IllegalArgumentException("Several("+results.size()+") matching RssiRecord for mac address <"+macAddr+">"); } } + + private boolean containsMacAddr(String macAddr, List temps){ + for(TempRssi temp : temps){ + if(temp.getAp().getMac_addr().equals(macAddr)) + return true; + } + return false; + } public String getMacAddr (final String clientIpAddr) { return debDao.getMacAddr(clientIpAddr); -- libgit2 0.21.4