Spisu treści:

Alexa, gdzie są moje klucze?: 4 kroki
Alexa, gdzie są moje klucze?: 4 kroki

Wideo: Alexa, gdzie są moje klucze?: 4 kroki

Wideo: Alexa, gdzie są moje klucze?: 4 kroki
Wideo: Весь курс А1 в одном видео (все 33 урока). Практический тренажёр. Перевод с польского на русский. 2024, Lipiec
Anonim
Image
Image
Hakowanie sygnałów nawigacyjnych Bluetooth
Hakowanie sygnałów nawigacyjnych Bluetooth

Alexa jest szczególnie dobrze przystosowana do zadań związanych z wyszukiwaniem informacji i monitorowaniem zasobów za pomocą bezprzewodowych sieci domowych. Naturalne jest rozważenie umieszczenia kosztowności na siatce w celu szybkiego odzyskania. Hakujemy tanie niskoenergetyczne beacony bluetooth dla zasięgu sieci i żywotności baterii oraz budujemy inteligentną aplikację, aby Alexa wiedziała, gdzie zostawiliśmy klucze.

Jak to zrobić…

Krok 1: Hakowanie sygnałów nawigacyjnych Bluetooth

Zestaw 3 beaconów można kupić za mniej niż 15 USD i są one obsługiwane przez aplikacje na Androida/iOS, ale zrezygnujemy z prywatności. Poza tym odnalezienie naszych kluczy nie powinno zamienić się w odnalezienie naszego telefonu.

Ten samouczek adafruit dotyczący inteligentnych świateł inżynierii odwrotnej pomógł nam kontrolować sygnały nawigacyjne. Zacznij od włączenia skanowania beaconów dla adresu urządzenia, uruchamiając:

sudo hcitool lescan

Znajdź i skopiuj adres oznaczony nazwą „iTag”, a następnie uruchom:

sudo gatttool -I

Połącz się z urządzeniem interaktywnie, uruchamiając:

połącz AA:BB:CC:DD:EE:FF

Spróbuj uruchomić „pomoc”, aby wyświetlić opcje lub „podstawową”, aby wyświetlić usługi:

Uruchamiając „char-desc”, a następnie uchwyt usługi, jak powyżej, znajdujemy identyfikatory UUID, które sprawdzamy, odwołując się do specyfikacji charakterystyki gatt i specyfikacji usług. Aby uzyskać więcej informacji na temat tych usług, sprawdź to. Sprawdzając ruch za pomocą Wireshark, stwierdzamy, że 0100111000000001 wyzwala alarm i logicznie 0000111000000001 go wyłącza. Teraz mamy prostą funkcję Pythona:

import pexpectdef sound_alarm(BD_ADDR): child = pexpect.spawn('gatttool -I') child.sendline('connect {}'.format(BD_ADDR)) child.expect('Połączenie powiodło się', timeout=30) child.sendline ('char-write-cmd 0x000b 0100111000000001')

Następnie skupiamy się na stworzeniu umiejętności Alexa, która uruchamia beacon, gdy szukamy kluczy.

Krok 2: Tworzenie umiejętności i aplikacji Alexa

Tworzenie umiejętności i aplikacji Alexa
Tworzenie umiejętności i aplikacji Alexa
Tworzenie umiejętności i aplikacji Alexa
Tworzenie umiejętności i aplikacji Alexa

Tworzymy umiejętność, która będzie połączona z lokalnym serwerem. Następnie konfigurujemy nasz serwer tak, aby podejmował dowolną akcję, w tym przypadku przybliżoną lokalizację kluczy i wydanie sygnału dźwiękowego beaconu Bluetooth. Flask zapewnia prostą i łatwą w użyciu bibliotekę Pythona do obsługi aplikacji. Używając flask-ask, możemy skonfigurować serwer tak, aby komunikował się z naszą umiejętnością Alexa, którą zbudujemy później. Dobrze obsłuż aplikację za pomocą Ngrok, który da nam link https, którego będziemy potrzebować do naszej umiejętności Alexa. Najpierw zbudowaliśmy aplikację z najprostszą funkcjonalnością: aby nasz beacon BLE wydawał sygnał dźwiękowy po uruchomieniu.

#!/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 ' #Twój identyfikator beacon bluetooth @ask.intent('findkeys') def retrievr(): sound_alarm() speech_text = "Twoje klucze są gdzieś tutaj." return statement(speech_text) def sound_alarm(): child = pexpect.spawn('gatttool -I') child.sendline('connect {}'.format(BD_ADDR)) child.expect('Połączenie powiodło się', timeout=60) child.sendline('char-write-cmd 0x000b 0100111000000001') if _name_ == "_main_": app.run(host='127.0.0.1', port='5000')

Użyliśmy funkcji sound_alarm(), którą napisaliśmy wcześniej, aby wywołać sygnał dźwiękowy BLE. Dla funkcji, która będzie używana do intencji, dodajemy dekoratora ask z naszymi intencjami "findkeys". Kiedy stworzymy umiejętność Alexa na pulpicie programisty Amazon, użyjemy tej nazwy dla naszych intencji. Napisz ten skrypt do pliku o nazwie app.py i uruchom

python aplikacja.py

To będzie obsługiwać twoją aplikację na https://localhost:5000. Uruchom serwer ngrok i skopiuj wygenerowany link https. Będziesz go potrzebować, gdy skonfigurujesz umiejętność Alexa. Więcej szczegółów znajdziesz w tym poście. Pomyślnie skonfigurowaliśmy prostą aplikację, teraz napiszemy umiejętność Alexa. Przejdź do pulpitu programisty Amazon i zaloguj się. Kliknij Alexa i zacznij korzystać z zestawu Alexa Skill

