Оглавление:

Алекса, где мои ключи?: 4 шага
Алекса, где мои ключи?: 4 шага

Видео: Алекса, где мои ключи?: 4 шага

Видео: Алекса, где мои ключи?: 4 шага
Видео: Timati ft. Mario Winans - Forever (official video) 2024, Июль
Anonim
Image
Image
Взлом Bluetooth-маяков
Взлом Bluetooth-маяков

Alexa особенно хорошо подходит для задач поиска информации и мониторинга активов с использованием беспроводных домашних сетей. Естественно подумать о размещении ценных вещей в сетке для быстрого поиска. Мы взламываем дешевые Bluetooth-маяки с низким энергопотреблением для обеспечения дальности действия сети и долговечности аккумулятора и создаем интеллектуальное приложение, чтобы Alexa знала, где мы оставили ключи.

Как это сделать…

Шаг 1. Взлом Bluetooth-маяков

Набор из 3 маяков можно приобрести менее чем за 15 долларов, и они поддерживаются приложениями Android / iOS, но мы откажемся от конфиденциальности. Кроме того, поиск ключей не должен превращаться в поиск телефона.

Этот учебник adafruit по обратному проектированию умного освещения помог нам управлять маяками. Начните с включения сканирования маяка для адреса устройства, запустив:

sudo hcitool lescan

Найдите и скопируйте адрес с именем iTag, затем запустите:

sudo gatttool -I

Подключитесь к устройству в интерактивном режиме, запустив:

подключить AA: BB: CC: DD: EE: FF

Попробуйте запустить «справку», чтобы просмотреть параметры, или «первичный», чтобы просмотреть службы:

Запустив 'char-desc', за которым следует дескриптор службы, как указано выше, мы находим UUID, которые ищем, ссылаясь на характеристики характеристик gatt и спецификации услуг. Чтобы узнать больше об этих сервисах, ознакомьтесь с этим. Анализируя трафик с помощью Wireshark, мы обнаруживаем, что 0100111000000001 вызывает тревогу, а логически 0000111000000001 отключает его. Теперь у нас есть простая функция Python:

import pexpectdef sound_alarm (BD_ADDR): child = pexpect.spawn ('gatttool -I') child.sendline ('connect {}'. format (BD_ADDR)) child.expect ('Соединение успешно', тайм-аут = 30) child.sendline ('char-write-cmd 0x000b 0100111000000001')

Далее мы сосредотачиваемся на создании навыка Alexa, чтобы активировать маяк, когда мы ищем ключи.

Шаг 2. Создание навыка и приложения для Alexa

Создание навыка и приложения Alexa
Создание навыка и приложения Alexa
Создание навыка и приложения Alexa
Создание навыка и приложения Alexa

Мы создаем навык, который будет привязан к локальному серверу. Затем мы настраиваем наш сервер для выполнения любых действий, которые мы хотели бы, в этом случае предоставить приблизительное расположение клавиш и подать сигнал маяка Bluetooth. Flask предоставляет простую и удобную библиотеку Python для обслуживания приложения. Используя flask-ask, мы можем настроить сервер для взаимодействия с нашим навыком Alexa, который мы построим позже. Хорошо обслужите приложение с помощью Ngrok, который предоставит нам https-ссылку, которая нам понадобится для нашего навыка Alexa. Сначала мы создали приложение с простейшими функциями: заставлять наш маячок BLE издавать звуковой сигнал при срабатывании.

#! / 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 '# Ваш идентификатор радиомаяка Bluetooth здесь @ ask.intent (' findkeys ') def retrievr (): sound_alarm () speech_text = "Ваши ключи где-то здесь". оператор возврата (речевой_текст) def sound_alarm (): child = pexpect.spawn ('gatttool -I') child.sendline ('connect {}'. format (BD_ADDR)) child.expect ('Соединение выполнено успешно', тайм-аут = 60) child.sendline ('char-write-cmd 0x000b 0100111000000001') если _name_ == "_main_": app.run (host = '127.0.0.1', port = '5000')

Мы использовали функцию sound_alarm (), которую мы написали ранее, чтобы издавать звуковой сигнал BLE. Для функции, которая будет использоваться для намерения, мы добавляем декоратор запроса с нашим намерением «findkeys». Когда мы создадим навык Alexa на панели инструментов разработчика Amazon, мы будем использовать это имя для наших целей. Запишите этот сценарий в файл с именем app.py и запустите

