概要

Dash Button
Dash Button
Raspberry Pi
Raspberry Pi
Wi-Fi
Wi-Fi
IFTTT
IFTTT
LINE
LINE
ARP request
ARP request
packet monitoring
packet monitoring
webhook
webhook
notify
notify
Viewer does not support full SVG 1.1

今回作るものはこんな感じ. 家にインターホンを設置することができず,書留郵便が送られてくるたびに不在連絡票が入って不便なので作った.

前提

  • 無線 LAN ルーター
  • Amazon Dash Button
  • Raspberry Pi (無線 LAN インターフェースを持つサーバーで代替可能)

無線 LAN ルーターは固定 IP アドレスとパケットフィルタリングが設定可能なものを利用する. また,Amazon Dash Button と Raspberry Pi はこの無線 LAN ルーターに接続することとする.

手順

Dash Button の設定

Dash Button はボタンが押下されると Amazon のサーバーに接続するようになっている. しかしながら,2019 年のサービス終了に伴い,Amazon のサーバーに接続するとすべての機能が無効化されたファームウェアが書き込まれるようになっている. 機能が無効化された Dash Button を再度利用可能な状態にするには,Dash Button のバッファオーバーフロー攻撃に関する脆弱性を利用してセットアップする必要がある 1. そこで,Dash Button をインターネットに接続しないように,無線 LAN ルーターにパケットフィルタリングを設定する必要がある.

まず,ルーターの設定で Dash Button に固定 IP アドレスを割り当てる. Dash Button の MAC アドレスは,以下の手順で知ることができる.

  1. ボタンを長押しして青色の LED を点滅させる
  2. Amazon ConfigMe という SSID のアクセスポイントに DHCP で接続する
  3. http://192.168.0.1/ にアクセスする

次に,ルーター側で Dash Button の IP アドレスからインターネットに接続しないようにパケットフィルタリングを設定する. 設定項目は以下のとおり.

項目
フィルタ種別 DENY
通信方向 LAN to WAN
プロトコル ALL
送信元 IP アドレス/マスク長 Dash Button に設定した固定 IP アドレス/32
送信元ポート ALL
宛先 IP アドレス/マスク長 ALL
宛先ポート ALL

設定が終わったら,ルーターを再起動させて設定を有効化する.

Dash ボタンの設定

Dash Button に Wi-Fi の接続設定を行う. 今回は Python のスクリプト を用いて設定する. スクリプトでは requests モジュールを利用しているので,インストールしていない場合は pip3 等でインストールする.

curl -O https://gist.githubusercontent.com/y-sira/11e6a79a5bc6d08234b5b626dbf41605/raw/d64062103a6ddf28c9c07f2943c0bd16cdc83c2d/setup.py
python3 setup.py <SSID> <KEY>

メッセージにしたがって設定を完了する.

Webhook の準備

IFTTT で WebhooksLINE にアクセスしてそれぞれ有効化する.

次に,Dash Button が押されたときに LINE に通知する Webhook を作成する.

  1. Create で新たにサービスを作成
  2. +This に Webhooks を選択
  3. Receive a web request を選択し,Event Name を「dash_button_pressed」として Create trigger を押下
  4. +That に LINE を選択
  5. Send message を選択し,Recipient を「1-on-1 chat with LINE Notify」,Message を「来客」にして Create action を押下
  6. Finish

Webhooks のページにアクセスし,Settings の Account Info にある URL にアクセスする. {event}dash_button_pressed を入力し,以下のような形式の Webhook の URL を取得する.

https://maker.ifttt.com/trigger/dash_button_pressed/with/key/****

サーバーの設定

Dash Button が押下されたことを検知して特定の処理を行うサーバーを構築する.

Dash Button は,ボタンが押下されると設定されている Wi-Fi に接続する. このとき,ルーターの IP アドレスに対応する MAC アドレスを知るために ARP リクエストパケットを送信する. サーバーはパケットを監視し,Dash Button の MAC アドレスから ARP リクエストパケットが送信されたときに特定の処理を実行する.

今回は amazon-dash というパッケージを利用する. Raspberry Pi にログインして,パッケージのインストールを行う.

sudo pip3 install amazon-dash
sudo python3 -m amazon_dash.install

Dash Button が押下されたときに行う処理を /etc/amazon-dash.yml に記述する. 今回は Webhook を実行するため,Dash Button の MAC アドレスの下に IFTTT の Webhook の URL を記載した.

settings:
  delay: 10
devices:
  00:00:5E:00:53:F1:
    name: dash_button_pressed
    url: 'https://maker.ifttt.com/trigger/dash_button_pressed/with/key/****'
    method: post

最後に amazon-dash サーバーを起動し,自動起動の設定を行なう.

sudo systemctl start amazon-dash
sudo systemctl enable amazon-dash

Dash Button を押下して LINE に通知されることを確認する.