Sommario:

Alexa, dove sono le mie chiavi?: 4 passaggi
Alexa, dove sono le mie chiavi?: 4 passaggi

Video: Alexa, dove sono le mie chiavi?: 4 passaggi

Video: Alexa, dove sono le mie chiavi?: 4 passaggi
Video: Бесшумное zigbee реле в подрозетник без нулевой линии, особенности монтажа, установка конденсатора 2024, Luglio
Anonim
Image
Image
Hackerare i beacon Bluetooth
Hackerare i beacon Bluetooth

Alexa è particolarmente adatto alle attività di recupero delle informazioni e al monitoraggio delle risorse tramite reti domestiche wireless. È naturale considerare l'inserimento di oggetti di valore sulla griglia per un rapido recupero. Abbiamo hackerato beacon bluetooth a basso consumo energetico per la portata della rete e la longevità della batteria e creiamo un'applicazione intelligente in modo che Alexa sappia dove abbiamo lasciato le chiavi.

Come farlo…

Passaggio 1: hacking dei beacon Bluetooth

È possibile acquistare un set di 3 beacon per meno di $ 15 e sono supportati con le applicazioni Android/iOS, ma verrà disattivato per la privacy. Inoltre, trovare le nostre chiavi non dovrebbe trasformarsi nel trovare il nostro telefono.

Questo tutorial di adafruit sulle luci intelligenti di reverse engineering ci ha aiutato a controllare i beacon. Inizia attivando la scansione beacon per l'indirizzo del dispositivo eseguendo:

sudo hcitool lescan

Trova e copia l'indirizzo etichettato con il nome "iTag", quindi esegui:

sudo gatttool -I

Connettiti al dispositivo in modo interattivo eseguendo:

collegare AA:BB:CC:DD:EE:FF

Prova a eseguire "help" per visualizzare le opzioni o "principale" per visualizzare i servizi:

Eseguendo 'char-desc' seguito dall'handle del servizio come sopra, troviamo gli UUID che cerchiamo facendo riferimento alle specifiche delle caratteristiche di gatt e alle specifiche del servizio. Per ulteriori informazioni su questi servizi, dai un'occhiata a questo. Ispezionando il traffico con Wireshark, scopriamo che 0100111000000001 attiva l'allarme e, logicamente, 0000111000000001 lo disattiva. Ora abbiamo la semplice funzione Python:

import peexpectdef sound_alarm(BD_ADDR): child = pexpect.spawn('gatttool -I') child.sendline('connect {}'.format(BD_ADDR)) child.expect('Connessione riuscita', timeout=30) child.sendline ('char-write-cmd 0x000b 0100011000000001')

Successivamente, ci concentriamo sulla creazione dell'abilità di Alexa per attivare il beacon quando cerchiamo le chiavi.

Passaggio 2: creazione di un'abilità e di un'app Alexa

Creare una Skill e un'App Alexa
Creare una Skill e un'App Alexa
Creare una Skill e un'App Alexa
Creare una Skill e un'App Alexa

Creiamo una skill che sarà collegata a un server locale. Quindi configuriamo il nostro server per eseguire qualsiasi azione vorremmo, in questo caso, fornire un'approssimazione di dove potrebbero trovarsi i tasti e far suonare il beacon Bluetooth. Flask fornisce una libreria Python semplice e facile da usare per servire un'applicazione. Usando flask-ask, possiamo configurare il server per comunicare con la nostra abilità Alexa che costruiremo in seguito. Bene, serviamo l'applicazione con Ngrok, che ci fornirà un collegamento https di cui avremo bisogno per la nostra abilità Alexa. Per prima cosa abbiamo creato l'applicazione con la funzionalità più semplice: fare in modo che il nostro beacon BLE emetta un segnale acustico quando viene attivato.

#!/usr/bin/env pythonfrom flask import Flask from flask_ask import Ask, statement import peexpect app=Flask(_name_) ask = Ask(app, '/') BD_ADDR = 'AA:BB:CC:DD:EE:FF ' #ID del tuo beacon bluetooth qui @ask.intent('findkeys') def retrievr(): sound_alarm() speech_text = "Le tue chiavi sono qui da qualche parte." dichiarazione di ritorno(speech_text) def sound_alarm(): child = peexpect.spawn('gatttool -I') child.sendline('connect {}'.format(BD_ADDR)) child.expect('Connessione riuscita', timeout=60) child.sendline('char-write-cmd 0x000b 0100111000000001') if _name_ == "_main_": app.run(host='127.0.0.1', port='5000')

Abbiamo usato la funzione sound_alarm() che abbiamo scritto in precedenza per far suonare il BLE. Per la funzione che verrà utilizzata per l'intento, aggiungiamo il decoratore ask con il nostro intento "findkeys". Quando creiamo l'abilità di Alexa sulla dashboard degli sviluppatori di Amazon, useremo questo nome per il nostro intento. Scrivi questo script in un file chiamato app.py ed esegui

