专栏首页老欧说安卓Android开发笔记(一百六十五)利用红外发射遥控电器

Android开发笔记(一百六十五)利用红外发射遥控电器

红外遥控是一种无线控制技术,它具有功耗小、成本低、易实现等诸多优点,因而被各种电子设备特别是家用电器广泛采用,像日常生活中的电视遥控器、空调遥控器等等基本都采用红外遥控技术。 不过遥控器并不都是红外遥控,也可能是射频遥控。红外遥控使用近红外光线(频率只有几万赫兹)作为遥控光源,而射频遥控使用超高频电磁波(频率高达几亿赫兹)作为信号载体。红外遥控器的顶部,有的镶嵌一个或多个小灯泡,有的是一小片黑色盖子,这个黑盖子对红外线来说可是透明的,只是人的肉眼看不穿它。射频遥控器的顶部,有的突出一根天线,有的啥都没有(其实发射器包在盖子里面)。红外遥控器带着灯泡就像一支手电筒,红外光照到哪里,哪里的电器才会接收响应,这决定了红外遥控的三个特性: 1、遥控器要对准电器才有反应。要是手电筒没照到这儿,那肯定是黑乎乎的; 2、遥控器不能距离电器太远,最好是五米之内。这也好理解,手电筒离得远了,照到物体上的光线都变暗了; 3、遥控器与电器之间不能有障碍物。你能想象手电筒发出来的灯光会穿透墙壁吗? 而射频遥控器正好与红外的特性相反,它采用超高频电磁波,所以信号是四散开的不具备方向性,并且射频信号的有效距离可以长达数十米,末了射频信号还能轻松穿透非金属的障碍物。红外遥控和射频遥控的不同特性决定了它们各自擅长的领域,红外遥控看似局限很多,其实正适用于家用电器,否则每个人隔着墙还能遥控邻居家的电器,这可怎么得了;射频遥控的强大抗干扰能力,更适用于一些专业的电子设备。因为红外遥控更贴近日常生活,所以人民大众购买的智能手机,自然配置的是红外遥控了(有的手机可能没装红外发射器)。 听起来装了红外发射器的手机,可以拿来当遥控器使用,还能一部手机遥控许多家电,这不是什么天方夜谭噢,接下来看看如何在App开发中运用红外遥控技术。 首先要在App工程的AndroidManifest.xml中补充红外权限配置,具体的配置例子见下:

    <!-- 红外遥控 -->
    <uses-permission android:name="android.permission.TRANSMIT_IR" />
    <!-- 仅在支持红外的设备上运行 -->
    <uses-feature android:name="android.hardware.ConsumerIrManager" android:required="true" />

其次在代码中初始化红外遥控的管理器,注意红外遥控功能从Android4.4之后才开始支持。红外遥控对应的管理类名叫ConsumerIrManager,它的常用方法主要有三个,分别说明如下: hasIrEmitter : 检查设备是否拥有红外发射器。返回true表示有,返回false表示没有。 getCarrierFrequencies : 获得可用的载波频率范围。 transmit : 发射红外信号。第一个参数为信号频率,单位赫兹(Hz),家用电器的红外频率通常使用38000Hz;第二个参数为整型数组形式的信号格式。 下面是红外遥控管理器的初始化代码例子:

    private ConsumerIrManager cim;
    private void initInfrared() {
        // 获取系统的红外遥控服务
        cim = (ConsumerIrManager) getSystemService(Context.CONSUMER_IR_SERVICE);
        if (!cim.hasIrEmitter()) {
            tv_infrared.setText("当前手机不支持红外遥控");
        }
    }

