老款车库门遥控器对码的方法比较简单,只需要按下电机后面的对码键,然后就会看到指示灯亮起来。再按下老款车库门遥控器中的一个按键,按住5秒钟后,看到指示灯上一直闪烁就可以松开按键了,松开后会看到指示灯熄灭,这就表面匹配成功了。
车库遥控器怎么配对遥控器:
1、准备的新车库门遥控器的型号要跟旧的车库遥控器一样;
2、新车库门遥控器上面的两个按键同时按住,看到遥控器上的红灯一直在闪动的时候,就可以松开按键了,这说明清码成功了;
3、把新旧车库门遥控器放在一起,并且同时按下同一个位置的按键,如果看到遥控器上的红灯闪动了,那就表面这个按键已经跟新的遥控器匹配成功了,就可以松开两个遥控器的按键;
4、如果匹配的时候,按下按键指示灯只是亮了一下就不亮了,这表面没有匹配成功,要重新再匹配一次;
5、按照这个方法把剩余的车库门遥控器逐一匹配。
新款车库门遥控器对码方法:
1、按住1到2秒电机后方的开门机对码键,指示灯会一直亮着;
2、按下车库门遥控器上的开门键,每按一次遥控器跟开门机的指示灯都会亮起,连续按4次,4次都同时亮指示灯,那就说明对码成功了;
3、对码成功之后,开门机的指示灯会熄灭,如果指示灯还在亮,这就说明开门机还是处于对码的状态,很有可能会匹配到其他的车库门遥控器,所以在完成对码之后,要再次按一下电机后方的开门机对码键来退出对码。
今早同事携带公司工具仓库的卷闸门遥控器坏了,一时无法进入,作为电力公司的工人,大家都急着领取工具出去做工。
我叫同事把遥控钥匙给我看一下,按的时候遥控器的灯很亮,应该不是电池的问题。
问了一下他了解到,因为工作安排的需要,旧的遥控器给了另外一个同事,他这个遥控器是刚从网上买到的,买到后他把新、旧遥控器一起拿到遥控器店铺叫别人配对好了,花了30块钱,但是今早来到发现用不了。
我上网查了一下,在网上这种卷闸门遥控钥匙在有两种。一种是学习型(对拷型),还有一种是焊码型和拨码型。
焊码型和拨码型原理一样,只是拨码型在原来需要焊码的地方多了一组可以拨动的开关,所以只要拨动对应的开关就行,操作简单,不需要用到电烙铁。
购买的时候一定要注意,要购买晶振频率原遥控器一致的新遥控器(如下图),其次就是要看遥控器的芯片型号。
学习(对拷)型遥控器:
学习型遥控器购买回来后第一步就是先给新的遥控器清码。
清码:同时按下遥控器的“上键”与“下键”(上排的两个按键),看到遥控器指示灯快速不停的闪烁,即表示清码成功。
注意:指示灯要不停的闪烁,按下遥控器任意键指示灯闪下灭掉就表示清码成功。
清码完成后就可以对遥控器进行学习了。
学习:同时按原配遥控器及对拷遥控器所对应按键进行学习,学习时尽量贴近,最好头对头学习,对拷遥控器灯快速闪烁或常亮,表明学习上了,学习5秒后松手,然后对剩余按键同样进行学习即可。
注意:拷贝时灯如果不闪烁或常亮,在两个遥控器上面的按键都按下去后
两只手都不要松开,然后拿着对拷遥控器在自己的遥控器周围找信号,看到灯
不停闪烁或常亮后就表示已经拷贝成功了。
对于学习型的遥控器,如果不小心清了码,那也不用担心,主要你还没有对遥控器进行新的学习,那么我们可以用复位的恢复到原来状态!
复位:同时按下遥控器的“锁键”与“停止键”(下排的两个按键),看到遥控器指示灯快速不停的闪烁,即表示复位成功。
焊码型和拨码型:
如果购买的是焊码型遥控器,操作起来比较麻烦,需要用到电烙铁,把密码区焊接成跟原来旧遥控器一样即可。如果是拔码型的,操作相对容易一点,只需要按照旧遥控器拨码到对应的位置。
需要注意的是,购买焊码型和拨码型遥控器的时候,还需要注意新旧遥控器的振荡电阻阻值要一致!
如果你的原遥控器不是焊码型或拨码型,那就只能选购学习型的了。
总的来说,对于动手能力差的朋友,还是学习型好一点,操作起来比较简单。
本文以不用原配钥匙无线电遥控打开车库电动卷帘门为目标,深入研究了ASK/OOK的编/解码,并用树莓派+五元钱的发射模块实现了打开车库门的各种姿势。本文适用于主流315/433MHz射频遥控。
背景车库装了电动卷帘门,为了了解其安全性,也是为了能自主控制,研究了下其遥控原理。其实在这个过程中,我测试了家里几乎所有的无电线遥控器,包括电动窗帘、投影幕布、电动衣架、车钥匙。除了车钥匙,其它都是类似的,即ASK/OOK编码。
ASK,简单的理解,就是调幅,用不同的幅度来代表不同的信息。OOK是ASK的特例,因为只有0和1要表示,可以用有载波来代表1,无载波来代表0。但实际上并不是这么直接,通常会加上脉宽调制(PWM)以提高抗干扰能力。
用HackRF确定可行性据说有的车库门是滚动码的(编码是变化的),我们可以先用HackRF做个简单的重放攻击测试。
录制2秒的信号并重放:
hackrf_transfer -f 433920000 -s 2000000 -a 1 -r capture.raw -n 4000000 -g 40 -l 16hackrf_transfer -f 433920000 -s 2000000 -a 1 -t capture.raw -x 40
部分运行提示:
call hackrf_set_sample_rate(2000000 Hz/2.000 MHz)call hackrf_set_hw_sync_mode(0)call hackrf_set_freq(433920000 Hz/433.920 MHz)call hackrf_set_amp_enable(1)samples_to_xfer 4000000/4MioStop with Ctrl-C 3.9 MiB / 1.000 sec = 3.9 MiB/second 3.9 MiB / 1.000 sec = 3.9 MiB/second 0.3 MiB / 1.000 sec = 0.3 MiB/secondExiting... hackrf_is_streaming() result: streaming terminated (-1004)
实测用录制的信号是可以控制的(如果不行,注意调整HackRF放大器的增益)。但这个没多大技术含量,而且成本高,数据量也大。我们的目标是解码后再重新编码/重放。
用GNU Radio录制信号用GNU Radio搭一个简单的接收框图,一方面将接收信号保存到文件,另一方面将信号以瀑布图显示作为实时反馈。因为遥控信号是433.92MHz,中心频率设在这个附近都可以;采样率2M就够了。
下图是运行时的瀑布图,其中按了5次遥控器。
用 Inspectrum 手动解码用apt-get安装inspectrum,或下载最新的Inspectrum代码,按照文档自行编译。试过Debian和Mac下都没问题(Mac下用MacPorts要安装一堆依赖)。编译就不多说了,下面是解码的主要步骤:
用Inspectrum打开前面录制的文件,设置采样率为录制时的采样率(2M);水平拖动,找到有信号的区域;在原始信号上右键,Add derived plot => Add sample plot;此时原始信号上会出现两条水平线,用鼠标拖动,调节中心频率的位置和宽度;在原始信号上右键,Add derived plot => Add amplitude plot;在Amplitude plot上右键,Add derived plot => Add threshold plot;勾选”Enable cursors”,此时会出现两条竖线;Zoom放大信号图,移动两条竖线,使其宽度包含一个符号。注意跳过前导的高低电平(start1, start0)。数据通常是脉宽编码的,一对高低电平的组合代表一个bit:高电平较宽的代表1,低电平较宽的代表0。从图中应该能看出这个规律。改变符号数,使其包含整个信号区域(图中是65个符号,这相当于完整的key),并调节首尾对齐(结束时通常有较长的低电平),这时可以得到符号的速率,即波特率(对OOK,其实等同于比特率)。最后,在Amplitude plot或Threshold plot上分别点右键,Extract symbols (to stdout),可以得到解码的数据。其中前者相当于模拟信号,简单理解:正数代表1,负数代表0;后者才是我们想要的bit流。
为确认解码正确,可以再选一段信号区域,做同样的操作,看结果是否一致。毕竟ASK抗干扰不强,有时候可能会差一两个bit。通常,按一下遥控器,同样的数据会重复发送几次。
遥控信号编码分析根据前面的解码,以及对更多遥控器的分析,可以归纳出一个模型。一个ASK信号包含如下部分(参数):
start1: 起始的高电平时间长度;start0: 起始的低电平时间长度;stop0: 结束的低电平时间长度;period: 每个bit的周期,在PWM编码中,每个bit都对应一对高/低电平,而且总是先高后低;duty: 占空比,比如占空比是75%,则意味着一个周期内如果75%左右是高电平,则代表1; 而75%左右是低电平则代表0;bits: 实际的bit流。这里的占空比肯定是大于50%的,通常在75%左右比较合适,这样既能拉开(每个周期内)两种电平的比例差,减少接收端的误判;又能保证接收时能采样到两种电平,也是为了减少误码。试想对于99%的占空比,1%周期的电平很可能被接收端采样不到,导致采样到199%(甚至更长)周期的同一种电平,这样解码时就会出错。
发射模块最初,我是想用GNU Radio做ASK/OOK编码并发射的。万能的HackRF和SDR按说能搞定这个小Case。
研究了下,发现这并不是一件容易的事。需要使用很多的模块。这也许是一个很好的GNU Radio的练习题。但我还是先看下有没有更简单的办法。
然后口水了一下TI的EZ430-Chronos手表,找了下“廉价”的RFcat,发现并不容易买到。最后在万能的假货宝发现了真正廉价的东东:只要5元!(你买不了吃亏,买不了上当。。)
这个模块很简单,就是把输入的信号以433/315M的载波调制/发射出去。DATA为高电平,就按高电平调幅输出(请注意,这里调制的是电平,并不是数据。也就是说,数据”1″对应多长时间的高电平,多长时间的低电平,这个模块都不管的——这些是编码模块要处理的事)。
用Python编码为了代码的模块化,也是为了减少发射时的计算量,我们采取先编码再发送的方案。根据前面建立的ASK信号的模型,将这个信号编码为高低电平交替的波形,并用一个数组表示,数组中每个元素存储高低电平切换时对应的时间戳。波形总是以高电平开始。
起始/结束电平的时长、占空比这些参数理论上并不需要严格准确,但这取决于接收端的宽容度,所以我们还是尽量忠实于原信号。
下面是核心的Python代码片断,其中ts是时间戳数组。
def encodePWM(self, ts): t = 0 tsend(t) t += self.start1 tsend(t) t += self.start0 tsend(t) for i in range(0, self.bits.len): w = self.duty if self.bits[i] else 1 - self.duty tsend(t + self.period * w) t += self.period tsend(t) ts[-1] += self.stop0用树莓派发送
发送工作就很简单了:将发射模块的DATA脚与树莓派的某个GPIO相连,电源也直接用树莓派的;
然后根据时间戳交替翻转对应的GPIO就行了。下面是Python的核心代码。
def send(self, ts): b = 1 t1 = time.time() GPIO.output(self.pin_tx, b) t1 -= ts[0] for t in ts[1:-1]: b = 1 - b wait = t1 + t - time.time() if wait > 0: time.sleep(wait) GPIO.output(self.pin_tx, b) wait = t1 + ts[-1] - time.time() if wait > 0: time.sleep(wait)
用sleep控制时间尽管有一定误差,脚本语言的运行也没那么快,但实测是够用的。下图是示波器上看到的DATA引脚的波形图(两个通道都连着DATA脚)。
为便于观察,我将编码周期设置为1ms,和示波器界面的1ms/div对应。图中测量的间距是2.78ms(预期是2.75ms),偏差是可接受的。
多种姿势打开车库门把发射的装置放在车库内,并连上网络,我们就可以无需钥匙自主控制车库门的开/关了。
手机开关门不需要自己写App,用ssh终端密钥登录并执行命令,就可以手机一键开/关门了,并且可以远程控制。
自动开关门以指定手机作为钥匙,当持手机靠近车库时(其实是连上车库WiFi后),就自动开门。大致流程是:
远程执行路由器的 iwinfo 命令(如下)检测连接在上面的设备;如果作为钥匙的手机的MAC在列表里,并且信号强度(SNR)超过设定值,就计为一个有效的连接。当连接数从0变为非0时,就自动开门。如果钥匙手机的有效连接数降到0, 就自动关门。ssh root@192.168.12.34 'iwinfo ra0 assoclist && iwinfo rai0 assoclist'
自动关门的好处是可以防止人走了忘了关门(俺家真的发生过)。
芝麻开门理论上可以做到,但需要可靠的声纹识别。这个就算了。。
锁死车库门把发射模块对应的GPIO设为高电平,由于发射模块信号强,距离近,接收端收到的总是1,导致用真的钥匙也开不了门。
结语不用滚动码编码的车库门其实是毫无安全性可言的。不管是简单的原始信号重放、还是解码后再编码的重放都比较容易实现。但我们可以利用这种不安全为自己提供便利,更灵活地自主开/关门。另外,用发射模块发射高电平可以干扰钥匙的信号达到锁死车库门的效果。
但如果不是通过监听钥匙的信号,用暴力破解Key也并不是那么容易的。因为ASK编码除了需要数据吻合,载波频率相同,还需要数据编码速率,甚至起止电平的时长都要一致。
用廉价的硬件发射模块配合树莓派(或单片机)可以低成本地编码/发射ASK/OOK信号,简单易行。而HackRF加Inspectrum解码仅适合实验和调试用,实用价值不高。后续将会尝试ASK/OOK的自动解码(解码可以用来做什么,你懂的)。