[PYTHON] Géolocalisation sur Intel Edison

Capteur Edison

É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! !! ** **

Géolocalisation

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.

code

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.

Expérience

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. Wifi位置推定

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. Wifi位置推定

Considération

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.

Résumé

Recommended Posts

Géolocalisation sur Intel Edison
Démarrage Intel Edison
Notification push à Intel Edison
Faire Intel Edison Debian et mettre scikit-learn
Réception de la télécommande infrarouge avec Intel Edison