Comments
Description
Transcript
2016 - 日本OSS推進フォーラム
IoT 分野への Ruby の適用実証 - これまでの課題と対策 - Japan OSS Promotion Forum 2016 2016/2/3 アプリケーション部会 IoT 研究チーム 株式会社シーイーシー 廣田 哲也 1 IoT分野へのRubyの適用実証(Japa n OSS Promotion Forum 2016/2/3 はじめに OSS 推進フォーラム アプリケーション部会では、昨年から Ruby/mruby の IoT への適用試行の研究を行っており、サンプル の開発を継続してきました。ここでは、昨年から開発しているサンプル の概要と、今年行った技術的な課題への対策などの活動について紹 介します。 ● ● ● ● IoT サンプルの概要 技術的な課題 課題への対策 ● mruby と C の共存 ● ● 2 HTTP ポーリングによる通信の性能 今後やっていきたいこと IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 IoT の研究チームのメンバー エルエスアイ開発研究所 3 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 IoT モノのインターネット (IoT) 一意に識別可能な「もの」がインターネット / クラウドに接続され、情報交換することにより相 互に制御する仕組みである。 … ここでいう「もの」とは、スマートフォンのように IP アドレスを持つものや、 IP アドレスを持つ センサーから検知可能な RFID タグを付けた商品や、 IP アドレスを持った機器に格納され たコンテンツのことである。 (Wikipedia ( 最終更新 2016 年 1 月 11 日 ( 月 ) 05:42 UTC) https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%8E%E3%81%AE%E3%8 2%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88 用途 ➢ 環境測定・監視 ➢ 施設・設備の管理 ➢ エネルギー管理 など 4 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 IoT Hype サイクル Press Release: Gartner's 2015 Hype Cycle for Emerging Technologies Identifies the Computing Innovations That Organizations Should Monitor http://www.gartner.com/newsroo m/id/3114217 5 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 サンプルの全体像 6 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 ハードウェア構成 7 IoT分野へのRubyの適用実証(Japan OSS Promotion Fo rum 2016) 2016/2/3 パッケージ構成 8 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 センサーの技術的な課題 ➢ ➢ ➢ 9 どこを mruby で作り、どこを C で作れば良 いか。 (C のライブラリもメモリを消費します。 ) より低価格のマイコンで動作させることはで きないか。 (e.g. Cortex-M0 ベースのボードなど ) 異なるタイプのマイコンでも動作させる場 合の実装の違い。 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 クラウドの技術的な課題 ➢ ➢ ➢ ➢ 10 複数ゲートウェイからのアクセスに対応して いない。 :p 大量アクセスの性能測定を行っていない。 クラウドとゲートウェイ、クラウドとモバイルの 間の通信が HTTP のポーリング通信に なっている。 ( 負荷が高いと思われる。 ) セキュリティ対策が必要。 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 課題への対策 - センサー ➢ どこを mruby で作り、どこを C で作れば良いか。 (C のライブラリもメモリを消費します。 ) ⇛ 小さな mrbgem を いくつかに分けて作りました。 ➢ FM3 に対応したものを 3 個 ➢ C で開発し、レジスタを 直接操作するようにしました ⇛ メインループ部は C で作りました。 これらのコードは Github で公開しています。 https://github.com/ossforumjp-app-IoT 11 IoT分野へのRubyの適用実証(Japan OSS Promotion Fo rum 2016) 2016/2/3 小さな mrbgem を作る理由 PC の RAM は、マイコンの 4000 倍 一方、象の体重は、子猫の 4000 倍 全部入りのお弁当がいいな。 ちょっとずつ好きなものを選びたいな。 OS のある PC ならば このような感じ。 マイコンで mruby と mrbgem を使うのはこのような感じ。 12 Elephant: http://free-illustrations.gatag.net/2013/11/16/050000.html Cat: http://blogs.yahoo.co.jp/studio_robin2008/2060732.html Makunouchi Bento: http://clipart-food.com/26packed-lunch/01-packed-lunch-dl.html Bento box and side dishes: [ 幼児の学習素材館 ] http://happylilac.net/asobi-obento.html Illustration: がみさん IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 メインループを C で書く理由 (1) メインループは C で実装しています。 それは、 mruby で実装すると問題を起こす可能性があるからです。 例: main.rb (excerpt): i = 0 loop do sensor = gpio.get_data if i % 100 == 0 recvdata = serial.get_data if recvdata (0 .. 7).each { |x| gpio.set_data(x, 1) if recvdata[x] = 0x01 } end i += 1 i = 0 if i > 100 mssleep 1 end 13 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 メインループを C で書く理由 (2) > GC.start => nil > p ObjectSpace.count_objects; 1000000.times { a = "a" }; ObjectSpace.count_objects {:TOTAL=>2048, :FREE=>1083, :T_OBJECT=>3, :T_CLASS=>45, :T_MODULE=>7, :T_ICLASS=>11, :T_SCLASS=>50, :T_PROC=>694, :T_ARRAY=>47, :T_HASH=>2, :T_STRING=>89, :T_EXCEPTION=>1, :T_ENV=>15, :T_DATA=>1} => {:TOTAL=>2048, :FREE=>1120, :T_OBJECT=>3, :T_CLASS=>45, :T_MODULE=>7, :T_ICLASS=>11, :T_SCLASS=>50, :T_PROC=>691, :T_ARRAY=>1, :T_HASH=>1, :T_STRING=>103, :T_EXCEPTION=>1, :T_ENV=>14, :T_DATA=>1} > > GC.disable => false > p ObjectSpace.count_objects; 1000000.times { a = "a" }; ObjectSpace.count_objects {:TOTAL=>2048, :FREE=>859, :T_OBJECT=>3, :T_CLASS=>45, :T_MODULE=>7, :T_ICLASS=>11, :T_SCLASS=>50, :T_PROC=>698, :T_ARRAY=>94, :T_HASH=>2, :T_STRING=>259, :T_EXCEPTION=>1, :T_ENV=>18, :T_DATA=>1} => {:TOTAL=>1001472, :FREE=>153, :T_OBJECT=>3, :T_CLASS=>45, :T_MODULE=>7, :T_ICLASS=>11, :T_SCLASS=>50, :T_PROC=>701, :T_ARRAY=>141, :T_HASH=>3, :T_STRING=>1000336, :T_EXCEPTION=>1, :T_ENV=>20, :T_DATA=>1} 14 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 メインループを C で書く理由 (3) どこで問題が起きると思われますか? 答えは Range です。 シリアルポートから受信するデータは 8 バイトですが、毎秒 8KB の速度で 継続的に受信すると 1 ミリ秒ごとに Range オブジェクトが生成されます。 main.rb (excerpt): i = 0 loop do sensor = gpio.get_data if i % 100 == 0 recvdata = serial.get_data if recvdata (0 .. 7).each { |x| gpio.set_data(x, 1) if recvdata[x] = 0x01 } end i += 1 i = 0 if i > 100 mssleep 1 end 15 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 メインループを C で作る理由 (4) > p Time.now; 1000000.times { a = "a" }; Time.now Fri Oct 30 19:09:24 2015 => Fri Oct 30 19:09:25 2015 1sec > GC.enable => true > p Time.now; 1000000.times { a = "a"; GC.start }; Time.now Fri Oct 30 19:10:05 2015 => Fri Oct 30 19:11:58 2015 113sec マイコンではメインループでイベントを検出します。 文字列リテラルや、配列、ハッシュ、 Range などをループで使うと、 RAM を使い果たしてしまいます。 GC を頻繁に行うと、処理が遅くなってしまいます。 ということで、メインループは C で、イベントハンドラに相当する部分は mruby で書いています。 16 IoT分野へのRubyの適用実証(Japan OSS Promotion Fo rum 2016) 2016/2/3 mruby と C の共存 mruby の利点 : ● ●シンプルでわかりやすいコード(特に文字列処理や通信など) ●バイトコードを分けて配置できる C の利点 : ● ●ハードウェアへのアクセス(パワーマネジメントも可能) ●使用するリソースが固定される 小さな mrbgem を皆で作りましょう(多くのデバイスごとの一般的な API を) ● メインループは C で、ロジックは mruby で作りましょう ● 1 つのコードが、小さな mrbgem を入れ替えることで、異なるデバイスで動かすことができま す。そしてロジック部分を簡単に変更することもできます。 17 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 課題への対策 - クラウド 18 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 大量アクセスの性能測定結果 19 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 おまけ クラウドの性能測定をするために、ダミーデータを作るための gem を作り ました。 There might be a person who uses it, so about 1 person for 1 million people, made it a gem and up to rubygems site. 20 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 今後やっていきたいこと ➢ ➢ 21 今のところ、バイトコードを分けて配置していな いのですが、これを分けて配置し、コンパイルす ること無くマイコンの動作を変更してみたいと思 います。 サーバー、ゲートウェイ、モバイルの通信に MQTT を使用することで、プロトコルのオー バーヘッドを減らすとともに、コードもよりシンプ ルにしたいと思います。 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3 ありがとうございました ! エルエスアイ開発研究所 22 IoT分野へのRubyの適用実証(Japan OSS Promotion Forum 2016) 2016/2/3