一、红外遥控

红外遥控技术是通过红外技术、红外通信技术和遥控技术的结合实现的一种无线控制技术。由于红外线的波长较短,对障碍物的衍射能力较差,无法穿透墙壁,所以红外遥控术更适合应用在短距离直线控制的场合,也正是这样,放置在不同房间的家用电器可使用通用的遥控器而不会产生相互干扰。

红外遥控所需传输的数据量较小,一般仅为几个至几十个字节的控制码,传输距离一般小于 10 米,因其功耗小、成本低、易实现等诸多优点,被广泛应用于电视机、机顶盒、DVD 播放器、功放、空调等家用电器的遥控。

二、手机红外遥控功能

部分智能手机都配置了是红外遥控功能(即安装红了外发射器)。那么,安装了红外发射器的智能手机,可以拿来当遥控器使用,还能一部手机遥控许多家电。具有红外功能的智能手机的顶部,有的镶嵌一个或多个小灯泡,有的是一小片黑色盖子,这个黑盖子对红外线来说可是透明的,只是人的肉眼看不穿它。红外遥控带着灯泡就像一支手电筒,红外光照到哪里,哪里的电器才会接收响应,这决定了红外遥控的三个特性:

  1. 遥控器要对准电器才有反应。
  2. 遥控器不能距离电器太远,最好是五米之内。
  3. 遥控器与电器之间不能有障碍物。

安装了红外发射器的手机,可以拿来当遥控器使用,还能一部手机遥控许多家电,这就需要破解电器的信号编码了。

三、红外发射原理简介

通用红外遥控系统主要由发射和接收两大部分组成。发射部分包括单片机芯片或红外遥控发射专用芯片实现编码和调制,红外发射电路实现发射;接收部分包括一体化红外接收头电路实现接收和解调,单片机芯片实现解码。红外遥控发射专用芯片非常多,编码及调制频率也不完全一样。手机实现红外遥控功能,主要就是发射红外信号部分,这就需要了解下红外信号的编码和调制原理。

3.1.红外遥控二进制信号的编码

红外遥控器发射的信号由一串「0」和「1」的二进制代码组成,不同的芯片对「0」和「1」的编码有所不同,通常有曼彻斯特 (Manchester) 编码和脉冲宽度编码 (PWM)。家用电器使用的红外遥控器绝大部分都是脉冲宽度编码,如下图所示:

3.2.红外遥控二进制信号的调制

二进制信号的调制由发送单片机芯片或红外遥控发射专用芯片来完成,把编码后的二进制信号调制成频率为 38kHz 的间断脉冲串,相当于用二进制信号的编码乘以频率为38kHz 的脉冲信号得到的间断脉冲串,即是调制后用于红外发射二极管发送的信号。通用红外遥控器里面常用的红外遥控发射专用芯片载波频率为 38kHz,这是由发射端所使用的 455kHz 陶瓷晶振来决定的。在发射端对晶振进行整数分频,分频系数一般取 12 所以 455kHz ÷ 12 ≈ 37.9kHz ≈ 38kHz。

四、 NEC编码协议

在红外开发中,可能最重要的就是发送二进制信号的编码协议了,各个厂家所使用的编码协议不同,所以遥控器也不能相互控制,而即使编码协议相同,使用的用户码不同,也不能被接收端接受。所以类似万能遥控器这种应用,第一个要解决的问题就是各类家用电器,各类厂家所使用的编码协议以及所使用的用户码等。但各类电器众多,这种应用是很难兼容全的,有的大厂家会将自家产品的编码及对应功能键的数据序列公布在网上,方便其他开发者开发,至于其他没有公布的,可能就要使用红外解码仪来破解它所使用的协议以及各功能键对应的数据码等。

在日常家用电器中,NEC 编码是比较常见的一种编码协议, 通用红外遥控器发出的一串二进制代码按功能可以分为分「引导码、用户码 16 位、数据码 8 位、数据反码 8 位和结束位」,编码共占 32 位,如下图2所示:

其中引导码由一个 9ms 的 38kHz 载波起始码和一个 4.5ms 的无载波低电平结果码组成。用户码由低 8 位和高 8 位组成 (用户码高八位和低八位可采用原码与反码的方式,可用于纠错,但也可直接是 16 位的原码方式),不同的遥控器有不同的用户码,避免不同设备产生干扰,用户码又称为地址码或系统码。数据码采用原码和反码方式重复发送,编码时用于对数据的纠错,遥控器发射编码时,低位在前,高位在后。结束位是 0.56ms 的 38kHz 载波。而其中的「0」码由 0.56ms 的 38kHz 载波和 0.56ms 的无载波低电平组合而成,脉冲宽度为 1.125ms,「1」码由 0.56ms 的 38kHz 载波和 1.69ms 的无载波低电平组合而成,脉冲宽度为 2.25ms,如下图所示:

五、红外遥控器解码

红外遥控器的解码仪能够分析常见家电的红外遥控信号,下面两种除外:
1、空调遥控器,空调的控制比较复杂,光光温度就可能调节十几次,难以破解。
2、灯光遥控器,灯本身发光发热,同时也会散发大量红外线,势必对外部的红外信号造成严重干扰;所以灯只能采取射频遥控器。

红外解码仪是家电维修人员的必备仪器,常用于检测遥控器能否正常工作,开发者为了让手机实现遥控功能,也要利用解码仪捕捉每个按键对应的红外信号,红外信号由三部分组成,分别是:

  1. 用户码,表示厂商代号,每个厂家都有自己的唯一代号;
  2. 数据码,表示按键的编号,不同的数据码代表不同的按键;
  3. 电路格式,表示红外信号的编码协议,每种协议都有专门的指令格式。

比如说电路61212表示的是NEC6121协议,该协议的红外信号编码格式为:引导码+用户码+数据码+数据反码+结束码,其中引导码和结束码都是固定的,数据反码由数据码按位取反得来,真正变化的只有用户码和数据码。

六、 Android红外遥控功能开发

1、红外权限配置

在App工程的AndroidManifest.xml中补充红外权限配置

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

2、红外功能API

红外遥控功能从Android4.4之后才开始支持,对应的管理类名叫ConsumerIrManager,常用的三个方法分别是:

  • hasIrEmitter (): 用于检查设备是否具有红外发射器。返回true表示有,返回false表示没有。

  • getCarrierFrequencies() : 获得红外发射器可用的载波频率范围。

  • transmit (int carrierFrequency, int[] pattern) : 用于发射红外信号。
    第一个参数为信号频率,单位赫兹(Hz),家用电器的红外频率通常使用38000Hz;第二个参数为整型数组形式的信号格式。

下边是一个封装好的红外遥控管理类

 import android.annotation.TargetApi;import android.content.Context;import android.os.Build;@TargetApi(Build.VERSION_CODES.KITKAT)public class ConsumerIrManagerApi {private static ConsumerIrManagerApi instance;private static android.hardware.ConsumerIrManager service;private ConsumerIrManagerApi(Context context) {//Android4.4才开始支持红外功能if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){// 获取系统的红外遥控服务service = (android.hardware.ConsumerIrManager) context.getApplicationContext().getSystemService(Context.CONSUMER_IR_SERVICE);}}public static ConsumerIrManagerApi getConsumerIrManager(Context context){if(instance == null){instance = new ConsumerIrManagerApi(context);}return instance;}/*** 手机是否有红外功能* @return*/public static boolean hasIrEmitter() {//android4.4及以上版本&有红外功能if(service!=null){return service.hasIrEmitter();}//android4.4以下及4.4以上没红外功能return false;}/*** 发射红外信号* @param carrierFrequency 红外频率* @param pattern*/public static void transmit(int carrierFrequency, int[] pattern) {if(service!=null){service.transmit(carrierFrequency, pattern);}}/*** 获取可支持的红外信号频率* @return*/public static android.hardware.ConsumerIrManager.CarrierFrequencyRange[] getCarrierFrequencies() {if(service!=null){return service.getCarrierFrequencies();}return null;}}

3、码值编码

上文提到过,一般家用电器遥控器的频率是38000,核心就在transmit()方法的信号编码参数上,上文第5部分提到过,编码由“引导码(9ms+4.5ms)+用户编码(高八位)+用户编码(低八位)+键数据码+键数据反码+结束码”组成,然后按照一定的编码规则,合成数组的形式。以NEC6122协议举例,引导码都是固定的(9000+4500),结束码即停止位可以按照(560,2000),不同遥控器差别主要在于用户码和数据码,同一个遥控器的用户码是一样的,不同按键有不同的码值,码值可以转换出对应的数据码和数据反码,以下面的遥控器码值举例。

用户码是0X08E6,按键2对应的码值是0X41,码值都是十六进制表示的,转化为二进制,用户码高八位08为00001000,用户码低八位E6为11100110,数据码41为01000001,数据反码为10111110。

由于手机与遥控器的信号编码有区别,需要逆序编码。逆序编码后,用户码高八位为00010000,用户码低八位为01100111,数据码为10000010,数据反码为01111101。

编码转换完成,但是transmit方法,参数要传递整型数组形式的信号,并不是二进制数而是电平信号数据。电平是电路中某一点电压的高低状态,在数字电路中常用高电平表示“1”,用低电平表示“0”。根据上文第四部分图三可以看出,遥控器发射红外信号之时,通过“560us低电平+1690us高电平”代表“1”,通过“560us低电平+565us低电平”代表“0”。于是编写Android代码的时候,使用“560,1690”表示二进制的1,使用“560,565”表示二进制的0,具体数组值如下所示:

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

具体这些转换工作用代码写出,如下:

 import java.util.ArrayList;import java.util.List;/*** Copyright  : huangr* Created by huangr on 2019/8/8.* ClassName  : NecPattern* Description  : 构造NEC协议的pattern编码*/public class NecPattern {//引导码private static final int startH = 9000;private static final int startL = 4500;//结束码private static final int endL = 560;private static final int endH = 2000;//高电平private static final int high8 = 560;//低电平0:1125private static final int low0 = 565;//低电平1:2250private static final int low1 = 1690;private static int[] pattern;private static List<Integer> list = new ArrayList<>();/*** 正常发码:引导码(9ms+4.5ms)+用户编码(高八位)+用户编码(低八位)+键数据码+键数据反码+结束码*/public static int[] buildPattern(int userCodeH, int userCodeL, int keyCode) {//用户编码高八位00String userH = constructBinaryCode(userCodeH);//用户编码低八位DFString userL = constructBinaryCode(userCodeL);//数字码String key = constructBinaryCode(keyCode);//数字反码String keyReverse = constructBinaryCode(~keyCode);list.clear();//引导码list.add(startH);list.add(startL);//用户编码changeAdd(userH);changeAdd(userL);//键数据码changeAdd(key);//键数据反码changeAdd(keyReverse);//结束码list.add(endL);list.add(endH);int size = list.size();pattern = new int[size];for (int i = 0; i < size; i++) {pattern[i] = list.get(i);}return pattern;}/*** 十六进制键值转化为二进制串,并逆转编码* @param keyCode* @return*/private static String constructBinaryCode(int keyCode) {String binaryStr = convertToBinary(keyCode);char[] chars = binaryStr.toCharArray();StringBuffer sb = new StringBuffer();for (int i = 7; i >= 4; i--) {sb.append(chars[i]);}for (int i = 3; i >= 0; i--) {sb.append(chars[i]);}return sb.toString();}/*** 数字转换为长度为8位的二进制字符串* @return*/private static String convertToBinary(int num) {String binary = Integer.toBinaryString(num);StringBuffer sb8 = new StringBuffer();//每个元素长度为8位,不够前面补充0if (binary.length() < 8) {for (int i = 0; i < 8 - binary.length(); i++) {sb8.append("0");}String binaryStr8 = sb8.append(binary).toString();return binaryStr8;}else{String binaryStr8 = binary.substring(binary.length() - 8);return binaryStr8;}}/*** 二进制转成电平** @param code*/public static void changeAdd(String code) {int len = code.length();String part;for (int i = 0; i < len; i++) {list.add(high8);part = code.substring(i, i + 1);if (part.equals("0"))list.add(low0);elselist.add(low1);}}}

4、使用

在需要发射红外信号处调用如下:

 /*** 按下按键发射红外信号*/public void transmit() {ConsumerIrManagerApi.transmit(38000,NecPattern.buildPattern(NecPattern.buildPattern(0X08,0XE6, 0X41));}

红外遥控及Android手机红外遥控器开发相关推荐

  1. Android手机红外开发—点击和长按事件

    上一篇文章<红外技术及Android手机红外遥控器开发>中简单介绍了红外遥控技术和Android 手机红外遥控开发操控中的点击事件,只需要按照编码协议规则对键值等进行编码解析,最后转化成数 ...

  2. Android手机系统软件apk开发制作

    Android手机系统软件apk开发制作 随着Android安卓系统的日益广泛使用,越来越多人发现手机潜在的力量,当然手机应用软件app的朝阳也随之并进,手机app软件潜在着无线巨大的发展空间和利益金 ...

  3. android开发2021,2021年高校邦Android手机软件快速开发App Inventor【2021秋】满分答案...

    2021年高校邦Android手机软件快速开发App Inventor[2021秋]满分答案 更多相关问题 <模仿:西方文学中的现实的再现>作者是:A.霍布斯B.阿多诺C.奥尔巴赫D.米勒 ...

  4. Android 手机红外遥控器实现(转)

    源:http://www.cnblogs.com/xiaochao1234/p/3615467.html 经过连续几天的编制,安卓手机代码终于完成了,目前已经将我宿舍,家里,集控室的红外遥控电气设备完 ...

  5. android 手机红外遥控器

    原文地址:http://blog.csdn.net/zhangxy0605/article/details/74344345 现在红外遥控的使用越来越多,android 手机基本都带有红外,自己可以写 ...

  6. Android 手机红外遥控器实现

    连续几天的努力,终于把红外遥控弄懂,可以控制红外小车了.终于完工了~~ 1.权限: android.permission.TRANSMIT_IR 2.发射红外代码 大多数的家用电器红外遥控编码为NEC ...

  7. Android 手机浏览器的开发

    最近看android资料,随手写了个简单手机浏览器应用,该应用很简单,主要包括AutoCompleteTextView .WebView.Button控件,但是涉及到了很多android开发常识,例如 ...

  8. Android手机记账应用开发视频教程

    基于Android平台的手机记账应用开发全程实录(Activity间数据传递.SQLiteDatabase.AsyncTask) 课程分类:Android 适合人群:中级 课时数量:26课时 用到技术 ...

  9. android手机百度地图开发

    最近在做android手机上的地图开发,我们选用百度地图进行开发. 1.百度资源下载及参考文档 http://developer.baidu.com/map/sdk-android.htm 里面的开发 ...

最新文章

  1. java创建oracle用户_oracle添加用户并指定数据库
  2. 【SpringBoot】SpringBoot+druid+Myibatis集成
  3. VMware workstation9 Virtual Machine Network
  4. 【BZOJ 1497】 [NOI2006]最大获利
  5. java读取局域网种大华摄像机信息
  6. Docker搭建酷q机器人
  7. 看完这篇文章,小白也能快速安装谷歌服务框架(GApps)!
  8. HTML5基础知识2
  9. 董明珠“跳槽不用” VS雷军“复仇者联盟”,人才在内还是在外?
  10. 新浪微博开发者创新基金开始接受申请
  11. 【超级表格创业谱】王庆刚:你的岗位有没有辜负你的才华?
  12. WebSpider简介
  13. xxlJob定时任务,文章的上下架
  14. 追踪邮件发送者的地理位置
  15. 毕业设计-基于大数据的移动图书馆个性化推荐系统-python
  16. 2012年桂城街道小学毕业生升初中
  17. Linux/Unix开发之make和makefile详解
  18. numpy ndarray嵌套ndarray浅显理解
  19. Java -- 用文本文档写代码
  20. 发展认知科学EEG研究: 新视角与挑战

热门文章

  1. 免费远程协助软件,可以手机控制电脑,电脑控制电脑!
  2. Python代码写一个玫瑰花
  3. spring相关:spring介绍与两大核心容器
  4. 基本光照与阴影(一)
  5. 系统迁移后无法正常开机相关心得
  6. python: xlsx表格转为csv文件
  7. 恢复chrome书签
  8. 2022茶艺师(初级)考试模拟100题模拟考试平台操作
  9. static final常量变量的正确书写规范
  10. 文琼书斋 v3.1 绿色