Turinys:

Alexa, kur yra mano raktai?: 4 žingsniai
Alexa, kur yra mano raktai?: 4 žingsniai

Video: Alexa, kur yra mano raktai?: 4 žingsniai

Video: Alexa, kur yra mano raktai?: 4 žingsniai
Video: Mano darbas – stebėti mišką ir čia vyksta kažkas keisto. 2024, Liepa
Anonim
Image
Image
Įsilaužimo „Bluetooth“švyturiai
Įsilaužimo „Bluetooth“švyturiai

„Alexa“ypač tinka informacijos paieškos užduotims ir turto stebėjimui naudojant belaidžius namų tinklus. Natūralu apsvarstyti galimybę vertingus daiktus įdėti į tinklą, kad juos būtų galima greitai atgauti. Nulaužame pigius „Bluetooth“mažai energijos naudojančius švyturėlius, skirtus tinklo diapazonui ir baterijos ilgaamžiškumui, ir sukuriame išmanią programą, kad „Alexa“žinotų, kur palikome raktus.

Kaip tai padaryti…

1 veiksmas: įsilaužimas į „Bluetooth“švyturėlius

3 švyturių rinkinį galima įsigyti už mažiau nei 15 USD ir jie palaikomi naudojant „Android“/„iOS“programas, tačiau mes atsisakysime privatumo. Be to, raktų paieška neturėtų virsti mūsų telefono paieška.

Ši „Adafruit“pamoka apie atvirkštinės inžinerijos išmaniuosius žibintus padėjo mums valdyti švyturėlius. Pradėkite įjungdami įrenginio adreso švyturėlio nuskaitymą vykdydami:

sudo hcitool lescan

Raskite ir nukopijuokite adresą, pažymėtą pavadinimu „iTag“, tada paleiskite:

sudo gatttool -I

Interaktyviai prisijunkite prie įrenginio vykdydami:

prijunkite AA: BB: CC: DD: EE: FF

Pabandykite paleisti „help“, kad peržiūrėtumėte parinktis, arba „pirminį“, kad peržiūrėtumėte paslaugas:

Vykdydami „char-desc“, o po to aptarnavimo rankenėlę, kaip nurodyta aukščiau, randame UUID, kurių ieškome remdamiesi gatt charakteristikomis ir paslaugų specifikacijomis. Norėdami sužinoti daugiau apie šias paslaugas, patikrinkite tai. Tikrindami srautą naudodami „Wireshark“, nustatome, kad 0100111000000001 suaktyvina aliarmą ir logiškai 0000111000000001 jį išjungia. Dabar turime paprastą python funkciją:

importuoti pexpectdef sound_alarm (BD_ADDR): child = pexpect.spawn ('gatttool -I') child.sendline ('connect {}'. format (BD_ADDR)) child.expect ('Ryšys sėkmingas', timeout = 30) child.sendline ('char-write-cmd 0x000b 0100111000000001')

Toliau mes sutelkiame dėmesį į „Alexa“įgūdžių kūrimą, kad suaktyvintų švyturėlį, kai ieškome raktų.

2 veiksmas: sukurkite „Alexa“įgūdį ir programą

„Alexa“įgūdžių ir programos kūrimas
„Alexa“įgūdžių ir programos kūrimas
„Alexa“įgūdžių ir programos kūrimas
„Alexa“įgūdžių ir programos kūrimas

Sukuriame įgūdį, kuris bus susietas su vietiniu serveriu. Tada mes sukonfigūruojame savo serverį atlikti bet kokius norimus veiksmus, šiuo atveju pateikiame apytikslę informaciją apie tai, kur gali būti raktai, ir pypsime „Bluetooth“švyturėlį. „Flask“suteikia paprastą ir lengvai naudojamą „python“biblioteką, skirtą programai aptarnauti. Naudodami „flask-ask“, mes galime sukonfigūruoti serverį bendrauti su mūsų „Alexa“įgūdžiais, kuriuos sukursime vėliau. Gerai aptarkite programą su „Ngrok“, kuri suteiks mums https nuorodą, kurios mums reikės norint įgyti „Alexa“įgūdžių. Pirmiausia mes sukūrėme programą su paprasčiausiomis funkcijomis: kad mūsų BLE švyturys pyptelėtų, kai suaktyvinamas.

