树莓派4B模拟USB键盘:Fn组合键无法触发iPhone功能的问题
问题背景
我用tshark捕获了Apple键盘连接到Raspberry Pi 4B的USB-A端口时按键生成的8字节数据,将这些数据转发到通过USB Camera Adapter连接到Pi的OTG端口的iPhone时,常规按键及Shift、Ctrl、Meta等组合键都能正常模拟,但Fn+C、Fn+H这类Fn组合键无法工作。
捕获的按键数据如下:
0000000000000001 - 仅Fn键按下 0000060000000001 - Fn+C组合键按下 0000000000000001 - 仅Fn键按下 0000000000000000 - 无按键按下
实际现象:iPhone仅识别到C键,无法调出控制中心;但将Apple键盘直接通过USB Camera Adapter连接到iPhone时,Fn+C组合键可正常触发控制中心。
原因分析
Fn键的特殊性
Apple键盘的Fn键并非标准USB HID键盘协议中的修饰键(标准修饰键是Shift、Ctrl、Alt、Meta这类,对应HID报告的前1字节位)。从捕获的数据能看出,Fn键被单独编码成0000000000000001,这说明它是键盘内部处理的特殊键,不是通过标准修饰位传递的。当键盘直接连iPhone时,它会向iOS发送定制化的HID报告,而非单纯的标准按键+Fn编码,iPhone能识别这种定制报告,从而触发Fn组合键对应的系统功能(比如Fn+C调出控制中心)。
USB Camera Adapter的特殊处理
当键盘直接通过Adapter连接iPhone时,Adapter会透传Apple键盘的原生HID报告(包括Fn相关的定制指令),而且iPhone和Apple键盘之间会进行专属的设备协议协商——键盘能识别连接的是iOS设备,进而发送适配iOS的指令。但通过树莓派转发时,你只转发了键盘连接树莓派时生成的通用USB主机报告,丢失了Apple键盘与iPhone之间的专属交互信息,导致iPhone无法识别这是Fn组合键操作,只能解析出标准的C键按下。
核心差异
直接连接场景下,Apple键盘和iPhone有设备级的适配交互,键盘会发送iOS专属的HID报告;而通过树莓派转发时,你转发的是键盘针对通用主机(树莓派)生成的标准报告,iOS无法将其中的Fn键识别为系统功能触发键,自然无法触发对应的组合功能。
内容的提问来源于stack exchange,提问作者user1279887

