关于安卓发射红外信号请看:点击打开链接
一、简单介绍红外基础
1.首先要在App工程的AndroidManifest.xml中补充红外权限配置
android:name="android.permission.TRANSMIT_IR" /> android:name="android.hardware.ConsumerIrManager" />
其次在代码中初始化红外遥控的管理器,注意红外遥控功能从Android4.4之后才开始支持。
红外遥控的管理类名ConsumerIrManager
常用方法如下:
hasIrEmitter : 检查设备是否拥有红外发射器。返回true表示有,返回false表示没有。
getCarrierFrequencies : 获得可用的载波频率范围。
transmit : 发射红外信号。
第一个参数为信号频率,单位赫兹(Hz),家用电器的红外频率通常使用38000Hz;
第二个参数为整型数组形式的信号格式。
2.美的的红外采用NEC格式的R05d
该协议的红外信号编码格式为:引导码+客户码+客户反码+数据码+数据反码+结束位,
其中引导码和结束码都是固定的,数据反码由数据码按位取反得来,真正变化的只有用户码和数据码。
3.可是前述的transmit方法,参数要传递整型数组形式的信号,并不是二进制数,这意味着二进制数还得转换成整型数组。
那么整型数组里面存放的到底是些什么数据呢?
这就要从数字电路中的电平说起了。电平是“电压平台”的简称,指的是电路中某一点电压的高低状态,在数字电路中常用高电平表示“1”,用低电平表示“0”。
遥控器发射红外信号之时,通过“560微秒低电平+1680微秒高电平”代表“1”,通过“560微秒低电平+560微秒低电平”代表“0”。于是编写Android代码的时候,使用“560,1680”表示二进制的1,使用“560,560”表示二进制的0。(此处的560和1680只是大概的数值,也可使用580、600替换560,或者使用1600、1650替换1680。)
4.举例
用户码:4055,对应的二进制数:0100 0000 0101 0101;
数据码:44,对应的二进制数为0100 0100,
数据反码:按位取反得到数据反码的二进制数为1011 1011。
根据数字电路的电平规则,用户码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”。
具体的数组数值如下所示:
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方法传递格式参数,示例如下:
transmit.transmit(38000, pattern); // 普通家电的红外发射频率一般为38KHz
二、美的协议解析
美的说明书下载:点击打开链接
这里只简单介绍开关机
L为引导码,
S为分隔码,
A为认别码(A=10110010=B2,预留方案时A=10110111=B7),
A'为A的反码,
B'为B的反码,
C'为C的反码
B |
C |
|||
B7 B6 B5 |
B4 B3 B2 B1 B0 |
C7 C6 C5 C4 |
C3 C2 |
C1 C0 |
风 速 (见表1) |
1 1 1 1 1 |
温 度 (见表2) |
模 式 (见表3) |
0 0 |
风 速 |
B7 B6 B5 |
|
温 度 |
C7 C6 C5 C4 |
|
自 动 |
1 0 1 |
17℃ |
0000 |
||
低 风 |
1 0 0 |
18℃ |
0001 |
||
中 风 |
0 1 0 |
19℃ |
0011 |
||
高 风 |
0 0 1 |
20℃ |
0010 |
||
固定风 |
0 0 0 |
21℃ |
0110 |
||
注: 在抽湿.自动模式及自动模式 下的经济运行,风量应为固定风,即: B7,B6,B5=000 制冷及制热时的经济运行,风量为自 动风,即: B7,B6,B5=101 |
22℃ |
0111 |
|||
23℃ |
0101 |
||||
24℃ |
0100 |
||||
25℃ |
1100 |
||||
26℃ |
1101 |
||||
表3(模式) |
27℃ |
1001 |
|||
28℃ |
1000 |
||||
模式 |
C3 C2 |
29℃ |
1010 |
||
自动 |
10 |
30℃ |
1011 |
||
制冷 |
00 |
无定义 |
1110 |
||
抽湿 |
01 |
注:
在只送风模式, C7,C6,C5,C4=1110 |
|||
制热 |
11 |
||||
送风 |
01 |
||||
注:送风和抽湿模式代码一样,但抽 湿模式有温度代码,而送风模式无。 |
开机编码:L,A,A',B,B',C,C', S, L,A,A',B,B',C,C'
/*开机 * L,A,A',B,B',C,C', S, L,A,A',B,B',C,C' * L 4.4 4.4 * A :1011 0010 * A':0100 1101 * B :0001 1111 固定風 * B':0100 0000 * C :1101 1000 26°自动模式 * C':1111 0111 * S :0.54 5.22 * */
关机编码:(与模式、温度、风速等无关)
L,A,A',B,B',C,C', S, L,A,A',B,B',C,C', S, L,A,A',Q,Q',Y,Y'
Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 |
小时时刻 |
Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 |
分钟时刻 |
0 0 0 0 0 0 0 0 |
0 |
0 0 0 0 0 0 0 0 |
0 |
0 0 0 0 0 0 0 1 |
1 |
0 0 0 0 0 0 0 1 |
1 |
0 0 0 0 0 0 1 0 |
2 |
0 0 0 0 0 0 1 0 |
2 |
0 0 0 0 0 0 1 1 |
3 |
0 0 0 0 0 0 1 1 |
3 |
0 0 0 0 0 1 0 0 |
4 |
0 0 0 0 0 1 0 0 |
4 |
…… |
…… |
…… |
…… |
0 0 0 1 1 0 0 0 |
24 |
0 0 0 1 1 0 0 0 |
24 |
|
|
…… |
…… |
|
|
0 0 1 1 1 1 0 0 |
60 |
/* * 关机编码:(与模式、温度、风速等无关)关机编码:(与模式、温度、风速等无关) * L,A,A',B,B',C,C', S, L,A,A',B,B',C,C', S, L,A,A',Q,Q',Y,Y' * L 4.4 4.4 * A=1011 0010 * a=0100 1101 * B=0111 1011 * b=1000 0100 * C=1110 0000 * c=0001 1111 * S :0.54 5.22 * Q:0000 0000-0 0h * Y:0000 0000-0 0m * */
补充:
三、部分红外编码代码
开机数据:
int zeroLow = 559; int zeroHigh = 531; int oneLow = 561; int oneHigh = 1578; // 一种交替的载波序列模式,通过毫秒测量,发射红外, pattern要和所用的红外码对应 //先打开1000微秒再关闭500微秒int[] pattern = { 1000,500,1000,1000 }; //脚码偶数 开 奇数 关 //开对应的是示波器上的低电平,关对应的高电平
int[] back = { 4400,4400, //L //1011 0010 A oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh,oneLow,oneHigh, zeroLow,zeroHigh,zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh, //A //0100 1101 a zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, oneLow,oneHigh,oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh, //A' //1011 1111 B oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh,oneLow,oneHigh, oneLow,oneHigh,oneLow,oneHigh,oneLow,oneHigh,oneLow,oneHigh, //B //0100 0000 b zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, //B' //1011 1111 C zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, //C //0100 0000 c zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,//C' 540,5220, //S 4400,4400, //L //1011 0010 A oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh,oneLow,oneHigh, zeroLow,zeroHigh,zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh, //A //0100 1101 a zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, oneLow,oneHigh,oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh, //A' //1011 1111 B oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh,oneLow,oneHigh, oneLow,oneHigh,oneLow,oneHigh,oneLow,oneHigh,oneLow,oneHigh, //B //0100 0000 b zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, //B' //1011 1111 C zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, //C //0100 0000 c zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh, zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,//C' 540 //end };