2014-03-27 3 views
3

PyBluez를 사용하여 Linux에서 HID 장치를 에뮬레이션해야합니다. HID 장치 (에뮬레이트 할 장치)가 있습니다. sdptool browse 명령은PyBluez로 HID 서비스 작성

Service Name: HID service 
Service RecHandle: 0x10001 
Service Class ID List: 
    "Human Interface Device" (0x1124) 
Protocol Descriptor List: 
    "L2CAP" (0x0100) 
    PSM: 17 
    "HIDP" (0x0011) 
Language Base Attr List: 
    code_ISO639: 0x656e 
    encoding: 0x6a 
    base_offset: 0x100 
Profile Descriptor List: 
    "Human Interface Device" (0x1124) 
    Version: 0x0101 

그래서 나는이에 파이썬 동등한 서비스를 만드는 데 필요한 다음과 같은 서비스를 제공하는 것을 저에게 보여줍니다. 문제는 제가 제공하는 Service class ID list을 절대적으로 무시한다는 것입니다. 내가 무엇을보고

from bluetooth import * 

server_sock=BluetoothSocket(L2CAP) 
server_sock.bind(("", 17)) 
server_sock.listen(1) 

uuid = "1f16e7c0-b59b-11e3-95d2-0002a5d5c51b" 

advertise_service(server_sock, "PyBluez TEST", 
        service_id = uuid, 
        service_classes = [ HID_CLASS ], 
        profiles = [ HID_PROFILE ]) 

print("Waiting for connection on L2CAP") 

try: 
    client_sock, client_info = server_sock.accept() 
    print("Accepted connection from ", client_info) 

    while True: 
     data = client_sock.recv(1024) 
     if len(data) == 0: 
       break 
     print("received [%s]" % data) 
except IOError: 
    pass 
except KeyboardInterrupt: 
    print "Stopping..." 
    stop_advertising(server_sock) 
    sys.exit() 

print("disconnected") 

client_sock.close() 
server_sock.close() 
print("all done") 

지금은 다른 블루투스 어댑터를 사용 sdptool을 실행하고 여기

Service Name: PyBluez TEST 
Service RecHandle: 0x10011 
Protocol Descriptor List: 
    "L2CAP" (0x0100) 
    PSM: 17 
Profile Descriptor List: 
    "Human Interface Device" (0x1124) 
    Version: 0x0100 

경우 서비스 클래스 ID 목록입니다 : 여기

코드인가?

this 책 (65 페이지)에 따르면이 책은 있어야하지만 그렇지 않습니다.

다음

또한 내가 여기에 대한 도움을받을 드리겠습니다 HCI 구성

hci0: Type: BR/EDR Bus: USB 
    BD Address: 00:17:9A:3F:54:6F ACL MTU: 1017:8 SCO MTU: 64:0 
    UP RUNNING PSCAN 
    RX bytes:37882 acl:320 sco:0 events:949 errors:0 
    TX bytes:41443 acl:352 sco:0 commands:629 errors:0 
    Features: 0xff 0xff 0x8d 0xfe 0x9b 0xf9 0x00 0x80 
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
    Link policy: RSWITCH HOLD SNIFF PARK 
    Link mode: SLAVE ACCEPT 
    Name: 'My HID Device' 
    Class: 0x6e0100 
    Service Classes: Networking, Rendering, Capturing, Audio, Telephony 
    Device Class: Computer, Uncategorized 
    HCI Version: 2.0 (0x3) Revision: 0x403d 
    LMP Version: 2.0 (0x3) Subversion: 0x430e 
    Manufacturer: Broadcom Corporation (15) 

입니다. HID 장치의 에뮬레이션에 도움이되는 책, 설명서, 예제 등 ... 나는 또한 연결 수준의 문제를 가지고있는 것처럼

는 ** UPDATE **

보인다. 페어링 후 내 HID 호스트는 자동으로 연결이 끊어집니다.

일반적으로 내 Bluetooth 어댑터를 HID 장치처럼 작동시키는 것은 가능합니까?

sdptool setseq 0x10011 0x0001 u0x1124 

을하지만 기능이 제한되어 있습니다 :

+0

만약에 당신이'인쇄 HID_CLASS'? '1124'값을 보시겠습니까? – Drewness

+0

예. 그것은 1124를 인쇄하고 실제로 HID 클래스와 관련이 없습니다. 모든 서비스 클래스 ID를 설정하면 동일한 동작이 나타납니다. SERIAL_PORT_CLASS 또는 다른 것. 나는 또한'hciconfig hci0 reset'을 실행하려고 시도했으나 이것은 도움이되지 않습니다. – incognito

답변

2

당신은 sdptool와 서비스 클래스 UUID를 설정할 수 있습니다.

나는 dbus-python 라이브러리를 사용하여 서비스를 광고하는 또 다른 방법 발견 :

import dbus 

def advertise_service(sdp_record_xml): 
    bus = dbus.SystemBus() 
    manager = dbus.Interface(bus.get_object("org.bluez", "/"), 
          "org.bluez.Manager") 
    adapter_path = manager.FindAdapter(self.device_id) 
    service = dbus.Interface(bus.get_object("org.bluez", adapter_path), 
          "org.bluez.Service") 
    service.AddRecord(sdp_record_xml) 

을 그리고 여기에 XML의 SDP 레코드의 예입니다

<?xml version="1.0" encoding="utf-8" ?> 
<record> 
    <attribute id="0x0001"> 
     <!-- ServiceClassIDList --> 
     <sequence> 
      <uuid value="00000000-0000-1000-8000-00805F9B34FB" /> 
     </sequence> 
    </attribute> 
    <attribute id="0x0003"> 
     <!-- ServiceID --> 
     <uuid value="00000000-0000-1000-8000-00805F9B34FB" /> 
    </attribute> 
    <attribute id="0x0004"> 
     <!-- ProtocolDescriptorList --> 
     <sequence> 
      <sequence> 
       <uuid value="0x0100" /> 
      </sequence> 
      <sequence> 
       <uuid value="0x0003" /> 
       <uint8 value="0x3" /> <!-- RFCOMM channel --> 
      </sequence> 
     </sequence> 
    </attribute> 
    <attribute id="0x0005"> 
     <!-- BrowseGroupList --> 
     <sequence> 
      <uuid value="0x1002" /> 
     </sequence> 
    </attribute> 
    <attribute id="0x0100"> 
     <!-- Service name --> 
     <text value="My Service" /> 
    </attribute> 
</record>