You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别同一游戏控制器的USB与蓝牙连接实例?

问题:关联PS4控制器的USB与蓝牙HID设备实例

我正在使用hidapi库进行控制器/摇杆数据读取实验,遇到一个问题:在Windows系统(推测Linux系统也存在该情况)中,PS4控制器可通过USB和蓝牙两种方式连接。使用hidapi库枚举设备时,会识别出该控制器的两个实例,分别对应USB总线和蓝牙总线,但无法确定哪一个蓝牙设备实例与哪一个USB设备实例属于同一物理控制器。


补充设备信息

第一个控制器

蓝牙连接信息

path    "\\?\HID#{00001124-0000-1000-8000-00805f9b34fb}_VID&0002054c_PID&09cc#8&12e42c53&4&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
vendor_id   1356    
product_id  2508    
serial_number   "dc0c2d6f3597"  
release_number  0
manufacturer_string "Sony Interactive Entertainment"
product_string  "Wireless Controller"
usage_page  1   
usage   5   
interface_number    -1
bus_type    HID_API_BUS_BLUETOOTH 

USB连接信息

path    "\\?\HID#VID_054C&PID_09CC&MI_03#9&2a666ca3&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
vendor_id   1356
product_id  2508
serial_number   ""
release_number  256 
manufacturer_string "Sony Interactive Entertainment"
product_string  "Wireless Controller"   
usage_page  1   
usage   5   
interface_number    3   
bus_type    HID_API_BUS_USB

第二个控制器

蓝牙连接信息

path     "\\?\HID#{00001124-0000-1000-8000-00805f9b34fb}_VID&0002054c_PID&09cc#8&2e3024ab&1&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}" 
vendor_id   1356
product_id  2508
serial_number   "dc0c2d6be031"  
release_number  0   
manufacturer_string "Sony Interactive Entertainment"
product_string  "Wireless Controller"
usage_page  1   
usage   5   
interface_number    -1
bus_type    HID_API_BUS_BLUETOOTH 

USB连接信息

path    "\\?\HID#VID_054C&PID_09CC&MI_03#a&150a354e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
vendor_id   1356
product_id  2508
serial_number   ""
release_number  256
manufacturer_string "Sony Interactive Entertainment"
product_string  "Wireless Controller"
usage_page  1
usage   5
interface_number    3
bus_type    HID_API_BUS_USB

可行解决方案

  • 读取控制器硬件唯一标识:PS4控制器内置了唯一的蓝牙MAC地址,该地址在蓝牙连接时会作为serial_number返回。通过USB连接时,可向控制器发送特定HID报告读取此MAC地址,将得到的MAC与蓝牙设备的serial_number匹配,即可关联同一物理控制器的两个实例。
  • Windows系统利用设备容器ID:在Windows中,同一物理设备的不同总线实例会共享相同的设备容器ID(ContainerId)。可通过SetupAPI调用SetupDiGetDeviceProperty函数获取DEVPKEY_Device_ContainerId属性,相同ContainerId的USB和蓝牙HID实例属于同一控制器。
  • Linux系统利用udev属性:Linux下通过udev工具可查询设备的父节点信息,同一物理控制器的USB和蓝牙实例会关联到同一个父设备。可遍历udev设备树,通过ID_SERIAL_SHORT或设备路径的共同父节点来完成关联。

内容的提问来源于stack exchange,提问作者user5706966

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:41:10