2011-09-06 18 views
5

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); 
        } 

Trả lời

2

Good day, thưa ông.

Hãy để tôi vui lòng trỏ đến bạn một Timewaster kỳ nghỉ khiêm tốn của tôi mà thực sự có thể được sử dụng với một mảnh rác gọi là iPad, mà phần mềm stack nên được gần gũi hợp lý để iPhone của bạn: https://github.com/lkundrak/virtkbd

Ngoài từ việc triển khai thực tế, tôi sẽ cố gắng trả lời các câu hỏi của bạn.

Câu hỏi 1:

Với chất lượng và thời gian của Bluetooth HID đặc điểm kỹ thuật hồ sơ, USB HID một và dụng cụ sẵn có và thực tế chi tiết cụ thể thiết bị, tôi đoán thử và sai sẽ mất thêm cho bạn. Có một bàn phím Bluetooth thực tế, và viết một bộ lặp giao thức đơn giản và dumper để cho bạn quan sát những gì họ làm - tham khảo tài liệu để giải mã những gì đang xảy ra.

Câu hỏi 2:

Đúng vậy. Đối với iPad của tôi, trước tiên tôi cần ghép nối các thiết bị với máy tính của mình không phải là là một lớp Bàn phím (tôi đoán là iPad sẽ cố gắng nhập mã PIN, không thể thực hiện được với Bluez). Sau đó, tôi cần thay đổi lớp thành Bàn phím (bằng cách chạy chương trình bithdd của tôi) và buộc iPad kết nối lại, để nó lấy bộ mô tả giao thức từ SDP và cố kết nối với cổng L2CAP 17 và 19.

Câu hỏi 3:

Vâng, nó khá giống như vậy - Tôi không nghĩ bạn bỏ lỡ bất cứ điều gì quan trọng.

Chúc bạn một ngày vui vẻ!

+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

Các vấn đề liên quan