์ผ๋ง์ ์ ์ ๊ต์ก์ฉ ํ๋ธ๋ฆฟ ๋์ฌ ์ฌ์ ์ ํ๋ ๋ถ์ผ๋ก๋ถํฐ ์ฐ๋ฝ์ ๋ฐ์๋ค. ๊ต์ก์ฉ ํ๋ธ๋ฆฟ์ 3๊ฐ์ ๋์ ๋ฌด๋ฃ ์ฒดํํ ์ ์๊ฒ ์ ๊ณต ํ๋๋ฐ, ์ฒดํ ์๋ฃ ์ฆ์์ ํ๋ธ๋ฆฟ์ ์์ด๋ฒ๋ ธ๋ค๋ฉด์ ๋๋ ค์ฃผ์ง ์๋ ์ฌ๋์ด ์ ์ ๋์ด๋๊ณ ์์ด์ ๊ณ ๋ฏผ์ด๋ผ๊ณ . ๊ทผ๋ฐ, ์ ๋ง ๋ถ์ค์ ํ ๊ฑด์ง ์ผ๋ถ๋ฌ ๋๋ ค์ฃผ์ง ์๋ ๊ฒ์ธ์ง ์ ๊ธธ์ด ์๋ค๊ณ ํ๋ค. ํ๋ธ๋ฆฟ์ ์์น๋ง ์์๋ ์ง์์ฌ๋ถ๋ฅผ ์ ์ ์์ ๊ฒ ๊ฐ์๋ฐ GPS ๊ฐ ์์ด์ ์์น๋ฅผ ์ ๊ธธ์ด ์๋ค๊ณ ํ๋ค. ์ด๋ด ๋ ์ฌ์ฉ๋ ์ ์๋ ๊ธฐ์ ์ด WPS ์ธ ๊ฒ ๊ฐ๋ค.
WPS (WiFi Positioning System)์ ํ๋ธ๋ฆฟ๊ณผ ๊ฐ์ IoT ๊ธฐ๊ธฐ์ ์์น๋ฅผ ์ฃผ๋ณ WiFi AP ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ถ์ ํ๋ ๊ธฐ์ ์ด๋ค. ์๋๋ก์ด๋ ํฐ๊ณผ ๊ฐ์ ์ค๋งํธ ๊ธฐ๊ธฐ์์๋ ์ค๋ด์์๋ GPS ๋ก๋ถํฐ ์์น๋ฅผ ํ๋ํ ์ ์๊ธฐ ๋๋ฌธ์ WPS ๋ฅผ ํจ๊ป ์ฌ์ฉํด์ ์์น๋ฅผ ์ถ์ ํ๋ค. ์ด์ฏค์์ ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ ๊ถ๊ธ์ฆ์ด ์๊ธธ ๊ฒ์ด๋ค. WiFi AP์ ์์น๋ ์ด๋ป๊ฒ ์๊ณ ์์๊น?
War driving ์ด๋ผ๊ณ ๋ค์ด๋ณด์ จ๋์ง? ์ด๊ธฐ์๋ ์๋์ฐจ๋ฅผ ํ๊ณ ๋๋ก๋ฅผ ๋ค๋๋ฉด์ ์ฃผ๋ณ WiFi ์ ํธ๋ฅผ ์์งํ๊ณ , ์ด๋ ๋ณด์กฐ GPS ๊ธฐ๊ธฐ๋ก๋ถํฐ ํ์ฌ ์์น๋ฅผ ํ๋ํด์ WiFi AP ์ Map ์ ๋ง๋ค์๋ค. ์๊ฐ์ด ์ง๋๋ฉด์ ์ผ๋ฐ ์ฌ์ฉ์์ ์ค๋งํธํฐ์์ ์์ง๋๋ ์ ๋ณด๋ก ๋ณด๋ค ์ ๊ตํ๊ฒ WiFi AP ์ ์์น๋ฅผ ์ถ์ ํ๋ ๊ธฐ์ ๋ค์ด ๊ฐ๋ฐ๋๊ธฐ ์์ํ๋ค(์, https://patents.google.com/patent/US8738043B2/en). Google ์ ํ๋ฐ์ฃผ์์ง๋ง WPS๋ฅผ ์ ๊ตฌ์ถํ๊ณ ์๊ณ , ์์ ์ ์๋๋ก์ด๋ ํ๋ซํผ ๋ฟ๋ง์๋๋ผ, REST API ํํ๋ก ์๋น์ค๋ฅผ ์คํํด์ ์ ๊ณตํ๊ณ ์๋ค. ๋ค๋ง, ์ซ ๋น์ธ๋ค. ๊ตญ๋ด์์๋ ์ผ๋ถ ํต์ ์ฌ ๋ฐ ์ธํฐ๋ท ๊ธฐ์ ์์ ์์ฒด WPS ๋ฅผ ๊ตฌ์ถํด์ ๊ฐ์ ํ์ฉํ๊ณ ์๋ค.
ํ์ฌ, ๋กํ๋ซ์ WPS ๋ฅผ REST API ํํ๋ก ์คํ ํด์ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. ์ ๊ตญ๋จ์์ WPS ๊ตฌ์ถ ๊ธฐ์ ์ ๋ํด ๊ถ๊ธํด ํ๋ ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๊ตฌํ์ ํ๋์ง ๊ฐ๋ตํ ๊ธฐ์ ์ ํด ๋ณผ๊น ํ๋ค.
๋กํ๋ซ์ ๋งค์ผ 15,000,000๊ฑด์ ์์น ๊ด๋ จํ ๊ธฐ๋ก์ ์๊ณ ์๋ค. ๊ทธ ๊ธฐ๋ก์ ์ค๋งํธํฐ ์ฃผ๋ณ์ WiFi AP ์ ๋ณด์ ๊ธฐ๊ธฐ ์์น์ ๋ณด๋ฅผ ๋์์ ๋ด๊ณ ์๋ค. ์ด ๊ธฐ๋ก์ 3๊ฐ์ ์ ๋ ์์ผ๋ฉด 1,350,000,000 ๊ฑด ์ ๋๊ฐ ๋๋ค. ๋ฌด๋ ค 13์ต ๊ฑด. ์ด์ ๋์ ๋ฐ์ดํฐ๋ ์ฐ๋ฆฌ๋๋ผ์ 4000๋ง๊ฐ์ AP๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๊ฒฝ์ฐ ๋ชจ๋ AP๊ฐ ์ต์ 30๋ฒ ์ด์ ๋ค๋ฅธ ์์น์์ ๊ด์ธก๋๋ ์์น์ด๋ค.
AP ์ ์์น๋ฅผ ์ถ์ ํ๋ ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น? ๊ฐ๋ณ AP ๋ณ๋ก ๊ด์ธก๋ ๋ชจ๋ ์์น ๊ฐ์ ์ฐ์ ํ๊ท ํ๋ฉด ๋์ง ์์๊น? ์ด๋ ์ ๋๋ ๋ง๋ค. ๋ค๋ง, ํ์ค์ ๋ง์ฃผํ๊ฒ ๋๋ฉด ์ฐ๋ฆฌ๊ฐ ํ์ด์ผ ํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ๋ค์ด ์๊ธฐ๊ฒ ๋๋ค. ์ฑ๋ฅ์ ๊ฐ์ฅ ํฌ๊ฒ ์ํฅ์ ๋ผ์น๋ ๋๊ฐ์ง๋ง ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ๋ค. ์ฒซ๋ฒ์งธ๋ mobile AP ์ด๋ค. ๋๋ฒ์งธ๋, AP ๊ฐ ์ด์ฌํ๋ ๊ฒฝ์ฐ์ด๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ AP ์ ์์น๊ฐ ์ด๋ ์๊ฐ์ ๋ณ๊ฒฝ์ด ๋๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์์น๊ฐ ๋ณํ๋ AP ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ณผ์ ๋ก ๋จ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด AP์ ์์น๋ฅผ time series ๋ฐ์ดํฐ๋ก ๋ณด๊ณ clustering ์ ์ํํ๋ค. ์ด ๊ณผ์ ์ ํตํด ์ฌ๋ฌ๊ฐ์ cluster๊ฐ ์์ฑ๋๋ AP ๋ฅผ AP Map ๊ตฌ์ฑ์์ ์ ์ธํ๋ ์ ๊ทผ๋ฒ์ ํํ๋ค. ๋ค์์ clustering์ ์ํํ๋ ์ํ์ฝ๋ ์ด๋ค.
var clusters = [];
for(var l = 0; l < location_list.length; l++) {
location = location_list[l];
last_ts = location.ts;
weight = f(...)
if(weight > 0) {
found = false;
used_loc_no += 1
for(var i=0; i<clusters.length; i++) {
cluster = clusters[i]
if(Math.abs(cluster[0] - location.lat) < LOC_DIFF &&
Math.abs(cluster[1] - location.lng) < LOC_DIFF) {
cluster_lat = cluster[0];
cluster_lng = cluster[1];
cluster_weight = cluster[2];
weight_sum = cluster_weight + weight;
cluster[0] = (cluster_lat*cluster_weight + location.lat*weight) / weight_sum;
cluster[1] = (cluster_lng*cluster_weight + location.lng*weight) / weight_sum;
cluster[2] = weight_sum;
cluster[3] += 1
if(cluster[cluster.length-1] != location.ts) {
cluster.push(location.ts);
}
found = true;
break;
}
}
if(!found) {
if(location.rss > -80) {
cluster = [location.lat, location.lng, weight, 1, location.ts];
clusters.push(cluster);
}
}
}
}
์ ๊ทธ๋ฐ๋ฐ, 13์ต ๊ฑด์ ๋ฐฉ๋ํ ๋ฐ์ดํฐ๋ก๋ถํฐ AP ๊ธฐ๋ก์ ์ถ์ถํ๊ณ clustering ์ ์ํํด์ mobile AP ๋ฅผ ์ ๊ฑฐํ ํ์ AP ์ ์์น๋ฅผ ์ถ์ ํ๋ ๊ณผ์ ์ ์ฝ๊ฒ ํ ์ ์์๊น? ์๋ฌด๋ฆฌ ์ฐ์ํ ์ฑ๋ฅ์ ์ปดํจํฐ๋ผ๋ ์ด๋ ๋ถ๊ฐ๋ฅํ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ CTO ์ ๋๋ผ์ด ๋ฅ๋ ฅ์ด ๋ฐํ๋์๋ค. ์ฐ๋ฆฌ๋ ๊ทธ์ ๋ฐ์ด๋ data engineering ๋ฅ๋ ฅ์ผ๋ก์ธํด ๋จ ๋ช๋ถ ๋ง์ ์ด๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ผ ์ ์๋ ๋น ๋ฐ์ดํฐ ์์คํ ์ ์ด๋ฏธ ๊ตฌ์ฑํด ๋์๋ ๊ฒ์ด๋ค. ๋จ์ง, ๋ด๊ฐ ํด์ผ ํ ์ผ์ ์์ ๊ฐ์ด javascript ์ฝ๋๋ฅผ ์ด์ฌํ ์ง๋๊ฒ ๋ฟ. ์ค์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ processing ํ ์ ์๋ ์์คํ ์ ๊ฐ์ถ๊ณ ์๋๋๊ฐ WPS ๋ฅผ ๊ตฌ์ถํ๋๋ฐ ์์ฃผ ์ค์ํ ์ญํ ์ ํ๋ ๊ฒ ๊ฐ๋ค.
์ผ๋จ AP Map์ ๊ตฌ์ฑํ๊ฒ๋๋ฉด, ์ฑ๋ฅ์ ํ์ธํด์ผ ํ๋ค. Golden Set ๋ผ๊ณ ๋ช ๋ช ๋ ๋ฐ์ดํฐ ์ธํธ์๋ WiFi ์ค์บ ๊ฐ๊ณผ ํด๋น WiFi ๊ฐ ์ค์บ๋ ์์น, ์ฆ ๊ด์ธก ๊ฐ๊ณผ ์ ๋ต ๊ฐ์ ์ํ์ด ํฌํจ๋์ด ์๋ค. ๋ง๊ฐ ์ด์์ ์ํ๋ก ๊ตฌ์ฑ๋ Golden Set ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ AP Map ๊ณผ WPS ์์น ์ถ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ณ์ ์ ๊ทธ๋ ์ด๋ ํ๋ค.
ํ์ฌ ๋กํ๋ซ WPS๋ ์ต๊ทผ 3๊ฐ์ ๊ธฐ๋ก ๋ฐ์ดํฐ๋ก๋ถํฐ ์ถ์ถ๋ ์ ๊ตญ 1500๋ง๊ฐAP์ ์์น๋ฅผ ๋ฐํ์ผ๋ก ํ๊ท 15m ์ค์ฐจ๋ฅผ ๊ฐ์ง๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. ์ ๊ตญ 50๋ง ๊ณณ ์ด์์์ ์ง์ ์์งํ WiFi AP ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ํ์ฉํ์ฌ ์ฃผ์์์ ์ง์ญ์์๋ ๊ฝค๋ ์ ํํ ์์น ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. ํ๊ฐ์ง ์ฃผ์ํ ํน์ง์ 2.5 dimension ์ ๋ณด๋ผ๊ณ ๋งํ๋ ์ธต ์ ๋ณด๋ฅผ ๊ตญ๋ด ์ฃผ์ ๋ฐฑํ์ ๋ฐ ๋ณตํฉ๋ชฐ๊ณผ ๊ฐ์ ์ฅ์์์ ์ ๊ณตํ๋ค๋ ๊ฒ์ด๋ค. ์ด ํน์ง์ ๋ฏธ์์ฐพ๊ธฐ ๋ฑ๊ณผ ๊ฐ์ IoT ์๋น์ค์์ ํ์ฉ๋๋ฉด ๊ทธ ๊ฐ์น๊ฐ ๋ ํด ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
WPS ํ์ฉ์ ๊ด์ฌ์์ผ์ ๋ถ์ ์๋ ๋งํฌ๋ฅผ ํตํด์ ์ฝ๊ฒ ์ฌ์ฉํด ๋ณผ ์ ์๋ค.
https://developers.loplat.com/#/documentation/wps
ํ๊ต๋ ์ฐ๊ตฌ๋จ์ฒด ๋ฑ ๊ณต์ต์ ์ธ ๋ชฉ์ ์ ์ฌ์ฉ์ฒ์๋ ๊ฐ๋ฅํํ ๋ฌด๋ฃ๋ก ์ ๊ณต๋ ์์ ์ ๋๋ค~
๊ทธ๋ฆฌ๊ณ ๋กํ๋ซ์ ํจ๊ป ๋ฏธ๋๋ฅผ ๋ง๋ค์ด ๊ฐ ์๋๋ก์ด๋, ML/AI ๊ฐ๋ฐ์๋ฅผ ์ฐพ๊ณ ์์ต๋๋ค~