Amazon Dash ButtonをPythonでハックする part1 -設定-

#Amazon#AmazonDashButton#IoT

はじめに、の前に

2018年5月に「AWS IoTエンタープライズボタン」が一般公開されました。 Amazon Dash Buttonで色々したいと思っていた方はこちらの方が適切かもしれません。 簡単に違いを述べると、

  • Amazon Dash Button
    • 元々Amazonの商品をワンクリックで注文するためのもの
    • IoT機器として優秀だったのでハックしようという人が現れた(本記事もその一つ)
    • 商品の注文で利益を取るつもりなので機器自体が格安(500円)
  • AWS IoTエンタープライズボタン
    • 任意のAWS Lambdaを叩ける
    • Lambdaを叩くための機器として設計されたので開発が楽(らしい)
    • Dash Buttonに比べると割高(2500円)

  とにかく安く済ませたい、本来の用途とは違う動作をさせたい(ハックしたい)などの希望がなければAWS IoTエンタープライズボタンの方が使いやすくて良いかと思います。

AWS IoT エンタープライズボタン – IoT をシンプルに。

  またAWS IoTを利用した例としてドワンゴのRuたんさんがスライドを公開しているので参考に紹介しておきます。

  ではとにかく安く済ませたいorハックしたい方は続きをどうぞ。

はじめに

「AmazonDashで遊ぶ会」に参加しました。 みんなで面白いこと試してみようぜ、と以下の記事を参考にハンズオン的に進めていたのですがかなり設定でつまりました。

  pyenvを入れている為、Pythonのバージョンでエラーを吐かれた人や、そもそもnpmが入れらんなかったりとわちゃわちゃしたので、自分の環境でできる方法で実装したのでメモを残します。   環境は以下の通りです。

  • Mac book Pro (Sierra)
  • Python 3.5.1 (pyenv)
  • 自宅のwi-fi

  Linuxではわかりませんが、Windowsでは動かないようなのでご注意ください。 あと、設定のためにスマホが必要となります。今回はiPhoneを使いましたがなんでも良いでしょう。 もう一つ、Amazon Dash Buttonはwi-fi経由で信号を発しています。 詳しい仕組みについては以下の記事を確認ください。

  一連の作業は可能なら通信的に静かなところで行うと良いでしょう。 複数人で同時に設定を始めると、他の人のAmazon Dash Buttonと紐づいてしまったりしまうので。。。

Amazon Dash Button設定

まずはスマホアプリ経由でAmazon Dash Buttonの設定を行います。 ストアから「Amazon ショッピングアプリ」をインストールします。     アプリを起動して、左上の三本線から設定画面開きます。   中程のアカウントサービスを選択します。   下にスクロールして「Dash端末 -> 新しい端末をセットアップ」を開きます。   同意して開始。   Amazon Dash Buttonをランプが青く点滅するまで長押しします(ランプの色が白から青になります)、その後指を離してスマホ画面の「接続」をタップ。   ネットワークのパスワードを入力してください。   Dash Buttonとの接続を開始するのでしばらく待機します。 接続が成功すればDash Buttonのランプが青く点滅します。   商品選択画面が開かれるので、正式な方法で使いたいならここで商品を選択します。 別の用途に使いたいなら右上の「× -> セットアップを終了」を選択しましょう。   設定画面に戻るので、「Dash端末 -> 端末を管理」から登録されているか確認します。   これで、Amazon Dash Button側の設定が完了しました。 Amazon Dash Buttonはボタンを押されると起動して、設定されたwi-fiに接続、ARPで要求を飛ばしIPアドレスを取得しようとします。 この時に同一のwi-fi環境内でAmazon Dash ButtonのMACアドレスからのARP要求を監視し、それをトリガーになんらかのプログラムを走らせるようにすればAmazon Dash Buttonを起点に様々なことができます。   その為にはまず、Amazon Dash ButtonのMACアドレスを知る必要があります。

Amazon Dash ButtonのMACアドレスを取得

ターミナルを開いてtcpdumpコマンドでプロトコルをARPに指定して待ち受けます。 Amazon Dash Buttonのブロードキャストだけを取得するよう1つ受け取ったら終了とします。

sudo tcpdump -e arp -c 1
tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pktap, link-type PKTAP (Apple DLT_PKTAP), capture size 262144 bytes

  この状態でAmazon Dash Buttonのボタンを押すと、以下のような標準出力が得られます。

18:05:51.129466 c4:8e:8f:fb:6c:bb (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 42: Request who-has 169.254.169.254 tell desktop-a8ovbff.lan, length 28
1 packet captured
498 packets received by filter
0 packets dropped by kernel

  c4:8e:8f:fb:6c:bbというMACアドレスからブロードキャストにARPが飛んでいることがわかります。 Amazon Dash ButtonのMACアドレスとしてメモしておきましょう。

amazon-dashライブラリを使ってボタンに対応してコマンドを実行

MACアドレスがわかれば、それを検知します。 以下のライブラリを使わせていただきました。

  pipで簡単に入れることができます。

sudo pip install amazon-dash

  適当なディレクトリを作業用に用意します。 amazon-dash.ymlというファイルを作成し設定を書きます。

# amazon-dash.yml
# ---------------
settings:
delay: 10
devices:
4:8e:8f:fb:6c:bb: # さっきメモしたMACアドレス
name: Echo # 多分コマンド名、なんでもいいはず
user: Ryota # コマンドを実行するユーザ(実行端末内にいるユーザを記述)
cmd: echo "hoge" # 実行するコマンド

  amazon-dash.ymlは所有権をrootに移す必要があるそうです。

sudo chown root amazon-dash.yml

  設定ファイルと同一ディレクトリでコマンドを実行します。

sudo amazon-dash run

  リッスン状態になるので、Amazon Dash Buttonのボタンを押すと、

hoge

  と、echo "hoge"が実行されました。 あとは色々実行したいことをカスタマイズすれば良いです。 プログラムを作ってそれを実行するようにしたり。 とりあえず、今回は入り口までということで終わりにします。

モジュールがないと言われたら

Githubのリポジトリ内にPython2, 3それぞれに対してrequiremnets.txtが用意されているので適宜pipでインストールしましょう。

次回

とりあえず、自宅で通信を確認できてよかったです。 今の所特にアイディアがないのですが、思いついたら実装してみたいと思います。 なんか面白いことやってみとのことでAmazon Dash Buttonを借りているので。   ちなみに、プライムデーで1つ100円だったので100個買ってきたらしいです。 真っ先に猫のシルエットのShebaを選びました。かわいいの選べて満足。   今回のようにハックする分にはどのボタンでも構わないので、好きなデザインのものを選ぶといいでしょう。 Amazon ダッシュボタン一覧

参考