Inhoudsopgave:

Alexa, waar zijn mijn sleutels?: 4 stappen
Alexa, waar zijn mijn sleutels?: 4 stappen

Video: Alexa, waar zijn mijn sleutels?: 4 stappen

Video: Alexa, waar zijn mijn sleutels?: 4 stappen
Video: 😳😂 Alex probeert Athena te zoenen in vlog Gio #gio #alex #athena #vlog 2024, November
Anonim
Image
Image
Bluetooth-bakens hacken
Bluetooth-bakens hacken

Alexa is met name geschikt voor het ophalen van informatie en het bewaken van activa met behulp van draadloze thuisnetwerken. Het is normaal om te overwegen om waardevolle spullen op het rooster te zetten om ze snel terug te kunnen vinden. We hacken goedkope bluetooth low energy beacons voor het netwerkbereik en de levensduur van de batterij en bouwen een slimme applicatie zodat Alexa weet waar we de sleutels hebben gelaten.

Hoe je dat doet…

Stap 1: Bluetooth-bakens hacken

Een set van 3 beacons kan worden gekocht voor minder dan $ 15 en wordt ondersteund met Android/iOS-applicaties, maar we kiezen voor privacy. Trouwens, het vinden van onze sleutels mag niet veranderen in het vinden van onze telefoon.

Deze adafruit-tutorial over reverse engineering van slimme lampen heeft ons geholpen de bakens te bedienen. Begin met het inschakelen van de bakenscan voor het apparaatadres door het volgende uit te voeren:

sudo hcitool lescan

Zoek en kopieer het adres met de naam 'iTag' en voer het volgende uit:

sudo gatttool -I

Maak interactief verbinding met het apparaat door het volgende uit te voeren:

sluit AA:BB:CC:DD:EE:FF

Probeer 'help' uit te voeren om opties te bekijken of 'primair' om services te bekijken:

Als we 'char-desc' uitvoeren, gevolgd door de servicehandle zoals hierboven, vinden we UUID's die we opzoeken door te verwijzen naar de gatt-karakteristieke specificaties en servicespecificaties. Bekijk dit voor meer informatie over deze services. Als we verkeer met Wireshark inspecteren, zien we dat 0100111000000001 het alarm activeert en logischerwijs schakelt 0000111000000001 het uit. Nu hebben we de eenvoudige python-functie:

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

Vervolgens concentreren we ons op het creëren van de Alexa-vaardigheid om het baken te activeren wanneer we op zoek zijn naar de sleutels.

Stap 2: Een Alexa-vaardigheid en app maken

Een Alexa-vaardigheid en app maken
Een Alexa-vaardigheid en app maken
Een Alexa-vaardigheid en app maken
Een Alexa-vaardigheid en app maken

We creëren een vaardigheid die wordt gekoppeld aan een lokale server. Vervolgens configureren we onze server om elke gewenste actie te ondernemen, in dit geval een benadering geven voor waar de sleutels zich kunnen bevinden en het Bluetooth-baken laten piepen. Flask biedt een eenvoudige en gemakkelijk te gebruiken python-bibliotheek om een applicatie te bedienen. Met behulp van flask-ask kunnen we de server configureren om te communiceren met onze Alexa-vaardigheid die we later zullen bouwen. Serveer de applicatie goed met Ngrok, die ons een https-link zal geven die we nodig hebben voor onze Alexa-vaardigheid. Eerst hebben we de applicatie gebouwd met de eenvoudigste functionaliteit: om ons BLE-baken te laten piepen wanneer het wordt geactiveerd.

#!/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 ' #Your bluetooth beacon id here @ask.intent('findkeys') def retrievr(): sound_alarm() speech_text = "Je sleutels zijn hier ergens." return statement(speech_text) def sound_alarm(): child = pexpect.spawn('gatttool -I') child.sendline('connect {}'.format(BD_ADDR)) child.expect('Verbinding succesvol', timeout=60) child.sendline('char-write-cmd 0x000b 0100111000000001') if _name_ == "_main_": app.run(host='127.0.0.1', port='5000')

We gebruikten de functie sound_alarm() die we eerder schreven om de BLE-piep te laten klinken. Voor de functie die zal worden gebruikt voor de intentie, voegen we de ask decorateur toe met onze intentie "findkeys". Wanneer we de Alexa-vaardigheid op het Amazon-dashboard voor ontwikkelaars maken, zullen we deze naam gebruiken voor onze bedoeling. Schrijf dit script naar een bestand met de naam app.py en voer het uit

python app.py

