dragonboard x soracom x - amazon s3€¦ · • 無料参加の方(dragonboard...
TRANSCRIPT
「DragonBoard x SORACOM x Scalenicsでやってみよう!IoT!」 ハンズオン資料(rev1.8)
ユーピーアール株式会社
IoT事業統括本部 IoT営業部
村澤徹
Copyright(C) 2016 UPR Inc. 1
Agenda
1. 本ハンズオンで行うこと
2. Step1:SORACOM Airをセットアップする
3. Step2:DragonBoardとSORACOM Beamをセットアップ
4. Step3:センサをクラウドから見る・動かす
5. Step4:ScalenicsのREST APIを使う
6. まとめ
Copyright(C) 2016 UPR Inc. 2
1章.本ハンズオンで行うこと
Copyright(C) 2016 UPR Inc. 3
SORACOM Air セットアップ
DragonBoard/SORACOM Beam設定
センサをクラウドで見る・動かす
ScalenicsのAPIを使う
1. SORACOM Airを使うためにコンソールからSIMを登録します。 2. Scalenicsの認証情報をSORACOM Beamに設定して、SORACOM Beam経由で
DragonBoardの認証を行えるようにします。 3. サンプルプログラムを利用して、Scalenicsへのデバイス登録・センサデータの入力・リレー/LEDの制御をMQTT経由で行います。
4. ScalenicsのREST APIを利用して、デバイス情報の取得・時系列データの取得を実際に行ってみます。
Step1 Step2 Step3 Step4
(ハンズオン構成)
Copyright(C) 2016 UPR Inc. 4
DragonBoard SORACOM Scalenics
認証フロー
MQTTフロー
Beamが代行
• Device Token • User ID
Subscribe(コマンド待ち受け)
Publish(データ送信) Publish(データ送信)
Subscribe(コマンド待ち受け)
平文 暗号化(MQTTS)
閉域網(DOCOMO) インターネット
SORACOM Beam
APIクライアント
管理コンソール
• DragonBoardからデータを受信 • DragonBoardにデータを送信 • IMSI番号をデバイスIDとして
DragonBoardを管理
• Scalenicsにデータを送信 • Scalenicsからデータを受信
• DragonBoardに代わって認証を代行
• SIMのIMSI番号をデバイスIDとしてMQTTトピックに付与
IMSI:xyz…
DeviceID:xyz…
API
(用意するもの)
• DragonBoard IoTスターターパック – DragonBoard410c本体・ACアダプタ・メザニンカード・センサセット・専用ケース・AK-020 3G USBドングル(SORACOM Air付属)・UPR Scalenics 3か月無償アカウント
– スターターパック購入の方はお持ち帰りいただけます。
– 無料参加の方はお貸出しいたします。
• Scalenicsアカウント – Developerアカウント(https://api.scalenics.io/signup/)
– 無料参加の方はこちら側で準備したアカウントをお使いいただきます。
– スターターパック購入の方は上記リンクよりアカウントを取得してください。
Copyright(C) 2016 UPR Inc. 5
「DragonBoard IoTスターターパック」の構成
Copyright(C) 2015 UPR Corporation 6
• DragonBoard410c本体(Debian Linuxインストール済み)
• メザニンカード(GPIOカード) • センサモジュール • 専用ケース(青or透明)
• USB UART(コンソール用)
• ACアダプタ(変換プラグ付)
• AK-020 SORACOMスターターキット
(注意点など)
Copyright(C) 2016 UPR Inc. 7
• 有料参加(DragonBoard IoTスターターパック購入)の方 – キット同梱のAK-020 3Gドングルに付属するSORACOM AirのSIMカードは参加者様が新規にSORACOMのアカウントを作成してお使いください。(Step1で作成します)
– Scalenicsのアカウントもオンラインサインアップして新規に取得してください。(Step2で作成します)
• 無料参加の方(DragonBoard IoTスターターパックレンタル)の方 – SORACOM AirのSIMカードは参加者様が新規にSORACOMのアカウントを作成してお使いください。(Step1で作成します)
– SORACOM/Scalenicsのアカウントは配布するゲストアカウントをお使いください。 • ScalenicsのUser IDおよびSORACOM Beamのグループ名は「SC000***」となります。
• 「SC000***」の3ケタの数字はお貸出し機のAK-020 3Gドングルに添付されている数字をお使いください。
2章 Step1:SORACOM Airセットアップ
Copyright(C) 2016 UPR Inc. 8
• Step1-1. SORACOM アカウントの作成 • Step1-2.ユーザ確認リンクのクリック • Step1-3. ユーザコンソールにログイン • Step1-4. 支払情報の設定 • Step1-5. Air SIMの登録 • Step1-6. Air SIMの取り外し • Step1-7. Air SIMを3G USBドングルに挿入する • Step1-8. データ通信料と利用料金の確認
SORACOM Air セットアップ
DragonBoard/SORACOM Beam設定
センサをクラウドで見る・動かす
ScalenicsのAPIを使う
Step1 Step2 Step3 Step4
Step1-1. SORACOM アカウントの作成
Copyright(C) 2016 UPR Inc. 9
Step1-2. ユーザ確認リンクのクリック
Copyright(C) 2016 UPR Inc. 10
Step1-3. ユーザコンソールにログイン
Copyright(C) 2016 UPR Inc. 11
(SORACOM ユーザコンソール) https://console.soracom.io/#/login
Step1-4. 支払情報の設定(1/2)
Copyright(C) 2016 UPR Inc. 12
Step1-4. 支払情報の設定(2/2)
Copyright(C) 2016 UPR Inc. 13
Step1-5. Air SIMの登録(1/2)
Copyright(C) 2016 UPR Inc. 14
Step1-5. Air SIMの登録(2/2)
Copyright(C) 2016 UPR Inc. 15
Step1-6. Air SIMの取り外し
Copyright(C) 2016 UPR Inc. 16
Step1-7. Air SIMを3G USBドングルに挿入する
Copyright(C) 2016 UPR Inc. 17
標準SIMアダプタにマイクロSIMを載せてから挿入します。
Step1-8. データ通信料と利用料金の確認(1/6)
Copyright(C) 2016 UPR Inc. 18
Step1-8. データ通信料と利用料金の確認(2/6)
Copyright(C) 2016 UPR Inc. 19
Step1-8. データ通信料と利用料金の確認(3/6)
Copyright(C) 2016 UPR Inc. 20
Step1-8. データ通信料と利用料金の確認(4/6)
Copyright(C) 2016 UPR Inc. 21
Step1-8. データ通信料と利用料金の確認(5/6)
Copyright(C) 2016 UPR Inc. 22
Step1-8. データ通信料と利用料金の確認(6/6)
Copyright(C) 2016 UPR Inc. 23
3章 Step2:DragonBoard/SORACOM Beamセットアップ
Copyright(C) 2016 UPR Inc. 24
• Step2-1. Virtual COM Portドライバのインストール
• Step2-2. USB UARTコンソールでログインする
• Step2-3. AK-020 3Gドングルを挿す
• Step2-4. SORACOMに接続する
• Step2-5. Scalenics認証情報の取得
• Step2-6. SORACOMメタデータサービスの設定
• Step2-7. SORACOM Beam設定
SORACOM Air セットアップ
DragonBoard/SORACOM Beam設定
センサをクラウドで見る・動かす
ScalenicsのAPIを使う
Step1 Step2 Step3 Step4
Step2-1. Virtual COM Portドライバのインストール
Copyright(C) 2016 UPR Inc. 25
(WinXP/7/10) • 以下リンクよりドライバダウンロード • http://www.ftdichip.com/Drivers/CDM/CD
M21218_Setup.zip • zipファイルに含まれる「CDM21218_Setup.exe」を実行してインストール
(MacOS X 10.9~) • 以下リンクよりドライバダウンロード • http://www.ftdichip.com/Drivers/VCP/MacO
SX/FTDIUSBSerialDriver_v2_3.dmg • dmgファイルに含まれる「FTDIUSBSerial.pkg」を実行してインストール
Step2-2. USB UARTコンソールでログインする
Copyright(C) 2016 UPR Inc. 26
• DragonBoardにACアダプタを挿し電源を入れ30秒ほど待つ • DragonBoardとPCをUSBケーブルで接続する • DragonBoardにシリアルコンソールでログインする
– (WinXP/7/10) • コンパネ->デバイスマネージャでCOMポートの番号を調べる(例:COM7) • PuTTy等でVCPのCOMポートを選択してログイン • スピードは115200bpsを選択
– (Mac)ターミナルを開いて以下でログイン
以下コマンドを実行する (␣は空白文字) $ sudo␣–i ※root権限になる # ls␣–l␣/dev/cu.usb* ※ttyデバイスを確認 # cu␣-l␣/dev/cu.usbserial-********␣-s␣115200 ※上記のttyデバイスにログイン
USB UART
(デバイスマネージャ)
ここに挿す!
(例:PuTTY)
Step2-3. AK-020 3Gドングルを挿す
Copyright(C) 2016 UPR Inc. 27
• AK-020 3GドングルをDragonBoardのUSBポート(どちらでもよい)に挿す。 • 以下メッセージが出きったら、ENTERキーを押してプロンプトに戻る
Step2-4. SORACOMに接続する
Copyright(C) 2016 UPR Inc. 28
以下コマンドを実行する (␣は空白文字) root@linaro-alip:~# wvdial␣& ※SORACOMにダイヤルアップ(以下の初期化メッセージが流れてDNSアドレスの取得表示まで出たらENTERキーを押してプロンプトに戻る) root@linaro-alip:~# ping␣–c␣3␣8.8.8.8 ※インターネットに接続できていることを確認
(NOTE!) wvdialコマンド実行時にAK-020の初期化がまれに失敗する場合(Modem not responding..表示で止まる)があるので、Control+Cキー
で中断して、改めて実行する。
Step2-5. Scalenics認証情報の取得(1/2)
Copyright(C) 2016 UPR Inc. 29
(有料参加:スターターパック購入の方) • スターターパック購入の方はhttps://api.scalenics.io/signup/からオンラインサインアップ
• 登録時のメールアドレスにログインに必要なアカウント情報が送付されていますのでこちらの情報でログインする。
(無料参加の方) • 無料参加の方はこちらでご用意したゲストアカウントをお使いください。
(Scalenics Management Consoleにアクセス) • https://api.scalenics.io/console/にアクセス • UsernameはSC000***を入力 • Passwordはオンラインサインアップ登録時のメールに記載されたもの or 無料参加者の方はこちらでご用意したアカウントのものを入力
「SC000***」を入力
Step2-5. Scalenics認証情報の取得(2/2)
Copyright(C) 2016 UPR Inc. 30
User ID:SORACOM Beamに設定するために必要(MQTT認証時のUserIDで必要)
Device Token:デバイス用の認
証クレデンシャル。メタデータサービスとSORACOM Beamに設定するために必要(MQTT認
証時のパスワードとトピックの組み立てに必要)
コピー①
コピー② API Token:API用の認証クレデンシャル。6章でAPIを呼び出す時に利用。
コピー③
(参考)Scalenicsの認証スキーム
Copyright(C) 2016 UPR Inc. 31
Scalenics
API
• デバイス側 – Device Tokenと呼ばれる、32bytesの認証トークンが利用される。 – MQTTの認証パスワードとトピックのアクセスリストとしても利用される。 – 今回はSORACOM Beam側にDevice Tokenを持たせるので、DragonBoard側に設定は不要
• アプリケーション(APIクライアント)側 – API Tokenと呼ばれる、32bytesの認証トークンが利用される。
アプリケーション デバイス
Device Token API Token
User ID
MQTT/HTTP HTTPS(REST)
Step2-6. SORACOM メタデータサービスの設定(1/4)
Copyright(C) 2016 UPR Inc. 32
(SORACOMユーザーコンソール) https://console.soracom.io/#/login
Step1で作成したメールアドレス
Step1で作成したパスワード
Step1でSORACOMのコンソールにログインされていた方は次に進む。
ログアウトしてしまった方は再ログインする。
Copyright(C) 2016 UPR Inc. 33
①コンソールのメニュー「グループ」から「追加」をクリック ②グループ名を入力して、「グループ作成」をクリック
③次に、SIMをこのグループに紐づけします。 ④SIM管理画面からSIMを選択して、操作→所属グループ変更を押します
⑤SIMにグループを割り当てたら、次に進む
Step2-6. SORACOM メタデータサービスの設定(2/4)
Step2-6. SORACOM メタデータサービスの設定(3/4)
Copyright(C) 2016 UPR Inc. 34
①メニューから ②「グループ」選択
③「グループ」選択 先に作成済みのグループを選択する。 ④「SORACOM Air設定」を選択
Step2-6. SORACOM メタデータサービスの設定(4/4)
Copyright(C) 2016 UPR Inc. 35
⑥Scalenicsの「Device Token」をペーストする
⑤ONに
⑦左下の保存ボタンをクリック
Step2-7. SORACOM Beam設定(1/2)
Copyright(C) 2016 UPR Inc. 36
MQTTエントリポイントを選択
SORACOM内部ネットワークではSORACOM Beam内のMQTTエンドポイントに転送し、BeamからScalenicsまでのインターネット区間ではMQTTSにてScalenicsのMQTTエンドポイントまで転送する。 これにより、DragonBoard側でTLS暗号化を行う必要無くMQTTブローカを利用でき、SORACOMから外部までの区間はBeamが暗号化処理を行うためデバイス側の暗号処理を省きつつ、End-to-EndでセキュアなIoT通信を実現できる。
Step2-7. SORACOM Beam設定(2/2)
Copyright(C) 2016 UPR Inc. 37
設定名は適当に設定(例:scalenics)
ホスト名:api.scalenics.io
ポート番号:8883
ユーザ名:ScalenicsのUser ID
パスワード:ScalenicsのDevice Token
IMSI付与:ONに設定
設定したら保存を忘れずに
(NOTE!) ※Scalenicsでは<Device Token>/<Device ID>のトピックを認識するため、Device IDとしてSIMの固有IDであるIMSI番号を埋め込みます。 トピックの組み立てに必要なDevice TokenはSIM認証によりメタデータサービスから取得できます。
4章 Step3.センサをクラウドから見る・動かす
Copyright(C) 2016 UPR Inc. 38
• Step3-1. 入力デバイスをつなぐ • Step3-2. サンプルプログラムを動かす • Step3-3. Scalenics – デバイス認識の確認 • Step3-4. Scalenics – チャネル作成 • Step3-5. Scalenics – デバイスにチャネル紐づけ • Step3-6. Scalenics – データ確認 • Step3-5. 出力デバイスをつなぐ • Step3-6. サンプルプログラムを動かす • Step3-7. Scalenicsから出力デバイスを動かす
SORACOM Air セットアップ
DragonBoard/SORACOM Beam設定
センサをクラウドで見る・動かす
ScalenicsのAPIを使う
Step1 Step2 Step3 Step4
Step3-1.メザニンカードに入力デバイスをつなぐ
Copyright(C) 2016 UPR Inc. 39
入力デバイスとして好きなものを選択して、GPIO(D1)に接続する。 • (左)押しボタン • (右)傾斜センサ
D1(赤枠)にリボンケーブルを接続。
押すとON 傾くとON 戻るとON
※OFFはONの直後に疑似的に発生させています。
Step3-2.サンプルプログラムを動かす
• 入力デバイスの情報をMQTTでScalenicsに送信するプログラムをgithubからダウンロードして実行する。
• 以下コマンド(赤文字)をコンソールから入力する。
Copyright(C) 2016 UPR Inc. 40
以下コマンドを実行する (␣は空白文字) root@linaro-alip:~# apt-get␣install␣python-pip ※「python-pip is already the newest version.」と出た場合は既にpipコマンドが入っているため無視 root@linaro-alip:~# pip␣install␣paho-mqtt ※「Requirement already satisfied..」と出た場合は既にpaho-mqttライブラリが入っているため無視 root@linaro-alip:~# git␣clone␣https://github.com/tmurasawa/db410c_soracom_din.git root@linaro-alip:~# cd␣db410c_soracom_din root@linaro-alip:~/db410c_soracom_din# python␣./db410c_soracom_din.py -- Get metadata from SORACOM... imsi:4401030******** device_token:16755F158AC56C21BBEDB8E0******** MQTT topic:16755F158AC56C21BBEDB8E0******** Push!
(NOTE!)
• プログラム起動時にSORACOMメタデータサービスにアクセスして、自身のデバイストークンを取得します。(通常、DragonBoard毎にScalenicsのデバイストークンを設定する必要が不要になる)
• MQTTパケットの転送・暗号化はSORACOM Beamが代理するため、DragonBoardの負荷が減る
押しボタンを押す度にScalenicsに状態を送信!
Step3-3. Scalenics - デバイス認識の確認
Copyright(C) 2016 UPR Inc. 41
Auto Provisioningにより 自動認識されたDragonBoard
• 管理コンソールの「Device」メニューから確認します。
• 正しく設定済みのデバイスが最初に接続された時に、自動的にデバイスIDが登録されます。(今回はSIMのIMSI番号)
• この状態ではScalenicsに「登録」だけされている状態なので、データ蓄積のために次に「チャネル=センサデータのデータストア」を作成します。
(参考)Scalenicsのデバイス管理フロー
Copyright(C) 2016 UPR Inc. 42
Device-A
Device-B
Device Registry Datastore(Channel)
デバイスID:44011234
デバイスID:44011235
チャネルID:10
チャネルID:11
: :
Devices MQTT Scalenics
1. MQTT認証を通過した新規デバイスは、ScalenicsのDevice Registryに自動登録される。
2. 自動登録された状態では、データを格納するチャネル(データストアの単位)が紐づいていないので、手動でチャネルを作成して紐づける。
3. チャネルが紐づいたデバイスは、以後チャネルに対してデータを蓄積していく。
4. デバイスが故障等で交換された際にデバイスIDが変わる事があるので、その際は新規のデバイスIDに既存のチャネルIDを紐づける事で、蓄積データをそのままに使い続ける事が出来る。
Device-A
Device-B
Step3-4. Scalenics - チャネル作成
Copyright(C) 2016 UPR Inc. 43
新規チャネルを作成 (今回はDragonBoardのGPIO_Aへの入力をCH:0とする。)
Value1にセンサ(スイッチ)の入力値が入る。 ここに入れるのはValue1のラベルと単位なので省略してもOK。
• 今回はデジタル入力値が0=OFF/1=ONで入る。
• 同時に4点以上のデータ取得する時はValue1にMessagePack等でエンコードしたデータを入れる。
• Int/float値の場合はAPIで積算・平均・最低・最高値を算出可能。
適当に名前を付ける
Step3-5. Scalenics - デバイスにチャネル紐づけ
Copyright(C) 2016 UPR Inc. 44
デバイス管理ページで自動認識されたデバイスを選択して以下を変更する。 • Description(デバイスの名前) • Enable(true:有効に変更) • Mapped_ch(CHxxに変更) Meta Dataは必要に応じて変更してください。
trueに変更
適当に名前を付ける
CH:0を設定
Step3-6. Scalenics - データ確認
Copyright(C) 2016 UPR Inc. 45
1:ON / 0:OFF
「Stream」ページで生データを確認する
Step3-7.メザニンカードに出力デバイスをつなぐ
Copyright(C) 2016 UPR Inc. 46
出力デバイスとして好きなものを選択して、GPIO(D1)に接続する。 • (左)LED • (右)リレー
※最初に接続した時点ではONになります。
D1(赤枠)にリボンケーブルを接続。
HIGHで点灯 LOWで消灯
HIGHで動作 LOWで解放
Step3-8.サンプルプログラムを動かす
• ScalenicsのMQTTブローカからにSubscribeし、LEDまたはリレーを制御するプログラムをダウンロードして実行する。
• 以下コマンド(赤文字)をコンソールから入力する。
Copyright(C) 2016 UPR Inc. 47
Ctrl+Cキーで前のプログラムを止めてから以下コマンド(␣は空白文字)を実行する root@linaro-alip:~/db410c_soracom_din# cd root@linaro-alip:~# git␣clone␣https://github.com/tmurasawa/db410c_soracom_led.git root@linaro-alip:~# cd␣db410c_soracom_led root@linaro-alip:~/db410c_soracom_led# python␣./db410c_soracom_led.py -- Get metadata from SORACOM... imsi:4401030******** device_token:16755F158AC56C21BBEDB8E0******** MQTT topic:16755F158AC56C21BBEDB8E0********/4401030********/subscribe Connected with result code 0 16755F158AC56C21BBEDB8E0********/4401030********/subscribe led:off led:off!! 16755F158AC56C21BBEDB8E0********/4401030********/subscribe led:on led:on!!
次ページでScalenicsから MQTTメッセージを送る
Step3-9.Scalenicsから出力デバイスを動かす
Copyright(C) 2016 UPR Inc. 48
登録されているデバイスIDを選択する
「Publish」ページでDragonBoardにMQTTメッセージを送る
DragonBoard側では赤枠のMQTTトピックを待ち受けている。 DEVICE_IDにはSIMのIMSI番号が設定される。
ペイロードにはDragonBoardへのコマンドが入る。 • 「led:off」でOFF(LOW) • 「led:on」でON(HIGH)
5章.Step4:ScalenicsのREST APIを使う
• Step4-1.ChromeにPOSTMANをインストールする。
• Step4-2.REST APIでデバイス一覧を取得する。
• Step4-3.REST APIでチャネル一覧を取得する。
• Step4-4.REST APIで蓄積データを取得する。
• Step4-5.実際のIoTアプリ
Copyright(C) 2016 UPR Inc. 49
SORACOM Air セットアップ
DragonBoard/SORACOM Beam設定
センサをクラウドで見る・動かす
ScalenicsのAPIを使う
Step1 Step2 Step3 Step4
Step4-1.ChromeにPOSTMANをインストールする。
• ScalenicsのREST APIを実際に呼び出すためにChrome上で稼働するREST APIクライアント(POSTMAN)をインストールする。
• 通常REST APIはプログラムからHTTPリクエストの形で呼び出すので、手軽に扱うためにPOSTMANというGUIツールを利用する。 – 以下手順でインストール。
1. chromeの検索窓から「postman」と入力
2. chromeウェブストアが出るので右上の「+ CHROMEに追加」ボタンを押してアプリをインストールする。
3. アプリを起動!
Copyright(C) 2016 UPR Inc. 50
Step4-2.REST APIでデバイス一覧を取得する。
Copyright(C) 2016 UPR Inc. 51
②APIトークンをセットする。 ※P26でコピーしたものを使う
①APIエンドポイント(デバイス一覧)を指定する。 (エンドポイント:https://api.scalenics.io/v1/device)
④JSONでデバイス一覧を取得した。
③GETメソッドでAPI呼出
Step4-3.REST APIでチャネル一覧を取得する。
Copyright(C) 2016 UPR Inc. 52
②APIトークンをセットする。 ※P26でコピーしたものを使う
①APIエンドポイント(チャネル一覧)を指定する。 (エンドポイント:https://api.scalenics.io/v1/channel)
④JSONでチャネル一覧を取得した。
③GETメソッドでAPI呼出
Step4-4.REST APIで蓄積データを取得する。
Copyright(C) 2016 UPR Inc. 53
②APIトークンをセットする。 ※P26でコピーしたものを使う
①APIエンドポイント(ストリーム取得)を指定する。 (エンドポイント:https://api.scalenics.io/v1/stream/0)
JSONでCH:1の最新データを取得した。
③最新データを取得するためにX-ENDTIMEヘッダに「last」をセット。
④GETメソッドでAPI呼出
Step4-5.実際のIoTアプリ
Copyright(C) 2016 UPR Inc. 54
• APIを使うことにより、ブラウザベースのWeb
アプリからモバイルのネイティブアプリまでIoTを活用したアプリをすぐ作成可能。
• (参考)ScalenicsのREST APIを利用したサイミックス株式会社製「お手軽IoTキット」
• (Playストア)「お手軽IoT」で検索 • (Github:)以下レポジトリからダウンロード https://github.com/simics-co/easyiotkit-demoapp-android
6章.まとめ
• 今回のハンズオンで学んだこと – SORACOM Airを管理コンソールから登録した。
• いつでもSORACOM AirのSIMを登録したり、各種設定をオンラインで変更できる!
– SORACOM Beamとメタサービスを活用して、ScalenicsとDragonBoard間の認証をオフロードしDragonBoardに認証情報を埋め込む事なくScalenics側で認証・登録ができる事を確認した。 • SORACOMとScalenicsを使う事でデバイスが1台から数百台でもデバイス固有の設定作業が不要になり盗難によるトークン流出対策にもなる!
– ScalenicsのMQTTブローカを経由してセンサデータ収集と制御を行った。 • MQTTによる効率的なセンサデータ収集とデバイスへのメッセージ配信が簡単にできる!
– REST APIでScalenicsの機能を外部から利用出来る事を確認した。 • IoTアプリを作る際に、デバイス管理などの機能を実装することなくアプリ本来の機能作成に集中できる!
Copyright(C) 2016 UPR Inc. 55