IoT企業社内便利ツール① ファームウェア書けーる

この記事はAkerun Advent Calendar 6日目の記事です。今回はこのブログでは初投稿のフォトシンスCTOのkazuphが担当します!(`・ω・´)ゞ

Adventカレンダーとしては前回、工場で使っているIoTツールの話をしました。

kazuph.hateblo.jp

工場では作業をできるだけ隠蔽・自動化し工程を進めているのですが、工場でやっていることを社内でもやりたい場合、もしくはもっと柔軟に作業を行いたい場合があります。また工場に依頼せずに社内で行っている作業もあります。

今回はそんな現場で使われている数ある社内ツールを何回かにわけていくつか紹介して期待と思います。

社内ファームウェア書込みツール 「Akerunファームウェア書けーる」

名前は気にしないでください( ・`д・´)

これは工場で使っているファームウェアの自動書込みと自動検査を行う「書込検査君」の社内版です。

↓工場で使ってるツールはこんな感じでブラウザで動作(裏ではGolangやshell)するGUIツールです。社内ツールとしては主にはCLIで操作します。

f:id:photosynth-inc:20161207100206p:plain

※名前は気にしないでください

で、工場では流れ作業でどんどん次のファームウェアの書込を行っていくのですが、社内では場合によっては任意のID、バージョン、Production用やStaging用、Dev用なのかなど、柔軟にファームウェアの書込を行う必要があります。

社内でそれをやるのに、一々開発者がStagingサーバーのDBを覗いてIDを確認してソースコードを変更するのはめんどうです。

そこで工場用のツールをつくる前から任意のファームウェアの書込みができるツールを僕のMacでも動作するように開発していました。

それが「Akeurnファームウェア書けーる」です! ※名前は略

構成

構成は簡単で、実行可能なshellを./bin以下に配置しておいて、それをGolangでラップしてWebAPIを叩いたり、次の別のshellを叩いたりするだけです。

工場用Webアプリケーションとは一応別レポジトリで管理しておいて、./binへのシンボリックリンクを貼っている感じで、ソースが分散しないようにしています。

使っているものとしては、

  • bin/kakerun.sh
    • 最もベースとなるbashスクリプト。基本的には、このスクリプトにオプションを渡せば、どんなバリエーションのファームウェアの書込みが可能になる。ただしソースコードからのビルドはせずに、バイナリ置換とJ-Linkによるファームウェアの書込み(流し込み、チップへのダウンロード)を行うだけ。J-Linkを使った書込み部分はexpectというインフラ秘伝技術を使いました。
  • bin/hex_replacer.rb
    • kakerun.shの中で呼ぶrubyスクリプト。intelhex形式の置換を担当する。こちらもオプションで指定することで任意のバイナリ置換が可能。ちなみにbin形式の置換は、kakerun.shの中のperlでやっている。この辺は、記事を書くほどではないかもですが、誰かが喜ぶかもなので、どこかにスニペット程度は上げて起きたいと思います。
  • akerun-firmware-kakeel
  • main.go
    • ルートとなるGoスクリプト。IDを受け取って、管理用APIのメソッドを叩いて、書込み用のメソッドを叩いて終了というシンプルな構成。
  • kakerun_wrapper.go
    • kakerun.shを実行するためのメソッドを置いてる。APIから取得した情報を使ってオプションを埋めて実行、結果の取得を行う。書込みに長い時間が必要な場合あるので、そんむーさんのtimeoutというGoのライブラリを使わせてもらいました。簡単便利!
import (
...
    "github.com/Songmu/timeout"
)
...
    tio := &timeout.Timeout{
        Cmd:       exec.Command(KAKERUN_SHELL_PATH, optionsAry...),
        Duration:  20 * time.Second,
        KillAfter: 10 * time.Second,
    }
    exitStatus, stdout, stderr, err := tio.Run()
  • tatakun.go
    • WebAPIを叩くためのメソッドを置いてる。goreqがちょっと便利だった。
import (
    "encoding/json"
    "fmt"
    "log"
    "net/url"

    "github.com/franela/goreq"
)

type AkerunFirmwareWriteOptions struct {
    Id            int    `json:"id"`
    DeviceAddress string `json:"device_addr"`
        ...
}

func TatakunDownloadDevicesInfoById(akerunId int) error {
    form := url.Values{}
    form.Set("access_token", env["ACCESS_TOKEN"])

    res, err := goreq.Request{
        Method:        "GET",
        Uri:                API_URL,
        QueryString: form,
    }.Do()

        ...
}

以上こんな感じでshellとGolangを連携させていました。これを使うことで、コマンドを一発叩くだけで、任意のファームウェアの書込みができるようになって、大変便利でした。

このツールはMacRaspberry Piで動作します。Golangで書いたけど、Windowsさんでの実行を想定せず。bashとかrubyにも依存しているので、すいません。まあうちのソフトウェアエンジニアは全員Macなので問題はないんですけどね👀

