android 空调遥控器——遥控器基本版(功能全部实现)

小编接着上一篇博客接着说咱们的空调遥控器,上一篇讲了基本的发送一个指令,这次小编给大家带来了,android基于红外的空调遥控器的完整版,基本实现了对格力空调的完全控制,(源代码已经,在我的资源处给出了大家可以点击链接下载http://download.csdn.net/detail/gywuhengy/9865590)不说了 上图: 
这是第一张 关闭状态: 
这里写图片描述

第二张:开机 
这里写图片描述

第三张:简单的切换模式 调整温度: 
这里写图片描述

2.原理 ,实现已经在代码里面说的很清楚了,大家自己看一下吧(主要贴出功能代码,布局自己在源码里面看吧)

空调遥控器 主fragment

package com.gaoyu.smarttools.fragment;

import android.content.Context;
import android.graphics.Typeface;
import android.hardware.ConsumerIrManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.gaoyu.smarttools.R;
import com.gaoyu.smarttools.bean.AirBean;
import com.gaoyu.smarttools.date.CodeCommand;

import static android.content.Context.CONSUMER_IR_SERVICE;

/**
 * Created by ${高宇} on 17/6/5.
 */
//需要api大于19与下面if判断用途类似
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public class AirConditionerFragment extends Basefragment implements View.OnClickListener {
    //获取红外控制类
    private ConsumerIrManager IR;
    //判断是否有红外功能
    boolean IRBack;

    private View view;
    private TextView tempShow, airWindDir, windDirAuto, windSpeed, modeShow;
    private ImageView modeCold, modeWatted, modeAuto, modeSupply, modeHeating;
    //开关、度数、模式、自动手动、风向、风量
    private AirBean airBean = new AirBean(0, 25, 0, 0, 0, 0);


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_air, container, false);
        inItEvent();
        inItUI();
        return view;
    }


    //初始化事务
    private void inItEvent() {
        //获取ConsumerIrManager实例
        IR = (ConsumerIrManager)getActivity().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("红外设备就绪");//可进行下一步操作
            }
        }
    }

    //初始化UI
    private void inItUI() {

        //按钮设置

        DisplayMetrics dm = getResources().getDisplayMetrics();
        int screenWidth = dm.widthPixels / 4;
        int screenHeight = dm.heightPixels / 10;
        Log.e("gaoyu", "宽高" + screenWidth + screenHeight);

        Button air_power = (Button) view.findViewById(R.id.btn_air_power);
        air_power.setOnClickListener(this);
        air_power.setWidth(screenWidth);
        air_power.setHeight(screenHeight);

        Button air_mode = (Button) view.findViewById(R.id.btn_air_mode);
        air_mode.setOnClickListener(this);
        air_mode.setWidth(screenWidth);
        air_mode.setHeight(screenHeight);


        Button air_tempadd = (Button) view.findViewById(R.id.btn_air_up);
        air_tempadd.setOnClickListener(this);
        air_tempadd.setWidth(screenWidth);
        air_tempadd.setHeight(screenHeight);

        Button air_tempsub = (Button) view.findViewById(R.id.btn_air_down);
        air_tempsub.setOnClickListener(this);
        air_tempsub.setWidth(screenWidth);
        air_tempsub.setHeight(screenHeight);

        Button air_wind_auto_dir = (Button) view.findViewById(R.id.btn_air_auto);
        air_wind_auto_dir.setOnClickListener(this);
        air_wind_auto_dir.setWidth(screenWidth);
        air_wind_auto_dir.setHeight(screenHeight);

        Button air_wind_count = (Button) view.findViewById(R.id.btn_air_count);
        air_wind_count.setOnClickListener(this);
        air_wind_count.setWidth(screenWidth);
        air_wind_count.setHeight(screenHeight);

        Button air_wind_dir = (Button) view.findViewById(R.id.btn_air_direction);
        air_wind_dir.setOnClickListener(this);
        air_wind_dir.setWidth(screenWidth);
        air_wind_dir.setHeight(screenHeight);

        //显示设置
        Context context = getContext();
        Typeface type = Typeface.createFromAsset(context.getAssets(), "fonts/lcd.TTF");
        tempShow = (TextView) view.findViewById(R.id.temp_show);
        tempShow.setTypeface(type);

        modeShow = (TextView) view.findViewById(R.id.text_mode);
        windSpeed = ((TextView) view.findViewById(R.id.text_wind_speed));
        airWindDir = ((TextView) view.findViewById(R.id.wind_dir));
        windDirAuto = ((TextView) view.findViewById(R.id.wind_dir_auto));

        modeCold = (ImageView) view.findViewById(R.id.image_cold);
        modeWatted = (ImageView) view.findViewById(R.id.image_watted);
        modeAuto = (ImageView) view.findViewById(R.id.image_auto);
        modeSupply = (ImageView) view.findViewById(R.id.image_supply);
        modeHeating = (ImageView) view.findViewById(R.id.image_heating);

    }

    /**
     * 点击处理
     *
     * @param v
     */
    @Override
    public void onClick(View v) {
        //五中模式
        int data;
        //关机状态
        if(IRBack == false){
            showToast("无红外设备!");
            return;
        }
        if (airBean.getmPower() == 0x00 && v.getId() != R.id.btn_air_power) {
            return;
        }

        switch (v.getId()) {

            case R.id.btn_air_mode:
                data = airBean.getmMode();
                data++;
                if (data > 4) {
                    data = 0;
                }
                airBean.setmMode(data);
                SendMsg(airBean);
                break;
            case R.id.btn_air_power:

                if (airBean.getmPower() == 0) {
                    airBean.setmPower(1);
                } else {
                    airBean.setmPower(0);
                }
                //发送消息
                SendMsg(airBean);
                break;
            case R.id.btn_air_up:
                data = airBean.getmTmp();
                data++;
                if (data > 30) {
                    data = 16;
                }
                airBean.setmTmp(data);
                SendMsg(airBean);
                break;
            case R.id.btn_air_down:
                data = airBean.getmTmp();
                data--;
                if (data < 16) {
                    data = 30;
                }
                airBean.setmTmp(data);
                SendMsg(airBean);
                break;
            case R.id.btn_air_auto:
                if (airBean.getmenergy() == 0) {
                    airBean.setmenergy(1);
                } else {
                    airBean.setmenergy(0);
                }
                SendMsg(airBean);
                break;
            case R.id.btn_air_count:
                data = airBean.getmWindCount();
                data++;
                if (data > 3) {
                    data = 0;
                }
                airBean.setmWindCount(data);
                SendMsg(airBean);
                break;
            case R.id.btn_air_direction:
                data = airBean.getmWindDir();
                data++;

                if (data > 3) {
                    data = 0;
                }
                airBean.setmWindDir(data);
                SendMsg(airBean);
                break;
            default:
                break;
        }
        //不论点击了什么 都要更新UI
        updataAirUI(airBean);
    }


    @Override
    public void onStart() {
        super.onStart();
        updataAirUI(airBean);
    }

    /**
     * 更新UI
     *
     * @param airBean_ui
     */
    public void updataAirUI(AirBean airBean_ui) {

        if (airBean_ui.getmPower() == 0x01) {

            if (airBean_ui.getmMode() == 0x00) {

                modeShow.setText(getString(R.string.air_mode_val)
                        + getString(R.string.air_mode_value_1));
                modeCold.setVisibility(View.INVISIBLE);
                modeWatted.setVisibility(View.INVISIBLE);
                modeAuto.setVisibility(View.VISIBLE);
                modeSupply.setVisibility(View.INVISIBLE);
                modeHeating.setVisibility(View.INVISIBLE);
                tempShow.setText(String.valueOf(airBean_ui.getmTmp())
                        + getResources().getString(R.string.degree));
            }
            if (airBean_ui.getmMode() == 0x01) {
                modeCold.setVisibility(View.VISIBLE);
                modeWatted.setVisibility(View.INVISIBLE);
                modeAuto.setVisibility(View.INVISIBLE);
                modeSupply.setVisibility(View.INVISIBLE);
                modeHeating.setVisibility(View.INVISIBLE);
                modeShow.setText(getString(R.string.air_mode_val)
                        + getString(R.string.air_mode_value_2));
                tempShow.setText(String.valueOf(airBean_ui.getmTmp())
                        + getResources().getString(R.string.degree));
            }
            if (airBean_ui.getmMode() == 0x02) {
                modeCold.setVisibility(View.INVISIBLE);
                modeWatted.setVisibility(View.VISIBLE);
                modeAuto.setVisibility(View.INVISIBLE);
                modeSupply.setVisibility(View.INVISIBLE);
                modeHeating.setVisibility(View.INVISIBLE);
                modeShow.setText(getString(R.string.air_mode_val)
                        + getString(R.string.air_mode_value_3));
                tempShow.setText("");
            }
            if (airBean_ui.getmMode() == 0x03) {
                modeCold.setVisibility(View.INVISIBLE);
                modeWatted.setVisibility(View.INVISIBLE);
                modeAuto.setVisibility(View.INVISIBLE);
                modeSupply.setVisibility(View.VISIBLE);
                modeHeating.setVisibility(View.INVISIBLE);
                modeShow.setText(getString(R.string.air_mode_val)
                        + getString(R.string.air_mode_value_4));
                tempShow.setText("");
            }
            if (airBean_ui.getmMode() == 0x04) {
                modeCold.setVisibility(View.INVISIBLE);
                modeWatted.setVisibility(View.INVISIBLE);
                modeAuto.setVisibility(View.INVISIBLE);
                modeSupply.setVisibility(View.INVISIBLE);
                modeHeating.setVisibility(View.VISIBLE);
                modeShow.setText(getString(R.string.air_mode_val)
                        + getString(R.string.air_mode_value_5));
                tempShow.setText(String.valueOf(airBean_ui.getmTmp())
                        + getResources().getString(R.string.degree));
            }
            if (airBean_ui.getmWindCount() == 0x00) {
                windSpeed.setText(getString(R.string.air_wind_val)
                        + getString(R.string.air_wind_count_value_1));
            } else if (airBean_ui.getmWindCount() == 0x01) {
                windSpeed.setText(getString(R.string.air_wind_val)
                        + getString(R.string.air_wind_count_value_2));
            } else if (airBean_ui.getmWindCount() == 0x02) {
                windSpeed.setText(getString(R.string.air_wind_val)
                        + getString(R.string.air_wind_count_value_3));
            } else if (airBean_ui.getmWindCount() == 0x03) {
                windSpeed.setText(getString(R.string.air_wind_val)
                        + getString(R.string.air_wind_count_value_4));
            }

            if (airBean_ui.getmWindDir() == 0x00) {
                airWindDir.setText(getString(R.string.air_wind_dir)
                        + getString(R.string.air_wind_dir_value_1));

            } else if (airBean_ui.getmWindDir() == 0x01) {
                airWindDir.setText(getString(R.string.air_wind_dir)
                        + getString(R.string.air_wind_dir_value_2));

            } else if (airBean_ui.getmWindDir() == 0x02) {
                airWindDir.setText(getString(R.string.air_wind_dir)
                        + getString(R.string.air_wind_dir_value_3));

            }

            if (airBean_ui.getmenergy() == 0x00) {
                windDirAuto.setText(getString(R.string.air_wind_auto_dir));

            } else if (airBean_ui.getmenergy() == 0x01) {
                windDirAuto.setText(getString(R.string.air_wind_auto_energy));
            }

        } else {
            modeCold.setVisibility(View.INVISIBLE);
            modeWatted.setVisibility(View.INVISIBLE);
            modeAuto.setVisibility(View.INVISIBLE);
            modeSupply.setVisibility(View.INVISIBLE);
            modeHeating.setVisibility(View.INVISIBLE);
            tempShow.setText("");
            windSpeed.setText("");
            airWindDir.setText("");
            windDirAuto.setText("");
            modeShow.setText(getString(R.string.air_mode_val)
                    + getString(R.string.air_power_off));

        }
    }

    /**
     * 逻辑处理
     * 发送消息
     *
     * @param airBean_Event
     */
    public void SendMsg(AirBean airBean_Event) {
        Log.e("gaoyu", "要发送的信息" + airBean_Event.toString());

        int mPower = airBean_Event.getmPower(); //开关
        int mTmp = airBean_Event.getmTmp();  //温度
        int mMode = airBean_Event.getmMode();  //模式
        int menergy = airBean_Event.getmenergy();  //节能省电/换气
        int mWindDir = airBean_Event.getmWindDir();   //风向
        int mWindCount = airBean_Event.getmWindCount(); //风量

        int tmWindDir = 0;//二进制方向
        //左右扫风风向判断
        if (mWindDir == 2) {
            tmWindDir = 1;
        } else if (mWindDir == 1) {
            tmWindDir = 0;
        } else {
            tmWindDir = 0;
        }
        //根据所选模式确定检验码
        //校验码 = [(模式 – 1) + (温度 – 16) + 5 +左右扫风+换气+节能]取二进制后四位,再逆序
        //以下为了思路清晰 就不写在一起了
        int check = (mMode - 1) + (mTmp - 16) + 5 + tmWindDir + menergy + menergy;//十进制数字
        String two_chack = Integer.toBinaryString(check);//转换成二进制
        //如果大于四位进行裁剪
        //补零
        switch (two_chack.length()){
            case 3:
                two_chack = "0"+two_chack;
                break;
            case 2:
                two_chack = "00"+two_chack;
                break;
            case 1:
                two_chack = "000"+two_chack;
                break;
        }
        two_chack = two_chack.substring(two_chack.length() - 4, two_chack.length());//取后四位
        String Cut = new StringBuffer(two_chack).reverse().toString();//倒序
        Log.e("gaoyu", "裁剪之前" + two_chack + "裁剪倒序之后" + Cut);

        //分解字符(承载最后四个逆序字符)
        char[] item = new char[5];
        for (int i = 0; i < Cut.length(); i++) {
            item[i] = Cut.charAt(i);
        }
        //操作大数组
        int base[] = CodeCommand.base;

        //第一步 替换校验码  (分七步)
        //取出数组里的四个数
        int one = Integer.valueOf(String.valueOf(item[0])).intValue();
        int two = Integer.valueOf(String.valueOf(item[1])).intValue();
        int three = Integer.valueOf(String.valueOf(item[2])).intValue();
        int four = Integer.valueOf(String.valueOf(item[3])).intValue();
        //64-67位为校验码 131132 \ 133134 \ 135136 \ 137138
        //第一个数
        if (one == 1) {
            Log.e("gaoyu", "第一个数是1");
            //将大数组里的130131位置1
            base[130] = CodeCommand.check_d;
            base[131] = CodeCommand.check_u;

        } else {
            Log.e("gaoyu", "第一个数是0");
            //将大数组里的64位不用变
        }
        //第二个数
        if (two == 1) {
            Log.e("gaoyu", "第二个数是1");
            //将大数组里的132133位置1
            base[132] = CodeCommand.check_d;
            base[133] = CodeCommand.check_u;

        } else {
            Log.e("gaoyu", "第二个数是0");
            //将大数组里的132133位不用变
        }
        //第三个数
        if (three == 1) {
            Log.e("gaoyu", "第三个数是1");
            //将大数组里的134135位置1
            base[134] = CodeCommand.check_d;
            base[135] = CodeCommand.check_u;

        } else {
            Log.e("gaoyu", "第三个数是0");
            //将大数组里的134135位不用变
        }
        //第四个数
        if (four == 1) {
            Log.e("gaoyu", "第四个数是1");
            //将大数组里的136137位置1
            base[136] = CodeCommand.check_d;
            base[137] = CodeCommand.check_u;
        } else {
            Log.e("gaoyu", "第四个数是0");
            //将大数组里的136137位不用变
        }

        //第二步 开关  8/9
        if (mPower == 1) {
            Log.e("gaoyu", "开");
            base[8] = CodeCommand.onedown;
            base[9] = CodeCommand.oneup;
        } else {
            base[8] = CodeCommand.zerodown;
            base[9] = CodeCommand.zeroup;
            Log.e("gaoyu", "关");
        }

        //第三步 温度 16-30度   数组中1825
        switch (mTmp) {
            case 16:
                //默认十六
                break;
            case 17:
                base[18] = CodeCommand.onedown;
                base[19] = CodeCommand.oneup;
                base[20] = CodeCommand.zerodown;
                base[21] = CodeCommand.zeroup;
                base[22] = CodeCommand.zerodown;
                base[23] = CodeCommand.zeroup;
                base[24] = CodeCommand.zerodown;
                base[25] = CodeCommand.zeroup;
                break;
            case 18:
                base[18] = CodeCommand.zerodown;
                base[19] = CodeCommand.zeroup;
                base[20] = CodeCommand.onedown;
                base[21] = CodeCommand.oneup;
                base[22] = CodeCommand.zerodown;
                base[23] = CodeCommand.zeroup;
                base[24] = CodeCommand.zerodown;
                base[25] = CodeCommand.zeroup;
                break;
            case 19:
                base[18] = CodeCommand.onedown;
                base[19] = CodeCommand.oneup;
                base[20] = CodeCommand.onedown;
                base[21] = CodeCommand.oneup;
                base[22] = CodeCommand.zerodown;
                base[23] = CodeCommand.zeroup;
                base[24] = CodeCommand.zerodown;
                base[25] = CodeCommand.zeroup;
                break;
            case 20:
                base[18] = CodeCommand.zerodown;
                base[19] = CodeCommand.zeroup;
                base[20] = CodeCommand.zerodown;
                base[21] = CodeCommand.zeroup;
                base[22] = CodeCommand.onedown;
                base[23] = CodeCommand.oneup;
                base[24] = CodeCommand.zerodown;
                base[25] = CodeCommand.zeroup;
                break;
            case 21:
                base[18] = CodeCommand.onedown;
                base[19] = CodeCommand.oneup;
                base[20] = CodeCommand.zerodown;
                base[21] = CodeCommand.zeroup;
                base[22] = CodeCommand.onedown;
                base[23] = CodeCommand.oneup;
                base[24] = CodeCommand.zerodown;
                base[25] = CodeCommand.zeroup;
                break;
            case 22:
                base[18] = CodeCommand.zerodown;
                base[19] = CodeCommand.zeroup;
                base[20] = CodeCommand.onedown;
                base[21] = CodeCommand.oneup;
                base[22] = CodeCommand.onedown;
                base[23] = CodeCommand.oneup;
                base[24] = CodeCommand.zerodown;
                base[25] = CodeCommand.zeroup;
                break;
            case 23:
                base[18] = CodeCommand.onedown;
                base[19] = CodeCommand.oneup;
                base[20] = CodeCommand.onedown;
                base[21] = CodeCommand.oneup;
                base[22] = CodeCommand.onedown;
                base[23] = CodeCommand.oneup;
                base[24] = CodeCommand.zerodown;
                base[25] = CodeCommand.zeroup;
                break;
            case 24:
                base[18] = CodeCommand.zerodown;
                base[19] = CodeCommand.zeroup;
                base[20] = CodeCommand.zerodown;
                base[21] = CodeCommand.zeroup;
                base[22] = CodeCommand.zerodown;
                base[23] = CodeCommand.zeroup;
                base[24] = CodeCommand.onedown;
                base[25] = CodeCommand.oneup;
                break;
            case 25:
                base[18] = CodeCommand.onedown;
                base[19] = CodeCommand.oneup;
                base[20] = CodeCommand.zerodown;
                base[21] = CodeCommand.zeroup;
                base[22] = CodeCommand.zerodown;
                base[23] = CodeCommand.zeroup;
                base[24] = CodeCommand.onedown;
                base[25] = CodeCommand.oneup;
                break;
            case 26:
                base[18] = CodeCommand.zerodown;
                base[19] = CodeCommand.zeroup;
                base[20] = CodeCommand.onedown;
                base[21] = CodeCommand.oneup;
                base[22] = CodeCommand.zerodown;
                base[23] = CodeCommand.zeroup;
                base[24] = CodeCommand.onedown;
                base[25] = CodeCommand.oneup;
                break;
            case 27:
                base[18] = CodeCommand.onedown;
                base[19] = CodeCommand.oneup;
                base[20] = CodeCommand.onedown;
                base[21] = CodeCommand.oneup;
                base[22] = CodeCommand.zerodown;
                base[23] = CodeCommand.zeroup;
                base[24] = CodeCommand.onedown;
                base[25] = CodeCommand.oneup;
                break;
            case 28:
                base[18] = CodeCommand.zerodown;
                base[19] = CodeCommand.zeroup;
                base[20] = CodeCommand.zerodown;
                base[21] = CodeCommand.zeroup;
                base[22] = CodeCommand.onedown;
                base[23] = CodeCommand.oneup;
                base[24] = CodeCommand.onedown;
                base[25] = CodeCommand.oneup;
                break;
            case 29:
                base[18] = CodeCommand.onedown;
                base[19] = CodeCommand.oneup;
                base[20] = CodeCommand.zerodown;
                base[21] = CodeCommand.zeroup;
                base[22] = CodeCommand.onedown;
                base[23] = CodeCommand.oneup;
                base[24] = CodeCommand.onedown;
                base[25] = CodeCommand.oneup;
                break;
            case 30:
                base[18] = CodeCommand.zerodown;
                base[19] = CodeCommand.zeroup;
                base[20] = CodeCommand.onedown;
                base[21] = CodeCommand.oneup;
                base[22] = CodeCommand.onedown;
                base[23] = CodeCommand.oneup;
                base[24] = CodeCommand.onedown;
                base[25] = CodeCommand.oneup;
                break;
            default:
                break;
        }

        //第四步  模式  2-7
        switch (mMode) {
            case 0:
                base[2] = CodeCommand.zerodown;
                base[3] = CodeCommand.zeroup;
                base[4] = CodeCommand.zerodown;
                base[5] = CodeCommand.zeroup;
                base[6] = CodeCommand.zerodown;
                base[7] = CodeCommand.zeroup;
                break;
            case 1:
                base[2] = CodeCommand.onedown;
                base[3] = CodeCommand.oneup;
                base[4] = CodeCommand.zerodown;
                base[5] = CodeCommand.zeroup;
                base[6] = CodeCommand.zerodown;
                base[7] = CodeCommand.zeroup;
                break;
            case 2:
                base[2] = CodeCommand.zerodown;
                base[3] = CodeCommand.zeroup;
                base[4] = CodeCommand.onedown;
                base[5] = CodeCommand.oneup;
                base[6] = CodeCommand.zerodown;
                base[7] = CodeCommand.zeroup;
                break;
            case 3:
                base[2] = CodeCommand.onedown;
                base[3] = CodeCommand.oneup;
                base[4] = CodeCommand.onedown;
                base[5] = CodeCommand.oneup;
                base[6] = CodeCommand.zerodown;
                base[7] = CodeCommand.zeroup;
                break;
            case 4:
                base[2] = CodeCommand.zerodown;
                base[3] = CodeCommand.zeroup;
                base[4] = CodeCommand.zerodown;
                base[5] = CodeCommand.zeroup;
                base[6] = CodeCommand.onedown;
                base[7] = CodeCommand.oneup;
                break;
        }
        //第五步 节电、换气 48-51
        if (menergy == 1) {
            Log.e("gaoyu", "开启节电换气");
            base[48] = CodeCommand.onedown;
            base[49] = CodeCommand.oneup;
            base[50] = CodeCommand.onedown;
            base[51] = CodeCommand.oneup;
        }else{
            base[48] = CodeCommand.zerodown;
            base[49] = CodeCommand.zeroup;
            base[50] = CodeCommand.zerodown;
            base[51] = CodeCommand.zeroup;
        }
        //第六步  风向  1、上下 36 数组 74.75   2、左右 40  80.81
        switch (mWindDir) {
            case 0:
                //默认
                break;
            case 1:
                base[74] = CodeCommand.onedown;
                base[75] = CodeCommand.oneup;
                break;
            case 2:
                base[80] = CodeCommand.onedown;
                base[81] = CodeCommand.oneup;
                break;
        }

        //第七步  风量  10-13
        switch (mWindCount) {
            case 0:
                //默认
                break;
            case 1:
                base[10] = CodeCommand.onedown;
                base[11] = CodeCommand.oneup;
                base[12] = CodeCommand.zerodown;
                base[13] = CodeCommand.zeroup;
                break;
            case 2:
                base[10] = CodeCommand.zerodown;
                base[11] = CodeCommand.zeroup;
                base[12] = CodeCommand.onedown;
                base[13] = CodeCommand.oneup;
                break;
            case 3:
                base[10] = CodeCommand.onedown;
                base[11] = CodeCommand.oneup;
                base[12] = CodeCommand.onedown;
                base[13] = CodeCommand.oneup;
                break;
        }

        //最后一步 调取红外进行发送
        String content = null;
        for (int i = 0; i < base.length; i++) {
            content += String.valueOf(base[i]) + ",";
        }
        Log.e("gaoyu", "数组信息是" + content);
        //发送完数据将大数组还原
        sendIrMsg(38000,base);
        base = CodeCommand.base;

    }


    /**
     * 发射红外信号
     * 可以查看这个标签的log   ConsumerIr
     * @param carrierFrequency 红外传输的频率,一般的遥控板都是38KHz
     * @param pattern          指以微秒为单位的红外开和关的交替时间
     */
    private void sendIrMsg(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])+",";
        }
        Log.e("gaoyu", "数组信息是" + content);
        Log.e("gaoyu", "一共有" + pattern.length);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • 403
  • 404
  • 405
  • 406
  • 407
  • 408
  • 409
  • 410
  • 411
  • 412
  • 413
  • 414
  • 415
  • 416
  • 417
  • 418
  • 419
  • 420
  • 421
  • 422
  • 423
  • 424
  • 425
  • 426
  • 427
  • 428
  • 429
  • 430
  • 431
  • 432
  • 433
  • 434
  • 435
  • 436
  • 437
  • 438
  • 439
  • 440
  • 441
  • 442
  • 443
  • 444
  • 445
  • 446
  • 447
  • 448
  • 449
  • 450
  • 451
  • 452
  • 453
  • 454
  • 455
  • 456
  • 457
  • 458
  • 459
  • 460
  • 461
  • 462
  • 463
  • 464
  • 465
  • 466
  • 467
  • 468
  • 469
  • 470
  • 471
  • 472
  • 473
  • 474
  • 475
  • 476
  • 477
  • 478
  • 479
  • 480
  • 481
  • 482
  • 483
  • 484
  • 485
  • 486
  • 487
  • 488
  • 489
  • 490
  • 491
  • 492
  • 493
  • 494
  • 495
  • 496
  • 497
  • 498
  • 499
  • 500
  • 501
  • 502
  • 503
  • 504
  • 505
  • 506
  • 507
  • 508
  • 509
  • 510
  • 511
  • 512
  • 513
  • 514
  • 515
  • 516
  • 517
  • 518
  • 519
  • 520
  • 521
  • 522
  • 523
  • 524
  • 525
  • 526
  • 527
  • 528
  • 529
  • 530
  • 531
  • 532
  • 533
  • 534
  • 535
  • 536
  • 537
  • 538
  • 539
  • 540
  • 541
  • 542
  • 543
  • 544
  • 545
  • 546
  • 547
  • 548
  • 549
  • 550
  • 551
  • 552
  • 553
  • 554
  • 555
  • 556
  • 557
  • 558
  • 559
  • 560
  • 561
  • 562
  • 563
  • 564
  • 565
  • 566
  • 567
  • 568
  • 569
  • 570
  • 571
  • 572
  • 573
  • 574
  • 575
  • 576
  • 577
  • 578
  • 579
  • 580
  • 581
  • 582
  • 583
  • 584
  • 585
  • 586
  • 587
  • 588
  • 589
  • 590
  • 591
  • 592
  • 593
  • 594
  • 595
  • 596
  • 597
  • 598
  • 599
  • 600
  • 601
  • 602
  • 603
  • 604
  • 605
  • 606
  • 607
  • 608
  • 609
  • 610
  • 611
  • 612
  • 613
  • 614
  • 615
  • 616
  • 617
  • 618
  • 619
  • 620
  • 621
  • 622
  • 623
  • 624
  • 625
  • 626
  • 627
  • 628
  • 629
  • 630
  • 631
  • 632
  • 633
  • 634
  • 635
  • 636
  • 637
  • 638
  • 639
  • 640
  • 641
  • 642
  • 643
  • 644
  • 645
  • 646
  • 647
  • 648
  • 649
  • 650
  • 651
  • 652
  • 653
  • 654
  • 655
  • 656
  • 657
  • 658
  • 659
  • 660
  • 661
  • 662
  • 663
  • 664
  • 665
  • 666
  • 667
  • 668
  • 669
  • 670
  • 671
  • 672
  • 673
  • 674
  • 675
  • 676
  • 677
  • 678
  • 679
  • 680
  • 681
  • 682
  • 683
  • 684
  • 685
  • 686
  • 687
  • 688
  • 689
  • 690
  • 691
  • 692
  • 693
  • 694
  • 695
  • 696
  • 697
  • 698
  • 699
  • 700
  • 701
  • 702
  • 703
  • 704
  • 705
  • 706
  • 707
  • 708
  • 709
  • 710
  • 711
  • 712
  • 713
  • 714
  • 715
  • 716
  • 717
  • 718
  • 719
  • 720
  • 721
  • 722
  • 723
  • 724
  • 725
  • 726
  • 727
  • 728
  • 729
  • 730
  • 731
  • 732
  • 733
  • 734
  • 735
  • 736
  • 737
  • 738

