IoT機器開発ことはじめ
初めまして。@KoheiAkitaです。こういった形でブログを書くのは人生で初めてなので、至らぬところが多々あるかと思いますが、温かい目で見守ってくれればと思います。
私は今は巡り巡ってIoT機器開発に携わっており、株式会社 PhotosynthにてAkerun Remoteのプロダクトオーナーとして主開発 兼 管理の立場として顧客にスマートロックの遠隔操作、自動情報収集の機能を提供するIoT機器開発をしています。
自分の現況はさておいて、「IoT機器開発ことはじめ」として、IoT機器における開発環境をいくつか紹介したいと思います。
IoT機器と言っても最近は多種多様なものがありますが、一般的には”イメージファイルを作って端末にフラッシュ”というのが一般的です。
しかし、私が今開発している端末は"Nodejsを用いたアプリケーション開発"であるため、イメージファイルを作る必要がありません。そのため、スクリプトファイルを更新して動かすだけ(厳密にはCやC++を使ったバイナリとともに動かしていますが)で良いのです。
それを踏まえた開発環境はどのようなものがあるか、検討した後、現在私が採用している手法について簡単に紹介させてもらえればと思います。
現在の開発端末の構成としては、以下のようになっています。
[ 開発機器 ] - [ USBシリアルケーブル ] - [ MacBook Pro ]
開発機器はIntel Edisonを搭載し、BluetoothとWi-Fiを備えている一般的なIoT機器と同様ですが、形状に拘りがあり、非常に小さい端末に仕立て上げています。
では次の項目から、紹介を始めていきます。
1. IDEでの統合開発
iPhoneやAndroidアプリを開発している方には馴染み深いIDEの統合
開発環境ソフトが第一に挙げられるでしょう。組み込み機器向けにも一般的にはEclipse、もしくは、それぞれの開発ボードのベンダーが提供するIDEがあります。
といった開発に非常に便利な機能が多数搭載されており、ソフトウェア開発に便利です。プログラミング始めたての方でもとっつきやすいのが良いですね。
2. VNCを用いたリモートアクセス
次に紹介するのはRaspberryや、Arduinoなど、リッチなUIをOSを搭載可能な端末では良く用いられている手法です。
- 開発PCでリモートデスクトップでアクセスでき、普段と変わらない操作性
- ターゲット端末のデスクトップ操作が可能なため、ターゲット端末内に開発環境を展開し、実際の端末上での開発が可能
- Samba等フォルダ共有システムを導入すると、コピーの手間も省ける
など、PCで開発することとほぼ同じことができるため、UIでの開発に慣れている方には違和感なく導入できる開発環境です。
3. NFSを構成して開発PCと同期
3番目はNFSの紹介です。NFSはNetwork File Systemの略で、その名の通り、ネットワークを使用したファイルシステムです。NFSをクライアント、サーバー両方に導入すると、クライアント側から指定したIPアドレスターゲットマシン内の任意のフォルダにマウントすることができ(理論的には)、サーバー側で操作した瞬間にクライアント側にも同期します。
Sambaとの大きな違いは、アクセス制御の有無、そしてOSの起動ブロックとして指定が可能であるため、サーバー側のデータを参照しての端末起動が可能です。
- 導入後は開発マシンからターゲットを起動することも可能
- 導入にはカーネル起動のinitスクリプトの変更が必要
- 場合によっては、カーネルコンフィギュレーション変更が必要
- 起動ブロックとしてマウントした場合、ネットワークを介すため起動は遅くなる
上記の通り、導入には若干ハードルが高いです。
以前に携わった独自OS開発プロジェクトにて、独自OSであったため、イメージ作成、ターゲットにフラッシュするツールなど従来あるはずのしっかりしたツールが無い状態での開発で、ツールを作成するよりはNFSを導入した方が早いとのことで、NFSをKernelに組み込みターゲット端末起動時に開発マシン内に展開してあるフォルダを参照しそこから端末を起動するようにしていました。案外、NFSが取り入れられるならばイメージ作成 →フラッシュの手間が省けテンポよく開発を進めることができたため、このケースの様に状況に応じて取り入れると非常に便利な機能です。
4. debファイルを作成してapt-get経由で更新
Linuxで一般的なaptファイル管理システムを用いてファイルを更新する仕組みです。
- バージョン管理が容易
- ファイルのやり取りはパッケージ一つにまとめられるためで一度で済む
- ただし、debianパッケージ作成、ローカルデータべース作成、サーバーへのアップロード等、手動でのパッケージ管理操作が必要。
トライアンドエラーを幾度となく回し、頻繁にファイルを更新するような状況下では向かないかもしれません。
上記までのやり方は、今回の開発をするにあたり一通り検討はしましたが、必要機能と導入のコストを鑑みていずれのやり方でもなく、以下の方法で行うことにしました。
5. SSHによるリモートログイン
SSHを使用してリモートログインし、ターゲットマシンのコンソールを開発マシンから捜査するという一般的な方法です。
私の環境でも最初に取り入れた手法ですが、” 動作ログの表示が遅い "という致命的な課題があったために不採用になりました。
6. SCPを用いたデータ転送
Nodejsのスクリプト言語である特徴を生かし、ビルドが必要なく、ファイルを更新して動作させるだけで良いことからSCPでのファイルコピーが一番シンプルで必要条件を十分に満たしているためこれを採用しています。ただ、本当にSCPでコピーするだけでは複数フォルダ、ディレクトリをコピーするには面倒なため、ひと手間加えて全て自動化します。以下にそのひと手間を記します。
6.1 パスワード自動入力スクリプトの作成
auto_scp.sh
#!/bin/sh
rsa_pass=xxxxxxxxxx
console_pass=xxxxxxxxx
expect -c "
set timeout 20
spawn scp -o StrictHostKeyChecking=no -r $1 $2
expect "passphrase"
send \"$rsa_pass\n\"
expect "password"
send \"$console_pass\n\"
interact
"
expectという対話型コマンドを用いてパスワード入力に利用します。このシェルスクリプトには、
を指定します。
6.2 ファイル自動転送スクリプト作成
5.1で作成したシェルスクリプトを使って、ローカルのディレクトリ、ファイルなどのコピー対象を羅列をした以下のシェルスクリプトをさらに作ります。
install_app.sh
#!/bin/sh
@echo off
TARGET_IP=$1
ACCOUNT_NAME=hoge
auto_scp.sh ./path/to/sourcecode $ACCOUNT_NAME@$TARGET_IP:/path/to/transfer/dir
auto_scp.sh ./path/to/file_something $ACCOUNT_NAME@$TARGET_IP:/path/to/transfer/dir
このスクリプトの第一引数にターゲット端末のアドレスを指定すれば、スクリプト内で指定したファイルが一発で指定した転送ディレクトリへコピーされます。
大した事はないですが、これらを自動化した事で非常にすばやく開発のトライ&エラーを回せるようになり、効率が上がりました。
開発環境は、機能はもちろんですが、一番重要なのは
いかに効率よく開発を進められるか
という点で構成すると一番やりやすいのではないかと私は考えていますが皆さんはいかがでしょうか。