Slack BOT から新型ルンバ980をWiFiで制御する【後編】

はじめに
おうちハック Advent Calendar 2015の5日目の記事です。
こんにちは。CTOのkamocです。 前回の記事(ルンバがうちに、やってきた。)では最新モデルのルンバ980をハックしていく方向性について書きました。 今回はアプリとiRobot API間の通信をハックして行きます。
今回のゴール
今回は図の★の部分。アプリとiRobot API間の通信をハックして行きます。

今回の記事では、ルンバに「掃除しろ」と命令したらルンバが掃除を開始する Slack BOT を開発します。
iRobot アプリの掃除開始命令を解析し、Slack BOT から同命令を叩いてルンバに掃除させます。
通信内容を観察してみる
iPhone のパケットキャプチャのやり方はこちらを参考にしました。
Charles を起動して iPhone のプロキシ設定を済ませた状態で、iRobotアプリを立ち上げるとこんな感じになります。

いろいろ通信してますね〜。 http://www.irobot.com と https://irobot.axeda.com のどちらかが iRobot API でしょう。この後詳しく見ていきます。 https://e.crashlytics.com はアプリのクラッシュレポートや利用状況を記録しているやつですね。いつもお世話になっています。 http://192.168.10.4 はルンバとの直接通信ですね。ルンバのIPアドレスは前回の記事で書いたとおり、iRobotアプリから確認することができます。
http://www.irobot.com との通信内容
Charles で通信内容覗いてみました。レスポンスのJSONの一例はこちら。
termsUrlの値の URL をブラウザで開いてみると、Legal Informationが表示されますね。 これは iRobot アプリの このアプリについて > 利用規約および個人情報保護方針 を選択した時に表示されるページです。

どうやらこのドメインとの通信では、アプリ内のWebView等で表示するコンテンツの情報を取得しているようですね。
https://irobot.axeda.com との通信内容
というわけで、こちらのドメインがルンバのAPIである可能性が濃厚になってきました。 通信を覗いてみましょう。
同ドメインについては以下のURLに対してのみ通信を行っています。 https://irobot.axeda.com/services/v1/rest/Scripto/execute/AspenApiRequest
一番上の通信のリクエストパラメータを見てみます。
本記事では以降 blid を {{ ROOMBA_ID }}, robotpwd を {{ ROOMBA_PW }} と表記します。
どうやら、APIのURLは共通で、“method”パラメータの値で挙動を定義しているようですね。 レスポンスはこちらです。
おぉ!いろいろと取れましたねぇ。 このAPIを定期的に呼び出せば、ルンバの現在の状態を知ることができそうですね。
次に、掃除開始命令を探してみましょう。 Charles さんに接続した状態で、iRobot アプリから掃除開始命令を出します。

はい。いましたねー。
iRobot APIの紹介
解析して明らかになった iRobot API をいくつか紹介します。
API の URL はすべて以下のURL。
https://irobot.axeda.com/services/v1/rest/Scripto/execute/AspenApiRequest
掃除開始
リクエストパラメータを以下のように設定
ステータス確認
リクエストパラメータを以下のように設定
行動履歴確認
リクエストパラメータを以下のように設定
APIの調査が終わったところで、curlコマンドを使ってAPIを叩き、実際にルンバが動くかどうか試してみましょう。
curl コマンドを使った検証
試しに掃除開始APIを curl コマンドで叩いてみましょう。
valueのパラメータは JSON 文字列をURLエンコードしています。
コンソールのEnterキーをターン!と叩きます。
・・・(2,3秒間があく)
ルンバ「ててーててー♪ ぴー ぴー ぴー ぴー」==◎
ルンバが走り出しました!!
ここまできたら後は Slack BOT とつなぐだけですね。
Slack bot の作成
Slack bot の作成は以下のサイトを参考にしました。
Coffeeスクリプトはこんな感じです。
Slack bot のソースコード一式はGitHubにあげてあります。
{{ROOMBA_ID}} と {{ROOMBA_PW}} だけご自身のルンバの値に書き換えてください。
社内 Slack で運用してみた
弊社 Slack にて世界中どこからでも、何時でも、kamoc宅のルンバを起動できるという状態にしてみました。
弊社社員に可愛がってもらっている様子がこちらです。

夜11:39に福島県からのリクエストで静岡県のルンバが掃除しております。
これはもう事件ですね。
セキュリティーの重要性について改めて考えさせられました。
現在1週間程運用しておりますが、深夜の掃除で目が覚めるといった自体は起きておりません。
それでは、今日はこの辺で。
ルンバかわいいよ、ルンバ。