最后准备发射遥控信号之时调用transmit方法就好了。 果真如此简单吗?当然不是,这里面的玄机全在transmit方法的信号格式参数上面。想一想,家电有很多种,每种家电又有好几个品牌,便是房间里的某个家电,遥控器上也有数排的按键。这么算下来,信号格式的各种组合都数不清了,普通开发者又不是电器厂商的内部人员,要想破解这些电器的红外信号编码,那可真是比登天还难。 手工破解固然不容易,却也并非没有办法,现在有一种红外遥控器的解码仪,可到淘宝上面购买。这个解码仪能够分析常见家电的红外遥控信号,下面两种除外: 1、空调遥控器,空调的控制比较复杂,光光温度就可能调节十几次,难以破解。 2、灯光遥控器,灯本身发光发热,同时也会散发大量红外线,势必对外部的红外信号造成严重干扰;所以灯只能采取射频遥控器。 红外解码仪是家电维修人员的必备仪器,常用于检测遥控器能否正常工作,开发者为了让手机实现遥控功能,也要利用解码仪捕捉每个按键对应的红外信号。接下来以扫地机器人的遥控解码为例,介绍如何通过解码仪获取对应的红外遥控指令。 先将扫地机器人的遥控器对准解码仪正面的红外接收窗口,按下遥控器上的clean键(开始扫地/停止扫地),此时解码仪的分析结果如下图所示:

从上图可见,clean键的红外信号由三部分组成,分别是用户码4055、数据码44、电路61212。其中用户码表示厂商代号,每个厂家都有自己的唯一代号;数据码表示按键的编号,不同的数据码代表不同的按键;电路格式表示红外信号的编码协议,每种协议都有专门的指令格式。比如说电路61212表示的是NEC6121协议,该协议的红外信号编码格式为:引导码+用户码+数据码+数据反码+结束码,其中引导码和结束码都是固定的,数据反码由数据码按位取反得来,真正变化的只有用户码和数据码。 然而解码仪获得的用户码和数据码并不能直接写在代码中,因为液晶屏上的编码其实是十六进制数,需要转换为二进制数才行。例如用户码4055,对应的二进制数为0100 0000 0101 0101;数据码44,对应的二进制数为0100 0100,按位取反得到数据反码的二进制数为1011 1011。 可是前述的transmit方法,参数要传递整型数组形式的信号,并不是二进制数,这意味着二进制数还得转换成整型数组。那么整型数组里面存放的到底是些什么数据呢?这就要从数字电路中的电平说起了。电平是“电压平台”的简称,指的是电路中某一点电压的高低状态,在数字电路中常用高电平表示“1”,用低电平表示“0”。遥控器发射红外信号之时,通过“560微秒低电平+1680微秒高电平”代表“1”,通过“560微秒低电平+560微秒低电平”代表“0”。于是编写Android代码的时候,使用“560,1680”表示二进制的1,使用“560,560”表示二进制的0,此处的560和1680只是大概的数值,也可使用580、600替换560,或者使用1600、1650替换1680。 根据数字电路的电平规则,用户码4055对应的二进制数为0100 0000 0101 0101,转换成电平信号就变成了“560,560, 560,1680, 560,560, 560,560, 560,560, 560,560, 560,560, 560,560, 560,560, 560,1680, 560,560, 560,1680, 560,560, 560,1680, 560,560, 560,1680, ”,数据码44及其数据反码的电平信号依此类推。再加上NEC协议固定的引导码“9000,4500”,以及结束码“560,20000”,即可得出前面clean键的红外信号整型数组,具体的数组数值如下所示:

int[] pattern = {9000,4500, // 开头两个数字表示引导码
    // 下面两行表示用户码
    560,560, 560,1680, 560,560, 560,560, 560,560, 560,560, 560,560, 560,560,
    560,560, 560,1680, 560,560, 560,1680, 560,560, 560,1680, 560,560, 560,1680,
    // 下面一行表示数据码
    560,560, 560,1680, 560,560, 560,560, 560,560, 560,1680, 560,560, 560,560,
    // 下面一行表示数据反码
    560,1680, 560,560, 560,1680, 560,1680, 560,1680, 560,560, 560,1680, 560,1680,
    560,20000}; // 末尾两个数字表示结束码