おわりに

社内では様々な人が様々な業務をこなしており、エンジニアから事務のお姉さん的な人含めて業務の効率化は必須です。Webエンジニアがやったらきっともっと簡単ですぐ終わるだろうなぁって思ったことが、結構手作業のまま行われているケースもあります。今回はCLIベースのツールの話をしましたが、今後の記事ではGUIでつくったツールの紹介もする予定です!お楽しみに!

ちなみにですが、こんなに命名規則に遊び心があるのは、ツール系だけですのでご安心を!

ということで今回は以上です!

開発者のためのAkerun Developersというサイトもやってます!

photosynth-inc.github.io

さくらIoT Platformをさわって遊んでみる

す〜 (@ksksue) です。株式会社PhotosynthでAkerun Proの回路設計を担当してます。

これは Akerun Advent Calender 5日目の記事です。

 

さくらIoT Platform β版(以下さくらIoT)をゲットしたのでAkerun Proに付けて遊んでみようかと思います。全3回くらいで仕上げればなーと。

※ ちなみにAkerunに正式にさくらIoTを採用しようとしているわけでなくほぼ個人活動と思っておいて下さい

 

今回はさくらIoT Platformモジュールの仕様をざっと眺めてみます。

f:id:photosynth-inc:20161206012751j:plain

さくらIoT Platformについて

これまでArduinoやラズパイからLTE回線網にアクセスするには3万円ほどのモジュールを買ってかつSIM代を別で払うという価格的に障壁があった分野で

さくら IoT Platform β版はLTEのSIM付きで 5400円(税込) という低価格なモジュールとして注目されています。そして気になるデータ通信量はなんとβ版の時期に限り制限がないようです。

遊んでみるなら今でしょという感じです。

 

さくら、4980円で2年分(注1)のSIM込でIoTのLTEモジュールを無料で容量無制限サーバ付(注2)でやるってよ。:村上福之の「ネットとケータイと俺様」:オルタナティブ・ブログ

iot-store.sakura.ad.jp

  

さくらIoT Platform 別売りボード 

ちなみに、さくらIoTモジュールだけではコネクタが小さいので信号を取り出せません。なので一緒に

Arduinoシールドボード(電圧レベル変換IC付)

・ブレイクアウトボード(電圧レベル変換IC無し)

のいずれかを用意する必要があります。

めんどくさがりな人は電圧レベル変換ICが付いている前者を購入することをオススメします。

iot-store.sakura.ad.jp

 

ボクはブレイクアウトボードを買ったので、秋月へ行ってもみくちゃにされながらI2Cラインの電圧レベル変換モジュールを買ってきました。

I2Cバス用双方向電圧レベル変換モジュール(FXMA2102): 半導体 秋月電子通商 電子部品 ネット通販

f:id:photosynth-inc:20161205235614p:plain

 

あとついでにスルーホールテストワイヤを買っておくと幸せになれます。

スルホール用テストワイヤ TT−200 (10本入): 電子工作便利商品 秋月電子通商 電子部品 ネット通販 ※両端ともバネピンタイプ

スルホール用テストワイヤ TP−200 (10本入): 電子工作便利商品 秋月電子通商 電子部品 ネット通販 ※片方がバネピン、片方がブレッドボード用ピンのタイプ

f:id:photosynth-inc:20161206013149p:plain

 

さくらIoT Platform 電圧

さくらIoTモジュールの電源電圧/IO電圧がわりとわかりにくかったのでまとめておくと

・電源電圧: 3.8V (追加ボードには5V→3.8V DCDCが付いているので特に意識しなくていい)

IO電圧: 1.8V (データシートに明記されてないけど実測するとこれ) ※訂正:データシートのtyp.には書いてないけど「さくらの通信モジュール データシート -β版」のp.30あたりに1.8Vの記述あり

・入力電圧は3.3Vトレラントなので3.3V系と接続可

ただ基本的には1.8V系なので入出力は電圧レベル変換モジュールを通しておいたほうがよさそうです。5V系Arduinoは否応なしに電圧レベル変換必須です。

 

I2C/SPI コマンド通信

さくらIoTモジュールとはI2C/SPI通信でコマンドをやり取りすることで、クラウドとの通信で 1度に8 byteのパケット 送受信することができます。

Arduinoのライブラリコードは以下のリンクのGithubで公開されているようなのでサクッと動かせるようす。

github.com

クラウド

自分は回路系なのでWeb側は理解が遅いんですが以下の3つの通信方法があるようです。

・WebSocket

・Outgoing Webhook

・Incomming Webhook

そしてなんとなくマイコンからI2C通信を経由してクラウドにデータをあげてみたの図

f:id:photosynth-inc:20161206014843p:plain

 

 

次回はさくらIoTモジュールとNordic nRF52とを繋いでゴニョゴニョ通信してみようと思います。

 

 

その他情報

さくらIoT Platformに関するスライド。料金体系など。

 

