凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

未来なお部屋へ向けての第一歩: Boost.Asio + iRemocon でテレビを操作してみた

はじめに

こんな記事をご存知でしょうか。

すげぇぇぇええええ!!!!!
特に、この音声認識システム。だって「テレビ付けて」とか「エアコン付けて」とかいうだけで家電操作できちゃうんですよ。まじ半端ない。やりたい。
ということで、早速 iRemocon を購入してしまいました。


eneloop は大きさ比較用です。思ってたより小型でしかも軽い。要はコレは据え置き型の学習リモコンです。しかし普通の学習リモコンとは一味もふた味も違います。iRemocon に LAN ケーブルをつなぐことで、iPhoneiPad から専用アプリで、家ではもちろん外出先でも操作できちゃうんです。

これだけでもかなり便利なのですが、更にすごい点は、メーカーのサイト(iRemoconトップページ)で開発者向け情報が公開されている点です。

ここにあるコマンド仕様書を見れば、なんと! PC から iRemocon を操作出来るわけですね。つまるところ、PC から各家電を操作できると。凄い!

iRemocon の仕様

外出先からは Glamo inc.社のサーバを経由して iRemocon へコマンドを送信するのですが、こちらの仕様に関しては法人のみ公開となっているようです。しかしながらローカルネットワーク内での仕様については詳細に公開されています。主な仕様は次のような感じです。
接続先:

-通信方法 : TCP/IP
-IPアドレス: iPhone or iPad からアプリで確認(直接取得する方法は非公開)
-接続ポート: 51013

コマンド:

*XX;yyyy\r\n
XX  : コマンド部 (e.g. au:接続確認; is:赤外線発信; tm:タイマーセット;)
yyyy: パラメータ部(e.g. is 時は 1〜1500 が学習させた信号に対応)

これに従ってコマンドを送ってあげれば iRemocon が操作できます。

実際に操作してみた

Boost.Asio を使うと C++ から簡単に TCP/IP 通信できちゃいます。次のようなプログラムを書きました。

環境
  • Ubuntu 11.10
  • g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
  • Boost 1.48.0
プログラム
#include <iostream>
#include <boost/asio.hpp>

int main(int argc, char const* argv[])
{
	using namespace boost::asio;
	using namespace std;

	// iRemocon の ip と port を指定
	const std::string ip = "192.168.0.3";
	const int port       = 51013;

	// エンドポイントを作成
	ip::address addr = ip::address::from_string(ip);
	ip::tcp::endpoint ep(addr, port);

	for (;;) {
		// iRemocon へ送るコマンドを入力 (q: 終了)
		std::string command;
		std::cout << "INPUT COMMAND: ";
		std::cin >> command;
		if (command == "q") break;
		std::cout << "SEND: *" + command << "\\r\\n" <<  std::endl;

		// iRemocon へコマンドを送信
		ip::tcp::iostream s(ep);
		s.expires_from_now(boost::posix_time::seconds(5));
		s << "*" << command << "\r\n" << std::flush;

		// iRemocon からの応答を書きだす
		std::string line;
		getline(s, line);
		std::cout << "REPLY: " << ((line != "") ? line : "Timeout") << std::endl;
	}

	return 0;
}
コンパイル
g++ client.cpp -o client -lboost_system -lboost_thread -lpthread
結果


動いた!(実際にテレビが ON/OFF されたり入力切り替えされます)
ちなみに予めテレビのリモコンを学習させておきました。
is;1 を送信すると電源 ON/OFF、is;2 を送信すると入力切り替え、といった感じです。

今後の展望

全部の家電を音声入力対応できるようにしたいです。あと出来れば Kinect とか買ってジェスチャーでチャンネル切り替えとか出来たら良いなぁ。夢が広がりますね!!