python app.py

Это будет обслуживать ваше приложение на https:// localhost: 5000. Запустите сервер ngrok и скопируйте сгенерированную ссылку https. Он понадобится вам при настройке навыка Alexa. Подробнее читайте в этом посте. Мы успешно настроили простое приложение, теперь напишем скилл Алекса. Перейдите к панели управления разработчика Amazon и войдите в систему. Нажмите Alexa и начните работу с Alexa Skill kit.

Следуйте инструкциям, предоставленным графическим интерфейсом.

На вкладке Interation Model вы захотите заполнить поле Intent Schema следующим образом:

В поле Sample Utterances вы хотите написать несколько примеров команд, которые человек может использовать для активации навыка. Мы написали это:

findkeys найди мои ключи найди ключи где мои ключи найди ключи я потерял свои ключи

  • На вкладке «Конфигурация» убедитесь, что в качестве конечной точки службы выбран HTTPS. Скопируйте ссылку https и вставьте ее в поле по умолчанию внизу. Связывание аккаунта можно оставить на Нет.
  • В сертификате SSL выберите средний вариант: «Моя конечная точка разработки - это поддомен домена, имеющего групповой сертификат от центра сертификации».
  • Вкладка «Тест» позволит вам протестировать новый навык, введя одну из ваших примеров команд.

Завершите заполнение последних двух вкладок, пока все галочки не станут зелеными. Затем начните свое мастерство с помощью функции бета-тестирования. Это позволяет вам разместить свое умение на любом эхо-устройстве перед его публикацией. Следуйте инструкциям по электронной почте, чтобы установить навык на свое эхо-устройство.

Шаг 3. Повышение эффективности наших навыков

Делаем наши навыки умнее
Делаем наши навыки умнее
Делаем наши навыки умнее
Делаем наши навыки умнее
Делаем наши навыки умнее
Делаем наши навыки умнее

Мы заставляем бездействующие компьютеры, разбросанные по всему дому, опрашивать маяк Bluetooth, чтобы сообщить об уровне сигнала RSSI.

Снимая показания с нескольких устройств, мы можем использовать уровень сигнала в качестве прокси для расстояния. Нам нужно выяснить, как использовать это, чтобы вычислить наиболее вероятную часть дома, чтобы найти маяк.

Переходим к машинному обучению. Задание crontab каждые 2 минуты создает набор данных кортежей RSSI. Размещая маяк в разных местах, таких как: «Спальня», «Ванная комната», «Кухня», «Жилая зона», мы маркируем журналы RSSI. После того, как мы нанесли на карту дом, мы можем использовать древовидные модели, такие как XGBClassifier от xgboost.

Реализация повышения градиента xgboost будет обрабатывать недостающие данные из показаний тайм-аута, обучаясь за пару секунд. Используйте python pickle, чтобы сохранить обученную модель и загрузить ее в наше приложение alexa retrievr. Когда вызывается навык, приложение просматривает показания RSSI Bluetooth и генерирует предсказанное местоположение, alexa может ответить, предлагая «попробовать поискать в ванной».

Шаг 4: Собираем все вместе

Имея модель для аппроксимации последнего местоположения ключей, мы можем добавить ее в приложение, чтобы улучшить выражение, возвращаемое Alexa. Мы изменили сценарий, чтобы он читал:

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] = чтение 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 = 'Попробуйте поискать в' if guess == 1: reply_str + = 'bedroom' elif guess ". == 2: reply_str + = 'ванная' elif guess == 3: reply_str + = 'kitchen' elif guess == 4: reply_str + = 'гостиная' return reply_str if _name_ == "_main_": app.run (host = '127.0.0.1', порт = '5000')

Мы создали новую функцию под названием guess_locate (), которая принимает файл с самыми последними записанными уровнями сигнала rssi. Затем он запустит образцы для нашей маринованной модели xgboost и вернет строку с наиболее вероятным местоположением. Это местоположение будет возвращено, когда появится запрос Alexa. Поскольку установление соединения с маяком может занять несколько секунд, мы запускаем отдельный процесс, вызывающий эту функцию в sound_alarm.py.

Рекомендуемые: