如何识别同一游戏控制器的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
相关产品推荐
相关产品推荐

