Table des matières:

Alexa, où sont mes clés ? : 4 étapes
Alexa, où sont mes clés ? : 4 étapes

Vidéo: Alexa, où sont mes clés ? : 4 étapes

Vidéo: Alexa, où sont mes clés ? : 4 étapes
Vidéo: Amazon Alexa: Configurer votre Echo Dot 2024, Juillet
Anonim
Image
Image
Piratage des balises Bluetooth
Piratage des balises Bluetooth

Alexa est particulièrement bien adapté aux tâches de récupération d'informations et de surveillance des actifs à l'aide de réseaux domestiques sans fil. Il est naturel d'envisager de mettre des objets de valeur sur la grille pour une récupération rapide. Nous hackons des balises bluetooth low energy bon marché pour la portée du réseau et la longévité de la batterie et créons une application intelligente pour qu'Alexa sache où nous avons laissé les clés.

Comment faire…

Étape 1: Piratage des balises Bluetooth

Un ensemble de 3 balises peut être acheté pour moins de 15 $ et est pris en charge par les applications Android/iOS, mais nous refuserons la confidentialité. D'ailleurs, trouver nos clés ne doit pas se transformer en trouver notre téléphone.

Ce tutoriel adafruit sur la rétro-ingénierie des lumières intelligentes nous a aidés à contrôler les balises. Commencez par activer l'analyse des balises pour l'adresse de l'appareil en exécutant:

sudo hcitool lescan

Recherchez et copiez l'adresse étiquetée avec le nom « iTag », puis exécutez:

sudo gatttool -I

Connectez-vous à l'appareil de manière interactive en exécutant:

connecter AA:BB:CC:DD:EE:FF

Essayez d'exécuter « help » pour afficher les options ou « principal » pour afficher les services:

En exécutant 'char-desc' suivi du descripteur de service comme ci-dessus, nous trouvons des UUID que nous recherchons en référençant les spécifications des caractéristiques gatt et les spécifications du service. Pour en savoir plus sur ces services, consultez ceci. En inspectant le trafic avec Wireshark, nous constatons que 0100111000000001 déclenche l'alarme et logiquement, 0000111000000001 la désactive. Maintenant, nous avons la simple fonction python:

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

Ensuite, nous nous concentrons sur la création de la compétence Alexa pour déclencher la balise lorsque nous recherchons les clés.

Étape 2: Création d'une compétence et d'une application Alexa

Création d'une compétence et d'une application Alexa
Création d'une compétence et d'une application Alexa
Création d'une compétence et d'une application Alexa
Création d'une compétence et d'une application Alexa

Nous créons une compétence qui sera liée à un serveur local. Ensuite, nous configurons notre serveur pour prendre toutes les mesures que nous aimerions, dans ce cas, fournir une approximation de l'emplacement des clés et faire biper la balise Bluetooth. Flask fournit une bibliothèque Python simple et facile à utiliser pour servir une application. En utilisant flask-ask, nous pouvons configurer le serveur pour communiquer avec notre skill Alexa que nous construirons plus tard. Eh bien, servez l'application avec Ngrok, ce qui nous donnera un lien https dont nous aurons besoin pour notre compétence Alexa. Nous avons d'abord construit l'application avec la fonctionnalité la plus simple: faire sonner notre balise BLE lorsqu'elle est déclenchée.

#!/usr/bin/env pythonfrom flask import Flask from flask_ask import Ask, instruction import pexpect app=Flask(_name_) ask = Ask(app, '/') BD_ADDR = 'AA:BB:CC:DD:EE:FF ' #Votre identifiant de balise Bluetooth ici @ask.intent('findkeys') def retrievr(): sound_alarm() speech_text = "Vos clés sont quelque part par ici." déclaration de retour (speech_text) def sound_alarm (): child = pexpect.spawn('gatttool -I') child.sendline('connect {}'.format(BD_ADDR)) child.expect('Connexion réussie', timeout=60) child.sendline('char-write-cmd 0x000b 0100111000000001') if _name_ == "_main_": app.run(host='127.0.0.1', port='5000')

Nous avons utilisé la fonction sound_alarm() que nous avons écrite précédemment pour faire biper le BLE. Pour la fonction qui sera utilisée pour l'intention, nous ajoutons le décorateur ask avec notre intention "findkeys". Lorsque nous créons la compétence Alexa sur le tableau de bord du développeur Amazon, nous utiliserons ce nom pour notre intention. Écrivez ce script dans un fichier nommé app.py et exécutez