Hiermee wordt uw toepassing op https://localhost:5000 weergegeven. Voer een ngrok-server uit en kopieer de gegenereerde https-link. Je hebt het nodig wanneer je de Alexa-vaardigheid configureert. Bekijk dit bericht voor meer informatie. We hebben met succes een eenvoudige applicatie opgezet, nu gaan we de Alexa-vaardigheid schrijven. Navigeer naar het Amazon-dashboard voor ontwikkelaars en log in. Klik op Alexa en ga aan de slag met de Alexa Skill-kit

Volg de instructies van de gui.

Op het tabblad Interation Model vult u het vak Intent Schema in met het volgende:

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

  • In het vak Voorbeelduitingen wilt u enkele voorbeeldopdrachten schrijven die een persoon zou kunnen gebruiken om de vaardigheid aan te roepen. We schreven deze:

vindsleutels vind mijn sleutelsvindsleutels waar mijn sleutels vindsleutels Ik ben mijn sleutels kwijt

  • Zorg ervoor dat u op het tabblad Configuratie het service-eindpunt kiest voor HTTPS. Kopieer uw https-link en plak deze in het vak Standaard eronder. Het koppelen van accounts kan worden overgelaten aan nr.
  • Kies in het SSL-certificaat de middelste optie, "Mijn ontwikkelingseindpunt is een subdomein van een domein met een wildcardcertificaat van een certificeringsinstantie".
  • Op het tabblad Test kunt u de nieuwe vaardigheid testen door een van uw voorbeeldopdrachten in te typen.

Voltooi het invullen van de laatste twee tabbladen totdat alle vinkjes groen zijn. Start vervolgens je vaardigheid met de functie Beta Testing. Hierdoor kunt u uw vaardigheid op elk echo-apparaat hosten voordat u het publiceert. Volg de instructies op de e-maillink om de vaardigheid op uw echo-apparaat te installeren.

Stap 3: Onze vaardigheid slimmer maken

Onze vaardigheden slimmer maken
Onze vaardigheden slimmer maken
Onze vaardigheden slimmer maken
Onze vaardigheden slimmer maken
Onze vaardigheden slimmer maken
Onze vaardigheden slimmer maken

We zetten de inactieve computers verspreid over het huis aan het werk bij het opvragen van het bluetooth-baken om de RSSI-signaalsterkte te rapporteren.

Door metingen van meerdere machines te nemen, kunnen we de signaalsterkte gebruiken als een proxy voor afstand. We moeten uitzoeken hoe we dit kunnen gebruiken om het meest waarschijnlijke deel van het huis te berekenen om het baken te vinden.

We gaan over op machine learning. Een crontab-taak elke 2 minuten, bouwt een dataset van RSSI-tupels op. Door het baken op verschillende plekken te plaatsen, zoals: 'Slaapkamer', 'Badkamer', 'Keuken', 'Woonruimte' labelen we de RSSI-logs. Zodra we het huis in kaart hebben gebracht, kunnen we op boom gebaseerde modellen gebruiken, zoals de XGBClassifier van xgboost.

De xgboost-implementatie van gradiëntversterking zal de ontbrekende gegevens van time-outmetingen verwerken en in een paar seconden trainen. Gebruik python augurk om het getrainde model te behouden en in onze alexa retrievr-applicatie te laden. Wanneer de vaardigheid wordt aangeroepen, zoekt de applicatie de Bluetooth RSSI-lezing op en genereert een voorspelde locatie, Alexa kan antwoorden met de suggestie 'probeer in de badkamer te kijken'.

Stap 4: Alles samenbrengen

Als we een model hebben om de laatste locatie van de sleutels te benaderen, kunnen we dit aan de applicatie toevoegen om de door Alexa geretourneerde verklaring te verbeteren. We hebben het script aangepast om te lezen:

import osfrom flask import Flask from flask_ask import Ask, statement import pexpect import augurk 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 = Guess_locate() return statement(speech_text) def Guess_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] = lezen 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) Guess = Teller(preds) Guess = Guess.most_common(1)[0][0] reply_str = 'Probeer in de ' if guess == 1: reply_str += 'bedroom' elif guess == 2: reply_str += 'badkamer' elif guess == 3: reply_str += 'keuken' elif guess == 4: reply_str += 'woonkamer' return reply_str if _name_ == "_main_": app.run(host ='127.0.0.1', poort='5000')

We hebben een nieuwe functie gemaakt met de naam Guess_locate() die een bestand nodig heeft met de laatste geregistreerde RSS-signaalsterkten. Vervolgens worden de voorbeelden uitgevoerd tegen ons gebeitst xgboost-model en wordt de meest waarschijnlijke locatiereeks geretourneerd. Deze locatie wordt geretourneerd wanneer Alexa daarom wordt gevraagd. Aangezien het tot stand brengen van een verbinding met een baken enkele seconden kan duren, voeren we een apart proces uit om die functie aan te roepen in sound_alarm.py.

Aanbevolen: