Commit 53954f959568d516fdfd51ec4b2b448dfacf63b9
1 parent
5f24440c
Modification serveur pour effectuer les mesures avec RssiSample plutot qu'avec des gaussiennes
Showing
4 changed files
with
81 additions
and
70 deletions
Show diff stats
positioning_server.iml
@@ -47,5 +47,21 @@ | @@ -47,5 +47,21 @@ | ||
47 | <orderEntry type="library" scope="RUNTIME" name="Maven: org.slf4j:slf4j-log4j12:1.5.8" level="project" /> | 47 | <orderEntry type="library" scope="RUNTIME" name="Maven: org.slf4j:slf4j-log4j12:1.5.8" level="project" /> |
48 | <orderEntry type="library" scope="RUNTIME" name="Maven: log4j:log4j:1.2.14" level="project" /> | 48 | <orderEntry type="library" scope="RUNTIME" name="Maven: log4j:log4j:1.2.14" level="project" /> |
49 | <orderEntry type="library" scope="RUNTIME" name="Maven: javassist:javassist:3.9.0.GA" level="project" /> | 49 | <orderEntry type="library" scope="RUNTIME" name="Maven: javassist:javassist:3.9.0.GA" level="project" /> |
50 | + <orderEntry type="library" scope="TEST" name="Maven: junit:junit:3.8.1" level="project" /> | ||
51 | + <orderEntry type="library" scope="PROVIDED" name="Maven: javax:javaee-web-api:6.0" level="project" /> | ||
52 | + <orderEntry type="library" name="Maven: org.postgresql:postgresql:9.4.1212" level="project" /> | ||
53 | + <orderEntry type="library" name="Maven: org.hibernate:hibernate-core:3.5.6-Final" level="project" /> | ||
54 | + <orderEntry type="library" name="Maven: antlr:antlr:2.7.6" level="project" /> | ||
55 | + <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.1" level="project" /> | ||
56 | + <orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" /> | ||
57 | + <orderEntry type="library" name="Maven: xml-apis:xml-apis:1.0.b2" level="project" /> | ||
58 | + <orderEntry type="library" name="Maven: javax.transaction:jta:1.1" level="project" /> | ||
59 | + <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.5.8" level="project" /> | ||
60 | + <orderEntry type="library" name="Maven: org.hibernate:hibernate-annotations:3.5.6-Final" level="project" /> | ||
61 | + <orderEntry type="library" name="Maven: org.hibernate:hibernate-commons-annotations:3.2.0.Final" level="project" /> | ||
62 | + <orderEntry type="library" name="Maven: org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final" level="project" /> | ||
63 | + <orderEntry type="library" scope="RUNTIME" name="Maven: org.slf4j:slf4j-log4j12:1.5.8" level="project" /> | ||
64 | + <orderEntry type="library" scope="RUNTIME" name="Maven: log4j:log4j:1.2.14" level="project" /> | ||
65 | + <orderEntry type="library" scope="RUNTIME" name="Maven: javassist:javassist:3.9.0.GA" level="project" /> | ||
50 | </component> | 66 | </component> |
51 | </module> | 67 | </module> |
52 | \ No newline at end of file | 68 | \ No newline at end of file |
src/main/java/core/repository/RssiRecord.java
@@ -11,8 +11,7 @@ import java.io.Serializable; | @@ -11,8 +11,7 @@ import java.io.Serializable; | ||
11 | public class RssiRecord implements Serializable { | 11 | public class RssiRecord implements Serializable { |
12 | @Id @GeneratedValue | 12 | @Id @GeneratedValue |
13 | private int id; | 13 | private int id; |
14 | - | ||
15 | - | 14 | + |
16 | @OneToOne(fetch = FetchType.LAZY) | 15 | @OneToOne(fetch = FetchType.LAZY) |
17 | @JoinColumn(name = "id", nullable = false) | 16 | @JoinColumn(name = "id", nullable = false) |
18 | private Location loc; | 17 | private Location loc; |
@@ -21,17 +20,15 @@ public class RssiRecord implements Serializable { | @@ -21,17 +20,15 @@ public class RssiRecord implements Serializable { | ||
21 | @JoinColumn(name = "id", nullable = false) | 20 | @JoinColumn(name = "id", nullable = false) |
22 | private AccessPoint ap; | 21 | private AccessPoint ap; |
23 | 22 | ||
24 | - private Double avg; | ||
25 | - private Double stdDev; | 23 | + private Double val; |
26 | 24 | ||
27 | public RssiRecord () { | 25 | public RssiRecord () { |
28 | } | 26 | } |
29 | 27 | ||
30 | - public RssiRecord(Location loc, AccessPoint ap, Double avg, Double stdDev){ | 28 | + public RssiRecord(Location loc, AccessPoint ap, Double val){ |
31 | this.loc = loc; | 29 | this.loc = loc; |
32 | this.ap = ap; | 30 | this.ap = ap; |
33 | - this.avg = avg; | ||
34 | - this.stdDev = stdDev; | 31 | + this.val = val; |
35 | } | 32 | } |
36 | 33 | ||
37 | public Location getLoc () { | 34 | public Location getLoc () { |
@@ -49,20 +46,20 @@ public class RssiRecord implements Serializable { | @@ -49,20 +46,20 @@ public class RssiRecord implements Serializable { | ||
49 | public void setAp (final AccessPoint ap) { | 46 | public void setAp (final AccessPoint ap) { |
50 | this.ap = ap; | 47 | this.ap = ap; |
51 | } | 48 | } |
52 | - | ||
53 | - public Double getAvg () { | ||
54 | - return avg; | 49 | + |
50 | + public int getId() { | ||
51 | + return id; | ||
55 | } | 52 | } |
56 | - | ||
57 | - public void setAvg (final Double avg) { | ||
58 | - this.avg = avg; | 53 | + |
54 | + public void setId(int id) { | ||
55 | + this.id = id; | ||
59 | } | 56 | } |
60 | - | ||
61 | - public Double getStdDev () { | ||
62 | - return stdDev; | 57 | + |
58 | + public Double getVal() { | ||
59 | + return val; | ||
63 | } | 60 | } |
64 | - | ||
65 | - public void setStdDev (final Double stdDev) { | ||
66 | - this.stdDev = stdDev; | 61 | + |
62 | + public void setVal(Double val) { | ||
63 | + this.val = val; | ||
67 | } | 64 | } |
68 | } | 65 | } |
src/main/java/core/repository/TempRssi.java
@@ -16,18 +16,24 @@ public class TempRssi { | @@ -16,18 +16,24 @@ public class TempRssi { | ||
16 | private AccessPoint ap; | 16 | private AccessPoint ap; |
17 | 17 | ||
18 | private String client_mac_addr; | 18 | private String client_mac_addr; |
19 | - private Double avg, stdDev; | 19 | + private Double val; |
20 | 20 | ||
21 | public TempRssi () {} | 21 | public TempRssi () {} |
22 | 22 | ||
23 | - public TempRssi (final AccessPoint accessPoint, final String clientMacAddr, final double avg, | ||
24 | - final double stdDev) { | 23 | + public TempRssi (final AccessPoint accessPoint, final String clientMacAddr, final double val) { |
25 | ap = accessPoint; | 24 | ap = accessPoint; |
26 | client_mac_addr = clientMacAddr; | 25 | client_mac_addr = clientMacAddr; |
27 | - this.avg = avg; | ||
28 | - this.stdDev = stdDev; | 26 | + this.val = val; |
29 | } | 27 | } |
30 | - | 28 | + |
29 | + public int getId() { | ||
30 | + return id; | ||
31 | + } | ||
32 | + | ||
33 | + public void setId(int id) { | ||
34 | + this.id = id; | ||
35 | + } | ||
36 | + | ||
31 | public AccessPoint getAp () { | 37 | public AccessPoint getAp () { |
32 | return ap; | 38 | return ap; |
33 | } | 39 | } |
@@ -43,20 +49,12 @@ public class TempRssi { | @@ -43,20 +49,12 @@ public class TempRssi { | ||
43 | public void setClient_mac_addr (final String client_mac_addr) { | 49 | public void setClient_mac_addr (final String client_mac_addr) { |
44 | this.client_mac_addr = client_mac_addr; | 50 | this.client_mac_addr = client_mac_addr; |
45 | } | 51 | } |
46 | - | ||
47 | - public Double getAvg () { | ||
48 | - return avg; | ||
49 | - } | ||
50 | - | ||
51 | - public void setAvg (final Double avg) { | ||
52 | - this.avg = avg; | ||
53 | - } | ||
54 | - | ||
55 | - public Double getStdDev () { | ||
56 | - return stdDev; | 52 | + |
53 | + public Double getVal() { | ||
54 | + return val; | ||
57 | } | 55 | } |
58 | - | ||
59 | - public void setStdDev (final Double stdDev) { | ||
60 | - this.stdDev = stdDev; | 56 | + |
57 | + public void setVal(Double val) { | ||
58 | + this.val = val; | ||
61 | } | 59 | } |
62 | } | 60 | } |
src/main/java/core/service/PositioningService.java
@@ -30,18 +30,19 @@ public class PositioningService { | @@ -30,18 +30,19 @@ public class PositioningService { | ||
30 | List<TempRssi> clientRssi = hibDao.getTempRssi(debDao.getMacAddr(ipAddr)); | 30 | List<TempRssi> clientRssi = hibDao.getTempRssi(debDao.getMacAddr(ipAddr)); |
31 | 31 | ||
32 | if(clientRssi.size()>=3) { | 32 | if(clientRssi.size()>=3) { |
33 | + | ||
33 | Location bestLoc = null; | 34 | Location bestLoc = null; |
34 | - double bestLocProbability = -1; | 35 | + double bestLocDistance = -1; |
36 | + | ||
35 | for (Location loc : hibDao.getLocations()) { | 37 | for (Location loc : hibDao.getLocations()) { |
36 | //Liste des RSSISample pour une position donnรฉe, chaque RSSISample รฉtant | 38 | //Liste des RSSISample pour une position donnรฉe, chaque RSSISample รฉtant |
37 | //assossiรฉ ร un AccessPoint | 39 | //assossiรฉ ร un AccessPoint |
38 | List<RssiRecord> rssis = hibDao.getRssiRecord(loc.getId()); | 40 | List<RssiRecord> rssis = hibDao.getRssiRecord(loc.getId()); |
39 | - | ||
40 | - | ||
41 | - double currentLocProbability = probability(clientRssi, rssis, DEFAULT_POSITIONING_PRECISION); | ||
42 | - if (bestLocProbability == -1 || currentLocProbability > bestLocProbability) { | 41 | + |
42 | + double currentLocDistance = rssiDistance(clientRssi, rssis); | ||
43 | + if (bestLocDistance == -1 || currentLocDistance < bestLocDistance) { | ||
43 | bestLoc = loc; | 44 | bestLoc = loc; |
44 | - bestLocProbability = currentLocProbability; | 45 | + bestLocDistance = currentLocDistance; |
45 | } | 46 | } |
46 | } | 47 | } |
47 | return bestLoc; | 48 | return bestLoc; |
@@ -49,52 +50,51 @@ public class PositioningService { | @@ -49,52 +50,51 @@ public class PositioningService { | ||
49 | return null; | 50 | return null; |
50 | } | 51 | } |
51 | 52 | ||
52 | - private double probability(List<TempRssi> temps, List<RssiRecord> rssis, double precision){ | 53 | + private double rssiDistance(List<TempRssi> temps, List<RssiRecord> rssis){ |
53 | try { | 54 | try { |
54 | - double probability = 1; | 55 | + double distance = 0; |
55 | for (TempRssi temp : temps) { | 56 | for (TempRssi temp : temps) { |
56 | RssiRecord rssi = find(temp.getAp().getMac_addr(), rssis); | 57 | RssiRecord rssi = find(temp.getAp().getMac_addr(), rssis); |
57 | - probability*=gauss_probability(temp.getAvg(), temp.getStdDev(), rssi.getAvg(), rssi.getStdDev(), precision); | 58 | + if(rssi!=null) |
59 | + distance+=(temp.getVal()- rssi.getVal())*(temp.getVal()- rssi.getVal()); | ||
60 | + else | ||
61 | + distance+=(temp.getVal()+95)*(temp.getVal()+95); | ||
58 | } | 62 | } |
59 | - return probability; | 63 | + |
64 | + for(RssiRecord rssi : rssis){ | ||
65 | + if(containsMacAddr(rssi.getAp().getMac_addr(), temps)) | ||
66 | + distance+=(rssi.getVal()+95)*(rssi.getVal()+95); | ||
67 | + } | ||
68 | + | ||
69 | + | ||
70 | + return Math.sqrt(distance); | ||
60 | }catch(IllegalArgumentException e){ | 71 | }catch(IllegalArgumentException e){ |
61 | e.printStackTrace(); | 72 | e.printStackTrace(); |
62 | return -1; | 73 | return -1; |
63 | } | 74 | } |
64 | } | 75 | } |
65 | - private double gauss_probability(double avg1, double std1, double avg2, double std2, double precision){ | ||
66 | - final double | ||
67 | - valDebut = Math.min(avg1-3*std1, avg2-3*std2), | ||
68 | - valFin = Math.max(avg1+3*std1, avg2+3*std2); | ||
69 | - double | ||
70 | - rectDebut = valDebut, | ||
71 | - rectFin = valDebut+precision, | ||
72 | - probabilite = 0; | ||
73 | - | ||
74 | - do{ | ||
75 | - probabilite+=Math.min( gauss(avg1, std1, (rectDebut+rectFin)/2), gauss(avg2, std2, (rectDebut+rectFin)/2)); | ||
76 | - rectDebut = rectFin; | ||
77 | - rectFin+=precision; | ||
78 | - }while(rectFin<valFin); | ||
79 | - | ||
80 | - return probabilite; | ||
81 | - } | ||
82 | - private double gauss (final double avg, final double std, final double x) { | ||
83 | - return (1/(std*Math.sqrt(2*Math.PI)))*Math.exp(-(Math.pow(x-avg, 2)/(2*Math.pow(std, 2)))); | ||
84 | - } | 76 | + |
85 | private RssiRecord find(String macAddr, List<RssiRecord> rrs){ | 77 | private RssiRecord find(String macAddr, List<RssiRecord> rrs){ |
86 | final List<RssiRecord> results = new ArrayList<>(); | 78 | final List<RssiRecord> results = new ArrayList<>(); |
87 | rrs.stream().filter(rr->rr.getAp().getMac_addr().equals(macAddr)).forEach(rr->results.add(rr)); | 79 | rrs.stream().filter(rr->rr.getAp().getMac_addr().equals(macAddr)).forEach(rr->results.add(rr)); |
88 | 80 | ||
89 | switch(results.size()){ | 81 | switch(results.size()){ |
90 | case 0: | 82 | case 0: |
91 | - throw new IllegalArgumentException("No matching RssiRecord for mac address <"+macAddr+">"); | 83 | + return null; |
92 | case 1: | 84 | case 1: |
93 | return results.get(0); | 85 | return results.get(0); |
94 | default : | 86 | default : |
95 | throw new IllegalArgumentException("Several("+results.size()+") matching RssiRecord for mac address <"+macAddr+">"); | 87 | throw new IllegalArgumentException("Several("+results.size()+") matching RssiRecord for mac address <"+macAddr+">"); |
96 | } | 88 | } |
97 | } | 89 | } |
90 | + | ||
91 | + private boolean containsMacAddr(String macAddr, List<TempRssi> temps){ | ||
92 | + for(TempRssi temp : temps){ | ||
93 | + if(temp.getAp().getMac_addr().equals(macAddr)) | ||
94 | + return true; | ||
95 | + } | ||
96 | + return false; | ||
97 | + } | ||
98 | 98 | ||
99 | public String getMacAddr (final String clientIpAddr) { | 99 | public String getMacAddr (final String clientIpAddr) { |
100 | return debDao.getMacAddr(clientIpAddr); | 100 | return debDao.getMacAddr(clientIpAddr); |