BLEでロボットトイを制御しよう/Control-your-robot-toy-with-BLE

9995bc19f5495c16e66fa10103f26add?s=47 sandfish03
August 29, 2020

 BLEでロボットトイを制御しよう/Control-your-robot-toy-with-BLE

STEAM教育が流行る中、教材として様々なモノが増えてきています。

これらの教材にはGUIを用いたプログラミング環境や開発者向けのAPIが公開されています。 しかし、これらの教材はおもちゃのように動くモノが多く、低いレイヤーの制御が必要なので、Webアプリケーション開発者には取っつきづらいこともあります。

このトークでは、教材が公開している技術仕様をもとにpythonでBLE制御するユースケースを共有します。

OSSで公開されているライブラリを用いた2つの方法でBLEを制御する方法が理解できます。

9995bc19f5495c16e66fa10103f26add?s=128

sandfish03

August 29, 2020
Tweet

Transcript

  1. BLEͰϩϘοττΠΛ ੍ޚ͠Α͏ Pycon JP 2020 2020/08/29 Twitterɿ@sandfish03

  2. ࣗݾ঺հ • sandfish03ɹ • αʔόαΠυΤϯδχΞʢ࠷ۙͷ࢓ࣄ͸C#Ͱ͢ʣ • Python͸ϓϥΠϕʔτͰར༻͍ͯ͠·͢ • JϦʔάͱԻָʢओʹϩοΫʣͱ΢ΟεΩʔΛ޷ΜͰ͍·͢ •

    ΧϯϑΝϨϯεͰൃද͢Δͷ͸ॳΊͯͳͷͰۓு͍ͯ͠·͢
  3. BLEͰϩϘοττΠΛ੍ޚ͠Α͏ ຊτʔΫͷ໨త

  4. STEAMڭҭΛ໨ʹ͢Δػձ͕૿͑·ͨ͠ ※ݸਓͷײ૝Ͱ͢

  5. STEAMڭҭͱ͸ • STEAMڭҭͱ͸ɺ ScienceʢՊֶʣɺ Technologyʢٕज़ʣɺ Engineeringʢ޻ֶʣɺMathematicsʢ਺ֶʣΛ౷߹తʹֶश͢Δ ʮSTEMڭҭʯʹɺ ͞ΒʹArtsʢϦϕϥϧΞʔπ·ͨ͸ܳज़ʣΛ౷߹ ͢Δڭҭख๏Ͱ͋Δ ʮSTEAMڭҭʯʰϑϦʔඦՊࣄయɹ΢ΟΩϖσΟΞ೔ຊޠ൛ʱɻ2020೥5݄25೔

    (݄) 18:48ɹUTCɺURL: https://ja.wikipedia.org
  6. গͣͭ͠ίϯςϯπ͕૿͍͑ͯ·͢ • ະདྷͷֶͼίϯιʔγΞϜ ✓ ࣄྫͷ঺հ΍ίϯςϯπͷ঺հΛ͍ͯ͠·͢ • ϩϘοττΠ • ϏδϡΞϧϓϩάϥϛϯάɹͳͲ

  7. ݸਓతʹࢥͬͯΔ͜ͱ • Python͸ॳֶऀֶ͕ͿͨΊʹྑ͍ݴޠ • ࠷ॳ͸ʮHello WorldʯΛग़ྗ͢ΔͰ΋ྑ͍͚ͲɺϞϊ͕ಈ͍ͨํ͕ ϓϩάϥϛϯάΛֶͿ্Ͱ΋ָ͍ͩ͠Ζ͏ͳ • ಈ͔ͤΔίϯςϯπͰAPI͕ެ։͞Ε͍ͯΔϞϊ͕͋ͬͨΒ STEAMڭҭͷίϯςϯπͱͯ͠ྑͦ͞͏

  8. ̎̌̎̌೥݄̏͝Ζͷࢲ

  9. ൃදऀͷtoio™ͷۙӨ "toioTM"͸ɺגࣜձࣾιχʔɾΠϯλϥΫςΟϒΤϯλςΠϯϝϯτͷొ࿥঎ඪ·ͨ͸঎ඪͰ͢ɻ

  10. toio™ͱ͸ • toio™͸ɺגࣜձࣾιχʔɾΠϯλϥΫςΟϒΤϯλςΠϯϝϯτ͕ ఏڙ͢ΔϩϘοττΠͰ͢ • ΧʔτϦοδΛࠩ͠ࠐΜͰ༷ʑͳ༡ͼΛମݧͰ͖·͢ • ϏδϡΞϧϓϩάϥϛϯάͰૢ࡞΋Ͱ͖·͢ • ٕज़࢓༷ʹଇͬͨίʔυΛॻ͚͹ૢ࡞Ͱ͖·͢

  11. ݸਓతʹtoio™Λਪ͢ཧ༝ ίʔσΟϯάͳ͠Ͱ༡΂Δ ↓ ϏδϡΞϧϓϩάϥϛϯάͰ؆୯ͳ͜ͱ͕Ͱ͖Δ ↓ ϓϩάϥϛϯάͯ͠ߴ౓ͳ͜ͱ͕Ͱ͖Δ εςοϓΞοϓͯ͠ ମݧͰ͖Δͷ ͍͍Ͷʂ

  12. ༻ҙ͞Ε͍ͯΔϥΠϒϥϦ͸JavaScript

  13. ̎̌̎̌೥݄̐͝Ζͷࢲ ɹϥΠϒϥϦ͸ JavaScript͚͔ͩ

  14. ͍΍ɺ଴ͯɺٕज़࢓༷͸ެ։͞Ε͍ͯΔ Original document by Sony Interactive Entertainment Inc., is licensed

    under CC BY 4.0. https://github.com/toio/toio-spec https://creativecommons.org/licenses/by/4.0/
  15. ͳ͍ͳΒ࡞Δ͔ʂʂ

  16. ຊτʔΫͷ಺༰ • Stay HomeͰ࣌ؒΛ࣋ͯ༨ͨ͠ൃදऀ͕toio.jsΛPythonʹॻ͖׵͑ͯ ֶΜͩ͜ͱΛڞ༗͠·͢ ✓ toio™ͷ੍ޚ͸BLEΛ༻͍͍ͯΔͷͰɺϥΠϒϥϦΛ༻͍ͨ BLEͷ੍ޚͷ࢓ํΛઆ໌͠·͢ ✓ ϥΠϒϥϦΛ࢖༻ͯ͠ൃੜͨ͠՝୊ʹ͍ͭͯରॲͨ͠಺༰Λ

    આ໌͠·͢
  17. ຊτʔΫͰ࿩͞ͳ͍͜ͱ • toio™ࣗମͷ͜ͱ͸࿩͠·ͤΜ • தͷਓͰ͸ͳ͍ͷͰɺtoio™ͷ࣭໰ʹ͸౴͑ΒΕ·ͤΜ • BLE੍ޚͷҰ෦ͷ࿩͸MacલఏͰɺWindowsɾLinuxͷ࿩͸͠·ͤΜ ✓ खݩʹWindowsϚγϯ͕ͳ͔ͬͨͷͰݕূͰ͖·ͤΜͰͨ͠ ✓

    Linux͸৺ʹ༨༟͕ͳ͔ͬͨͷͰݕূͰ͖·ͤΜͰͨ͠
  18. BLEͰϩϘοττΠΛ੍ޚ͠Α͏ BLE֓ཁ

  19. ͦ΋ͦ΋BLEͬͯʁ • Bluetooth Low Energy (Bluetooth LE, BLE)ͱ͸ɺແઢPANٕज़Ͱ͋Δ Bluetooth ͷҰ෦Ͱɺόʔδϣϯ

    4.0 ͔Β௥Ճʹͳͬͨ௿ফඅిྗͷ ௨৴Ϟʔυ • BLEͰ͸ɺσόΠεͱσόΠε͕௨৴Λ͓͜ͳ͏ํ๏ͱͯ͠ɺϒϩʔ υΩϟετͱίωΫγϣϯͱ͍͏2ͭͷํ๏Λఆ͍ٛͯ͠·͢ ʮBluetooth Low EnergyʯʰϑϦʔඦՊࣄయɹ΢ΟΩϖσΟΞ೔ຊޠ൛ʱɻ2019೥12݄2೔ (݄) 00:25ɹUTCɺURL: https://ja.wikipedia.org
  20. ίωΫγϣϯͷߏ੒Ͱ઀ଓ • toio™͸ίωΫγϣϯͷߏ੒Ͱ઀ଓ͠·͢ • ίωΫγϣϯʹ͸ηϯτϥϧͱϖϦϑΣϥϧͷ2ͭͷ໾ׂ͕͋Γ·͢ • ௨৴ͷϗετͱͳΔσόΠεΛηϯτϥϧɺԿ͔͠Βͷ৘ใ΍ػೳΛ ఏڙ͢ΔσόΠεΛϖϦϑΣϥϧͱݺͼ·͢

  21. ηϯτϥϧͱϖϦϑΣϥϧ • ࠓճͷ࣮૷͸ɺtoio™ͷΩϡʔϒ͕ϖϦϑΣϥϧͰɺ PythonͰ࣮૷͠Α͏ͱ͍ͯ͠Δͷ͕ηϯτϥϧͷ෦෼Ͱ͢ ϖϦϑΣϥϧ ηϯτϥϧ

  22. toioΩϡʔϒͷػೳͷར༻ • ϖϦϑΣϥϧͷ੍ޚ͸αʔϏεͱαʔϏεʹؚ·Ε͍ͯΔ ΩϟϥΫλϦεςΟοΫʢʹಛੑʣΛ࢖͏͜ͱͰ৘ใͷऔಘ΍੍ޚ͕ Ͱ͖·͢

  23. toioΩϡʔϒͷػೳͷར༻ Type Primary Service Service UUID 10B20100-5B3B-4571-9508-CF3EFCD7BBAE Characteristics ID Information

    / ಡΈऔΓηϯαʔ Sensor Information / Ϟʔγϣϯηϯαʔ Button Information / Ϙλϯ Battery Information / όοςϦʔ Motor Control / Ϟʔλʔ Light Control / ϥϯϓ Sound Control / α΢ϯυ Configuration / ઃఆ Original document by Sony Interactive Entertainment Inc., is licensed under CC BY 4.0. https://github.com/toio/toio-spec https://creativecommons.org/licenses/by/4.0/
  24. BLEϥΠϒϥϦͰ੍ޚ͢Δ

  25. BLEϥΠϒϥϦͰ੍ޚ͢Δ όΠφϦσʔλΛѻ͏

  26. toioΩϡʔϒͷૢ࡞͸όΠφϦσʔλͰߦ͏ • ϖϦϑΣϥϧͰ͋ΔtoioΩϡʔϒ͔Βͷ৘ใΛಡΈॻ͖͠·͢ toio.js͔ΒҾ༻ʢίʔυ͸TypescriptͰॻ͔Ε͍ͯ·͢ʣ

  27. όΠφϦσʔλΛѻ͏ΦϒδΣΫτ • όΠφϦσʔλΛૢ࡞͢ΔͨΊͷίΞ૊ΈࠐΈܕ͸ bytes ͓Αͼ bytearray Ͱ͢ • bytes ΦϒδΣΫτ͸ෆมͳΦϒδΣΫτͰɺbytearray

    ΦϒδΣΫτ ͸ՄมͳΦϒδΣΫτͰ͢
  28. ෆมͳΦϒδΣΫτɾՄมͳΦϒδΣΫτ ಡΈॻ͖Մೳͳbytes-like object͕ඞཁ bytes͸bytes-like object͚ͩͲಡΈॻ͖ՄೳͰͳ͍ bytes-like object͸༻ޠूΛࢀর bytearrayͳΒOK

  29. toio.jsͷ࣮૷ɿόΠφϦσʔλಡΈॻ͖ • readUInt8ɿ8Ϗοτූ߹ແ͠੔਺ͷಡΈࠐΈ • writeUInt8ɿ8Ϗοτූ߹ແ͠੔਺ͷॻ͖ࠐΈ toio.js͔ΒҾ༻ʢίʔυ͸TypescriptͰॻ͔Ε͍ͯ·͢ʣ

  30. toio.jsͷ࣮૷ɿόΠφϦσʔλಡΈॻ͖ • readUInt32LEɿ32Ϗοτූ߹ແ͠੔਺ͷಡΈࠐΈ • writeUInt16LEɿ16Ϗοτූ߹ແ͠੔਺ͷॻ͖ࠐΈ toio.js͔ΒҾ༻ʢίʔυ͸TypescriptͰॻ͔Ε͍ͯ·͢ʣ LE is Կʁ

  31. ݸਓతʹջ͔͍͠ϦτϧΤϯσΟΞϯ Original document by Sony Interactive Entertainment Inc., is licensed

    under CC BY 4.0. https://github.com/toio/toio-spec https://creativecommons.org/licenses/by/4.0/
  32. όΠτΦʔμΛҙࣝͯ͠όΠφϦσʔλΛѻ͏ • ॻࣜจࣈྻͰσʔλΛύοΫͨ͠ΓɺΞϯύοΫ͢Δ࣌ͷظ଴͞ΕΔ ϨΠΞ΢τΛࢦఆ͢Δ จࣈ όΠτΦʔμ < ϦτϧΤϯσΟΞϯ > ϏοάΤϯσΟΞϯ

    ϑΥʔϚοτ Cͷܕ Pythonͷܕ ඪ४ͷαΠζ B unsigned char ੔਺ 1 H unsigned short ੔਺ 2 I unsigned int ੔਺ 4 ॻࣜจࣈྻ ॻࣜࢦఆจࣈ https://docs.python.org/ja/3/library/struct.html#format-strings
  33. όΠτΦʔμΛҙࣝͯ͠όΠφϦσʔλΛѻ͏ αΠζ͝ͱʹॻࣜจࣈྻΛ ࢦఆͯ͠ॲཧ͢Δ <HͳͷͰɺ ϦτϧΤϯσΟΞϯͰαΠζ͸2 BͳͷͰɺαΠζ͸1 <IͳͷͰɺ ϦτϧΤϯσΟΞϯͰαΠζ͸4

  34. BLEϥΠϒϥϦͰ੍ޚ͢Δ BLEΛૢ࡞͢Δ

  35. ηϯτϥϧࢹ఺Ͱͷେ͖ͳྲྀΕ 1. Scan • पғʹ͍ΔϖϦϑΣϥϧΛ୳͢ 2. Connect • ݟ͚ͭͨϖϦϑΣϥϧͱ઀ଓ͢Δ 3.

    ReadʗNotifyʗWrite • ϖϦϑΣϥϧͷαʔϏεʹඥͮ͘ಛੑʹରͯ͠σʔλΛಡΈॻ͖͢Δ 4. Disconnect • ϖϦϑΣϥϧͱͷ઀ଓΛղআ͢Δ BLEͷ࣮૷͸OSʹ ґଘ͢ΔՕॴ͕͋Δ ͷͰେมͦ͏
  36. BLEΛૢ࡞͢ΔϥΠϒϥϦ • PythonͰBLEΛૢ࡞͢ΔϥΠϒϥϦΛ୳ͯ͠ΈΔ "EBGSVJU1ZUIPO#MVFGSVJU-& #MFBL 63- IUUQTMFBSOBEBGSVJUDPNCMVFGSVJUMFQZUIPO MJCSBSZPWFSWJFX IUUQTCMFBLSFBEUIFEPDTJPFOMBUFTU ର৅04

    w NBD04 w -JOVY w 8JOEPXT w NBD04 w -JOVY උߟ w ϥΠϒϥϦࣗମ͸EFQSFDBUFEʹͳΔखલͷες ʔλεͰͨ͠ w $JSDVJU1ZUIPOΛ஌ͬͨͷ͸গ͠ޙͰͨ͠ɻɻɻ w ֤04Ͱಁաతʹར༻Ͱ͖Δͷ͸ྑͦ͞͏
  37. BLE੍ޚ͢ΔϥΠϒϥϦΛ૊ΈࠐΜͰΈΔ self._peripheral.connect()΍ discover͸BLE੍ޚϥΠϒϥϦͷ ϝιουͰ͢ ※͜ͷ࣌఺Ͱ͸Adafruit Python BluefruitLEΛ࢖༻͍ͯ͠·͢

  38. BLE੍ޚ͢ΔϥΠϒϥϦΛ૊ΈࠐΜͰΈΔ

  39. BLE੍ޚ͢ΔϥΠϒϥϦΛ࢖ͬͯಈ͔ͯ͠ΈΔ

  40. BLEϥΠϒϥϦͰ੍ޚ͢Δ BLEϥΠϒϥϦͰൃੜͨ͠՝୊

  41. Adafruit_BluefruitLEͰൃੜͨ͠՝୊ • ௨ৗͷಡΈࠐΈɺॻ͖ࠐΈͰ͸໰୊ͳ͍Ͱ͢ • ͨͩɺηϯτϥϧ͕पғʹ͋ΔϖϦϑΣϥϧΛݕࡧ͢Δ࣮૷ͰɺRSSI ʢ৴߸ڧ౓ʣͷ஋Λอ͍࣋ͯ͠ͳ͍ͷͰtoio.jsͰ࣮ݱ͞Ε͍ͯΔ͜ͱ ͕࣮ݱͰ͖·ͤΜͰͨ͠

  42. • ͜ͷॲཧͰ͸ηϯτϥϧ͕ϖϦϑΣϥϧΛݕࡧ͠ɺ࠷΋͍ۙϖϦϑΣ ϥϧΛฦ٫͠·͢ • ࠷΋͍ۙ͸ϖϦϑΣϥϧͷ৴߸ڧ౓Ͱ൑ఆ͠·͢ toio.jsͰ࣮ݱ͍ͯ͠Δ͜ͱ

  43. rssiΛҾ਺Ͱड͚औ͍ͬͯΔ͕อ͍࣋ͯ͠ͳ͍ ͜ͷॲཧ͸ηϯτϥϧ͕ϖϦϑΣϥϧΛScanͨ࣌͠ʹಈ͘ʢৄ͘͠͸ޙ΄Ͳʣ

  44. Adafruit Python BluefruitLEͰਐΊΔͷ͸೉͍͠ ΋͏ҰͭͷϥΠϒϥϦͷ bleakΛࢼͯ͠ΈΔ͔

  45. bleakͰൃੜͨ͠ ͦͷੲɺൃੜͯͨ͠՝୊ • 2020/08/07࣌఺ͰbleakͰࢼͨ͠ΒϥΠϒϥϦͷߏ଄͕มΘ͍ͬͯͯ ໰୊ͳ͘ಈ͖·ͨ͠ɻɻɻ

  46. bleakͰൃੜͨ͠ ͦͷੲɺൃੜͯͨ͠՝୊ • ηϯτϥϧͱϖϦϑΣϥϧ͸ඇಉظͰॲཧΛߦͳ͍ͬͯΔՕॴ͕ଘࡏ ͠·͢ • ಉҰͷϖϦϑΣϥϧ͔Βͷ௨஌Λड͚औ͍ͬͯΔͷͰ͕͢ɺ৘ใ͕མ ͍ͪͯΔέʔε͕͋Γɺਖ਼͘͠ͳ͍஋Ͱॲཧ͕ߦΘΕ͍ͯ·ͨ͠

  47. ಉ͡UUIDͷ৔߹ɺొ࿥͞ΕͨσʔλΛར༻ ॳճʹड͚औͬͨ QFSJQIFSBMͷOBNF͸ۭ Ͱɺճ໨ʹड͚औΔͱ OBNFʹਖ਼͍͠஋͕ೖΔ Ṗݱ৅͕ൃੜ ͦΕͧΕͷϖϦϑΣϥϧ ͰҰ൪࠷ޙʹདྷͨ΋ͷΛ ਖ਼ͱͯ͘͠Ε͹໰୊ͳ͍

  48. นʹͿ͔ͭͬͯ͠·ͬͨ • PRΛग़ͯ͠ΈΔʁ • Adafruit͸ߋ৽͕ࢭ·͍ͬͯΔΈ͍ͨ ʢ͜ͷ࣌͸deprecatedͳͷ΋஌Βͳ͍ʣ • bleak΋ଞͷBLEͩͱ্ख͘औಘͰ͖͍ͯΔ͔Βɺ toioΩϡʔϒ͕ۮવɺname͕औΕͳ͍͚͔ͩ΋ɻɻɻ •

    ෆ۩߹͡Όͳͦ͞͏͔ͩΒͳɻɻɻɻ
  49. ंྠͷ࠶ൃ໌͚ͩͲɺࣗ෼Ͱ࡞ͬͯΈΔ͔ʂ

  50. ͲͪΒ΋pyobjcΛར༻͍ͯ͠Δ https://bleak.readthedocs.io/en/latest/backends/macos.html https://github.com/adafruit/Adafruit_Python_BluefruitLE Adafruit Python BluefruitLE bleak

  51. pyobjcͰBLE੍ޚͯ͠ΈΑ͏ʂ https://pyobjc.readthedocs.io/en/latest/#

  52. pyobjcͰ੍ޚ͢Δ

  53. pyobjcͰ੍ޚ͢Δ pyobjcͱ͸

  54. pyobjcͱ͸ • PyObjC͸macOS্ͰPythonͱObjective-CͷݴޠؒͷϒϦοδΛఏ ڙ͍ͯ͠·͢ • Python͔ΒObjective-CϕʔεͷϥΠϒϥϦΛར༻Ͱ͖ɺٯ΋વΓ • ࠓճ͸ɺmacOSͰBLEΛ੍ޚ͢ΔCoreBluetoothΛར༻͠·͢

  55. pythonࢹ఺Ͱͷpyobjc֓ཁ • Objective-CΫϥεͱPythonͷؔ࿈͚ͮʹΞϯμʔείΞ Λ࢖͏ • 2ϑΣʔζͰॳظԽ͢Δ • Πϯελϯεม਺ʹ͸ΞΫηαΛར༻͢Δ

  56. Objective-CΫϥεͱPythonͷؔ࿈͚ͮ • Objective-Cͷϝιουݺͼͩ͠͸ϝοηʔδૹ৴ͰɺηϨΫλΛ ౉ͯ͠ରԠ͢Δϝιου͕ಈ͖·͢ ɹ[someObject doSomething:arg1 withSomethingElse:arg2]; ɹdoSomething:withSomethingElse: ηϨΫλ ϝιουݺͼग़͠

  57. Objective-CΫϥεͱPythonͷؔ࿈͚ͮ • ಁաతʹΞΫηε͢ΔͨΊPythonϝιου໊͸ɺηϨΫλͷίϩϯΛ ΞϯμʔείΞʹஔ͖׵͑ͯఆٛ͠·͢ ɹdoSomething_withSomethingElse_ ɹdoSomething:withSomethingElse: ηϨΫλ Pythonͷϝιου

  58. Objective-CΫϥεͱPythonͷؔ࿈͚ͮͷ෭࡞༻ • ͨͩ͠ɺ͜ͷ࢓૊Έʹ͸෭࡞༻͕͋Γɺϝιου໊ͷΞϯμʔείΞ ͱҾ਺ͷ਺͕͍͋ͬͯͳ͍ͱΤϥʔͰىಈ͠·ͤΜ • NSObjectΛܧঝͨ͠Ϋϥεʹwrite_valueϝιουΛ௥Ճͨ͠Β objc.BadPrototypeErrorʹͳΓ·ͨ͠

  59. Objective-CΫϥεͱPythonͷؔ࿈͚ͮͷ෭࡞༻ • ϝιου໊Λϧʔϧʹ߹ΘͤΕ͹໰୊ͳ͍Ͱ͕͢ɺσίϨʔλΛར༻ ͨ͠ํ͕ྑͦ͞͏ QZUIPOϝιουͱͯ͠ѻΘΕ ϒϦοδ͞Εͳ͍ Ҿ਺ͷ਺ʹ߹Θͤͯϝιου໊ʹΞϯμʔ είΞΛ߹ΘͤΕ͹ΤϥʔʹͳΒͳ͍ɻ ˞ΞϯμʔείΞͰऴΘΒͳ͍ͱҾ਺ͱ͠ ͯೝࣝ͞Εͳ͍

  60. 2ϑΣʔζͰॳظԽ͢Δ ΦϒδΣΫτͷΠϯελϯεԽʹඞཁͳ 2ͭͷεςοϓ • ׂΓ౰ͯɿallocϝιου • ॳظԽɿinitϝιου

  61. Objective-CΫϥεͷΠχγϟϥΠβ • ΠχγϟϥΠβ͸ init ͰҾ਺ͳ͠ • Ҿ਺͋ΓͷΠχγϟϥΠβ͸श׳తʹinitWithʙͰ࢝ΊΔʢΒ͍͠ʣ • initWith ʴʢ

    Ҿ਺໊ ʴ _ ʣ✖ Ҿ਺ͷ਺෼ • લͷαϯϓϧͩͱotherVariableͱ͍͏Ҿ਺͕͋ΔͷͰ initWithOtherVariable_ɹͱ͍͏ϝιουΛఆٛ͢Δ
  62. Πϯελϯεม਺ʹ͸ΞΫηαΛར༻͢Δ • Πϯελϯεม਺Λར༻͢Δͱ͖͸ΞΫηαϝιουʹ͢Δ͜ͱΛ ؾΛ෇͚Δ DIBSBDUFSJTUJDWBMVFͰ͸ͳ͘ɺ DIBSBDUFSJTUJDWBMVF ͰΞΫηε͢Δ ※஋Λઃఆ͢Δͱ͖͸ characteristic.setValue_(value)

  63. Objective-Cͷϓϩτίϧ • CoreBluetoothʹ͸ϓϩτίϧ͕ग़͖ͯ·͢ • ϓϩτίϧʹ४ڌͨ͠ΦϒδΣΫτ͸ϓϩτίϧͰఆΊͨϝιουΛ ࣮૷͠ͳ͚Ε͹ͳΒͳ͍ • ͍ۙ͠ߟ͑ํͱͯ͠͸ந৅جఈΫϥεʢABC: Abstract Base

    Classʣ • CoreBluetoothͷΦϒδΣΫτͰ͸σϦήʔτͷ࣮૷ʹϓϩτίϧ͕ ར༻͞Ε͍ͯΔ
  64. playbackɿ՝୊ͱͯ͠ొ৔ͨ͠ϝιου • ϓϩτίϧͰఆٛ͞Ε͍ͯΔϝιου͸࣮૷͕ඞਢ • ૒ํ޲ʹॲཧ͢ΔͨΊϝιου໊ͷϧʔϧɺҾ਺ͷ਺Ͱؔ࿈͚ͮͯ͠ ஋ͷड͚౉͠Λߦ͍ͬͯΔʢͳͷͰɺ࢖͍ͬͯͳ͍஋΋౉͍ͯ͠Δʣ

  65. pyobjcͰ੍ޚ͢Δ corebluetoothΛ੍ޚ͢Δ

  66. corebluetoothͷ֓ཁ • AppleͷυΩϡϝϯτʮCore Bluetooth Programming Guideʯʹ جຊతͳ಺༰ʹ͍ͭͯهࡌ͞Ε͍ͯ·͢ • ʮPerforming Common

    Central Role TasksʯΛಡΊ͹ྑͦ͞͏
  67. Central ManagerͷॳظԽ "QQMFͷυΩϡϝϯτʹ͸OJMʢ/POFʣͰࢦఆ͢Δ ͱ.BJOͷ%JTQBUDI2VFVFΛར༻͢Δͱॻ͍ͯ͋Γ ·͕ͨ͠ɺϓϩτίϧͷ࣮૷ʹ௨஌͕ߦΘΕ·ͤΜ Ͱͨ͠ɻ ࣗલͰ%JTQBUDI2VFVFΛ࡞ΔΑ͏ʹ͍ͯ͠·͢

  68. ϖϦϑΣϥϧΛൃݟ ϖϦϑΣϥϧΛ୳͢ϝιου͕࣮ߦ͞Εͨ ޙͷσϦήʔτॲཧ ϖϦϑΣϥϧΛ୳͢ϝιου ※ηϯτϥϧͱϖϦϑΣϥϧؒͷ௨৴͸ඇಉظͳͷͰɺϓϩτίϧͷϝιου͕ద੾ʹॲཧ͞ΕΔ·Ͱ଴ͭ ɹඞཁ͕͋Γ·͢ʢҎ߱ͷηϯτϥϧɾϖϦϑΣϥϧؒͷॲཧ͸ಉ͡ߟ͑ํͰ͢ʣ

  69. ϖϦϑΣϥϧʹ઀ଓ ϖϦϑΣϥϧʹ઀ଓ͢Δϝιου͕࣮ߦ͞ ΕͨޙͷσϦήʔτॲཧ ϖϦϑΣϥϧʹ઀ଓ͢Δϝιου

  70. ઀ଓͨ͠ϖϦϑΣϥϧͷαʔϏεɾಛੑΛൃݟ αʔϏεʹඥͮ͘ಛੑΛൃݟ͢Δϝιου αʔϏεΛൃݟ͢Δϝιου αʔϏεΛൃݟ͢Δϝιου͕࣮ߦ͞ΕͨޙͷσϦήʔτॲཧ ಛੑΛൃݟ͢Δϝιου͕࣮ߦ͞ΕͨޙͷσϦήʔτॲཧ

  71. ಛੑͷ஋ΛಡΈऔΔʗॻ͖ࠐΉ ಡΈࠐΈϝιου ॻ͖ࠐΈϝιου͕࣮ߦ͞ΕͨޙͷσϦήʔτॲཧ ಡΈࠐΈϝιου͕࣮ߦ͞ΕͨޙͷσϦήʔτॲཧ ॻ͖ࠐΈϝιου ɿॻ͖ࠐΈ੒ޭΛ௨஌ ɿॻ͖ࠐΈ੒ޭΛ௨஌͠ͳ͍

  72. ͓·͚ɿ઀ଓΛղআ͢Δ • corebluetoothͷ֓ཁʹ͸disconnectͷઆ໌͕ͳ͔ͬͨ • Objective-CͷAPIυΩϡϝϯτݟΔͱղআ͸͜ΕΛݺͼग़͢ • func cancelPeripheralConnection(CBPeripheral) • Delegateͷॲཧ͸ͪ͜Β͕ݺͼग़͞Εͦ͏

    • func centralManager(CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: Error?)
  73. ϖϦϑΣϥϧͷ઀ଓΛղআ͢Δ ઀ଓղআϝιου ઀ଓղআϝιου͕࣮ߦ͞ΕͨޙͷσϦήʔτॲཧ

  74. ·ͱΊ

  75. ·ͱΊ • όΠφϦσʔλΛѻ͏ʹ͸structύοέʔδΛ࢖͍·͢ ✓ όΠτΦʔμʔ΍αΠζ͸ॻࣜจࣈྻΛ༻੍͍ͯޚ͠·͢ ✓ όΠφϦσʔλ͸ಡΈॻ͖Մೳͳbytes-like object͕ඞཁͰ͢ • BLEϥΠϒϥϦΛಋೖ͢Δͱ؆୯ʹBLE੍ޚ͕Ͱ͖·͢

    ✓ OSґଘͷ࣮૷͸ϥΠϒϥϦ͕Ӆͯ͘͠Ε·͢
  76. ·ͱΊ • ௿͍ϨΠϠͷϥΠϒϥϦͰ͋ΔpyobjcΛར༻͢Δ͜ͱ΋ՄೳͰ͢ ✓ Objective-CͱϒϦοδ͢Δඞཁͷͳ͍ϝιου͸σίϨʔλΛͭ ͚ͯϒϦοδର৅֎ͱͨ͠ํ͕ྑ͍Ͱ͢ ✓ MainͷσΟεύονΩϡʔ͕ಈ͔ͳ͔ͬͨͷͰɺݸผʹΩϡʔΛ ࡞੒͢Ε͹ಈ࡞Մೳ

  77. ࠓޙʹ޲͚ͯɿStay Homeத • pyobjc༻ʹࣗ࡞ͷίʔυΛॻ͖׵͑ • toio™ͷϖϦϑΣϥϧͷόʔδϣϯΞοϓରԠʢ2.0.0→2.1.0ʣ • WindowsରԠʢҰࡢ೔WindowsϚγϯΛखʹೖΕ·ͨ͠ʣ ରԠͨ͠಺༰͸BlogΛߋ৽͠·͢ Blog

    ɿ https://sandfishfactory.hatenablog.com/
  78. ΍ͬͯΑ͔ͬͨ͜ͱ • ΍ͬͺΓϞϊ͕ಈָ͍ͬͯ͘͠ • PythonͰόΠτΦʔμΛૢ࡞͢ΔͳͲීஈͷ࢓ࣄͰ͸ؔΘͬͯͳ͔ͬ ͨͷͰ৽઱ͩͬͨ • ंྠͷ࠶ൃ໌͚ͩͬͨͲɺJavaScriptͷίʔυΛPythonʹஔ͖׵͑Δ ʹ͸Ͳ͏͢Δ͚ͩͬʁͬͯߟ͑ͨΒPythonͷ஌Βͳ͍͜ͱ͕ଟ͔ͬͨ

  79. օ͞Μ΋BLEͰϩϘοττΠΛ੍ޚ͠Α͏ʂ

  80. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ Twitterɿ@sandfish03