公式の開発者向け情報

さくらのIoT Platform|開発者向け

・さくらIoTモジュールのデータシート/マニュアル

Arduinoシールドボード・ブレイクアウトボードの仕様書/回路図

 

 

Akerun Developersサイトが11月にオープンしました。

Akerun APIの情報などあるのでぜひ覗いてみて下さい。

photosynth-inc.github.io

IoT機器開発ことはじめ

初めまして。@KoheiAkitaです。こういった形でブログを書くのは人生で初めてなので、至らぬところが多々あるかと思いますが、温かい目で見守ってくれればと思います。

私は今は巡り巡ってIoT機器開発に携わっており、株式会社 PhotosynthにてAkerun Remoteのプロダクトオーナーとして主開発 兼 管理の立場として顧客にスマートロックの遠隔操作、自動情報収集の機能を提供するIoT機器開発をしています。

 

自分の現況はさておいて、「IoT機器開発ことはじめ」として、IoT機器における開発環境をいくつか紹介したいと思います。

IoT機器と言っても最近は多種多様なものがありますが、一般的には”イメージファイルを作って端末にフラッシュ”というのが一般的です。

しかし、私が今開発している端末は"Nodejsを用いたアプリケーション開発"であるため、イメージファイルを作る必要がありません。そのため、スクリプトファイルを更新して動かすだけ(厳密にはCやC++を使ったバイナリとともに動かしていますが)で良いのです。

それを踏まえた開発環境はどのようなものがあるか、検討した後、現在私が採用している手法について簡単に紹介させてもらえればと思います。

 

現在の開発端末の構成としては、以下のようになっています。

 

[ 開発機器 ] - [ USBシリアルケーブル ] - [ MacBook Pro ]


開発機器はIntel Edisonを搭載し、BluetoothWi-Fiを備えている一般的なIoT機器と同様ですが、形状に拘りがあり、非常に小さい端末に仕立て上げています。

 

では次の項目から、紹介を始めていきます。

 

1. IDEでの統合開発

iPhoneAndroidアプリを開発している方には馴染み深いIDEの統合
開発環境ソフトが第一に挙げられるでしょう。組み込み機器向けにも一般的にはEclipse、もしくは、それぞれの開発ボードのベンダーが提供するIDEがあります。 

  • ワンクリックでビルドができる(必要な言語ならば)
  • デバッグもワンクリックでできる 
  • ソースコード管理のgitと等とも連携できる 
  • 高性能なIDEは開発機器のメモリ管理もできる 

といった開発に非常に便利な機能が多数搭載されており、ソフトウェア開発に便利です。プログラミング始めたての方でもとっつきやすいのが良いですね。

 2. VNCを用いたリモートアクセス

次に紹介するのはRaspberryや、Arduinoなど、リッチなUIをOSを搭載可能な端末では良く用いられている手法です。

  • 開発PCでリモートデスクトップでアクセスでき、普段と変わらない操作性 
  • ターゲット端末のデスクトップ操作が可能なため、ターゲット端末内に開発環境を展開し、実際の端末上での開発が可能 
  • Samba等フォルダ共有システムを導入すると、コピーの手間も省ける 

など、PCで開発することとほぼ同じことができるため、UIでの開発に慣れている方には違和感なく導入できる開発環境です。

 

3. NFSを構成して開発PCと同期

3番目はNFSの紹介です。NFSはNetwork File Systemの略で、その名の通り、ネットワークを使用したファイルシステムです。NFSをクライアント、サーバー両方に導入すると、クライアント側から指定したIPアドレスターゲットマシン内の任意のフォルダにマウントすることができ(理論的には)、サーバー側で操作した瞬間にクライアント側にも同期します。

Sambaとの大きな違いは、アクセス制御の有無、そしてOSの起動ブロックとして指定が可能であるため、サーバー側のデータを参照しての端末起動が可能です。

上記の通り、導入には若干ハードルが高いです。

以前に携わった独自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

このスクリプトの第一引数にターゲット端末のアドレスを指定すれば、スクリプト内で指定したファイルが一発で指定した転送ディレクトリへコピーされます。

 

大した事はないですが、これらを自動化した事で非常にすばやく開発のトライ&エラーを回せるようになり、効率が上がりました。

 

開発環境は、機能はもちろんですが、一番重要なのは

いかに効率よく開発を進められるか

という点で構成すると一番やりやすいのではないかと私は考えていますが皆さんはいかがでしょうか。

 

株式会社フォトシンスのエンジニアブログ

スマートロック Akerun を開発している技術者たちのブログです。

このブログではフォトシンスのメカ・回路・ファーム・LinuxAndroid/iOSアプリ・Web系のエンジニア達が技術情報を発信していきます。

通常は不定期更新ですが、12月からのアドベントカレンダーでAkerunについて1日1記事ペースで書いていく予定です。

qiita.com

フォトシンス Akerun をよろしくお願いします。