Tôi đang cố gắng gửi tổ hợp phím qua bluetooth cho iPhone4 từ ubuntu. I.e., phát triển một bàn phím ảo rất nguyên thủy.Trình mô tả báo cáo HID (với iPhone)
Vấn đề Có talk ứng dụng của tôi cho iPhone (ví dụ: sử dụng báo cáo giao thức, đó là tất cả iPhone hỗ trợ). Vì vậy, các cuộc gọi write(interruptChannelFD)
của tôi không trả lại lỗi nào, nhưng không có văn bản nào xuất hiện trên iPhone. Các kênh l2cap đã được mở bằng thư viện blueZ.
Câu hỏi 1: Vì không có bàn phím ảo nào tồn tại, điều đó có khó khăn đến mức nào?
Tôi đang ở giai đoạn mà iPhone và hộp Linux của tôi kết nối và duy trì kết nối, không có vấn đề gì. Ngoài ra, tất cả các cuộc gọi perror()
đều cho tôi biết rằng điều khiển và ngắt các ổ cắm kênh chỉ kết nối tốt. (Những gì tôi làm là hciconfig dongle của tôi vào lớp thiết bị bàn phím và sử dụng mã số nổi tiếng bởi Collin Mulliner với sửa đổi nhỏ - tôi phải nhập mật mã một lần, như tất cả điện thoại thông minh yêu cầu).
Câu hỏi 2: Tôi có thể chỉ cần write()
vào ổ cắm ngắt mà không phải lo lắng về mã hóa, đúng không? Tôi đã nhập mật mã và điện thoại tin tưởng vào bàn phím. (Collin đã được cân nhắc một cuộc tấn công HID có thể, nhưng tôi kết nối một cách trung thực)
Ngoài ra, nó là sự hiểu biết của tôi rằng trong giao thức khởi động của một thiết bị HID, báo cáo chính xác mô tả specfied trong SPD là hầu như không có liên quan - mẫu báo cáo được cố định. Vì vậy ...
Câu hỏi 3: Tôi có bỏ lỡ điều gì đó quan trọng về giao thức báo cáo . Những gì tôi làm là sửa đổi bộ mô tả báo cáo bàn phím Apple và viết vào ổ cắm (xem bên dưới).
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
};
Sau đó, tôi viết 10 byte sau vào kênh ngắt:
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);
}
+1, btw, bạn có thể nhập mã PIN bằng BlueZ, thông qua 'org.bluez.Agent'' RequestPinCode' (nghĩa là bạn cần phải đăng ký làm đại lý thông qua 'org.bluez.Adapter'' RegisterAgent'). Bạn cũng không cần phải nhập mã PIN nếu bạn đang sử dụng thiết bị Bluetooth 2.1 (vì chúng cho phép Ghép nối đơn giản an toàn) – Hasturkun