接着上一篇我们接着研究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. * 

*

* 下面是空调遥控器编码 * 格力空调遥控器(YB0F2)红外码组成如下,按解码顺序排列 * 起始码(S)+35位数据码+连接码(C)+32位数据码 * 各种编码的电平宽度: * 数据码由“0”“1”组成: * 0的电平宽度为:600us低电平+600us高电平, * 1的电平宽度为:600us低电平+1600us高电平 * 起始码S电平宽度为:9000us低电平+4500us高电平 * 连接码C电平宽度为:600us低电平+20000us高电平 *

* 校验码的形成机制如下: * 校验码 = [(模式 – 1) + (温度 – 16) + 5 +左右扫风+换气+节能]取二进制后四位,再逆序; *

* 例如:如果需要设置一下的状态,模式4,30℃,左右扫风,换气关闭,节能关闭,那么校验码为: * (4 – 1)+(30-16)+5+1+0+0= 23,二进制为10111,取低四位为0111,逆序后为1110 *

* 为了方便编码,在编码时可以正序,解码端再逆序,解码的时候先解码低字节,再解码高字节的位。 * 另外定时数据对最后的校验码的影响没有测试,因为很少会用到这个功能。 */public class CodeCommand { //编码规则 //起始码S电平宽度为:9000us低电平+4500us高电平 public static final int startdown = 9000; public static final int startup = 4500; //连接码C电平宽度为:600us低电平+20000us高电平 public static final int connectdown = 600; public static final int connectup = 20000; //数据码由0,1组成: //0的电平宽度为:600us低电平+600us高电平, public static final int zerodown = 600; public static final int zeroup = 600; //1的电平宽度为:600us低电平+1600us高电平 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,//1-3 onedown, oneup, zerodown, zeroup, zerodown, zeroup,//4-6 onedown, oneup, zerodown, zeroup, zerodown, zeroup,//7-9 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//10-12 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//13-15 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//16-18 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//19-21 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//22-24 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//25-27 zerodown, zeroup, onedown, oneup, zerodown, zeroup,//28-30 onedown, oneup, zerodown, zeroup, zerodown, zeroup,//31-33 onedown, oneup, zerodown, zeroup,//34-35 前35位数据码结束 connectdown, connectup,//连接码 后32位开始 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//36-38 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//39-41 zerodown, zeroup, zerodown, zeroup, onedown, oneup,//42-44 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//45-47 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//48-50 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//51-53 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//54-56 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//57-59 zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//60-62 zerodown, zeroup, //63 zerodown, zeroup, onedown, oneup,zerodown, zeroup, onedown, oneup,//64-67(四位检验码)后32位结束 };}

3、构造主界面调用上面咱们配置好的数组 布局就自己加吧超级简单的

//需要api大于19与下面if判断用途类似@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();    }    //初始化UI    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() {        //获取ConsumerIrManager实例        IR = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);        //如果sdk版本大于4.4才进行是否有红外的功能(手机的android版本)        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",";        }        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、跑起来效果如下

5、源码下载地址
http://download.csdn.net/detail/gywuhengy/9860555

6、继续关注哟,小编马上推出、关于空调遥控器的完整版(功能)
详情见下一篇 android 空调遥控器——遥控器基本版

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android(安卓)Studio实现简单的购物商城界面
  3. Android(安卓)中 MVC 的简单理解
  4. android 解析并显示dicom文件的数据和图像
  5. Android报表解决方案 使用开源组件iChartjs(二)
  6. Unity3D 游戏引擎之游戏场景的切换与持久化简单数据的储存(十四)
  7. Android(安卓)Canvas练习(7)绘制欧冠八强防守&控制率数据对比图
  8. Android内、外存储 易混淆点剖析【/mnt/sdcard、/storage/sdcard
  9. SQLite轻量级数据库的注意事项

随机推荐

  1. Android(安卓)让adb logcat打印内核调试
  2. android学习笔记一(基础篇)
  3. GridView翻页
  4. Android绘制流程窗口启动流程分析(中)
  5. android在view.requestFocus(0)返回false
  6. android模拟器——Genymotion 如何安装AP
  7. com android phone crash 手机已停止运行
  8. 【Android自动化打包】01. aapt的用法
  9. Android(安卓)使用selector设置button字
  10. Android(安卓)项目中设置背景图片