Innehållsförteckning:

Alexa, Var är mina nycklar ?: 4 steg
Alexa, Var är mina nycklar ?: 4 steg

Video: Alexa, Var är mina nycklar ?: 4 steg

Video: Alexa, Var är mina nycklar ?: 4 steg
Video: Magdalena Andersson tvärvänder när hon inser missen 2024, Juli
Anonim
Image
Image
Hackar Bluetooth -beacons
Hackar Bluetooth -beacons

Alexa är särskilt väl lämpad för informationshämtning och övervakning av tillgångar med hjälp av trådlösa hemnätverk. Det är naturligt att överväga att sätta värdesaker på nätet för snabb hämtning. Vi hackar billiga bluetooth -lågenergibakar för nätverksintervallet och batteriets livslängd och bygger en smart applikation så att Alexa vet var vi lämnade nycklarna.

Hur man gör det…

Steg 1: Hacka Bluetooth -beacons

En uppsättning med 3 fyrar kan köpas för mindre än $ 15 och stöds med Android/iOS -applikationer, men vi väljer bort sekretess. Att hitta våra nycklar borde dessutom inte bli en telefon.

Denna adafruit -handledning om bakåtbyggda smarta lampor hjälpte oss att styra fyrarna. Börja med att slå på beacon -sökningen efter enhetsadressen genom att köra:

sudo hcitool lescan

Hitta och kopiera adressen märkt med namnet 'iTag' och kör sedan:

sudo gatttool -I

Anslut till enheten interaktivt genom att köra:

anslut AA: BB: CC: DD: EE: FF

Prova att köra "hjälp" för att visa alternativ eller "primär" för att visa tjänster:

Genom att köra 'char-desc' följt av servicehandtaget enligt ovan hittar vi UUID: er som vi letar upp genom att referera till de gattskarakteristiska specifikationerna och servicespecifikationerna. För mer information om de här tjänsterna, kolla in detta. Vid inspektion av trafik med Wireshark finner vi att 0100111000000001 utlöser larmet och logiskt nog stänger 0000111000000001 av det. Nu har vi den enkla python -funktionen:

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

Därefter fokuserar vi på att skapa Alexa -färdigheten för att utlösa fyren när vi letar efter nycklarna.

Steg 2: Skapa en Alexa Skill och App

Skapa en Alexa Skill och App
Skapa en Alexa Skill och App
Skapa en Alexa Skill och App
Skapa en Alexa Skill och App

Vi skapar en skicklighet som kommer att länkas till en lokal server. Sedan konfigurerar vi vår server för att vidta alla åtgärder vi skulle vilja, i det här fallet, ge en approximation för var nycklarna kan vara placerade och få Bluetooth -varningssignalen att pipa. Flask ger ett enkelt och lättanvänt pythonbibliotek för att betjäna en applikation. Med hjälp av flask-ask kan vi konfigurera servern för att kommunicera med vår Alexa-skicklighet som vi kommer att bygga senare. Servera programmet med Ngrok, vilket ger oss en https -länk som vi behöver för vår Alexa -skicklighet. Först byggde vi applikationen med den enklaste funktionaliteten: att få vår BLE -signal att pipa när den utlöses.

#!/usr/bin/env pythonfrån flaskimport Flask from flask_ask import Ask, statement import pexpect app = Flask (_ name_) ask = Ask (app, '/') BD_ADDR = 'AA: BB: CC: DD: EE: FF '#Ditt bluetooth -beacon -id här @ask.intent (' findkeys ') def retrievr (): sound_alarm () speech_text = "Dina nycklar finns här någonstans." return statement (speech_text) def sound_alarm (): child = pexpect.spawn ('gatttool -I') child.sendline ('connect {}'. format (BD_ADDR)) child.expect ('Connection failed', timeout = 60) child.sendline ('char-write-cmd 0x000b 0100111000000001') om _name_ == "_main_": app.run (host = '127.0.0.1', port = '5000')

Vi använde funktionen sound_alarm () som vi skrev tidigare för att göra BLE -pipet. För funktionen som kommer att användas för avsikten lägger vi till askdekoratören med våra avsikter "findkeys". När vi gör Alexa -färdigheten på Amazon -utvecklarens instrumentpanel kommer vi att använda detta namn för vår avsikt. Skriv detta skript till en fil som heter app.py och kör

python app.py

