K-Ruby #25 https://k-ruby.connpass.com/event/195281/
NervesͰ֦ுੑͷߴ͍IoTσόΠεΛ࡞Δ܀ྛ ݈ଠʢGMOϖύϘגࣜձࣾɺઌՊֶٕज़େֶӃେֶʣϥΠτχϯάτʔΫ@K-Ruby #25ʢ202011݄26ʣ1
View Slide
܀ྛ ݈ଠ a.k.a. ͋ΜͪΆhttps://kentarokuribayashi.comGMOϖύϘגࣜձࣾऔకCTOҰൠࣾஂ๏ਓຊCTOڠձཧࣄઌՊֶٕज़େֶӃେֶʢJAISTʣത࢜લظ՝ఔࡏֶதͷࣾձਓֶੜͰ͋ΔIoTηΩϡϦςΟؔ࿈Λݚڀ͢ΔͭΓࣗݾհ2
- NervesΛ༻͍ͯRaspberry PiͰLEDΛνΧνΧͤ͞ΔʢLνΧʣ- ElixirͷGenServerͱ͍͏ΈΛ֦ͬͯுՄೳͳઃܭΛ͢Δ- PhoenixΛ༻͍ͯWeb APIܦ༝ͰLEDΛνΧνΧͤ͞ΔʢΣϒνΧʣ- ΣϒνΧΛෳσόΠεؒͷ௨৴ʹΑ࣮ͬͯݱ͢ΔలΛड़ΔίʔυͷৄࡉΑΓʮElixirͱNervesͩͱ͜Μͳ͜ͱ͕؆୯ʹͰ͖͍ͯ͢͝ʂʯͱ͍͏Λ͠·͢ʢίʔυGitHubʹΞοϓͯ͠ΔͷͰɺৄࡉͦͪΒΛࢀর͍ͯͩ͘͠͞ʣɻ͜ͷLTͰ͢͜ͱ3
- ϓϥοτϑΥʔϜ- ϓϩηεͱݺΕΔܰྔεϨουʹΑΓɺεέʔϥϏϦςΟ͕ߴ͍- ϓϩηεΛࢹ͠ো࣌ʹࣗಈ෮چͰ͖ΔͨΊɺোੑ͕ߴ͍- ݴޠ- ؔܕݴޠͰ͋Γɺ؆ܿͰϝϯςφϯεੑͷߴ͍ίʔυΛॻ͚Δ- ڧྗͳύλʔϯϚονϯάػೳɺϚΫϩʹΑΔݴޠͷ֦ுੑΛ༗͢Δ- πʔϧ- ϏϧυπʔϧͷMixύοέʔδϚωʔδϟʔͷHexͷπʔϧ͕ॆ࣮- Erlang VM্Ͱಈͨ͘ΊɺErlangͷརɾࢿ࢈Λ׆༻Ͱ͖ΔElixirͷಛग़ॴ: The Elixir programming language ΑΓචऀ͕·ͱΊͨ4
- ElixirͰIoTσόΠεΛ։ൃ͢ΔͨΊͷศརͳ͘͠ΈҰࣜΛఏڙ- ϓϥοτϑΥʔϜ: BEAMʢErlang VMʣΛϒʔτ͢ΔϛχϚϧͳLinuxϑΝʔϜΣΞΛఏڙ- ϑϨʔϜϫʔΫ: ElixirͰIoTσόΠεΛૉૣ͘։ൃ͢ΔͨΊͷϥΠϒϥϦ܈Λఏڙ- πʔϧνΣΠϯ: ϑΝʔϜΣΞΛϏϧυͨ͠ΓσϓϩΠͨ͠Γ͢ΔͨΊͷCLIπʔϧΛఏڙ- ͦͷଞ: ϑΝʔϜΣΞΛOTA͢ΔͨΊͷNervesHubͱ͍͏ج൫Λఏڙʢݸਓతʹ͜͜ͷڵຯ͔ΒNervesʹϋϚΓ࢝ΊͨʣNervesͱग़ॴ: Nerves PlatformɺGetting Started — nerves v1.7.0 ΑΓචऀ͕·ͱΊͨ5
ී௨ͷLνΧී௨ͷLνΧ6
- લϖʔδͷίʔυͰɺϕλʹϧʔϓΛճͯ͠νΧνΧ͍ͤͯ͞Δ- LνΧΛ࣮͢Δ෦Λଞͷػೳͱͭͳ͍͛ͨͱࢥͬͨΒͲ͏͢Δʁ- Web API͔ΒLνΧΛݺͼग़͍ͨ͠ʢࠓճͬͨ͜ͱͱͯ͢͠༰ʣ- ෳσόΠεʹεέʔϧΞτ͍ͨ͠ʢࠓޙͷలͱͯ͢͠༰ʣ- ElixirʹΑΔϓϩάϥϛϯάͰɺଟͷϓϩηεؒͷϝοηʔδϯάύογϯάʹΑͬͯઃܭ͢Δ- ϋʔυΣΞͷૢ࡞ͱɺૢ࡞ґཔϦΫΤετͷॲཧͱΛΘ͚ͯઃܭ͢ΔLνΧΛ࠶ઃܭ͢Δ7
LνΧͷॲཧΛߏ͢Δϓϩηε܈SupervisorWorkerLedsuperviseWorkerͱLedϓϩηεΛsupervise͠ɺϓϩηε͕མͪͨΒ্ཱͪ͛͢ɻLEDΛΦϯɾΦϑͨ͠Γɺ໓ͤͨ͞Γ͢ΔೖΓޱΛఏڙ͢Δϓϩηεɻ෦Ͱϧʔϓॲཧ୲͍ͬͯΔɻҎԼͷϝοηʔδʹԠ͢Δɻ:turn_on:turn_off:start_blinking:stop_blinkingLEDͷૢ࡞Λఏڙ͢ΔϓϩηεɻҎԼͷϝοηʔδʹԠ͢Δɻ:turn_on:turn_off8Message
- 1. ΫϥΠΞϯτϓϩηε͔ΒϝοηʔδΛड͚औΓɺ2. ͳΜΒ͔ͷॲཧΛͯ͠ɺ3. ݁ՌΛฦ͢ͱ͍͏ʮαʔόʔϓϩηεͷ͋Δ͋ΔύλʔϯʯΛఆٛ- αʔόʔϓϩηεεςʔτϑϧͰ͋Δʢ෦ঢ়ଶΛ͍࣋ͬͯΔʣ- ۩ମతʹɺJavaͰ͍͏InterfaceͷΑ͏ͳΈͰ͋ΔBehaviourʹΑ࣮ͬͯݱ͍ͯ͠Δ- ΫϥΠΞϯτ͔Βͷಉظɾඇಉظݺͼग़͠ͷͲͪΒʹରԠ͍ͯ͠Δ- SupervisorͷࢹԼʹஔ͘ͱɺαʔόʔϓϩηε͕ࢮΜͰࣗಈతʹ࠶ىಈ͞ΕΔΑ͏ʹͰ͖ΔGenServer9
- ͲͪΒGenServerΛ༻͍࣮ͯ͞Εͨϓϩηε- Workerϓϩηε- ֎෦ϓϩηεʢREPLWeb APIͳͲʣ͔ΒͷɺϋʔυΣΞʢ͜͜ͰLEDʣͷૢ࡞Λґཔ͢ΔϦΫΤετΛड͚͚Δ- LEDΛνΧνΧͤ͞ΔͨΊͷϧʔϓॲཧ୲͏ʢվળͷ༨͋Γ※ʣ- Ledϓϩηε- Workerϓϩηε͔ΒΈΔͱαʔόʔϓϩηεʹ͋ͨΔ- ϋʔυΣΞͷૢ࡞Λ୲͏ɻ۩ମతʹɺRaspberry PiͷGPIOܦ༝ͰLEDΛૢ࡞͢ΔWorkerͱLed※ ʮ͡ΊͯNerves(6) GPIOೖྗͷΤοδΛͬͯΠϕϯτυϦϒϯͳϘλνΧΛ͢Δʯࢀরɻ10
ElixirͷREPLʢIExʣ͔ΒLνΧ͢Δstart_blinkingͰLνΧ։࢝stop_blinkingͰLνΧऴྃʢ͕௧͘ͳΔͷͰ……ʣνΧνΧ͍ͯ͠Δʂ11
ίʔυ kentaro/nerves_webchika Ͱʂ12
- ࣍ɺWebʢAPIʣܦ༝ͰLνΧ=ʮΣϒνΧʯʢ※ʣ͍ͨ͠- Web APIͷ࣮ɺElixirͷσϑΝΫτελϯμʔυͳWAFͰ͋ΔPhoenixΛ༻͍Δ- ࣮ʹࡍͯ͠ɺطʹݟͨLνΧΛߏ͢Δϓϩηε܈ͷϝοηʔδύογϯά͚ͩͰ࣮ݱ͢Δ- ͭ·ΓɺWeb APIଆͰϋʔυΣΞͷૢ࡞Λ୲͏࣮ʹґଘ͠ͳ͍Α͏ʹ͢ΔWeb͔ΒLνΧʢΣϒνΧʣ͍ͨ͠※ ʮElixir_Nervesೖʂݎ࿚ͳIoT EdgeσόΠεϓϩάϥϛϯάΛ͓खܰʹʙNervesͰͭ͘ΔΣϒνΧʙʯ͕ൃʁ13
ΣϒνΧͷॲཧΛߏ͢Δϓϩηε܈SupervisorWorkerLedsuperviseHTTP௨৴ϝοηʔδૹ৴14Ϣʔβ͔ΒͷWebܦ༝Ͱͷૢ࡞ϦΫΤετΛड͚͚ΔAPIΛఏڙWeb API
Web APIͷίʔυʢ࣮࣭ʣ͜Ε͚ͩnerves.local/led/...- start_blinking- stop_blinking- turn_on- turn_offWorkerʹϝοηʔδΛૹΔ15
ίʔυ kentaro/nerves_webchika Ͱʂ16
- ϑΝʔϜΣΞͷىಈ࣌ʹࣗಈͰLνΧ࢝·ΔΑ͏ʹ͠ͳ͔ͬͨͷɺ։ൃ࣌ʹ͕νΧνΧ௧͘ͳΔ͔Β- WorkerɺLedͷϓϩηεΞϓϦέʔγϣϯىಈ࣌ʹࣗಈతʹىಈ- ৄ͘͠ίʔυΛࢀরͷ͜ͱ- ࠓճ1ͷRaspberry Pi্ͰɺWeb APIΛؚΉશͯͷϓϩηεΛ࣮ߦ͕ͨ͠ɺෳʹ༰қʹεέʔϧΞτͰ͖Δʢ※ʣ- ܭࢉϦιʔεΛେྔʹফඅͨ͠ΓɺI/Oͷ͕ଟ͔ͬͨΓ͢ΔΑ͏ͳσόΠεΛ࡞Δ߹ʹศར- ͞ΒʹϝοηʔδΛPub/SubͰΓͱΓ͢ΔͱΑΓૄ݁߹ʹͳ͍͍ͬͯײ͡ิͱٞ※ ۩ମతʹʮ͡ΊͯNerves(8) ୯ҰϗετͰಈ͘γεςϜΛෳϗετʹࢄ͢ΔʯΛࢀরͷ͜ͱ17
ෳͷཧϊʔυʹ֦ு͞Εͨϓϩηε܈SupervisorWorkerLedsuperviseϢʔβ͔ΒͷWebܦ༝Ͱͷૢ࡞ϦΫΤετΛड͚͚ΔAPIΛఏڙWeb APIHTTP௨৴ϝοηʔδૹ৴18ϊʔυ 1ϊʔυ 2
- NervesΛ༻͍ͯRaspberry PiͰLEDΛνΧνΧͤͨ͞ʢLνΧʣ- ElixirͷGenServerͱ͍͏ΈΛ֦ͬͯுՄೳͳઃܭΛͨ͠- PhoenixΛ༻͍ͯWeb APIܦ༝ͰLEDΛνΧνΧͤͨ͞ʢΣϒνΧʣ- ΣϒνΧΛෳσόΠεؒͷ௨৴ʹΑ࣮ͬͯݱ͢ΔలΛड़ͨElixirͱNervesͰIoTσόΠεΛ࡞ΔͷϚδͰେ͖ͳՄೳੑΛײ͡Δɻ·ͱΊ19