gpt4 book ai didi

python - 使用 PyBluez 编写 HID 服务

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:54 26 4
gpt4 key购买 nike

需要使用 PyBluez 在 Linux 上模拟 HID 设备。我有一个 HID 设备(我要模拟)。sdptool browse 命令显示它提供以下服务

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

所以我需要用 python 创建一个与此等效的服务。问题是它完全忽略了我提供的 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

Service Class ID List 在哪里?

根据 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 设备的东西。

**更新**

看起来我在连接级别上也有问题。我的 HID 主机在配对后自动断开连接。

通常是否可以让我的蓝牙适配器像 HID 设备一样工作?如何做?

最佳答案

您可以使用sdptool 设置服务类uuid:

sdptool setseq 0x10011 0x0001 u0x1124

但它的功能有限。

我找到了另一种使用 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>

关于python - 使用 PyBluez 编写 HID 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22688375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com