本文以打开无线控制的电动车库卷帘门为目标,深入研究了ASK/OOK的编/解码,并用树莓派+五元钱的ASK/OOK 发射模块

背景

车库装了电动卷帘门,为了了解其安全性,也是为了能自主控制,研究了下其遥控原理。其实在这个过程中,我测试了家里几乎所有的无电线遥控器,包括电动窗帘、投影幕布、电动衣架、车钥匙。除了车钥匙,其它都是类似的,即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 16
hackrf_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/4Mio
Stop with Ctrl-C3.9 MiB / 1.000 sec =  3.9 MiB/second3.9 MiB / 1.000 sec =  3.9 MiB/second0.3 MiB / 1.000 sec =  0.3 MiB/second
Exiting... hackrf_is_streaming() result: streaming terminated (-1004)

实测用录制的信号是可以控制的(如果不行,注意调整HackRF放大器的增益)。但这个没多大技术含量,而且成本高,数据量也大。我们的目标是解码后再重新编码/重放。

用GNU Radio录制信号

用GNU Radio搭一个简单的接收框图,一方面将接收信号保存到文件,另一方面将信号以瀑布图显示作为实时反馈。因为遥控信号是433.92MHz,中心频率设在这个附近都可以;采样率2M就够了。

图1:gnuradio-companion 连接框图

下图是运行时的瀑布图,其中按了5次遥控器。

图2:gnuradio-companion 运行时的瀑布图

用 Inspectrum 手动解码

用apt-get安装inspectrum,或下载最新的Inspectrum代码,按照文档自行编译。试过Debian和Mac下都没问题(Mac下用MacPorts要安装一堆依赖)。编译就不多说了,下面是解码的主要步骤:

1. 用Inspectrum打开前面录制的文件,设置采样率为录制时的采样率(2M);

2. 水平拖动,找到有信号的区域;

3. 在原始信号上右键,Add derived plot => Add sample plot;

4. 此时原始信号上会出现两条水平线,用鼠标拖动,调节中心频率的位置和宽度;

5. 在原始信号上右键,Add derived plot => Add amplitude plot;

6. 在Amplitude plot上右键,Add derived plot => Add threshold plot;

7. 勾选”Enable cursors”,此时会出现两条竖线;

8. Zoom放大信号图,移动两条竖线,使其宽度包含一个符号。注意跳过前导的高低电平(start1, start0)。数据通常是脉宽编码的,一对高低电平的组合代表一个bit:高电平较宽的代表1,低电平较宽的代表0。从图中应该能看出这个规律。

9. 改变符号数,使其包含整个信号区域(图中是65个符号,这相当于完整的key),并调节首尾对齐(结束时通常有较长的低电平),这时可以得到符号的速率,即波特率(对OOK,其实等同于比特率)。

图3:用Inspectrum解码的步骤

最后,在Amplitude plot或Threshold plot上分别点右键,Extract symbols (to stdout),可以得到解码的数据。其中前者相当于模拟信号,简单理解:正数代表1,负数代表0;后者才是我们想要的bit流。

图4:用Inspectrum解码的结果

为确认解码正确,可以再选一段信号区域,做同样的操作,看结果是否一致。毕竟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″对应多长时间的高电平,多长时间的低电平,这个模块都不管的——这些是编码模块要处理的事)。

图5:ASK/OOK 发射模块

用Python编码

为了代码的模块化,也是为了减少发射时的计算量,我们采取先编码再发送的方案。根据前面建立的ASK信号的模型,将这个信号编码为高低电平交替的波形,并用一个数组表示,数组中每个元素存储高低电平切换时对应的时间戳。波形总是以高电平开始。

起始/结束电平的时长、占空比这些参数理论上并不需要严格准确,但这取决于接收端的宽容度,所以我们还是尽量忠实于原信号。

下面是核心的代码片断,其中ts是时间戳数组。

    def encodePWM(self, ts):t = 0ts.append(t)t += self.start1ts.append(t)t += self.start0ts.append(t)for i in range(0, self.bits.len):w = self.duty if self.bits[i] else 1 - self.dutyts.append(t + self.period * w)t += self.periodts.append(t)ts[-1] += self.stop0