python app.py

Questo servirà la tua applicazione su https://localhost:5000. Esegui un server ngrok e copia il collegamento https generato. Ne avrai bisogno quando configuri l'abilità di Alexa. Per maggiori dettagli, dai un'occhiata a questo post. Abbiamo impostato con successo una semplice applicazione, ora scriveremo l'abilità di Alexa. Vai alla dashboard per sviluppatori di Amazon e accedi. Fai clic su Alexa e inizia con Alexa Skill kit

Segui le istruzioni fornite dalla gui.

Nella scheda Modello di interazione dovrai compilare la casella Schema di intenti con quanto segue:

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

  • Nella casella Espressioni di esempio, vuoi scrivere alcuni comandi di esempio che una persona potrebbe usare per invocare l'abilità. Abbiamo scritto questi:

trova chiavi trova le mie chiavi trova le chiavi dove le mie chiavi trova le chiavi Ho perso le chiavi

  • Nella scheda Configurazione, assicurati di scegliere l'endpoint del servizio su HTTPS. Copia il tuo link https e incollalo nella casella Predefinito sottostante. Il collegamento dell'account può essere lasciato al n.
  • Nel certificato SSL scegli l'opzione centrale, "Il mio endpoint di sviluppo è un sottodominio di un dominio che ha un certificato con caratteri jolly di un'autorità di certificazione".
  • La scheda Test ti consentirà di testare la nuova abilità digitando uno dei tuoi comandi di esempio.

Completa la compilazione delle ultime due schede finché tutti i segni di spunta non diventano verdi. Quindi avvia la tua abilità con la funzione di beta test. Ciò ti consente di ospitare la tua abilità su qualsiasi dispositivo echo prima di pubblicarla. Segui le istruzioni sul link e-mail per installare l'abilità sul tuo dispositivo echo.

Passaggio 3: rendere le nostre competenze più intelligenti

Rendere la nostra abilità più intelligente
Rendere la nostra abilità più intelligente
Rendere la nostra abilità più intelligente
Rendere la nostra abilità più intelligente
Rendere la nostra abilità più intelligente
Rendere la nostra abilità più intelligente

Mettiamo i computer inattivi sparsi in tutta la casa per interrogare il beacon bluetooth per segnalare la potenza del segnale RSSI.

Prendendo letture da più macchine, possiamo utilizzare la potenza del segnale come proxy per la distanza. Dobbiamo capire come usarlo per calcolare la parte più probabile della casa per trovare il faro.

Passiamo al machine learning. Un lavoro crontab ogni 2 minuti, crea un set di dati di tuple RSSI. Posizionando il beacon in punti diversi come: 'Camera da letto', 'Bagno', 'Cucina', 'Area soggiorno' etichettiamo i registri RSSI. Una volta mappata la casa, possiamo usare modelli basati su alberi come XGBClassifier di xgboost.

L'implementazione xgboost del gradient boosting gestirà i dati mancanti dalle letture scadute, allenandosi in un paio di secondi. Usa python pickle per rendere persistente il modello addestrato e caricarlo nella nostra applicazione alexa retrievr. Quando l'abilità viene chiamata, l'applicazione cerca la lettura RSSI bluetooth e genera una posizione prevista, Alexa può rispondere suggerendo di "prova a guardare in bagno".

Passaggio 4: mettere tutto insieme

Avendo un modello per approssimare l'ultima posizione delle chiavi, possiamo aggiungerlo all'applicazione per migliorare l'affermazione restituita da Alexa. Abbiamo modificato lo script per leggere:

import osfrom flask import Flask from flask_ask import Ask, statement import pexpect import pickle import pandas as pd import numpy as np from collection 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 istruzione(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] = lettura 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 = Counter(preds) guess = guess.most_common(1)[0][0] reply_str = 'Prova a cercare in ' if guess == 1: reply_str += 'camera da letto' elif guess == 2: reply_str += 'bagno' elif guess == 3: reply_str += 'cucina' elif guess == 4: reply_str += 'salotto' return reply_str if _name_ == "_main_": app.run(host ='127.0.0.1', porta='5000')

Abbiamo creato una nuova funzione chiamata guess_locate() che prende un file con gli ultimi segnali rssi registrati. Quindi eseguirà i campioni rispetto al nostro modello xgboost in salamoia e restituirà la stringa di posizione più probabile. Questa posizione verrà restituita quando viene richiesto ad Alexa. Poiché stabilire una connessione a un beacon può richiedere alcuni secondi, eseguiamo un processo separato che chiama quella funzione in sound_alarm.py.

Consigliato: