ps5手柄usb&蓝牙流量协议
打Π被手把✌锁破防了,于是斥巨资成为手把练习生。
初步分析
抓了一下手柄的流量
在descriptor response device 中可以找到流量所属的产品名称以及相关信息
可以发现每个interrupt 输入都是91byte
而hid data都是64byte
在google寻找相关ps5 usb协议的资料
找到了https://github.com/nondebug/dualsense?tab=readme-ov-file
其中https://github.com/nondebug/dualsense/blob/main/dualsense-explorer.html 是一个手柄测试界面,调用了webapi来连接手柄,可以实时显示手柄的输入和输出数据
连上发现,在我把手柄放在桌子上时没有任何操作,输入有些字节一直在变化
往下可以看到,是陀螺仪的数据在变化,可以猜测,变化的哪些字节代表着陀螺仪的数据,而剩下大致不变字节的则是按键的数据
根据该示例进行研究
这是我抓取的一个hid data 此时我按下了十字按键(ps :由于陀螺仪一直变化的原因,所以抓包的时候是实时的,而不是按下了某个按键才会抓取,所以流量很多)
1 |
|
根据map :
第0个字节01是固定的
第1个字节82代表左摇杆x轴上的数据 80代表在中间位置 从左到右 最左left: 0x00 到 最右ight: 0xff
第2个字节代表左摇杆y轴上的数据 规则同上
下面第3第4字节是右摇杆的数据规则同上
第五第六字节代表的是左右扳机的数据 未按下时 neutral: 0x00 按到底时pressed: 0xff
第七字节分析流量包每一个数据发现是从第一个hid data开始往下按+1递增的
第8字节的0-3bit代表的是方向键(byte->bit 就是转为8位的2进制数)
方向规则如下
1 |
|
这里要看后一位数字 如该字节是08 则表示没有按下,00表示按下了指向北方的按键
第8字节第4bit开始是右边4个图形按键的数据
例如我上面按下十字按键时是28
可能是是因为usb传输读取数据顺序的问题,这里要倒着来读 即从右往左第5bit是1
根据
1 |
|
可以知道按下了十字按键 即按下了什么按键,该对应的bit位就是1
后面的按键以此类推
如果同时按下了多个按键,分析方法也一样
一个简单的脚本解析按键
1 |
|
蓝牙流量分析
这里的map跟usb的稍有不同,但规则是一样的
1 |
|
这里同样可以用https://github.com/nondebug/dualsense/blob/main/dualsense-explorer.html
本地搭建就可以了
此时我按下了L1按键,可以看到31 41 81 81 83 80 00 00 01 08 01 00 00
第10byte发生了变化
这里的第0 byte是31 而byte 0, bit 0: Report ID - 8 bits always 0x01
貌似有点对不上,wireshark抓包看看(管理员运行)
wireshark抓蓝牙不要选蓝牙网络连接(抓不到数据)
选择usbpcap1并勾选 bluetooth
往下拉可以看到手柄设备
抓包时我按下的是L1,
1 |
|
可以看到input数据跟上面测试程序的数据是一样的
这跟https://github.com/nondebug/dualsense?tab=readme-ov-file里蓝牙input为10byte 不对应
而且在流里面没发现设备名称,貌似无法像usb那样识别出设备
以下是根据测试程序写的map
Sample Bluetooth input report, all inputs neutral (10 bytes):31 41 81 81 83 80 00 00 01 08 01 00 00
1 |
|
就是按键byte里的bit规则不变但是数据的byte位变了
蓝牙协议还未详细深入学习,至此,下播了