...

2016 - 日本OSS推進フォーラム

by user

on
Category: Documents
3

views

Report

Comments

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
Fly UP