Da Edison keinen Sensor hat, ist es nicht möglich, Informationen von der Außenwelt aufzunehmen, ohne verschiedene Sensoren extern anzubringen. ・ ・ Kannst du es nicht abholen?
** Sie können Wifi-Informationen erhalten! !! ** ** **
Geolokalisierung ist die Schätzung der Position auf der Karte. GPS ist berühmt. GPS ist eine Technologie, die die Position anhand der allgemeinen Relativitätstheorie basierend auf den Zeitinformationen schätzt, die von einem stationären Satelliten gesendet werden, der weit um die Erde kreist. Aber diesmal spielt es keine Rolle. Dieses Mal zielen wir auf Informationen zu Wifi Access Points (AP) ab, die auf der ganzen Welt verteilt sind. Viele APs senden weiterhin an einem Punkt Radiowellen aus, ohne zu stark bewegt zu werden. Da die in Wifi usw. verwendeten Funkwellen hohe Frequenzen haben, werden sie schnell gedämpft und fliegen nicht zu weit. Darüber hinaus ist bekannt, dass die Stärke von Funkwellen mit der Entfernung abnimmt. In Anbetracht der Natur dieses Gebiets dachten einige Leute, dass die Position des empfangenen Geräts auf der Karte durch die Stärke des Wifi-Signals bestimmt werden könnte. Und es ist Google, das dies weltweit getan hat. Und wie können wir diese API auch verwenden. Das ist Google Map Geolocation API. Wenn Sie die umgebenden AP-Informationen, die in JSON konsolidiert wurden, an die API-URL senden, werden die geschätzten Positionsinformationen sofort zurückgegeben.
Bitte registrieren Sie sich als Entwickler bei Google und erhalten Sie den API-Schlüssel von Google Map. GAPI_KEY im folgenden Code entspricht dem. Es scheint, dass es innerhalb von 1000 Anfragen / Tag und 1 Anfrage / Sekunde kostenlos verwendet werden kann. Vom Code unten. Geben Sie bei ELI_MAC die MAC-Adresse des AP ein, der von der Positionsschätzung ausgeschlossen werden soll. In meinem Fall habe ich die MAC-Adresse des für die Kommunikation mit Edison verwendeten Tethering-Mobiltelefons eingegeben.
geo.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import commands, datetime, time
import re
import json, requests
GAPI_KEY = "fa1iuEe32hw4iusiWKgrwFEheERfieunGeWW"
ELI_MAC = ["12:34:56:78:9A:BC"]
re_mac = re.compile("\s+Cell \d{2} - Address: (\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2})")
re_ch = re.compile("\s+Channel:(\d+)")
re_freq = re.compile("\s+Frequency:(\S+) GHz")
re_qual = re.compile("\s+Quality=(\S+) Signal level=(\S+) dBm")
re_essid = re.compile("\s+ESSID:\"([^\"]+)\"")
class AP:
def __init__(self, _mac, _channel, _frequency, _quality, _signal, _essid=""):
self.mac = _mac
self.channel = _channel
self.frequency = _frequency
self.quality = _quality
self.signal = _signal
self.essid = _essid
self.time = datetime.datetime.now()
def show(self):
print("%s, %s, %s, %s, %s, %s" % (self.essid, self.mac, self.channel, self.frequency, self.quality, self.signal))
def getVal(self):
t = datetime.datetime.now() - self.time
age = t.seconds * 1000 + t.microseconds / 1000
return {"macAddress":self.mac, "signalStrength":self.signal, "age":age, "channel":self.channel}
def getAPList():
aplist = []
res = commands.getoutput("/sbin/iwlist wlan0 scan")
essid = ""
mac = ""
channel = ""
frequency = ""
quality = ""
signal = ""
for t in res.splitlines():
m = re_mac.match(t)
if m:
mac = m.group(1)
continue
m = re_ch.match(t)
if m:
channel = m.group(1)
continue
m = re_freq.match(t)
if m:
frequency = m.group(1)
continue
m = re_qual.match(t)
if m:
quality = m.group(1)
signal = m.group(2)
if mac not in ELI_MAC:
aplist.append(AP(mac, channel, frequency, quality, signal, essid))
continue
m = re_essid.match(t)
if m:
essid = m.group(1)
continue
return aplist
def getLocationFromWifi(wifilist):
url = "https://www.googleapis.com/geolocation/v1/geolocate?key=%s" % GAPI_KEY
headers = {"Content-Type": "application/json"}
data = json.dumps({"wifiAccessPoints":wifilist})
r = requests.post(url, data=data, headers=headers)
geo = r.json()
return {"Latitude":geo['location']['lat'], "Longitude":geo['location']['lng'], "Accuracy":geo['accuracy']}
if __name__ == '__main__':
aps = {}
while True:
naps = getAPList()
lapsk = aps.keys()
napsk = []
# add new APs to AP list.
for ap in naps:
if ap.mac not in lapsk:
aps[ap.mac] = ap
# make new AP names list
napsk.append(ap.mac)
# search missed APs to delete from AP list
for ap in lapsk:
if ap not in napsk:
aps.pop(ap)
loc = getLocationFromWifi([d.getVal() for d in aps.values()])
print("Latitude: %f, Longitude: %f, Accuracy; %f" % (loc['Latitude'], loc['Longitude'], loc['Accuracy']))
print("https://www.google.co.jp/maps/@%s,%s,21z?hl=ja" % (loc["Latitude"], loc["Longitude"]))
time.sleep(30)
Führen Sie diesen Code mit Administratorrechten aus. Als ich es zu Hause laufen ließ, um es zu testen, hatte ich ein wenig Angst, weil es auf einer Ebene identifiziert wurde, auf der ich möglicherweise sogar die Zimmernummer kenne.
Die Ergebnisse der Positionsschätzung beim Gehen zwischen Akihabara und Ocha no Mizu zu Fuß sind nachstehend aufgeführt. Der rote Punkt ist die geschätzte Position. In diesem Experiment wurden zur Vermeidung des Zeitlimits der API nur die AP-Informationen erfasst und die Positionsschätzung nach der Rückkehr nach Hause durchgeführt.
Die GPS-Daten beim Gehen beim Sammeln von WLAN-Informationen in der Umgebung mit Edison lauten wie folgt. Auch hier ist die Genauigkeit nicht so gut, daher dient sie nur als Referenz.
Ich lache über die Stelle, an der plötzlich der rote Punkt vor der Ochanomizu-Station erscheint, aber es gibt auch Stellen, an denen ich überrascht bin, die Position zu schätzen. Wenn Sie mit einer gemeinsamen Bewegungsgeschwindigkeit filtern, oder?
Ja. Ich habe Akihabara als Teststandort gewählt, weil ich dachte, dass es eine große Anzahl von Beispiel-Wifi-APs geben würde. Je nach Standort konnte ich fast 60 APs sehen, was mehr war als ich erwartet hatte.