接着在App代码中代入上述的信号格式数组,即调用transmit方法传递格式参数,示例如下:

    // 普通家电的红外发射频率一般为38KHz
    cim.transmit(38000, pattern);

运行测试App,却发现不管让手机发送多少次的红外信号,扫地机器人都呆若木鸡,丝毫没有反应。这是咋回事?奥秘在于NEC协议只规定了大体上的编码规则,实际的遥控器信号在整体规则内略有调整。之前提到的解码仪,既是家电售后的检测仪器,也可作为App开发者的调试工具。拿起手机对准解码仪正面的接收窗口,点击按钮发送红外信号,解码仪同步显示分析后的信号数据,如下图所示:

由上图可知,此时手机发出的红外信号符合NEC6121协议,只不过用户码变成了02AA,数据码变成了22。把这两个码数翻译成二进制,则用户码02AA转为0000 0010 1010 1010,数据码22转为0010 0010。回头比较遥控器的解码数据,遥控器发出的用户码4055对应0100 0000 0101 0101,数据码44对应0100 0100。看起来手机与遥控器的信号区别,应当是每两个十六进制数先转为二进制数,然后倒过来排列,也就是所谓的逆序编码。 找到问题的症结便好办了,数学上有负负得正,编码则有逆逆得顺。既然4055逆序编码后变为02AA,那么02AA逆序编码后必为4055,于是再次构造用户码02AA以及数据码22的电平信号,更改后的红外信号数据如下所示:

int[] pattern = {9000,4500, // 开头两个数字表示引导码
    // 下面两行表示用户码
    560,560, 560,560, 560,560, 560,560, 560,560, 560,560, 560,1680, 560,560,
    560,1680, 560,560, 560,1680, 560,560, 560,1680, 560,560, 560,1680, 560,560,
    // 下面一行表示数据码
    560,560, 560,560, 560,1680, 560,560, 560,560, 560,560, 560,1680, 560,560,
    // 下面一行表示数据反码
    560,1680, 560,1680, 560,560, 560,1680, 560,1680, 560,1680, 560,560, 560,1680,
    560,20000}; // 末尾两个数字表示结束码