用树莓派发送

发送工作就很简单了:将发射模块的DATA脚与树莓派的某个GPIO相连,电源也直接用树莓派的;

图6:树莓派与发射模块

然后根据时间戳交替翻转对应的GPIO就行了。

    def send(self, ts):b = 1t1 = time.time()GPIO.output(self.pin_tx, b)t1 -= ts[0]for t in ts[1:-1]:b = 1 - bwait = 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脚)。

图7:树莓派产生的待调制信号

为便于观察,我将编码周期设置为1ms,和示波器界面的1ms/div对应。图中测量的间距是2.78ms(预期是2.75ms),偏差是可接受的。

多种姿势打开车库门

把发射的装置放在车库内,并连上网络,就可以无需钥匙自主控制车库门的开/关了。

手机开关门

不需要自己写App,用ssh终端密钥登录并执行命令,就可以手机一键开/关门了,并且可以远程控制。

图8:手机上用ssh开关车库门

自动开关门

以指定手机作为钥匙,当持手机靠近车库时(其实是连上车库WiFi后),就自动开门。大致流程是:

远程执行路由器的 iwinfo 命令(如下)检测连接在上面的设备;

如果作为钥匙的手机的MAC在列表里,并且信号强度(SNR)超过设定值,就计为一个有效的连接。当连接数从0变为非0时,就自动开门。

如果钥匙手机的有效连接数降到0, 就自动关门。

ssh root@wireless-router 'iwinfo ra0 assoclist && iwinfo rai0 assoclist'

自动关门的好处是可以防止人走了忘了关门(俺家真的发生过)。

芝麻开门

理论上可以做到,但需要可靠的声纹识别。这个就算了。。

锁死车库门

把发射模块对应的GPIO设为高电平,由于发射模块信号强,距离近,接收端收到的总是1,导致用真的钥匙也开不了门。

结语

不用滚动码编码的车库门其实是毫无安全性可言的。不管是简单的原始信号重放、还是解码后再编码的重放都比较容易实现。但我们可以利用这种不安全为自己提供便利,更灵活地自主开/关门。另外,用发射模块发射高电平可以干扰钥匙的信号达到锁死车库门的效果。

但如果不是通过监听钥匙的信号,用暴力破解Key也并不是那么容易的。因为ASK编码除了需要数据吻合,载波频率相同,还需要数据编码速率,甚至起止电平的时长都要一致。

用廉价的硬件发射模块配合树莓派(或单片机)可以低成本地编码/发射ASK/OOK信号,简单易行。而HackRF加Inspectrum解码仅适合实验和调试用,实用价值不高。后续将会尝试ASK/OOK的自动解码。

 
本文转自 K1two2 博客园博客,原文链接:http://www.cnblogs.com/k1two2/p/7504942.html  ,如需转载请自行联系原作者

