Bluetooth経由でubuntuからiPhone4にキーストロークを送信しようとしています。つまり、非常に原始的な仮想キーボードの開発です。
問題アプリケーションが iPhone と通信するようにします (つまり、レポート プロトコルを使用します。iPhone がサポートするのはそれだけです)。そのままでは、私のwrite(interruptChannelFD)
呼び出しはエラーを返しませんが、iPhone 側にはテキストが表示されません。l2cap チャネルは、blueZ ライブラリを使用して開かれています。
質問 1:それを行う仮想キーボードが存在しないことを考えると、どれくらい難しいですか?
私は、iPhone と Linux ボックスが接続され、接続を維持する段階にいます。問題ありません。また、すべてのperror()
呼び出しは、制御チャネル ソケットと割り込みチャネル ソケットが正常に接続されていることを示しています。(私が行っているのは、ドングルを Keyboard デバイス クラスに hciconfig し、Collin Mullinerによるよく知られているコードを少し変更して使用することです。すべてのスマートフォンで要求されるように、パスコードを 1 回入力する必要がありました)。
質問 2:write()
暗号化を気にせずに割り込みソケットに入る ことができるはずですよね? パスコードを入力しましたが、電話機はキーボードを信頼しています。(コリンは隠し攻撃の可能性を考えていましたが、正直に言います)
また、HID デバイスのブート プロトコルでは、SPD で指定された正確なレポート記述子はほとんど関係がないことを理解しています。レポート形式はとにかく固定されています。そう...
質問 3:レポート プロトコルについて何か大きな間違いがありますか? 私がやっていることは、Apple キーボード レポート記述子を変更し、ソケットに書き込むことです (以下を参照)。
const uint8_t hid_spec[] = {
0x05, 0x01, // usage page
0x09, 0x06, // keyboard
0xa1, 0x01, // collection (Application)
0x85, 0x01, // report id (0x01)
0x05, 0x07, // usage page(keyboard)
0x19, 0xe0, // usage min
0x29, 0xe7, // usage max
0x15, 0x00, // logical min
0x25, 0x01, // logical max
0x75, 0x01, // report size
0x95, 0x08, // report count
0x81, 0x02, // input (dat var abs)
0x75, 0x08, // report size
0x95, 0x01, // report count
0x81, 0x01, // input (const)
// The following two outputs I don't seem to receive
0x75, 0x01, // report size
0x95, 0x05, // report count
0x05, 0x08, // usage page (LEDs)
0x19, 0x01, // usage min
0x29, 0x05, // usage max
0x91, 0x02, // OUTPUT1 (dat var abs)
0x75, 0x03,
0x95, 0x01,
0x91, 0x01, // OUTPUT2 (arr,const)
0x75, 0x08, // report size
0x95, 0x06, // report count
0x15, 0x00, // logical min
0x26, 0xff, 0x00 // logical max
0x05, 0x07
0x19, 0x00
0x2a, 0xff, 0x00,
0x81, 0x00,
// A total of 9 bits sent by now
// I tried remove the following fields
/********** BEGIN SNIP
0x75, 0x01,
0x95, 0x01,
0x15, 0x00,
0x25, 0x01,
0x05, 0x0c,
0x09, 0xb8,
0x81, 0x06,
0x09, 0xe2,
0x81, 0x06,
0x09, 0xe9,
0x81, 0x02,
0x09, 0xea,
0x81, 0x02,
0x75, 0x01,
0x95, 0x04,
0x81, 0x01,
**** END SNIP/
0xc0 // end coll
};
この後、次の 10 バイトを割り込みチャネルに書き込みます。
pkg[0] = 0xa1; // BT HDR (DATA)
pkg[1] = 0x01; // REPORT ID 0x1 == kbd
pkg[2] = modifiers; // Ctrl, Shift, etc
pkg[3] = 0x00; // constant 0 (see descr)
// pkg[4] = 0x00; // the key code - entered before this point, according to HID usage tables.
pkg[5] = 0x00;
pkg[6] = 0x00;
pkg[7] = 0x00;
pkg[8] = 0x00;
pkg[9] = 0x00;
if (write(is, pkg, 10) <= 0) {
perror("write");
exit(-1);
}