Étant donné qu'Edison n'a pas de capteur, il n'est pas possible de récupérer des informations du monde extérieur sans attacher divers capteurs à l'extérieur. ・ ・ Tu ne peux pas le ramasser?
** Vous pouvez obtenir des informations Wifi! !! ** **
La géolocalisation est l'estimation de la position sur la carte. Le GPS est célèbre. Le GPS est une technologie qui estime la position par la théorie de la relativité générale basée sur les informations de temps envoyées par un satellite stationnaire qui orbite loin autour de la Terre. Mais cette fois, cela n'a pas d'importance. L'objectif cette fois-ci est l'information sur les points d'accès Wifi (AP) dispersés dans le monde. De nombreux points d'accès continuent d'émettre des ondes radio à un moment donné sans être trop déplacés. Étant donné que les ondes radio utilisées dans le Wifi, etc. ont des fréquences élevées, elles sont rapidement atténuées et ne volent pas trop loin. De plus, on sait que la force des ondes radio diminue avec la distance. En regardant la nature de cette zone, certaines personnes ont pensé que la position de l'appareil reçu sur la carte pouvait être spécifiée par la force du signal Wifi. Et Google l'a fait à l'échelle mondiale. Et comment, nous pouvons également utiliser cette API. Il s'agit de l 'API de géolocalisation de Google Map. Si vous envoyez les informations AP environnantes qui ont été consolidées dans JSON à l'URL de l'API, les informations de position estimée seront renvoyées immédiatement.
Veuillez vous inscrire en tant que développeur auprès de Google et obtenir la clé API de Google Map. GAPI_KEY dans le code ci-dessous correspond à cela. Il semble qu'il puisse être utilisé gratuitement dans un délai de 1000 requêtes / jour et 1 requête / seconde. Du code ci-dessous. S'il s'agit d'ELI_MAC, entrez l'adresse MAC du point d'accès à exclure de l'estimation de position. Dans mon cas, j'ai mis l'adresse MAC du téléphone mobile utilisé pour la communication d'Edison.
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)
Exécutez ce code avec les privilèges d'administrateur. Quand je l'ai fait fonctionner à la maison avec l'intention de le tester, j'avais un peu peur car il était identifié à un niveau où je pourrais même connaître le numéro de la chambre.
Les résultats de l'estimation de la position lors du déplacement entre Akihabara et Ocha no Mizu à pied sont présentés ci-dessous. Le point rouge est la position estimée. Dans cette expérience, afin d'éviter la limite de temps de l'API, seules les informations AP ont été acquises, et l'estimation de la position a été effectuée après le retour à la maison.
Les données GPS lorsque vous marchez tout en collectant des informations Wifi autour de la zone avec Edison sont les suivantes. Encore une fois, la précision n'est pas très bonne, c'est donc à titre indicatif uniquement.
Je ris de l'endroit où le point rouge apparaît soudain devant la gare d'Ochanomizu, mais il y a aussi des endroits où je suis surpris d'estimer la position. Si vous filtrez à une vitesse de déplacement commune, ou?
Ouais. J'ai choisi Akihabara comme site de test car je pensais qu'il y aurait un grand nombre d'échantillons d'AP Wifi. Selon l'emplacement, je pouvais voir près de 60 points d'accès, ce qui était plus que ce à quoi je m'attendais.