Subscribed unsubscribe Subscribe Subscribe

@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

Amazon Dash Buttonの母艦をIntel Edisonにする

需要がなさそうなので簡単に書きます。連絡いただければ追記します。

やろうとしたこと

Dash ButtonでLINEにメッセージを送る。

手段

だいたいこんな感じ

  • dasher をベースに自作
  • LINE Notify は直接叩けなかったので
  • IFTTTのMaker 経由でLINEに通知した

問題点と回避策

dasherをインストールできない

Edisonのgitが2.0.1で、git submoduleが入っていないため、npm install した時にnode-pcapのcloneができなかった模様。

この問題はmacでnpm install した後、node_moduleをEdisonに転送して回避。

バイナリの再ビルドが必要なので、node-gyp (入っていなかったので npm i -g node-gypで入れる) で再ビルドする。 以下の二箇所で良さそう

cd node_modules/pcap
node-gyp rebuild
cd ../socketwatcher
node-gyp rebuild
cd ../../

これで./scripts/find_buttonnpm startが動くようになるが、wlan0からボタンのパケットが全然拾えない。

DashButtonのパケットを探す

dasherのインストールができてもDash Buttonのパケットを見つけてくれない。

./node_modules/node-dash-button/bin/findbutton wlan0を叩くと、MACアドレスが見えることがあったので、 dasherのconfig/config.jsonにinterface: wlan0を追加するも改善せず。

最終的に、以下のソースを参考に、node_pcapとrequestで自作したのが一番安定した。

uber-dash/utils.jsはそのままdasherのlibにコピー。

lib/ifttt-maker.jsを以下のような内容で保存。

var request = require('request');
var url = 'https://maker.ifttt.com/trigger/<Makerでつけた名前>/with/key/<Makerのキー>';
var body = {'value1': 'ボタン押したやでー'};
var reqOpts = {
  url: url,
  method: 'POST',
  body: body,
  json: true
};

module.exports = {
  notify: function(){
    request(reqOpts, function (error, response, body) {
      if (!error && response.statusCode == 200) {
        console.log(response.body);
      } else {
        console.log('error: '+ response.statusCode);
      }
    });
  }
};

以下の内容をdasher.jsと言う名前で保存。

var utils = require('./lib/utils');
var line = require('./lib/ifttt-maker');
var dash button = '34:**:**';

var pcap = require('pcap');
var pcap_session = pcap.createSession('wlan0', '');
pcap_session.on('packet', function (raw_packet) {

  var packet = pcap.decode.packet(raw_packet);
  var dadd   = packet.payload.shost.addr;
  var mac    = utils.dadd2hadd(dadd);

  // console.log('MAC:', mac);

  if (mac === dashbutton && utils.throttled()) {
    line.notify();
  }
});

あとは、node dasher.jsで起動してボタンを押せば動いた。

f:id:peccu:20161230230955p:plain

私はPM2で常駐させてる。pm2 start --name dasher dasher.js; pm2 save