[PYTHON] Geolocation auf Intel Edison

Edison-Sensor

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

Geolocation

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.

Code

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.

Experiment

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

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

Erwägung

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.

Zusammenfassung

Recommended Posts

Geolocation auf Intel Edison
Start Intel Edison
Push-Benachrichtigung an Intel Edison
Machen Sie Intel Edison Debian und setzen Sie scikit-learn
Infrarot-Fernbedienungsempfang mit Intel Edison