调用SDP Helper接口非常简单,基本上跟Sample Code差不多,只不过代码换成了Python编程。
#!/usr/bin/env python
import ctypes,os
hidd_report_desc = bytearray(
[
0x05, 0x01, # UsagePage GenericDesktop
0x09, 0x02, # Usage Mouse
0xA1, 0x01, # Collection Application
0x85, 0x01, # REPORT ID: 1
0x09, 0x01, # Usage Pointer
0xA1, 0x00, # Collection Physical
0x05, 0x09, # UsagePage Buttons
0x19, 0x01, # UsageMinimum 1
0x29, 0x03, # UsageMaximum 3
0x15, 0x00, # LogicalMinimum 0
0x25, 0x01, # LogicalMaximum 1
0x75, 0x01, # ReportSize 1
0x95, 0x03, # ReportCount 3
0x81, 0x02, # **Input data variable absolute
0x75, 0x05, # ReportSize 5
0x95, 0x01, # ReportCount 1
0x81, 0x01, # **InputConstant (padding)
0x05, 0x01, # UsagePage GenericDesktop
0x09, 0x30, # Usage X
0x09, 0x31, # Usage Y
0x09, 0x38, # Usage ScrollWheel
0x15, 0x81, # LogicalMinimum -127
0x25, 0x7F, # LogicalMaximum +127
0x75, 0x08, # ReportSize 8
0x95, 0x02, # ReportCount 3
0x81, 0x06, # **Input data variable relative
0xC0, 0xC0, # EndCollection EndCollection
0x05, 0x01, # UsagePage GenericDesktop
0x09, 0x06, # Usage Keyboard
0xA1, 0x01, # Collection Application
0x85, 0x02, # REPORT ID: 2
0xA1, 0x00, # Collection Physical
0x05, 0x07, # UsagePage Keyboard
0x19, 0xE0, # UsageMinimum 224
0x29, 0xE7, # UsageMaximum 231
0x15, 0x00, # LogicalMinimum 0
0x25, 0x01, # LogicalMaximum 1
0x75, 0x01, # ReportSize 1
0x95, 0x08, # ReportCount 8
0x81, 0x02, # **Input data variable absolute
0x95, 0x08, # ReportCount 8
0x75, 0x08, # ReportSize 8
0x15, 0x00, # LogicalMinimum 0
0x25, 0x65, # LogicalMaximum 101
0x05, 0x07, # UsagePage Keycodes
0x19, 0x00, # UsageMinimum 0
0x29, 0x65, # UsageMaximum 101
0x81, 0x00, # **Input DataArray
0xC0, 0xC0, # EndCollection
])
class HiddInfo(ctypes.Structure):
_fields_ = (('service_name', ctypes.c_char_p),
('description', ctypes.c_char_p),
('provider', ctypes.c_char_p),
('desc_data', ctypes.c_char_p),
('desc_len', ctypes.c_uint),
('sub_class', ctypes.c_uint))
HiddInfoPtr = ctypes.POINTER(HiddInfo)
class Sdp:
def __init__(self):
self.dll = ctypes.CDLL(os.path.abspath('libbthidd.so'))
return
def CreateRecord(self, handle=0xffffffff):
return self.dll.SdpCreateRecord(ctypes.c_uint(handle))
def DestroyRecord(self, record):
return self.dll.SdpDestroyRecord(ctypes.c_void_p(record))
def MakeUpHidRecord(self, record, info):
return self.dll.SdpMakeUpHidRecord(ctypes.c_void_p(record), HiddInfoPtr(info))
def RegisterRecord(self, record):
return self.dll.SdpRegisterRecord(ctypes.c_void_p(record))
def UnregisterRecord(self, record):
return self.dll.SdpUnregisterRecord(ctypes.c_void_p(record))
pass
def main_entry():
info = HiddInfo()
info.service_name = 'My Virtual Mouse and Keyboard'
info.description = 'Bluetooth HID Mouse and Keyboard'
info.provider = 'Huipeng Zhao'
info.desc_data = str(hidd_report_desc)
info.desc_len = len(hidd_report_desc)
info.sub_class = 0x80
sdp = Sdp()
record = sdp.CreateRecord()
sdp.MakeUpHidRecord(record, info)
sdp.RegisterRecord(record)
sdp.DestroyRecord(record)
return
if __name__ == '__main__':
main_entry()
pass
Sdp类会在初始化函数中打开libbthidd.so动态库,因此Python脚本与libbthidd.so得放在同一个目录下。