セカイノカタチ

世界のカタチを探求するブログ。関数型言語に興味があり、HaskellやScalaを勉強中。最近はカメラの話題も多め

マーブルワーズ

Amazon Dash Buttonをエマージェンシーコールボタンにしてみた

f:id:qtamaki:20170323151509j:plain

キュキュット Dash Button

キュキュット Dash Button

エリエール Dash Button

エリエール Dash Button

さて、昨年末に日本で発売された Amazon Dash Button ですが、「どうやらハックできるらしい」ということを知って、買ってみました。

本当は、12月に買ってあったのですが、色々忙しくて三ヶ月ほど放置していましたが、「エマージェンシーコールが欲しいな」と思い、簡単なハックをしました。

直接のきっかけはコレ。

東京の自宅に四歳の息子がいて、自分は酒田に居ることが多いため、母親(かみさん)が倒れると、この漫画の状況になります。

これは泣ける。

ということで、今回実現したい仕様は「Amazon Dash Button が押されたら特定のアドレスにメールが届く」です。

簡単そうですね。

主に参考にしたのは、この記事です。

qiita.com

実際には、こちらの記事でも使用している「node-dash-button」というライブラリを使用しました。

動作原理

上記の記事にもありますが、簡単に動作原理を説明します。

前提

Amazon Dash Button は、初期設定でWifiの接続設定を行うようにできており、ボタンを押すと、インターネット経由でアマゾンに1-Click注文処理を投げます。node-dash-buttonは、この時の通信を「傍受」して別の処理を行います。Amazon Dash Button には一切修正を入れずにButtonが押された時の処理を定義できます。ただし1-Click注文を未設定状態にしておかないと、「注文されます」(^^;

動作

  1. Amazon Dash Button を押すとネットワークの接続を確認するため信号(arp probe)が出ます
  2. この信号を監視するサーバーを立てておき、この信号をリアルタイムに検知します
  3. MACアドレスによって、特定の Amazon Dash Button であることが判定可能なので、特定のMACアドレスから信号が来たら定められていたアクションを行います

原理は簡単で、「node-dash-button」は、dash-buttonという名前がついていますが、他のネットワーク機器(スマホやPC)でも、接続されたときにアクションを定義できるはずです。^^;

Amazon Dash Button の設定

Amazon.co.jp ヘルプ: Dash Buttonの設定を管理する

こちらの設定ページの通り設定します。ただし、最後の商品選択のところで、処理をやめて放置します。^^;

最後まで設定してしまうと、もちろん 商品が届きます

と、ここまで書いてて思ったのですが、「商品が届いてしまう」という副作用を無視すれば、アマゾンから注文メールが届くので、無改造で「エマージェンシーコール」として機能するな。

子供に持たせる場合、誤操作で商品が届くとちょっとアレですが。^^;

Amazon Dash Button のMACアドレスを知る

Amazon Dash Button のMACアドレスを調べるのはそこそこダルいですね。

僕は、node-dash-buttonを起動して、表示されるMACアドレスを使いました。

以下のような手順です。

git clone https://github.com/hortinstein/node-dash-button.git
cd node-dash-button
npm install
sudo /path/to/node/node/bin/node bin/findbutton

sudoが必要なので、nodeのパスを絶対パス指定しないと動かないと思います。

こんな感じのログが表示されます。

Possible dash hardware address detected: 34:d2:70:6f:e5:c0 Manufacturer: unknown Protocol: udp
Possible dash hardware address detected: 34:d2:70:6f:e5:c0 Manufacturer: unknown Protocol: arp
Possible dash hardware address detected: ac:63:be:9a:29:3d Manufacturer: Amazon Technologies Inc. Protocol: udp
Possible dash hardware address detected: ac:63:be:9a:29:3d Manufacturer: Amazon Technologies Inc. Protocol: arp

ボタンの機体によって、プロトコルの表示が違うのは謎です。

実施

さて、準備はこんなもんなので、プログラムを書いて「node-dash-button」と「Nodemailer」を使って、ボタンが押されたら特定のアドレスにメールが届くようしてみました。

github.com

注意点としては、ARPを監視するため、 管理者権限で実行しないといけない ということです。

そして、ARP監視に、「libpcap-dev」を利用するため、MacやWindowsでは動かないと思います。VMを立てるか、Linux(Debian系が良いと思う。僕はUbuntuでやりました)を利用しましょう。

あと、Nodemailerが、Node.js V6.x以降でないと動かないので、パッケージから入れたnode.jsでは動かないと思います。本家のサイトから最新版をDLしてきて入れましょう。

npm install
sudo /path/to/node/bin/node main.js

とするだけで動きます。

main.jsの中身も相当ベタに書いてあるので、難しいことはないと思います。^^;

fromのメールアドレスや、Amazon Dash Button のMacアドレスの部分は書き換えてください。

一応、動作確認したときに届いたメールのスクショを貼っておきます。

f:id:qtamaki:20170323161601j:plain