python app.py

Cela servira votre application sur https://localhost:5000. Exécutez un serveur ngrok et copiez le lien https généré. Vous en aurez besoin lorsque vous configurerez la compétence Alexa. Pour plus de détails, consultez cet article. Nous avons réussi à mettre en place une application simple, nous allons maintenant écrire la skill Alexa. Accédez au tableau de bord du développeur Amazon et connectez-vous. Cliquez sur Alexa et lancez-vous avec le kit de compétences Alexa

Suivez les instructions données par l'interface graphique.

Sous l'onglet Modèle d'interaction, vous devrez remplir la zone Schéma d'intention avec les éléments suivants:

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

  • Dans la zone Exemples d'énoncés, vous souhaitez écrire des exemples de commandes qu'une personne pourrait utiliser pour invoquer la compétence. Nous avons écrit ceux-ci:

findkeys trouver mes clésfindkeys où mes clés findkeys j'ai perdu mes clés

  • Dans l'onglet Configuration, assurez-vous de choisir le point de terminaison du service vers HTTPS. Copiez votre lien https et collez-le dans la zone Par défaut en dessous. La liaison de compte peut être laissée à Non.
  • Dans le certificat SSL, choisissez l'option du milieu, "Mon point de terminaison de développement est un sous-domaine d'un domaine qui a un certificat générique d'une autorité de certification".
  • L'onglet Test vous permettra de tester la nouvelle compétence en tapant l'un de vos exemples de commandes.

Terminez de remplir les deux derniers onglets jusqu'à ce que toutes les coches soient vertes. Ensuite, lancez votre skill avec la fonctionnalité Beta Testing. Cela vous permet d'héberger votre skill sur n'importe quel appareil d'écho avant de la publier. Suivez les instructions sur le lien e-mail pour installer la skill sur votre appareil echo.

Étape 3: Rendre nos compétences plus intelligentes

Rendre nos compétences plus intelligentes
Rendre nos compétences plus intelligentes
Rendre nos compétences plus intelligentes
Rendre nos compétences plus intelligentes
Rendre nos compétences plus intelligentes
Rendre nos compétences plus intelligentes

Nous mettons les ordinateurs inactifs répartis dans toute la maison au travail en interrogeant la balise Bluetooth pour signaler la force du signal RSSI.

En prenant des lectures sur plusieurs machines, nous pouvons utiliser la force du signal comme indicateur de distance. Nous devons trouver comment l'utiliser pour calculer la partie de la maison la plus susceptible de trouver la balise.

Nous nous tournons vers l'apprentissage automatique. Une tâche crontab toutes les 2 minutes crée un ensemble de données de tuples RSSI. En plaçant la balise à différents endroits tels que: 'Chambre', 'Salle de bain', 'Cuisine', 'Séjour', nous étiquetons les journaux RSSI. Une fois que nous avons cartographié la maison, nous pouvons utiliser des modèles basés sur des arbres comme XGBClassifier de xgboost.

L'implémentation xgboost de l'amplification de gradient gérera les données manquantes des lectures expirées, s'entraînant en quelques secondes. Utilisez python pickle pour conserver le modèle entraîné et le charger dans notre application alexa retrievr. Lorsque la compétence est appelée, l'application recherche la lecture RSSI Bluetooth et génère un emplacement prédit, Alexa peut répondre en suggérant « essayez de regarder dans la salle de bain ».

Étape 4: Tout assembler

Ayant un modèle pour approximer le dernier emplacement des clés, nous pouvons l'ajouter à l'application pour améliorer la déclaration renvoyée par Alexa. Nous avons modifié le script pour lire:

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 = 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] = lecture 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 = 'Essayez de regarder dans le ' if guess == 1: reply_str += 'chambre' elif guess == 2: reply_str += 'salle de bain' elif guess == 3: reply_str += 'cuisine' elif guess == 4: reply_str += 'living room' return reply_str if _name_ == "_main_": app.run(host ='127.0.0.1', port='5000')

Nous avons créé une nouvelle fonction appelée guess_locate() qui prend un fichier avec les dernières forces de signal rssi enregistrées. Il exécutera ensuite les échantillons sur notre modèle xgboost décapé et renverra la chaîne d'emplacement la plus probable. Cet emplacement sera renvoyé lorsque Alexa sera invité. Étant donné que l'établissement d'une connexion à une balise peut prendre quelques secondes, nous exécutons un processus distinct appelant cette fonction dans sound_alarm.py.

Conseillé: