手把手教你破解红外遥控器协议规则
在上一篇文章中,我们利用 ESP32 的 GPIO 中断成功捕获了红外信号的脉冲时长。成功运行后你会活得一串数字。但是,看着串口打印出来的一串串 560, 1690, 560, 560... 数字,你可能会感到困惑:这些数字到底代表什么?为什么不同品牌的家电这串数字完全不同?
一、 物理层:载波
首先要纠正一个直觉上的误区:红外遥控器并不是简单地亮灯代表 1,灭灯代表 0。
如果我们直接由 GPIO 控制红外 LED 亮灭,信号会立刻淹没在日光灯、太阳光等环境红外线噪音中。为了解决这个问题,红外遥控引入了载波的概念。
调制: 遥控器发射信号时,并不是让 LED 持续亮,而是以特定的频率(38kHz)快速闪烁。
解调: 电器上的红外接收头,内部集成了带通滤波器。它只对 38kHz 频率闪烁的红外光敏感,对于阳光这种直流或低频红外光视而不见。
关键点: 我们代码中记录的
560μs,并不是 LED 亮了 560 微秒,而是 LED 以 38kHz 的频率闪烁了 560 微秒。
二、 逻辑层
当你剔除载波后,剩下的就是高低电平的包络线。不同的厂家定义了不同的规则来把这些电平翻译成 0 和 1,这就是编码格式。
1. 脉冲距离编码
这是 NEC 协议采用的方式。无论 0 还是 1,高电平的时间是固定的。区别在于低电平的时间长短。因此当我们看到一串很整齐的短脉冲,间隔忽长忽短,基本就是 NEC。

2. PWM编码
这是 Sony 设备采用的方式。 无论 0 还是 1,低电平的时间是固定的。区别在于高电平的时间长短。波形看起来像不同宽度的实心方块排列在一起。

3. 曼彻斯特编码
这是 飞利浦采用的方式,比较古老但抗干扰强。它不看电平长短,而是看电平跳变的方向。从低变高代表 1,从高变低代表 0。这种协议很难用简单的时长数组来肉眼解析,通常需要专门的库。

三、标准 NEC 数据包结构
既然 NEC 是最通用的协议(TCL、创维、海尔、美的等大部分型号都基于此),我们来深度解剖它的一条完整指令例如:0x00FF02FD。
这 32 位数据被分成了四个部分:
引导码:9000μs 高电平 + 4500μs 低电平。让接收头调整增益,准备接收数据。
地址码:
0x00(8位) ,告诉接收方我是电视机遥控器。地址反码 :
0xFF校验。0x00取反就是0xFF。如果接收头收到的两段数据不互为反码,说明传输传错了,直接丢弃。命令码:
0x02(8位)具体动作。比如“音量+”。命令反码 :
0xFD(8位) 校验命令是否正确。
逆向未知设备
如果你遇到了一个奇葩设备,既不是 NEC 也不是 Sony,甚至 Home Assistant 社区都没人讨论,该怎么办?
只能使用Raw 大法,不要试图去理解它,成为它。而是直接录音。 在 Home Assistant 或 ESPHome 中,使用 raw 模式。直接记录刚才提到的 [560, 1690, 560, 560...] 数组。原样播放,是能直接解决问题的。

wlh889116
校验提示文案
wlh889116
校验提示文案