Postępuj zgodnie z instrukcjami podanymi przez gui.

Na karcie Interation Model będziesz chciał wypełnić pole Intent Schema następującymi elementami:

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

  • W polu Przykładowe wypowiedzi chcesz napisać kilka przykładowych poleceń, których osoba może użyć do wywołania umiejętności. Napisaliśmy te:

findkeys znajdź moje klucze znajdź klucze gdzie moje klucze findkeys Zgubiłem klucze

  • Na karcie Konfiguracja wybierz punkt końcowy usługi na HTTPS. Skopiuj link https i wklej go w polu Domyślne poniżej. Łączenie kont można pozostawić na Nie.
  • W certyfikacie SSL wybierz środkową opcję „Mój punkt końcowy rozwoju jest subdomeną domeny, która ma certyfikat wieloznaczny z urzędu certyfikacji”.
  • Zakładka Test pozwoli Ci przetestować nową umiejętność, wpisując jedno z przykładowych poleceń.

Zakończ wypełnianie dwóch ostatnich zakładek, aż wszystkie znaczniki wyboru będą zielone. Następnie uruchom swoje umiejętności dzięki funkcji beta testów. Dzięki temu możesz przechowywać swoje umiejętności na dowolnym urządzeniu echo przed ich opublikowaniem. Postępuj zgodnie z instrukcjami podanymi w e-mailu, aby zainstalować umiejętność na urządzeniu echo.

Krok 3: Zwiększanie inteligencji naszych umiejętności

Zwiększanie inteligencji naszych umiejętności
Zwiększanie inteligencji naszych umiejętności
Zwiększanie inteligencji naszych umiejętności
Zwiększanie inteligencji naszych umiejętności
Zwiększanie inteligencji naszych umiejętności
Zwiększanie inteligencji naszych umiejętności

Umieściliśmy bezczynne komputery rozsiane po całym domu w celu odpytywania sygnału nawigacyjnego Bluetooth w celu zgłoszenia siły sygnału RSSI.

Pobierając odczyty z wielu maszyn, możemy wykorzystać siłę sygnału jako proxy dla odległości. Musimy dowiedzieć się, jak tego użyć, aby obliczyć najbardziej prawdopodobną część domu, aby znaleźć latarnię.

Zwracamy się do uczenia maszynowego. Zadanie crontab co 2 minuty, buduje zestaw danych krotek RSSI. Umieszczając beacon w różnych miejscach, takich jak: „Sypialnia”, „Łazienka”, „Kuchnia”, „Obszar dzienny” oznaczamy dzienniki RSSI. Po zmapowaniu domu możemy użyć modeli opartych na drzewie, takich jak XGBClassifier firmy xgboost.

Implementacja zwiększania gradientu w xgboost poradzi sobie z brakiem danych z odczytów, których przekroczono limit czasu, trenując w ciągu kilku sekund. Użyj pickle Pythona, aby utrwalić wytrenowany model i załadować do naszej aplikacji alexa retrievr. Po wywołaniu umiejętności aplikacja sprawdza odczyt RSSI bluetooth i generuje przewidywaną lokalizację, alexa może odpowiedzieć, proponując „spróbuj zajrzeć do łazienki”.

Krok 4: Złożenie wszystkiego razem

Mając model przybliżający ostatnią lokalizację kluczy, możemy dodać go do aplikacji, aby poprawić zestawienie zwracane przez Alexę. Zmodyfikowaliśmy skrypt, aby czytał:

import osfrom flask import Flask from flask_ask import Ask, statement import pexpect import pickle import pandy as pd import numpy as np z kolekcji import defaultdict, Counter from reverse_read import reverse_readline app=Flask(_name_) ask = Ask(app, '/') @ ask.intent('findkeys') def retrievr(): os.system("/ścieżka/do/repo/sound_alarm.py &") speech_text = przypuszczaj_lokalizuj() return instrukcja(mowa_tekst) def odgadnij_lokalizuj(): read_dict = {} line_gen = reverse_readline('TWOJE_PLIK_DANE.txt') res_lst = while len(res_lst) != 20: ln = next(line_gen) if ln.startswith('Host'): _, ip, _, reading = ln.split () read_dict[ip] = czytanie 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) zgadnij = Counter(preds) zgadnij = zgadnij.most_common(1)[0][0] reply_str = 'Spróbuj zajrzeć do ' jeśli zgadnij == 1: reply_str += 'sypialnia' elif odgadnąć == 2: reply_str += 'łazienka' elif odgadnij == 3: odpowiedz_str += 'kuchnia' elif odgadnij == 4: odpowiedz_str += 'salon' return reply_str if _name_ == "_main_": app.run(host ='127.0.0.1', port='5000')

Stworzyliśmy nową funkcję o nazwie odgadnij_lokalizację(), która pobiera plik z najnowszymi zarejestrowanymi siłami sygnału rssi. Następnie przeanalizuje próbki względem naszego marynowanego modelu xgboost i zwróci najbardziej prawdopodobny ciąg lokalizacji. Ta lokalizacja zostanie zwrócona, gdy pojawi się monit Alexa. Ponieważ nawiązanie połączenia z beaconem może zająć kilka sekund, uruchamiamy osobny proces wywołujący tę funkcję w sound_alarm.py.

Zalecana: