Inhaltsverzeichnis:

Alexa, wo sind meine Schlüssel? - Gunook
Alexa, wo sind meine Schlüssel? - Gunook

Video: Alexa, wo sind meine Schlüssel? - Gunook

Video: Alexa, wo sind meine Schlüssel? - Gunook
Video: Amazon Echo Dot 4 einrichten - schnelle Anleitung 📲 2024, Juli
Anonim
Image
Image
Hacken von Bluetooth-Beacons
Hacken von Bluetooth-Beacons

Alexa eignet sich besonders gut zum Abrufen von Informationen und zur Überwachung von Assets mithilfe von drahtlosen Heimnetzwerken. Es ist natürlich in Betracht zu ziehen, Wertsachen zum schnellen Wiederauffinden ins Netz zu legen. Wir hacken billige Bluetooth-Low-Energy-Beacons für die Netzwerkreichweite und die Batterielebensdauer und bauen eine intelligente Anwendung, damit Alexa weiß, wo wir die Schlüssel gelassen haben.

Wie es geht…

Schritt 1: Hacken von Bluetooth-Beacons

Ein Satz von 3 Beacons kann für weniger als 15 US-Dollar erworben werden und wird von Android-/iOS-Anwendungen unterstützt, aber wir werden uns aus Datenschutzgründen abmelden. Außerdem sollte das Finden unserer Schlüssel nicht dazu führen, dass wir unser Telefon finden.

Dieses adafruit-Tutorial zum Reverse Engineering von Smart Lights hat uns bei der Steuerung der Beacons geholfen. Beginnen Sie, indem Sie den Beacon-Scan für die Geräteadresse einschalten, indem Sie Folgendes ausführen:

sudo hcitool lescan

Suchen und kopieren Sie die Adresse mit dem Namen "iTag", und führen Sie dann Folgendes aus:

sudo gatttool -I

Verbinden Sie sich interaktiv mit dem Gerät, indem Sie Folgendes ausführen:

verbinden AA:BB:CC:DD:EE:FF

Versuchen Sie, 'Hilfe' auszuführen, um Optionen anzuzeigen, oder 'primär', um Dienste anzuzeigen:

Wenn wir 'char-desc' gefolgt von dem Service-Handle wie oben ausführen, finden wir UUIDs, die wir durch Bezugnahme auf die gatt-Eigenschaftsspezifikationen und die Servicespezifikationen nachschlagen. Weitere Informationen zu diesen Diensten finden Sie hier. Bei der Überprüfung des Datenverkehrs mit Wireshark stellen wir fest, dass 0100111000000001 den Alarm auslöst und 0000111000000001 logischerweise ausschaltet. Jetzt haben wir die einfache Python-Funktion:

import pexpectdef sound_alarm(BD_ADDR): child = pexpect.spawn('gatttool -I') child.sendline('connect {}'.format(BD_ADDR)) child.expect('Verbindung erfolgreich', timeout=30) child.sendline ('char-write-cmd 0x000b 0100111000000001')

Als nächstes konzentrieren wir uns darauf, den Alexa-Skill zu erstellen, um das Beacon auszulösen, wenn wir nach den Schlüsseln suchen.

Schritt 2: Erstellen eines Alexa Skills und einer App

Einen Alexa Skill und eine App erstellen
Einen Alexa Skill und eine App erstellen
Einen Alexa Skill und eine App erstellen
Einen Alexa Skill und eine App erstellen

Wir erstellen einen Skill, der mit einem lokalen Server verbunden wird. Dann konfigurieren wir unseren Server so, dass er jede gewünschte Aktion ausführt. In diesem Fall geben wir eine ungefähre Angabe dafür, wo sich die Schlüssel befinden könnten, und lassen das Bluetooth-Beacon piepsen. Flask bietet eine einfache und benutzerfreundliche Python-Bibliothek, um eine Anwendung bereitzustellen. Mit Flask-ask können wir den Server so konfigurieren, dass er mit unserem Alexa-Skill kommuniziert, den wir später erstellen werden. Stellen Sie die Anwendung mit Ngrok bereit, wodurch wir einen https-Link erhalten, den wir für unseren Alexa-Skill benötigen. Zuerst haben wir die Anwendung mit der einfachsten Funktionalität erstellt: um unseren BLE-Beacon beim Auslösen piepen zu lassen.