Detta kommer att visa din ansökan på https:// localhost: 5000. Kör en ngrok -server och kopiera den genererade https -länken. Du behöver det när du konfigurerar Alexa -färdigheten. För mer information, kolla in det här inlägget. Vi har framgångsrikt konfigurerat en enkel applikation, nu skriver vi Alexa -färdigheten. Navigera till Amazon utvecklarens instrumentpanel och logga in. Klicka på Alexa och kom igång med Alexa Skill kit

Följ instruktionerna från gui.

Under fliken Interationsmodell vill du fylla i rutan Intent Schema med följande:

I rutan Provutterances vill du skriva några exempelkommandon som en person kan använda för att åkalla färdigheten. Vi skrev dessa:

findkeys find my keysfindkeys där mina nycklar hittar nycklar jag tappade mina nycklar

  • På fliken Konfiguration, se till att välja tjänstens slutpunkt till HTTPS. Kopiera din https -länk och klistra in den i standardrutan nedanför. Kontolänkning kan lämnas till nr.
  • I SSL-certifikatet väljer du det mellersta alternativet "Min utveckling slutpunkt är en underdomän för en domän som har ett jokertecken från en certifikatutfärdare".
  • På fliken Test kan du testa den nya färdigheten genom att skriva in ett av dina provkommandon.

Slutför att fylla i de två sista flikarna tills alla bockar är gröna. Starta sedan din skicklighet med Beta Testing -funktionen. Detta låter dig vara värd för din skicklighet på vilken eko -enhet som helst innan du publicerar den. Följ instruktionerna på e -postlänken för att installera färdigheten på din eko -enhet.

Steg 3: Gör vår skicklighet smartare

Gör vår skicklighet smartare
Gör vår skicklighet smartare
Gör vår skicklighet smartare
Gör vår skicklighet smartare
Gör vår skicklighet smartare
Gör vår skicklighet smartare

Vi lägger inaktiverade datorer spridda över hela huset för att arbeta med att fråga bluetooth -fyren för att rapportera RSSI -signalstyrkan.

Med avläsningar från flera maskiner kan vi använda signalstyrkan till som en proxy för avstånd. Vi måste ta reda på hur vi använder det här för att beräkna den mest troliga delen av huset för att hitta ledstjärnan.

Vi vänder oss till maskininlärning. Ett crontab -jobb varannan minut, bygger upp en dataset med RSSI -tupler. Placera fyren på olika platser som: "Sovrum", "Badrum", "Kök", "Vardagsrum" märker vi RSSI -loggarna. När vi har kartlagt hemmet kan vi använda trädbaserade modeller som xgboosts XGBClassifier.

Xgboost -implementeringen av gradientförstärkning kommer att hantera saknade data från timeout -avläsningar, träning på några sekunder. Använd python pickle för att fortsätta den utbildade modellen och ladda in i vår alexa retrievr -applikation. När färdigheten anropas letar applikationen upp Bluetooth RSSI -läsningen och genererar en förutsagd plats, alexa kan svara och föreslår att "försöka titta i badrummet."

Steg 4: Sätta ihop allt

Med en modell för att approximera nycklarnas sista plats kan vi lägga till den i programmet för att förbättra uttalandet som returneras av Alexa. Vi har ändrat skriptet för att läsa:

importera osfrån kolv importera kolv från flask_ask import Fråga, uttalande 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 = guess_locate () return statement (speech_text) def guess_locate (): read_dict = {} line_gen = reverse_readline ('YOUR_DATA_FILE.txt') res_lst = medan len (res_lst)! = 20: ln = nästa (line_gen) om ln.startswith ('Host'): _, ip, _, läsning = ln.split () read_dict [ip] = läser 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}). Värden mdl_ = pickle.load (öppen (' location_model_file.dat ',' rb ')) preds = mdl_.predict (val) guess = Counter (preds) gissning = gissa.most_sommar (1) [0] [0] reply_str = 'Prova att titta i' if guess == 1: reply_str += 'sovrum' elif gissning == 2: reply_str += 'badrum' elif gissning == 3: answer_str += 'kök' elif gissning == 4: reply_str += 'vardagsrum' return svara_str om _name_ == "_main_": app.run (värd = '127.0.0.1', port = '5000')

Vi skapade en ny funktion som heter guess_locate () som tar en fil med de senaste registrerade rssi -signalstyrkorna. Den kör sedan proverna mot vår inlagda xgboost -modell och returnerar den mest troliga platssträngen. Den här platsen returneras när Alexa uppmanas. Eftersom det kan ta några sekunder att upprätta en anslutning till en fyr, kör vi en separat process som kallar den funktionen i sound_alarm.py.

Rekommenderad: