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