Septeni Engineer's Blog

セプテーニ・オリジナルのエンジニアが綴る技術ブログ

セールなので💪Dashで社内をハックする!

こんにちは、菅野です。
最近私はTreasuredataやDigdagやAthenaなどを使ってビッグなデータを扱う仕事をしています。

そんなことより、今AmazonでDashボタンの100円セールをやってます! f:id:zakknak:20180705215635p:plain

いつもより5倍買えるのです!!
たくさんハックしてIoTボタンとして働いてもらうのです!!

突然のセール

早速ポチって、しばらく寝ていると届きました! f:id:zakknak:20180705220237j:plain

セットアップしたボタンを押すとお茶も届きました。

このSpeed感…シビれる…

Androidとの格闘

とりあえずお茶は適当に放っておいて、DashボタンをIoTボタンとして目覚めさせる作業を行います。
いつもだとここでラズパイが出てくるのですが、今回はどこのご家庭にも転がっているAndroid端末を用意しました。

f:id:zakknak:20180705221434j:plain

私がオモチャとして愛用しているJelly Proは、基盤むき出しのラズパイと比べて筐体フレームで包まれ、バッテリーやタッチパネル液晶、カメラ、GPS、その他のセンサーまで標準で装備しているのでコスパ的にもだいぶ良いのではないでしょうか?弱点はセンサーの拡張性とAndroidであること(後に仇となる)くらいです。

ほぼDebian

DashボタンをIoTボタンとして活用するやり方は、Dashボタンを押すとネットワークにARPのパケットが飛ぶのでそれをトリガーとして何かをするという手順になります。

ARPパケットを補足して何かするという部分はdasherですぐに実現できます。

github.com

dasherを動かすためにはnode.jsが必要ですが、Android端末上でどうやって動かすのでしょう。

play.google.com

それはTermuxというアプリで解決できます。
このアプリはAndroid端末上でほぼDebianのような環境を作れます!マジか。

f:id:zakknak:20180705224145j:plain

既にお気付きの通り、スマホでターミナルは厳しいので何とかします。

まずは pkg install opensshsshをインストール(!)します。
次にどうにか頑張ってauthorized_keysに自分の公開鍵を登録します。
で、sshdsshサーバを起動します。あとはログインするだけです。デフォルトでは8022番ポートで起動するので注意。

f:id:zakknak:20180705225018p:plain
スマホにログインしました(笑)

次にやることはもうお分かりでしょうが、
gitnodejs 、yarnがお好みなら yarn をインストールします。なんだかワクワクしてきました!

dasherの依存ライブラリのビルドで必要となる、libpcap-dev clang python2 も入れておきましょう。
そしてdasherをcloneしましょう。

f:id:zakknak:20180705230645p:plain
スマホ上で普通に開発が始まりました。

そして、 yarn で依存モジュールをインストールしていると問題発生! 依存モジュールの中にnode-gypでネイティブバイナリをビルドする部分があるのですが、リンクに失敗するのでコンパイルオプションを変更する必要がありました。

f:id:zakknak:20180705231524p:plain
common.gypiOS == "android" の部分の cflags の値を -fPIC に変更して再度ビルド。

うまくいったら、dashボタンのMACアドレスを確認します。
dasherのREADMEに書いてあるように、script/find_button でパケットキャプチャを起動します。 プロミスキャスモードでの動作になるので、端末のroot権限が必要です。私は気づいたら手に入れていました。(嵌った)

いろんなところからARPのパケットが飛んできますが、静かになったときにDashボタンを押してMACアドレスを特定します。
それっぽい物を見つけたら、 config/config.json に設定を済ませて準備完了です。 f:id:zakknak:20180705232011j:plain

と、さらっと書いていますが、なかなかボタンのパケットが来なくてだいぶ嵌りました。
Androidアプリはバックグラウンドになるとプロセスが眠りにつくパターンだけではなく、起きててもネットワークは絞られるため、Termuxをフォアグラウンドの状態にしたままにする必要がありました。

問題が解決したので start でDashボタンを待ち構えましょう。
実行にはsudoが必要です。 f:id:zakknak:20180705232140p:plain

ポチッとな

ボタンを押して反応したら成功です。

f:id:zakknak:20180705233112p:plain

いざ、出社

さて、ボタンを手に出社した私はそもそも何でボタンを買ったんだっけという疑問には目もくれず、 アプリの制作に取り掛かります。

ボタン一発で決めてやる

程なくアプリ一号ができました。

私が所属するいちご組は譲り合い文化の醸成が進んでいるのですが、そんな雰囲気でもDashボタンがあれば素早く率先して行動することができるようになります!

ポチッとな
f:id:zakknak:20180706215916j:plain

一瞬(やや長い)の静寂の後、Slackに最も自主性のあるメンバーが表示される! f:id:zakknak:20180706001634j:plain
私はDashボタンをキメた。

一方、某氏はサイコロを使った。
f:id:zakknak:20180706215741j:plain

…すべての利便性においてサイコロのほうが上回っていました。
そもそもこの問題はIoTが解決する領域じゃない。

第二弾

気を取り直して、自分のロッカーに勤怠ボタンを設置してみました。

伊右衛門(お茶)が出勤、ピルスナー・ウルケル(ビール)が退勤です。

f:id:zakknak:20180706220329j:plain

…設置したのはいいのですが、時間をメモするだけなので全然便利になった気がしません。
それに何かIoT感が足りない気がします。

IoTって、センサーとかで状況を把握できたりとかするやつだと思ってました。

IoTっぽい?

ならばと白羽の矢が立ったのが社内のあの場所。
弊社の執務エリアにはローソンがあります!

生贄のローソンです
f:id:zakknak:20180706221123j:plain

此奴とAndroid端末のカメラを組み合わせようと思います。
TermuxにはAPIがあってカメラの撮影も問題なしです!

f:id:zakknak:20180706014819p:plain

近くのテーブルにこっそりとAndroid端末をセットしておきます。
元からこんなデザインのテーブルだったかのような出来栄えです。
f:id:zakknak:20180706221411j:plain

そしてボタンをPush!

f:id:zakknak:20180706222144p:plain

ローソンの偵察結果がSlackで到着しました。
だいぶ荒らされてるようです。
でもこれだけだと中途半端なので、在庫自体を認識させようと思います。
OpenCVを使えば余裕ですね。Termuxではソースからインストールが必要です。

いろいろ仕込んだら、ビールに思いを馳せながら自席からピルスナーウルケルのボタンを押します。
何だかIoT感がぐんと上がりました!
f:id:zakknak:20180706222544j:plain

f:id:zakknak:20180706222917p:plain
ホントに探せてるかよくわかりませんが(多分ダメ)、ボタンによると社内には置いて無いようです。

ちなみにGoogleのCloud Vision API伊右衛門を見せたのですが、当然のことながらボトルの飲み物であることまでしかわかりませんでした。

OCRを試してみたところ、読み取ったテキストから商品を推定する方法でいけるかもと思えてきました!

しかし、疲れたので今回はこれで打ち止め。

おわり

どれもこれも需要が行方不明な気がしますが、Dashボタンでいろいろ試してみました。*1
ここまで読んでいただいてありがとうございます!

なにか面白いアイデアがある方やない方は
ぜひ弊社にジョインして社内をハックしてください!

*1:なお、自宅では出社連絡ボタンとして大活躍の模様