重新编译运行测试App,手机依旧对准解码仪,然后点击按钮发射红外信号,解码仪终于正常显示用户码4055、数据码44了。这时再将手机对准扫地机器人,点击发射按钮,机器人居然转动起来了耶。至此遥控器clean键的红外编码正式破解完成,其它按键乃至其它家电遥控器的红外信号编码,均可通过解码仪破译得到。 当然,以上的红外信号解析办法,仅限于编码规则广泛公开的NEC协议。对于其它格式未知的电路协议,只能借助于更专业的单片机来分析,话说开发者拿起电路板,一边做电工,一边做码农,其乐也融融。采用红外遥控的家电种类与品牌都很繁多,前人已经对它们做了不少的信号破译工作,这些已知的红外信号数据详见网址http://www.remotecentral.com/cgi-bin/codes/,里面包括各大国外家电品牌的信号编码,有兴趣的读者可参考。 点此查看Android开发笔记的完整目录

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android开发笔记(序)写在前面的目录

    一方面写写自己走过的弯路掉进去的坑,避免以后再犯;另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平。因此博主就想,入门的东西...

    用户4464237
  • Android开发笔记(一百五十五)利用GL10描绘点、线、面

    上一篇文章介绍了GL10的常用方法,包括如何设置颜色、如何指定坐标系、如何调整镜头参数、如何挪动观测方位等等,不过这些方法只是...

    用户4464237
  • 红外通信原理

    一、 红外通信原理 红外遥控有发送和接收两个组成部分。发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。红外接收完...

    云深无际
  • Android开发笔记(六十一)文件下载管理DownloadManager

    文件下载其实是网络数据访问的一种特殊形式,使用普通的http请求也能完成,就是实现起来会繁琐一些。因为下载功能比较常用,而且业务功能相对统一,所以从Andr...

    用户4464237
  • Diy飞行器制作流程(纯手工写噢)

    2015年花了一个假期做好了一个小灰机,一方面被坑的太惨,希望广大同胞别走我们的弯路,另一方我们也要记录自己制作的经验。

    我在鹅厂做安全
  • Android NFC 技术解析,附 Demo 源码

    近期由于项目需求,对 Android NFC 技术进行了一定的了解和深入,整合了一些网络、书籍资料,此文章仅作为自己的学习笔记。 NFC 是 Near Fiel...

    非著名程序员
  • 哪些曾经的高科技产品会消失呢?又被哪些高科技所替代呢?

    KS Knowledge Sharing 知识分享 现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。 写在...

    互扯程序
  • 【科普文】一文详解红外遥控模块工作原理

    红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的...

    程序IT圈
  • Android开发笔记(一百六十)休眠模式下的定时器控制

    定时器AlarmManager常常用于需要周期性处理的场合,比如闹钟提醒、任务轮询等等。并且定时器来源于系统服务,即使App已...

    用户4464237
  • Android开发笔记(七十七)图片缓存算法

    由于手机流量有限,又要加快app的运行效率,因此好的app都有做图片缓存。图片缓存说起来简单,做起来就用到很多知识点,可算是集Android技术之大全了。只...

    用户4464237
  • Android开发笔记(五十九)巧用传感器

    传感器是Android用来感知周围环境以及运动信息的工具。因为具体的感应信息依赖于相关硬件,所以虽然Android提供了众多的感应器,但不是每部手机都能支持...

    用户4464237
  • 商业价值:苹果iTV,再一次改变世界?

      苹果(Apple)公司打算进军智能电视领域,这在行业里已经不是秘密,有关苹果智能电视的消息也是不绝于耳,结合苹果产品线的命名规则,苹果智能 电视基本上就是i...

    阳光岛主
  • 使用HackCube-Special分析滚动码信号

    所谓滚动码(Rolling code)是我们嗅探汽车遥控发射出来的射频信号,发现每一次的射频信号都是不一样的,并且每个信号只能被使用一次,这就是被称为滚动码的原...

    FB客服
  • 神舟十二号飞天|扒一扒火箭上的摄像头:有多少?装在哪?有何用?

    根据中国载人航天工程办公室发布的消息,航天员聂海胜、刘伯明、汤洪波乘神舟十二号载人飞船前往空间站天和核心舱。按计划,他们将在太空驻留长达三个月。

    AI掘金志
  • MicroPython TPYBoard v102 无线红外遥控舵机(基于红外解/编码模块)

    该模块使用方法非常简单,只需要掌握基本的单片机TTL串口通信知识即可。将模块与开发板进行串口连接,通过串口发送指定的指令进行控制模块发射;通过串口接收方式进行红...

    阿莉埃蒂
  • 独家探秘大疆追赶者:小型无人机厂商伟力玩具

    不久前《电子工程专辑》记者采访了四轴飞行器出货量第一的哈博森,但在微博互动中,有网友报料表示,在汕头澄海有几家小四轴和大四轴的飞行器出货量比哈博 森还要大。为了...

    机器人网
  • 安卓手机系统连接电视,最好的方案是什么?

    现在,大部分人都用手机看视频。但是手机屏幕太小,不适合高清视频。电视看视频,才有更好的体验。

    ruanyf
  • 蓝牙项目开发流程

    用户1733354
  • 自制S-Bus接收器(控制dji EP车)

    因为知道这个东西,所以一直想做一些改装S1的通用可编程性,一直不是那么好。。。可是你说都折腾这个了,买个接收器插上意思不大,自己做一个最好了~

    云深无际

扫码关注云+社区

领取腾讯云代金券