#!/usr/bin/env pythonfrom Flask import Flask from Flask_ask import Ask, Statement import pexpect app=Flask(_name_) ask = Ask(app, '/') BD_ADDR = 'AA:BB:CC:DD:EE:FF ' #Ihre Bluetooth-Beacon-ID hier @ask.intent('findkeys') def retrievr(): sound_alarm() speech_text = "Ihre Schlüssel sind hier irgendwo." return-Anweisung(speech_text) def sound_alarm(): child = pexpect.spawn('gatttool -I') child.sendline('connect {}'.format(BD_ADDR)) child.expect('Verbindung erfolgreich', timeout=60) child.sendline('char-write-cmd 0x000b 0100111000000001') if _name_ == "_main_": app.run(host='127.0.0.1', port='5000')

Wir haben die Funktion sound_alarm() verwendet, die wir zuvor geschrieben haben, um den BLE-Piepton zu erzeugen. Für die Funktion, die für den Intent verwendet wird, fügen wir den Ask-Dekorator mit unserem Intent "findkeys" hinzu. Wenn wir den Alexa-Skill im Amazon-Entwickler-Dashboard erstellen, verwenden wir diesen Namen für unsere Absicht. Schreiben Sie dieses Skript in eine Datei namens app.py und führen Sie es aus

python app.py

Dadurch wird Ihre Anwendung auf https://localhost:5000 bereitgestellt. Führen Sie einen ngrok-Server aus und kopieren Sie den generierten https-Link. Sie benötigen es, wenn Sie den Alexa-Skill konfigurieren. Weitere Informationen finden Sie in diesem Beitrag. Wir haben erfolgreich eine einfache Anwendung eingerichtet, jetzt schreiben wir den Alexa-Skill. Navigieren Sie zum Amazon Developer Dashboard und melden Sie sich an. Klicken Sie auf Alexa und legen Sie los mit dem Alexa Skill Kit

Folgen Sie den Anweisungen der GUI.

Auf der Registerkarte Interaktionsmodell sollten Sie das Feld Absichtsschema wie folgt ausfüllen:

{ "intents": [{ "intent": "findkeys" }, { "intent": "AMAZON. HelpIntent" }, { "intent": "AMAZON. StopIntent" }, { "intent": "AMAZON. CancelIntent" }] }

  • In das Feld Beispieläußerungen möchten Sie einige Beispielbefehle schreiben, die eine Person verwenden könnte, um die Fertigkeit aufzurufen. Wir haben diese geschrieben:

findkeys find my keyfindkeys wo meine Schlüssel findkeys Ich habe meine Schlüssel verloren

  • Stellen Sie auf der Registerkarte Konfiguration sicher, dass Sie als Dienstendpunkt HTTPS auswählen. Kopieren Sie Ihren https-Link und fügen Sie ihn in das Feld Standard darunter ein. Die Kontoverknüpfung kann auf Nein belassen werden.
  • Wählen Sie im SSL-Zertifikat die mittlere Option "Mein Entwicklungsendpunkt ist eine Unterdomäne einer Domäne, die über ein Wildcard-Zertifikat einer Zertifizierungsstelle verfügt".
  • Auf der Registerkarte Test können Sie die neue Fertigkeit testen, indem Sie einen Ihrer Beispielbefehle eingeben.

Füllen Sie die letzten beiden Registerkarten aus, bis alle Häkchen grün sind. Starten Sie dann Ihren Skill mit der Beta-Testfunktion. Auf diese Weise können Sie Ihren Skill auf jedem Echo-Gerät hosten, bevor Sie ihn veröffentlichen. Folgen Sie den Anweisungen auf dem E-Mail-Link, um den Skill auf Ihrem Echo-Gerät zu installieren.

Schritt 3: Unsere Fähigkeiten intelligenter machen

