Android と Wii リモコンを接続する


20140303wii

Android と Wii リモコンを接続する方法を調べてみた。

概要

Android は、フレームワークとして Bluetooth HID をサポートしており、Bluetooth キーボードやマウスが使用できる。
Bluetooth API では、HID はサポートされていないので、InputManager を経由してキー入力を検出する。
なお、Bluetooth API では、RFCOMM をサポートしており、シリアル通信が可能である。

Wii リモコンは、Bluetooth HID を使っている。
HID といっても、一般的なキーボードやマウスとは異なる、独自の仕様である。

Linux レイヤの変更

CWiid という Linux 用のドライバーがある。
CWiid とは、C言語で記述された Wii の Driver の意味らしい。
BeagleBoard Android に移植した例

ルート化

ルート化して、HID をサポートする。
androhid がソースコードを公開している。

リフレクション

公式の API では、L2CAP をサポートしていないが、内部的には用意されている。

BluetoothSocket.java

static final int TYPE_L2CAP = 3;
BluetoothSocket(int type, int fd, boolean auth, boolean encrypt,
	BluetoothDevice device, int port, ParcelUuid uuid) throws IOException {

これをリフレクションで利用して、Wii リモコンと接続する。

Constructor<BluetoothSocket> construct = BluetoothSocket.class.getDeclaredConstructor( int.class, int.class, boolean.class, boolean.class, BluetoothDevice.class, int.class, ParcelUuid.class );
construct.setAccessible(true);
construct.newInstance( TYPE_L2CAP, -1, false, false, dev, port, null );

BluezIMEFitScales がソースコードを公開している。

Android 4.2

Android 4.2 からリフレクションが使えなくなった。
btif_sock.c で UNSUPPORTED になった。

btif_sock.c

case BTSOCK_L2CAP:
	BTIF_TRACE_ERROR1("bt l2cap socket type not supported, type:%d", type);
	status = BT_STATUS_UNSUPPORTED;
	break;

Connecting to a bluetooth HID device (mouse) using L2CAP


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です