#!/usr/bin/env pythonfrom kolbos importavimas Kolba iš kolbos_ask importas Klausti, teiginio importavimas pexpect app = Kolba (_ name_) ask = Klausti (programa, '/') BD_ADDR = 'AA: BB: CC: DD: EE: FF '#Jūsų „Bluetooth“švyturėlio ID čia @ask.intent (' findkeys ') def retrievr (): sound_alarm () speech_text = "Jūsų raktai yra kažkur čia." grąžinimo teiginys (kalbos_tekstas) def sound_alarm (): child = pexpect.spawn ('gatttool -I') child.sendline ('connect {}'. format (BD_ADDR)) child.expect ('Ryšys sėkmingas', skirtasis laikas = 60) child.sendline ('char-write-cmd 0x000b 0100111000000001'), jei _name_ == "_main_": app.run (host = '127.0.0.1', port = '5000')

BLE pyptelėjimui panaudojome anksčiau parašytą funkciją sound_alarm (). Funkcijai, kuri bus naudojama ketinimui, pridedame „ask decorator“su savo ketinimais „findkeys“. Kai atliksime „Alexa“įgūdžius „Amazon“kūrėjų prietaisų skydelyje, šį pavadinimą naudosime savo tikslui. Įrašykite šį scenarijų į failą pavadinimu app.py ir paleiskite

python app.py

Tai pateiks jūsų programą https:// localhost: 5000. Paleiskite „ngrok“serverį ir nukopijuokite sukurtą https nuorodą. Jums to reikės, kai sukonfigūruosite „Alexa“įgūdžius. Norėdami gauti daugiau informacijos, peržiūrėkite šį įrašą. Sėkmingai sukūrėme paprastą programą, dabar parašysime „Alexa“įgūdžius. Eikite į „Amazon“kūrėjų prietaisų skydelį ir prisijunkite. Spustelėkite „Alexa“ir pradėkite naudoti „Alexa Skill Kit“

Vykdykite gui nurodymus.

Skirtuke „Interakcijos modelis“norite užpildyti langelį „Intent Schema“, nurodydami:

Lauke Pavyzdžių išraiškos norite parašyti keletą komandų pavyzdžių, kuriuos asmuo galėtų panaudoti įgūdžiams įgyti. Mes parašėme šiuos:

Findkeys suranda mano raktus

  • Skirtuke Konfigūracija būtinai pasirinkite paslaugos pabaigos tašką HTTPS. Nukopijuokite https nuorodą ir įklijuokite ją žemiau esančiame laukelyje Numatytasis. Paskyros susiejimą galima palikti ne.
  • SSL sertifikate pasirinkite vidurinę parinktį „Mano kūrimo galutinis taškas yra domeno, turinčio sertifikato institucijos pakaitos simbolių sertifikatą, padomenis“.
  • Skirtuke Testas galėsite išbandyti naujus įgūdžius įvesdami vieną iš pavyzdinių komandų.

Užbaikite užpildyti paskutinius du skirtukus, kol visos varnelės bus žalios. Tada paleiskite savo įgūdžius naudodami beta testavimo funkciją. Tai leidžia prieš paskelbiant savo įgūdžius bet kuriame aido įrenginyje. Vykdykite el. Pašto nuorodoje pateiktas instrukcijas, kad įdiegtumėte įgūdžius savo echo įrenginyje.

3 žingsnis: Padarykite mūsų įgūdžius protingesnius

Padaryti mūsų įgūdžius protingesnius
Padaryti mūsų įgūdžius protingesnius
Padaryti mūsų įgūdžius protingesnius
Padaryti mūsų įgūdžius protingesnius
Padaryti mūsų įgūdžius protingesnius
Padaryti mūsų įgūdžius protingesnius

Įdėjome nenaudojamus kompiuterius, išplitusius po visą namą, atlikti užklausą dėl „Bluetooth“švyturėlio ir pranešti apie RSSI signalo stiprumą.

Imdami rodmenis iš kelių mašinų, mes galime panaudoti signalo stiprumą kaip atstumo įgaliotinį. Turime išsiaiškinti, kaip tai panaudoti norint apskaičiuoti labiausiai tikėtiną namo dalį švyturiui rasti.

Mes kreipiamės į mašinų mokymąsi. „Crontab“užduotis kas 2 minutes sukuria RSSI kartotekų duomenų rinkinį. Įdėdami švyturėlį į skirtingas vietas, tokias kaip „Miegamasis“, „Vonios kambarys“, „Virtuvė“, „Gyvenamasis plotas“, pažymime RSSI žurnalus. Sukūrę namų žemėlapį, galime naudoti medžio modelius, tokius kaip „xgboost“XGBClassifier.

„Xgboost“diegimas gradiento didinimui apdoros trūkstamus duomenis, gautus iš skirtojo laiko, ir išmokys per kelias sekundes. Naudokite „Python“marinatą, kad išlaikytumėte apmokytą modelį ir įkelkite į mūsų „alexa retrievr“programą. Paskambinus įgūdžiams, programa suranda „Bluetooth“RSSI rodmenis ir sukuria numatytą vietą. „Alexa“gali atsakyti ir pasiūlyti „pabandyti ieškoti vonios kambaryje“.

4 žingsnis: sudėkite viską kartu

Turėdami modelį, kuris apytiksliai nurodo paskutinę raktų vietą, galime jį pridėti prie programos, kad pagerintume „Alexa“pateiktą teiginį. Mes pakeitėme scenarijų taip:

importuoti osfrom iš kolbos importuoti Kolba iš kolbos_ask importas Klausti, pareiškimas importuoti pexpect importuoti marinuotą agurką importuoti pandas kaip pd importuoti numpy kaip np iš kolekcijų importuoti defaultdict, skaitiklis iš reverse_read importuoti reverse_readline app = Kolba (_ name_) ask = Klausti (programa, '/') @ ask.intent ('findkeys') def retrievr (): os.system ("/path/to/repo/sound_alarm.py &") speech_text = guess_locate () grąžinimo teiginys (kalbos_tekstas) def guess_locate (): read_dict = {} line_gen = reverse_readline ('YOUR_DATA_FILE.txt') res_lst = o len (res_lst)! = 20: ln = next (line_gen) if ln.startswith ('Host'): _, ip, _, reading = ln.split () read_dict [ip] = skaitymas res_lst.append (read_dict), jei ip == 'ip.of.one.computer': read_dict = {} else: pass val = pd. DataFrame (res_lst).replace ({'N/ A ': np.nan}). Reikšmės mdl_ = marinatas.load (atviras (' location_model_file.dat ',' rb ')) preds = mdl_.predict (val) guess = Counter (preds) guess = guess.most_common (1) [0] [0] answer_str = 'Pabandykite pažvelgti į' if guess == 1: answer_str += 'bedroom' elif guess == 2: answer_str += 'bathroom' elif guess == 3: answer_str += 'kitchen' elif guess == 4: answer_str += 'living room' return answer_str if _name_ == "_main_": app.run (host = '127.0.0.1', prievadas = '5000')

Mes sukūrėme naują funkciją, pavadintą guess_locate (), kuri paima failą su naujausiais užfiksuotais rssi signalo stiprumais. Tada jis paims pavyzdžius prieš mūsų marinuotą „xgboost“modelį ir grąžins labiausiai tikėtiną vietos eilutę. Ši vieta bus grąžinta, kai bus paraginta „Alexa“. Ryšio su švyturėliu užmezgimas gali užtrukti kelias sekundes, todėl vykdome atskirą procesą, iškviečiantį šią funkciją „sound_alarm.py“.

Rekomenduojamas: