Upgrade to Pro — share decks privately, control downloads, hide ads and more …

dRuby over BLE

dRuby over BLE

dRuby over BLE: Device-to-Device Remote Method Calls
2026.06.06. 松江Ruby会議12

Avatar for makicamel

makicamel

June 08, 2026

More Decks by makicamel

Other Decks in Programming

Transcript

  1. #-&6"35 🔴 6"35 🔴 ػثΛ෺ཧઢͰͭͳ͍Ͱ૒ํ޲ʹόΠτΛૹΔ௨ ৴ํࣜ 🔴 #-&6"35 🔴 6"35Λ#-&ͰԾ૝తʹ࣮ݱ͢Δ1JDP3VCZͷ࣮૷

    🔴 *0ͷΑ͏ͳΠϯλʔϑΣʔεͰѻ͑Δ #-&6"35QJDPSVCZQJDPSVCZ IUUQTHJUIVCDPNQJDPSVCZQJDPSVCZUSFFNBTUFSNSCHFNTQJDPSVCZCMFVBSU 21 / 65
  2. #-&6"35 # ૹ৴ଆ(PicoRuby) ble_uart = BLE::UART.new ble_uart.start do if ble_uart.connected?

    ble_uart.puts('Hello, BLE::UART!') end end 3VCZͬΆ͍ʂ 22 / 65
  3. #-&6"35 # ड৴ଆ(PicoRuby.WASM) # ηοτΞοϓ @buffer = '' server =

    @device.connect service = server.service(@svc_uuid) @rx_char = service.characteristic(@rx_uuid) @rx_char.on_change { |data| @buffer << data } @rx_char.start_notify 23 / 65
  4. #-&6"35 # ड৴ଆ(PicoRuby.WASM) # @bufferΛҰఆ࣌ؒຖʹνΣοΫ͢Δ while (idx = @buffer.index(SEPARATOR)) line

    = @buffer.slice!(0..idx).strip line.split(SAMPLE_SEPARATOR) .each { |sample| send_data(sample) } end 3VCZͬΆ͍ʜʜʁ 24 / 65
  5. #-&6"35 🔴 )551 🔴 ϦΫΤετϝοηʔδ 🔴 #-&6"35 🔴 όΠτετϦʔϜ 🔴

    ड৴ϝοηʔδ 🔴 FH ෳ਺ϝοηʔδɺϝοηʔδ్͕தͰ͖ΕΔ 🔴 ηύϨʔλͰ۠੾Γ௚ͯࣗ͠෼Ͱ૊ΈཱͯΔ 25 / 65
  6. E3VCZ 🔴 EJTUSJCVUJPO3VCZ 🔴 ෼ࢄ3VCZ 🔴 ෼ࢄΦϒδΣΫτγεςϜΛ࣮ݱ͢ΔϥΠϒϥϦ 🔴 ؔকढ़͞Μ࡞ MJCSBSZESC

    3VCZϦϑΝϨϯεϚχϡΞϧ IUUQTEPDTSVCZMBOHPSHKBMBUFTUMJCSBSZESCIUNM 28 / 65
  7. E3VCZ { greeting: 'Hello, Matsue!' object[:greeting] } # => 'Hello,

    Matsue!' E3VCZೖ໳ऀʹΑΔ͋ͳͨͷ਎ۙʹ͋ΔE3VCZೖ໳!NBLJDBNFM IUUQTTQFBLFSEFDLDPNNBLJDBNFMESVCZBUUSBDUJPO 32 / 65
  8. E3VCZPWFS#-& E3VCZ͸ϓϩτίϧ͕ࠩ͠ସ͑Մೳ 🔴 ϏϧτΠϯ 🔴 Ϣʔβʔ֦ு 🔴 5$1 🔴 8FC4PDLFU

    🔴 6/*9υϝΠϯιέοτ 🔴 #-&🆕 GPS1JDP3VCZ1JDP3VCZ8"4. 🔴 44- 36 / 65
  9. E3VCZGPS1JDP3VCZ ΫϥΠΞϯτ αʔό ᶄελϒΛ࡞Δ ᶃΦϒδΣΫτΛެ։ αʔόͷΞυϨεΛࢦఆ front = Calc.new obj

    = DRbObject.new( DRb.start_service( "ble://picoruby") "ble://picoruby", front) 38 / 65
  10. E3VCZGPS1JDP3VCZ ΫϥΠΞϯτ αʔό ᶄελϒΛ࡞Δ ᶃΦϒδΣΫτΛެ։ αʔόͷΞυϨεΛࢦఆ front = Calc.new obj

    = DRbObject.new( DRb.start_service( "ble://picoruby") "ble://picoruby", front) ᶅϝοηʔδૹ৴ obj.add(1, 2) όΠτྻ΁ม׵ͯ͠ૹ৴ όΠτྻΛૹड৴ 39 / 65
  11. E3VCZGPS1JDP3VCZ ΫϥΠΞϯτ αʔό ᶄελϒΛ࡞Δ ᶃΦϒδΣΫτΛެ։ αʔόͷΞυϨεΛࢦఆ front = Calc.new obj

    = DRbObject.new( DRb.start_service( "ble://picoruby") "ble://picoruby", front) ᶅϝοηʔδૹ৴ ᶆϝιουίʔϧ obj.add(1, 2) όΠτྻΛม׵ͯ͠ϝιουίʔϧ όΠτྻ΁ม׵ͯ͠ૹ৴ front.send(msg_id, *args) όΠτྻΛૹड৴ 40 / 65
  12. E3VCZGPS1JDP3VCZ ΫϥΠΞϯτ αʔό ᶄελϒΛ࡞Δ ᶃΦϒδΣΫτΛެ։ αʔόͷΞυϨεΛࢦఆ front = Calc.new obj

    = DRbObject.new( DRb.start_service( "ble://picoruby") "ble://picoruby", front) ᶅϝοηʔδૹ৴ ᶆϝιουίʔϧ obj.add(1, 2) όΠτྻΛม׵ͯ͠ϝιουίʔϧ όΠτྻ΁ม׵ͯ͠ૹ৴ front.send(msg_id, *args) όΠτྻΛૹड৴ ᶇ݁ՌΛฦ͢ # => 3 41 / 65
  13. E3VCZGPS1JDP3VCZ ΫϥΠΞϯτ αʔό ᶄελϒΛ࡞Δ ᶃΦϒδΣΫτΛެ։ αʔόͷΞυϨεΛࢦఆ front = Calc.new obj

    = DRbObject.new( DRb.start_service( "ble://picoruby") "ble://picoruby", front) ᶅϝοηʔδૹ৴ ᶆϝιουίʔϧ obj.add(1, 2) όΠτྻΛม׵ͯ͠ϝιουίʔϧ όΠτྻ΁ม׵ͯ͠ૹ৴ front.send(msg_id, *args) όΠτྻΛૹड৴ ᶈ݁ՌΛड͚औΔ ᶇ݁ՌΛฦ͢ # => 3 # => 3 42 / 65
  14. E3VCZGPS1JDP3VCZ ΫϥΠΞϯτ αʔό ᶄελϒΛ࡞Δ ᶃΦϒδΣΫτΛެ։ αʔόͷΞυϨεΛࢦఆ front = Calc.new obj

    = DRbObject.new( DRb.start_service( "ble://picoruby") #-&༻ιέοτΛ "ble://picoruby", front) ࣮૷͢Δ͚ͩ ᶅϝοηʔδૹ৴ ᶆϝιουίʔϧ obj.add(1, 2) όΠτྻΛม׵ͯ͠ϝιουίʔϧ όΠτྻ΁ม׵ͯ͠ૹ৴ front.send(msg_id, *args) όΠτྻΛૹड৴ 47 / 65
  15. %3C#-&"EBQUFS 🔴 DRbMessage 🔴 BLE::UART #recv_message(n) #read_nonblock(n) 🔴 ϒϩοΩϯάඞཁ 🔴

    ϒϩοΩϯά͠ͳ͍ 🔴 ஸ౓OόΠτ΄͍͠ 🔴 ʙOόΠτΛฦ͢ ͜ͷࠩΛ DRb::BLE::Adapter#read Ͱٵऩ͢Δ 49 / 65
  16. %3C#-&"EBQUFS def read(n) ड৴όοϑΝʹ until @uart.available >= n OόΠτ #

    ... ཷ·Δ·Ͱ଴ͭ ϒϩοΩϯά sleep_ms 10 end end 50 / 65
  17. %3C#-&"EBQUFS def read(n) until @uart.available >= n # ... @uart.poll_once

    ड৴ύέοτΛ sleep_ms 10 όοϑΝʹੵΉ end end 51 / 65
  18. %3C#-&"EBQUFS def read(n) until @uart.available >= n # ... @uart.poll_once

    sleep_ms 10 end OόΠτཷ·ͬͨΒ @uart.read_nonblock(n) औΓग़ͯ͠ฦ͢ end 52 / 65
  19. ΞϓϦଆίʔυ 🔴 CFGPSF # ड৴ଆ(PicoRuby.WASM) # ηοτΞοϓ @buffer = ''

    server = @device.connect service = server.service(@svc_uuid) @rx_char = service.characteristic(@rx_uuid) @rx_char.on_change { |data| @buffer << data } @rx_char.start_notify # @bufferΛҰఆ࣌ؒຖʹνΣοΫ͢Δ while (idx = @buffer.index(SEPARATOR)) line = @buffer.slice!(0..idx).strip line.split(SAMPLE_SEPARATOR) .each { |sample| send_data(sample) } end Ή͔͍ͣ͠ʜʜ 56 / 65
  20. ΞϓϦଆίʔυ 🔴 BGUFS # ड৴ଆ(PicoRuby.WASM) # ηοτΞοϓ @obj = DRb::DRbObject.new_with_uri(uri)

    # @obj.readΛҰఆ࣌ؒຖʹίʔϧ͢Δ @obj.read.each { |sample| send_data(sample) } 3VCZͬΆ͍ʂ 57 / 65
  21. ༨ஊ 🔴 E3VCZ 🔴 QVTI 🔴 SFRVFTUSFQMZܕ 🔴 Ұํ޲ͷετϦʔϜ 🔴

    ຖճ 🔴 ߴස౓ʹૹΕͯ௿஗Ԇ ૹ৴ɾ଴ػɾड৴ 🔴 ฦࣄෆཁ 🔴 ௨৴ճ਺͕૿͑Δ 🔴 ฦࣄΛ଴ͭ෼஗͘ͳΔ ༻్ʹ͋ͬͨํ๏ Λબ΅͏ ήʔϜίϯτϩʔϥ͸QVTIܕ޲͖ 62 / 65