Google Maps Platform의 Geolocation API
https://developers.google.com/maps/documentation/geolocation/overview?hl=ko
Wi-Fi 액세스 포인트, GPS, 기지국 데이터를 결합하여 위치 추적.
매월 100,000회 무료제공 (이후 사용량별 금액 청구) _ 미화 0.005달러/회 (미화 5.00달러/1,000회)
* 사용하기 위해서는 Google Cloud 프로젝트 생성 필요. ( + API 사용 설정 / api키 발급 필요 )
위치정보 요청 및 응답 개발가이드 :
https://developers.google.com/maps/documentation/geolocation/requests-geolocation?hl=ko&_gl=1*kn8ia4*_up*MQ..*_ga*NjQ2MDc0Njc1LjE3Mzc1MjY1NTQ.*_ga_NRWSTWS78N*MTczNzUzMDI4OS4yLjEuMTczNzUzMDU0OC4wLjAuMA..
pip install requests 설치.
import requests
key = '###########발급받은key#############'
send_url = 'https://www.googleapis.com/geolocation/v1/geolocate?key=' + key
# POST 요청 보내기
r = requests.post(send_url)
# 응답 처리
if r.status_code == 200:
j = r.json()
print(j)
print(j.get('location', 'Location not found'))
else:
print(f"Error: {r.status_code}, {r.text}")
# 응답결과
# {'location': {'lat': 37.526126, 'lng': 126.922255}, 'accuracy': 91275.98445292684}
# {'lat': 37.526126, 'lng': 126.922255}
=> 요청 파라미터가 없을 시 요청 위치의 ip주소 기반으로 추적한 위치정보 반환.
아래처럼 위도 / 경도 값을 반환한다. ( 예시로 사용한 좌표는 여의도 공원 )
위도 : 37.526126
경도 : 126.922255
이렇게 나온 위도,경도 값인 ' 37.526126, 126.922255 '을 google map에 검색하면 지도에 위치가 뜬다.
요청 파라미터 없이 결과를 받아보니 실제 위치와 2.04 km 떨어진 지점을 잡는다.
이전에는 차이가 500m정도였는데 이번에는 오차범위가 크다.
Wi-Fi 활성화
GPS 활성화
Wi-Fi 네트워크 밀도가 높은 도심
=> 정확도가 높아짐
요청 파라미터에 내 현재 네트워크 정보 포함시켜보자.
우선 네트워크 정보 가져오기.
CMD창에 아래 명령어 실행
netsh wlan show networks mode=bssid
=> 사용자의 컴퓨터가 현재 감지할 수 있는 모든 무선 네트워크 및 관련 정보 출력.
현재 내가 사용중인 Wi-Fi 정보가 나온다.
BSSID 는 AB:CD:EF:12:34:56 형태 (무선 네트워크의 고유한 식별자로, 일반적으로 액세스 포인트의 MAC 주소 형식)
위에서 얻은 MAC주소를 포함시켜 요청.
import requests
from wifiTest import get_bssid_list, format_bssid_list
key = '###########발급받은key#############'
send_url = 'https://www.googleapis.com/geolocation/v1/geolocate?key=' + key
# 요청 본문
payload = {
"homeMobileCountryCode": 310, # 기기의 홈 네트워크의 모바일 국가 코드 (MCC)
"considerIp": "false", # IP위치정보로 대체여부(default: false)
"wifiAccessPoints": [
{
"macAddress": "네트워크1_BSSID"
},
{
"macAddress": "네트워크2_BSSID"
},
{
"macAddress": "네트워크3_BSSID"
}
]
}
# POST 요청 보내기 (네트워크정보 포함)
r = requests.post(send_url, json=payload)
# 응답 처리
if r.status_code == 200:
j = r.json()
print(j)
print(j.get('location', 'Location not found'))
else:
print(f"Error: {r.status_code}, {r.text}")
이제 내가 현재 있는 건물 위치를 정확하게 잡는다.
그런데 네트워크 정보가 적은 경우에는 404에러가 뜬다.
현재 잡히는 네트워크들의 모든 BSSID를 긁어모아본다.
wifiTest 컴포넌트 생성
import subprocess # 외부 명령 실행
import re
def get_bssid_list():
# netsh 명령 실행 (window) // linux : sudo iwlist wlan0 scanning
result = subprocess.run(['netsh', 'wlan', 'show', 'networks', 'mode=bssid'], capture_output=True, text=True)
networks = result.stdout
print(f"result: {networks}")
# BSSID 추출
bssid_list = re.findall(r"BSSID\s+\d+\s+:\s+([0-9A-Fa-f:]{17})", networks)
return bssid_list
def format_bssid_list(bssid_list):
# BSSID를 JSON 형태로 변환
formatted_list = [{"macAddress": bssid} for bssid in bssid_list]
return formatted_list
# BSSID 출력
bssid = get_bssid_list()
# print(f"BSSIDs: {bssid}")
print(f"json_bssid: {format_bssid_list(bssid)}")
대략 아래처럼 모아진다.
Wi-Fi를 한번 껐다가 켜면 네트워크 여러개가 잘 잡힘!
[
{'macAddress': '네트워크1_BSSID'},
{'macAddress': '네트워크2_BSSID'},
{'macAddress': '네트워크3_BSSID'},
{'macAddress': '네트워크4_BSSID'},
{'macAddress': '네트워크5_BSSID'},
]
wifiTest 컴포넌트에서 긁어모은 BSSID를 포함시켜 요청.
import requests
from wifiTest import get_bssid_list, format_bssid_list
key = '###########발급받은key#############'
send_url = 'https://www.googleapis.com/geolocation/v1/geolocate?key=' + key
# 요청 본문
payload = {
"homeMobileCountryCode": 310, # 기기의 홈 네트워크의 모바일 국가 코드 (MCC)
"considerIp": "false", # IP위치정보로 대체여부(default: false)
}
# BSSID 리스트 가져오기
bssid_list = get_bssid_list()
# JSON 형식으로 변환
formatted_bssid_list = format_bssid_list(bssid_list)
# 결과 출력
payload["wifiAccessPoints"] = formatted_bssid_list
print("payload: ", payload)
# POST 요청 보내기
r = requests.post(send_url, json=payload)
# 응답 처리
if r.status_code == 200:
j = r.json()
print(j)
print(j.get('location', 'Location not found'))
else:
print(f"Error: {r.status_code}, {r.text}")
요청데이터(paylode)는 아래 형태
paylode : {
"homeMobileCountryCode": 310,
"considerIp": "false",
"wifiAccessPoints": [
{"macAddress": "네트워크1_BSSID"},
{"macAddress": "네트워크2_BSSID"},
{"macAddress": "네트워크3_BSSID"},
{"macAddress": "네트워크4_BSSID"},
{"macAddress": "네트워크5_BSSID"},
{"macAddress": "네트워크6_BSSID"},
{"macAddress": "네트워크7_BSSID"}
]
}
BSSID가 많을 수록 정확한 위치를 잘 잡는다.
네트워크 공부 더해야겠다..
무선네트워크 이해 (6) - Chapter4. WLAN (1)
무선네트워크 이해 (6) - Chapter4. WLAN Components WIFI 의 기본 적인 내용을 이해 하셨으면 이제 WLAN (Wireless Local Area Network) 를 이제 보시게 될 텐데요. 이번 장은 간단하게 WLAN 용어를 정리해보도록 하겠
haru21.tistory.com
'기타' 카테고리의 다른 글
[LINUX/JAVA] 자바 버전 관리 도구 (alternatives) (0) | 2025.02.11 |
---|---|
[LINUX] 포그라운드/백그라운드 프로세스(nohup, &) (0) | 2025.02.11 |
[Docker] 도커 컨테이너, Dockerfile, Volume, 도커 네트워크 (0) | 2025.02.10 |
[Linux] 표준 출력(stdout) & 표준 에러(stderr) 읽어오기 (0) | 2025.01.27 |