android 空调遥控器——简单发送内容
![]()
接着上一篇我们接着研究android红外开发,本篇我们以网上最开源的格力空调编码开始研究,好了废话不多说,开搞!!
1、首先我们先来了解一下格力空调的编码格式 这个网上都有
格力空调遥控器(YB0F2)红外码组成如下,按解码顺序排列
起始码(S)+35位数据码+连接码(C)+32位数据码
各种编码的电平宽度:
数据码由“0”“1”组成:
0的电平宽度为:600us低电平+600us高电平,
1的电平宽度为:600us低电平+1600us高电平
起始码S电平宽度为:9000us低电平+4500us高电平
数据码看下图
![这里写图片描述]()
![这里写图片描述]()
![这里写图片描述]()
大概了解这些乱糟糟的编码之后大家县里都有一个疑问,有个蛋用,别急小编给大家一点点 拿形象点的数字拼接起来
2、数据拼接
(四个部分:起始码+35数据码+连接码+32数据码
分别:1位+35位+1位+32位=69位X2=138个时间)(每位由一个高和一个低组成)
由于这个属于命令编码 在好多地方都能用得到,我们就新建一个类把它拿出来如下: 代码里面注释很清楚了自己看下
package com.gaoyu.smarttools.date;
/**
* Created by ${高宇} on 17/6/3.
* <p>
* <p>
* 下面是空调遥控器编码
* 格力空调遥控器(YB0F2)红外码组成如下,按解码顺序排列
* 起始码(S)+35位数据码+连接码(C)+32位数据码
* 各种编码的电平宽度:
* 数据码由“0”“1”组成:
* 0的电平宽度为:600us低电平+600us高电平,
* 1的电平宽度为:600us低电平+1600us高电平
* 起始码S电平宽度为:9000us低电平+4500us高电平
* 连接码C电平宽度为:600us低电平+20000us高电平
* <p>
* 校验码的形成机制如下:
* 校验码 = [(模式 – 1) + (温度 – 16) + 5 +左右扫风+换气+节能]取二进制后四位,再逆序;
* <p>
* 例如:如果需要设置一下的状态,模式4,30℃,左右扫风,换气关闭,节能关闭,那么校验码为:
* (4 – 1)+(30-16)+5+1+0+0= 23,二进制为10111,取低四位为0111,逆序后为1110
* <p>
* 为了方便编码,在编码时可以正序,解码端再逆序,解码的时候先解码低字节,再解码高字节的位。
* 另外定时数据对最后的校验码的影响没有测试,因为很少会用到这个功能。
*/
public class CodeCommand {
public static final int startdown = 9000;
public static final int startup = 4500;
public static final int connectdown = 600;
public static final int connectup = 20000;
public static final int zerodown = 600;
public static final int zeroup = 600;
public static final int onedown = 600;
public static final int oneup = 1600;
public static final int[] auto = {
startdown, startup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
onedown, oneup, zerodown, zeroup, zerodown, zeroup,
onedown, oneup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, onedown, oneup, zerodown, zeroup,
onedown, oneup, zerodown, zeroup, zerodown, zeroup,
onedown, oneup, zerodown, zeroup,
connectdown, connectup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, onedown, oneup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,
zerodown, zeroup,
zerodown, zeroup, onedown, oneup,zerodown, zeroup, onedown, oneup,
};
}
3、构造主界面调用上面咱们配置好的数组 布局就自己加吧超级简单的
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public class InfraredActivity extends BaseActivity implements View.OnClickListener {
private ConsumerIrManager IR;
private TextView tv_detail;
private Button btn_AirConditioner_GL;
boolean IRBack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_infrared);
inItEvent();
inItUI();
}
private void inItUI() {
tv_detail = (TextView) findViewById(R.id.tv_detail);
btn_AirConditioner_GL = (Button) findViewById(R.id.btn_AirConditioner_GL);
btn_AirConditioner_GL.setOnClickListener(this);
}
private void inItEvent() {
IR = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
IRBack = IR.hasIrEmitter();
if (!IRBack) {
showToast("对不起,该设备上没有红外功能!");
} else {
showToast("红外设备就绪");
}
}
}
/**
* 发射红外信号
* 可以查看这个标签的log ConsumerIr
* @param carrierFrequency 红外传输的频率,一般的遥控板都是38KHz
* @param pattern 指以微秒为单位的红外开和关的交替时间
*/
private void sendMsg(int carrierFrequency, int[] pattern) {
IR.transmit(carrierFrequency, pattern);
showToast("发送成功");
String content = null;
for(int i = 0;i<pattern.length;i++){
content += String.valueOf(pattern[i])+",";
}
tv_detail.setText(content+"\n"+(pattern.length)+"个时间数据");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_AirConditioner_GL:
if (IRBack) {
sendMsg(38000, CodeCommand.auto);
} else {
showToast("对不起,该设备上没有红外功能!");
}
break;
}
}
}
4、跑起来效果如下
![这里写图片描述]()
原文地址http://www.bieryun.com/2889.html