利用ASK/OOK 发射模块,实现信号重放相关推荐

  1. bladeRF无线门控钥匙信号重放小记

    相关借鉴内容 本文重点参阅了这两篇博客=>GnuRadio Hacking ①:使用GnuRadio+SDR破解固定码无线遥控和HackRF实现无线门铃信号分析重放,其中第二篇博客的数据解码部分 ...

  2. matlab 方波_MATLAB之Simulink(二)利用switch模块将正弦信号变为方波信号

    ##MATLAB之Simulink(二) ##利用switch模块将正弦信号变为方波信号 今天给大家展示一个simulink电路仿真,将正弦信号转化为方波信号. 下面开始教程: 1.首先直接在MATL ...

  3. matlab simulink_MATLAB之Simulink(二)利用switch模块将正弦信号变为方波信号

    ##MATLAB之Simulink(二) ##利用switch模块将正弦信号变为方波信号 今天给大家展示一个simulink电路仿真,将正弦信号转化为方波信号. 下面开始教程: 1.首先直接在MATL ...

  4. (四十五:2021.08.05)《利用深度学习对ecg信号进行分割》

    <Deep Learning for ECG Segmentation><利用深度学习对ecg信号进行分割> 讲在前面 摘要 1. 介绍 2. 算法 2.1 预处理 2.2 神 ...

  5. 利用红外线接收器触发中断信号

    开发板:龙芯1B PC:ubuntu13.10 本程序利用红外线接收器触发中断信号,然后打印信息,红外线接收器通过gpio控制 /*********************************** ...

  6. 一款利用普通手持对讲机做测向信号源的控制电路及程序

    一款利用普通手持对讲机做测向信号源的控制电路及程序 /********************************************************************* 程序名 ...

  7. 蓝牙模块HC-05的调试(利用LED灯来检验信号是否能正常传输)

    蓝牙模块HC-05的调试(利用LED灯来检验信号是否能正常传输) by hasyu 我所用到的硬件 BlueTooth HC-05,arduino 2560(uno也行吧) 电脑 手机 硬件的连接 不 ...

  8. 利用dft对连续信号进行频谱分析_利用DFT对连续时间信号进行近似频谱分析过程中,减小栅栏效应的常用方法是_______;通过_______的方法可以提高频率分辨率。()...

    利用DFT对连续时间信号进行近似频谱分析过程中,减小栅栏效应的常用方法是_______;通过_______的方法可以提高频率分辨率.() 答:减小采样间隔:提高采样点数 川乌既祛风湿,又能: 答:散寒 ...

  9. 利用函数wavread对语音信号进行采样_语音识别第4讲:语音特征参数MFCC

    一.MFCC概述[1] 在语音识别(SpeechRecognition)和话者识别(SpeakerRecognition)方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scaleFrequency ...

  10. Android利用AccessibilityService自动获取微信号

    前言: 最近遇到一个需求,要求写一个小插件,能够自动在微信的页面弹出一个窗口,展示用户的相关信息(与我们公司有关的信息,方便运营快速了解用户信息). 当时我第一反应是不可能,如果能够在别的app中获取 ...

最新文章

  1. Dojo QuickStart 快速入门教程 (1) Why Dojo
  2. HTML big 标签
  3. 机房中铅酸蓄电池的性能参数及优缺点
  4. 数据库-mysql基础操作之输入查询
  5. 看到这一幕,我甚至都想戒烟了。。 | 今日最佳
  6. Spark_Sql50题(DataFrame)
  7. 屏幕空间实时非平面反射
  8. jquery解析php json,Jquery解析json数据详解_jquery
  9. Cocos Creator 粒子编辑插件推荐
  10. 浅谈python可视化编程之tkinter(一)
  11. Python实现简单爬虫:爬取法律法规网数据库信息并分类写入word保存
  12. ONES(光盘刻录软件)单文件版V2.1.358 | ones刻录软件下载 | ones刻录软件怎么使用
  13. Texture ASTC转换ETC
  14. 计算机图形学——Liang-Barsky算法
  15. JavaScript删除节点
  16. “道可道,非常道”——千年孤独话老子
  17. 加强银行余额调节表在财务管理中的作用
  18. 中国结构性心脏病年度报告2020发布会圆满召开!
  19. VirtualBox快捷键
  20. oracle导出数据视频教程,Oracle数据导入导出基本操作示例

热门文章

  1. 【笔记】用python计算BS模型、隐波的笔记
  2. 微信文章图片防盗链,下载到本地
  3. 『论文笔记』目标追踪结合相关滤波器资料收集+机器学习基础知识补充!
  4. Mortal Kombat Tower (dp动态规划)
  5. Linux下的摄相头驱动
  6. 如何用matlab求出矩阵简化阶梯形顺带算出主元所在的列
  7. 《MATLAB 神经网络43个案例分析》:第14章 基于SVM的数据分类预测——意大利葡萄酒种类识别
  8. Deepfool阅读笔记
  9. 凡诺CMS一处文件包含漏洞
  10. Hadoop3+Hive3安装记录(虚拟机搭建分布式环境,报错解决)