首先可以用SDRSharp看一下遥控器的中心频率. 但是我这边没有遥控器, 是社工来的, 所以就假设它是433Mhz吧.
开启Universal Radio Hacker(urh)进行抓包. 可以得到pcm数据.
可以先把时域上无关的杂波去掉, 只留下有信号的一段时间的波形. 如图所示为遥控器控制门禁时的波形

可以对这个波形做一个滤波. 先切换到频域视图, 然后用鼠标施加一个带通滤波器上去.

之后urh将会自动生成一个新的波形. 再调整参数给波形降噪, 即可得到一个观感还可以的波形.

画圈的这个参数是幅度滤波. 低于该数值的波将会被当作噪声过滤掉, 也就是下图中被红色矩形包络起来的部分(上图中设置为了0所有没有红色包络). 因此这个数值越小能显示出来的波纹越多, 同样噪声也越多.
切换到"解调"视图, 可以得到等效的pcm波形. 用鼠标拖动红绿色交界的地方, 可以设置判断高低电平的阈值.

接下来需要调整采样率, 就是设置每个码元对应的采样数量, 相当于设置时隙了. 这一步我也不知道有何依据, 我是找到了一个看上去最短的高电平区间, 将它的点数作为了采样率

设置好时隙之后, 可以多选择几个脉冲区间看看. 基本上每个高低电平的间隔都是设置的采样率的整数倍, 如此看来时隙应该是设置对了.

协议分析
这个波形还是挺容易看出来的. 然后了解一下433遥控的基本协议, 这篇文章介绍了EV1527这种协议, 它其实就是我捕获的这个遥控器的协议. 当然这些协议也可以在RCSwitch的文件里看到.
/* Format for protocol definitions:
* {pulselength, Sync bit, "0" bit, "1" bit, invertedSignal}
*
* pulselength: pulse length in microseconds, e.g. 350
* Sync bit: {1, 31} means 1 high pulse and 31 low pulses
* (perceived as a 31*pulselength long pulse, total length of sync bit is
* 32*pulselength microseconds), i.e:
* _
* | |_______________________________ (don't count the vertical bars)
* "0" bit: waveform for a data bit of value "0", {1, 3} means 1 high pulse
* and 3 low pulses, total length (1+3)*pulselength, i.e:
* _
* | |___
* "1" bit: waveform for a data bit of value "1", e.g. {3,1}:
* ___
* | |_
*
* These are combined to form Tri-State bits when sending or receiving codes.
*/
{ 350, { 1, 31 }, { 1, 3 }, { 3, 1 }, false }, // protocol 1
协议1给出的参数其实就是这个遥控器的协议. 可以看到它有一个31个空白的同步码, 1高3低表示"0"/ 3高1低表示"1".

之后根据{1, 3}, {3, 1}
的协议就可以恢复出来0/1的序列了. 因为这里的数据量很少, 所以我就人工一个一个比对了. 如果这里数据量比较多的话, 就设置一下采样率, 然后用urh自带的解调功能解码出原始的序列. 然后再用文本替换的方法把1000/1110替换成L/H(或者HEX编码为8和e)就行.
但是注意, 使用自带的解码可能不会很准. 尤其是解调的抽样时间可能会对不齐, 导致出现偏差. 因此需要进一步的核对.
吐槽一个
上面这个波形还是很容易看出来的, 那么下面这个波形就很差了.
这是一个443射频的无线开灯器的波形. 因为高频电路也忘干净了(本来就没学会, 可能还不如何同学学的好), 出现这种波形的原因是分析不出来了. 最后就是根据协议来猜一猜.
首先第一个高电平之后有一长段的低电平, 那么就假设前面有1个或者2个高电平. 再量一量后面的长度和比例, 和EV1527这个协议是一样的
可以看到, 这个波形的问题是发送高电平的时候无法维持住高电平的波幅, 只有出现上升沿和下降沿的时候才会有比较高的能量. 毕竟这个小遥控器的电路非常简单, 所以出现啥波形都有可能吧. 总之就是这样分析出来, 放到单片机里验证一下就是了.
编写代码发送信号
使用arduino或者esp32之类的单片机, 配合433超外差发射模块即可实现信号发射. 注意脉冲的长度需要在代码里根据实际情况设定一下. 一个简单的示例代码如下:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
// Transmitter is connected to Arduino Pin #10
mySwitch.enableTransmit(5);
// Optional set protocol (default is 1, will work for most outlets)
mySwitch.setProtocol(1);
// Optional set pulse length. 设置脉冲长度, 注意这里是设置的500/2也就是250us
mySwitch.setPulseLength(250);
// Optional set number of transmission repetitions.
mySwitch.setRepeatTransmit(7);
}
void loop() {
Serial.println("hello1");
mySwitch.send("001011101000110100010000");
delay(1000);
}
这里可以用RCSwitch
的重复功能多发几次信号, 因为只发送一次信号可能并不会有效. 在实际中也是, 按遥控器肯定不可能按下去一瞬间就抬起来, 肯定要按一定长的时间确保生效才会松手的.
另外, 有一个方板的433发射模块, 那个模块的接口线序是 DATA/VCC/GND, 别插错了. 我就是把VCC和DATA插反了, 这样其实也有效果, 因为是键控调幅嘛, DATA也只是控制通不通电, 所以和VCC对调似乎影响也不大.
奇怪的地方
这里有一个奇怪的地方我也没想通(本来通信原理就没学好, 过了这么长时间更不可能知道了)
在urh里可以看到, 一个高电平的持续时间是500us, 那么按理说RCSwitch
的pulselength就应该是500才对. 但是我实际运行了一下代码, 真正起效的脉冲长度应该是250us. 这里是为什么没太理解. 不过犹记得当年学信号系统的时候经常忘记"x2", 可能这里也和这个有关系吧.
补充: 在后来的一个遥控器信号里, 按照"除以2"的方法设置脉冲长度, 反倒又不可以了. 需要使用URH里给出的脉冲长度才可以正常使用. 很奇怪很奇怪. 难道要重拾<<通信原理>>了嘛?
