需要がなさそうなので簡単に書きます。連絡いただければ追記します。
やろうとしたこと
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_button
やnpm 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 at master · geoffrey/uber-dash
- uber-dash/network.js at master · geoffrey/uber-dash
- dasher/dasher.js at master · maddox/dasher
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
で起動してボタンを押せば動いた。
私はPM2で常駐させてる。pm2 start --name dasher dasher.js; pm2 save