なぜか質問を投稿すると反映されない。。 何かしら問題があってはじかれている??
SwitchBotのAPIを叩いてドアの施錠を操作する
AndroidのアプリTaskerのみで実装させたかったが、
JavaScriptで署名をゴリゴリするのが大変だったので
とりまサーバでPHPからAPIを叩いてみた。
今回使用したSwitchBotはこちら。
指紋認証でアンロックができるので便利なのではあるが、
家に近づくだけで自動的にアンロックさせたかった。
(両手に荷物を持っている時に便利)
【ロック状態を確認する】
TaskerからPHPへはPOSTでtoken,secret,deviceIDを送信する。
deviceIDはここから調べることが出来る。
$token = isset($_POST['token']) ? htmlspecialchars($_POST['token'], ENT_QUOTES, 'UTF-8') : "";
$secret = isset($_POST['secret']) ? htmlspecialchars($_POST['secret'], ENT_QUOTES, 'UTF-8') : "";
$deviceId = isset($_POST['deviceId']) ? htmlspecialchars($_POST['deviceId'], ENT_QUOTES, 'UTF-8') : "";
$time = (string)floor( microtime(true) * 1000 );
$nonce = "xyzzy";
$sha256 = hash_hmac( 'sha256', "{$token}{$time}{$nonce}", $secret, true);
$header = [];
$header[] = "Authorization:{$token}";
$header[] = "t:{$time}";
$header[] = "sign:".base64_encode($sha256);
$header[] = "nonce:{$nonce}";
$header[] = "Content-Type:application/json";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.switch-bot.com/v1.1/devices/{$deviceId}/status");
curl_setopt($curl, CURLOPT_POST, 'true');
curl_setopt($curl, CURLOPT_HEADER, 'true');
curl_setopt($curl, CURLINFO_HEADER_OUT, 'true');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 'true');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
header("Content-Type: application/json; charset=utf-8");
echo curl_exec( $curl );
【施錠を操作する】
TaskerからPHPへはPOSTでtoken,secret,deviceID,cmdを送信する。
cmdは”lock”もしくは”unlock”
deviceIDはここから調べることが出来る。
$token = isset($_POST['token']) ? htmlspecialchars($_POST['token'], ENT_QUOTES, 'UTF-8') : "";
$secret = isset($_POST['secret']) ? htmlspecialchars($_POST['secret'], ENT_QUOTES, 'UTF-8') : "";
$deviceId = isset($_POST['deviceId']) ? htmlspecialchars($_POST['deviceId'], ENT_QUOTES, 'UTF-8') : "";
$cmd = isset($_POST['cmd']) ? htmlspecialchars($_POST['cmd'], ENT_QUOTES, 'UTF-8') : "";
$time = (string)floor( microtime(true) * 1000 );
$nonce = "xyzzy";
$sha256 = hash_hmac( 'sha256', "{$token}{$time}{$nonce}", $secret, true);
$header = [];
$header[] = "Authorization:{$token}";
$header[] = "t:{$time}";
$header[] = "sign:".base64_encode($sha256);
$header[] = "nonce:{$nonce}";
$header[] = "Content-Type:application/json";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.switch-bot.com/v1.1/devices/{$deviceId}/commands");
curl_setopt($curl, CURLOPT_POST, 'true');
curl_setopt($curl, CURLOPT_POSTFIELDS, '{"command": "'.$cmd.'","parameter": "default","commandType": "command"}');
curl_setopt($curl, CURLOPT_HEADER, 'true');
curl_setopt($curl, CURLINFO_HEADER_OUT, 'true');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 'true');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
header("Content-Type: application/json; charset=utf-8");
echo curl_exec( $curl );
検索

コメントを残す