3、数据处理类

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,取低四位为0111,逆序后为1110
 * <p>
 * 为了方便编码,在编码时可以正序,解码端再逆序,解码的时候先解码低字节,再解码高字节的位。
 * 另外定时数据对最后的校验码的影响没有测试,因为很少会用到这个功能。
 */

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[] base = {
            startdown, startup,//起始码
            zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//1-3
            zerodown, zeroup, 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, zerodown, zeroup, zerodown, zeroup, zerodown, zeroup,//64-67(四位检验码)后32位结束

    };

    //校验码--1
    public static int check_d = onedown;
    public static int check_u = oneup;


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

主要代码给大家了 可以参考一下,如果想了解详细,请下载源码或者留言

http://download.csdn.net/detail/gywuhengy/9865590

感兴趣的可以接着关注 小编小编接下来 
会给大家带来 空调遥控器的 学习功能,以及电视遥控器,3q支持

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
完整:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
### 回答1: 开发 Android 空调遥控器涉及以下几个方面的工作: 1. 界面设计:首先要设计一个用户友好的界面,确保用户能够轻松理解和使用遥控器功能。界面应该包括温度调节、风速选择、模式选择、定时开关机等功能。 2. 通信协议:需要与空调进行通信,以发送控制指令和接收状态信息。可以使用红外线技术或 Wi-Fi 等无线技术实现通信。对于红外线通信,需要调研并找到特定空调品牌和型号的红外线控制指令集。对于 Wi-Fi 通信,需要设计与空调通信的网络协议。 3. 状态更新和同步:在用户调节遥控器参数后,需要及时将设置的参数发送给空调,并确保空调收到指令后做出相应的操作。同时,还需要定期从空调读取当前的工作状态,例如温度、风速等,并更新到遥控器界面上,便于用户实时监控和调节。 4. 兼容性考虑:考虑到不同品牌和型号的空调具有不同的控制方式和功能设置,开发时需要充分考虑兼容性。可以通过提供用户可自定义的参数配置功能,让用户可以在遥控器上选择对应的空调品牌和型号,以及支持的功能,从而适配各种空调设备。 5. 其他功能增强:最后,可以考虑为遥控器增加一些实用的功能,例如支持语音控制、场景模式设置、设备联动等,以提升用户体验。 总体而言,开发 Android 空调遥控器需要通过界面设计、通信协议、状态更新、兼容性考虑和功能增强等多个方面的工作来实现。这些工作需要结合具体的需求和技术要求进行设计和开发,最终提供给用户一个方便、易用且功能丰富的空调遥控器应用。 ### 回答2: Android空调遥控器开发是基于Android操作系统的智能设备遥控应用程序。该应用程序可以与用户的空调设备进行无线连接,通过无线信号与空调设备进行通信,并模拟空调遥控器功能实现远程控制空调设备的操作。 在进行Android空调遥控器开发时,首先需要实现空调设备的无线连接功能。可以利用蓝牙、红外线或者Wi-Fi等通信方式实现设备连接。通过与空调设备建立连接之后,可以获取设备的状态和参数信息,从而实现空调设备的遥控操作。用户可以通过触摸屏幕上的操作按钮或者滑动条,调节空调的温度、风速、模式等参数,同时也可以进行定时、定位、控制多个空调等特殊功能。 在开发过程中,需要使用Android开发工具,如Android Studio,并结合空调设备的通信协议,编写相应的代码实现连接和与空调设备的通信。此外,还需要设计应用程序的用户界面,包括各种操作按钮和界面布局等。应用程序还应该具备良好的用户体验,保证操作的简单易懂和流畅性能。 Android空调遥控器的开发可以带来许多便利性和舒适性。用户可以随时随地通过手机对家中的空调设备进行远程控制,无需亲临现场进行操作。而且可以利用智能手机的多媒体功能,进行更加个性化的设置和控制。 总之,Android空调遥控器开发是一项基于Android操作系统的智能设备遥控应用程序的开发工作。通过与空调设备的无线连接和通信,实现空调设备的遥控操作,提供更加方便和舒适的使用体验。 ### 回答3: 开发 Android 空调遥控器是为了实现通过手机控制空调功能。首先,我们需要设计一个用户友好的界面,包括一些基本的控制按钮,如开、关、调温、调风等。通过与空调的通信接口,我们可以将用户在手机上的操作指令传输到空调设备上。 在开发过程中,我们需要注意以下几点: 1. 兼容性:确保该遥控器应用程序能够支持主流的 Android 手机和智能设备。 2. 连接性:通过蓝牙、Wi-Fi 或红外线技术,实现手机与空调之间的无线连接。 3. 控制功能:在应用程序中提供各种必要的控制功能,如调节温度、调整风向、设置定时功能等。 4. 数据传输安全性:确保用户在使用手机遥控器时的数据传输是安全的,防止他人恶意干扰。 5. 自定义设置:为用户提供自定义选项,使他们能够根据自己的需求进行个性化设置,如添加多个设备、命名等。 6. 易于使用:设计简单直观的用户界面,使用户能够轻松地理解和操作。 通过上述开发,用户将能够通过他们的 Android 手机方便地操控空调,无需再去寻找遥控器或靠近空调设备。这将为用户带来更多的便利性和舒适感。随着智能家居的发展,这样的应用程序也能与其他智能设备进行连接,实现更智能化的家庭控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值