ENGINEER BLOG

ENGINEER BLOG

Amazon Dash Buttonを押す

Amazon Dash Buttonを押す

ごきげんよう、コンサルティングサービス本部のじんぐうじです。

出遅れ感がありますが、既にみなさまご購入済みであろうAmazon Dash ButtonをIoTボタンとして使ってみました。推しメンはNANOXですが今回はevianを使います。
IMG_3163

Dash Buttonの準備

Dash Buttonをアクティベートするためにはアカウントに紐づける必要が有りますが、 紐づけはスマートフォンとDash ButtonをBlueToothで接続してAmazonアプリで行います。
IMG_3144 IMG_3145
メニューから「端末を管理」→「新しいDash Buttonをセットアップ」と進み、

IMG_3146 IMG_3147 IMG_3148
「同意して開始」をタップ後、指示通りDash Buttonを6秒間長押ししてから「接続」をタップするとスマホと接続されます。

IMG_3149 IMG_3150 IMG_3151
その後wifiと接続(必要に応じて「他のネットワーク名を入力」をタップしてSSIDとパスワードを入力)すると 商品選択画面になりますが、右上の×ボタンをタップしてセットアップを中断します。商品を選択するとボタンを押した際に注文されてしまうので…

IMG_3152
セットアップを終了して、Dash Button側の設定は完了です!

サーバ側の準備

Dash ButtonはAmazonのサーバへ直接リクエストを行うので通常の用途であればサーバは必要ないのですが、 ボタンが押されたことを検出するためにサーバが必要となります。 Dash Buttonのリクエスト先の変更はできないため、Dash Buttonが送出したar/udpのブロードキャストを検出することで、ボタンが押されたことを同一セグメント上のサーバが検知します。
今回はnode-dash-buttonで実装しました。
package.jsonは↓のような感じにしてnpm installします。

{
  "name": "evaluate-amazon-dash",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "find": "findbutton",
    "start": "node index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "node-dash-button": "^0.6.1"
  }
}

node-dash-buttonはnode-pcapに依存しているのでlibpcap-develが必要になります。 ちなみに最初Windows環境で導入しようとしたのですが、node-pcapのビルドが面倒だったことと、ブロードキャストが届く範囲にlinuxマシンが無かったためVirtualBoxにCentOSをインストールしました。切ないですね。 会社貸与のPCがMacだったらいいのに

次にDash ButtonのMACアドレスを確認します。node-dash-buttonのfindbuttonを実行したからボタンを押すことで MACアドレスを取得します(私の環境ではベンダ名がunknownになりました)。
# npm run find

> evaluate-amazon-dash@1.0.0 find /root/evaluate-amazon-dash
> findbutton

Watching for arp & udp requests on your local network, please try to press your dash now
Dash buttons should appear as manufactured by 'Amazon Technologies Inc.'
:
Possible dash hardware address detected: XX:XX:XX:XX:XX:XX Manufacturer: unknown Protocol: udp
Possible dash hardware address detected: XX:XX:XX:XX:XX:XX Manufacturer: unknown Protocol: arp
:

コードを書く

MACアドレスを取得したら後は実装するだけです!下記コードはボタンが押されたらログを出力するだけですが、 Dash Buttonが押されたタイミングで任意のコードを実行できます。簡単ですね!

//index.js
const dashButton = require('node-dash-button');

const macAddr = 'XX:XX:XX:XX:XX:XX';
const dash = dashButton(macAddr, null, null, 'all');

let i = 0;
dash.on('detected', () => {
  console.log('[' + (i++) + '] ' + "OMG!!! It's Amazon Dash!!!");
});


実行結果はこのようになります。
# npm run start

> evaluate-amazon-dash@1.0.0 start /root/evaluate-amazon-dash
> node index.js

[0] OMG!!! It's Amazon Dash!!!
[1] OMG!!! It's Amazon Dash!!!
[2] OMG!!! It's Amazon Dash!!!

まとめ

Dash Buttonを使用することで、簡単に物理ボタンのイベントをプログラムで取得することができました。 (ちなみにHTTP(S)のリクエストを送るだけであればdasherを使う方が楽です。) RaspberryPiやArduinoで実装する手間や、Amazon IoT Buttonが$20程度かかることに比べると、 500円のDash Buttonは安く手間なく用意できるため夢が広がりますね!!