Unsere Fähigkeiten intelligenter machen
Unsere Fähigkeiten intelligenter machen
Unsere Fähigkeiten intelligenter machen
Unsere Fähigkeiten intelligenter machen
Unsere Fähigkeiten intelligenter machen
Unsere Fähigkeiten intelligenter machen

Wir haben die im ganzen Haus verteilten Computer im Leerlauf damit beauftragt, das Bluetooth-Beacon abzufragen, um die RSSI-Signalstärke zu melden.

Wenn wir von mehreren Geräten abgelesen werden, können wir die Signalstärke als Proxy für die Entfernung verwenden. Wir müssen herausfinden, wie wir dies verwenden können, um den wahrscheinlichsten Teil des Hauses zu berechnen, um das Beacon zu finden.

Wir wenden uns dem maschinellen Lernen zu. Ein crontab-Job alle 2 Minuten baut einen Datensatz von RSSI-Tupeln auf. Durch die Platzierung des Beacons an verschiedenen Stellen wie: 'Schlafzimmer', 'Badezimmer', 'Küche', 'Wohnbereich' kennzeichnen wir die RSSI-Protokolle. Sobald wir das Zuhause kartiert haben, können wir baumbasierte Modelle wie den XGBClassifier von xgboost verwenden.

Die xgboost-Implementierung von Gradient Boosting verarbeitet die fehlenden Daten aus Zeitüberschreitungen und trainiert in wenigen Sekunden. Verwenden Sie Python Pickle, um das trainierte Modell beizubehalten und in unsere Alexa-Retrievr-Anwendung zu laden. Wenn der Skill aufgerufen wird, schlägt die Anwendung den Bluetooth-RSSI-Wert nach und generiert einen vorhergesagten Standort. Alexa kann antworten und vorschlagen, "versuchen Sie im Badezimmer nachzusehen".

Schritt 4: Alles zusammenfügen

Wenn wir ein Modell haben, das die letzte Position der Schlüssel annähert, können wir es der Anwendung hinzufügen, um die von Alexa zurückgegebene Anweisung zu verbessern. Wir haben das Skript so geändert, dass es lautet:

import osfrom Flask import Flask from Flask_ask import Ask, Statement import pexpect import pickle import pandas as pd import numpy as np from collections import defaultdict, Counter from reverse_read import reverse_readline app=Flask(_name_) ask = Ask(app, '/') @ ask.intent('findkeys') def retrievr(): os.system("/path/to/repo/sound_alarm.py &") Speech_text = mut_locate() return statement(speech_text) def mut_locate(): read_dict = {} line_gen = reverse_readline('YOUR_DATA_FILE.txt') res_lst = while len(res_lst) != 20: ln = next(line_gen) if ln.startswith('Host'): _, ip, _, reading = ln.split () read_dict[ip] = lesen res_lst.append(read_dict) if ip == 'ip.of.one.computer': read_dict = {} else: pass val = pd. DataFrame(res_lst).replace({'N/ A': np.nan}).values mdl_ = pickle.load(open('location_model_file.dat', 'rb')) preds = mdl_.predict(val) erahnen = Counter(preds) erahnen = rate.most_common(1)[0][0] answer_str = 'Versuchen Sie, im ' zu suchen, wenn erraten == 1: answer_str += 'Schlafzimmer' elif Vermutung == 2: Reply_str += 'Badezimmer' elif rate == 3: Reply_str += 'Küche' elif rate == 4: Reply_str += 'Wohnzimmer' return answer_str if _name_ == "_main_": app.run(host ='127.0.0.1', Port='5000')

Wir haben eine neue Funktion namens Vermutung_locate() erstellt, die eine Datei mit den zuletzt aufgezeichneten RSS-Signalstärken nimmt. Es führt dann die Beispiele gegen unser gebeiztes xgboost-Modell aus und gibt die wahrscheinlichste Positionszeichenfolge zurück. Dieser Standort wird zurückgegeben, wenn Alexa dazu aufgefordert wird. Da das Herstellen einer Verbindung zu einem Beacon einige Sekunden dauern kann, führen wir einen separaten Prozess aus, der diese Funktion in sound_alarm.py aufruft.

Empfohlen: