源:http://www.cnblogs.com/xiaochao1234/p/3615467.html

  经过连续几天的编制,安卓手机代码终于完成了,目前已经将我宿舍,家里,集控室的红外遥控电气设备完好的遥控了,另外还遥控了我的D7000相机,不错终于完工了。 代码分为二类: 各种电视、相机、等等遥控编码最简单,只要将按键的编码复制下来,直接变成手机发射码就可以了。(这种编码单个按键只发射单个信息) 最难的是空调编码,由于空调编码是将单个按键要发射所有控制信息,如增加一度温度,同时要将控制模式、温度、风量等等所有信息一同发射出去,还有检验码,通过长时间实验,如果像一般模仿遥控器的设备(例如万能遥控器)编码是将各种组合分别保存起来,这要就很长,也很麻烦,但用第一种方法实现起来就很容易。第二种方法主要是找规律比较麻烦,而且要再程序中变成组合再变成安卓发射码,比较麻烦。 经过摸索     格力遥控器编码规则如下(前面的资料是网上搜集来的,这里是自己总结的):

 
**文件格式:开关名称 / 按键位置 / 图标名称 / 命令代码
**空调格式:格力空调YB0FB
**  0         1                     2          3方式  4开5风6睡 7温度   8          10强照  干
++++/24,65,22/38000,358,179/ 100/       0 /00/00 /0101 /0000 /0000/ 0/0/0/0 /0000 /1010 /010/ ,24,795 /0000 /0000 /1000 /0100 /0000 /0000 /0000 /++
 
**名称/位置/图标/位置/初始值/变化
++/空调开关/20/power/4/2
++/模式/21/mode/3/5/p1/auto/coldm/dryingm/windm/warmm
++/风量/22/velocity/5/4/t2/wind0/wind1/wind2/wind3
++/温度+/23/up/7/14/t1/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30
++/温度-/28/down/7/14/t1/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30
++/灯光/25/light/11/2/p3/nu/lightm
++/睡眠/26/sleep/6/2/p4/nu/sleepm
这上面是格力空调编码方案  
下面是直接编码:  
电视开关/0/power/38000,358,179,21,21,22,21,23,20,21,21,22,21,23,20,21,67,23,20,21,21,22,21,23,20,21,21,22,21,23,20,21,67,23,20,21,21,22,67,21,21,22,67,21,21,22,21,23,20,21,21,22,67,21,21,22,67,21,21,22,67,21,67,23,64,22,67,21,1310,358,89,22 
静音/6/mute/38000,361,176,22,21,21,21,22,21,21,22,21,21,22,21,21,67,22,21,21,22,21,21,22,21,21,22,22,20,23,20,21,67,23,20,21,67,23,65,22,65,21,67,23,20,21,22,23,19,24,19,21,22,23,19,24,19,21,22,23,64,21,67,24,64,23,64,21,1310,359,88,21
显示模式/5/screen/38000,359,178,22,21,25,18,21,21,22,21,25,18,21,21,22,67,21,21,22,21,25,18,21,21,22,21,25,18,21,21,22,67,21,21,22,67,21,21,22,21,25,63,22,67,21,21,22,21,25,18,21,21,22,67,21,67,25,18,21,21,22,67,21,67,25,63,22,1309,359,89,25
信号源/1/tvav/38000,362,175,24,20,21,21,22,21,24,20,21,21,22,21,24,64,22,21,24,20,21,21,22,21,24,20,21,21,22,21,24,64,22,21,24,64,22,21,24,20,21,21,22,21,24,20,21,67,24,20,21,21,22,67,21,67,24,64,22,67,21,67,24,20,21,67,24,1307,362,86,21
 

下面是安卓语言源代码:不喜好编程的人就不用看了:(感兴趣的朋友可以联系我,图片上有QQ号)

package com.example.sumxingir;

import java.io.FileInputStream;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

import org.apache.http.util.EncodingUtils;

import android.app.Activity;

import android.content.Intent;

import android.content.res.Resources;

import android.graphics.Color;

import android.os.Bundle;

import android.os.Environment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.GridView;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;

public class room extends Activity {

String Temp;

String[] STR=new String[2];

String[] rv=new String[2];

private MyAdapter adapter = null;

private ArrayList<Map<String, Object>> array;

GridView layout;

String[] Kt=new String[20];       //Kt1 整体代码

int  Ktonof=0;                   // /Kt1 开关;

String[]  base=new String[]{"","",""};      // /0电平宽度1电平宽度;高电平宽度;

    int check=0 ;

String[] Ktmode=new String[10];   //空调模式

String[] Ktwendu=new String[30];  //温度变化量

String[] Ktwind=new String[10];   //风变化量

String[] Ktp3=new String[]{"","","","","",""};   //空调其它按键

String[] Ktp4=new String[]{"","","","","",""};   //空调其它按键

String[] Ktt2=new String[]{"","","","","",""};   //空调其它按键

   int Count;

   String[] name=new String[40] ;

   int[]  image=new int[40];

   String[] code=new String[40];

   String[] mode=new String[5];

// android.view.ViewGroup.LayoutParams lp ;  //声明控件参数获取对象 LayoutParams lp;     

   @Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.room);

GridView layout = (GridView) findViewById(R.id.gridview);

RelativeLayout view = (RelativeLayout) findViewById(R.id.view);

android.view.ViewGroup.LayoutParams lp ;  //声明控件参数获取对象 LayoutParams lp;

lp = view.getLayoutParams(); //2、获取控件参数: lp = 控件id.getLayoutParams();

lp.height=0; view.setLayoutParams(lp);

  // setContentView(layout);  

        Intent intent=getIntent();

Temp=intent.getStringExtra("strcode") ;

setTitle(Temp);

setTitleColor(Color.GREEN);

   Temp= readFileSdcard(Temp.trim()); 

STR=Temp.split("\r\n");                   //=============文件处理

Count=0;

for (int i=0 ;i<STR.length;i++){   

if (STR[i].trim().length()<10 ){continue;}

if(STR[i].substring(0, 2).equals("**")){continue;}

  if (STR[i].substring(0, 2).equals("++")){

 if (STR[i].substring(0, 4).equals("++++")){ Kt=STR[i].trim().split("/");

 lp.height=150; view.setLayoutParams(lp); 

 base=Kt[1].trim().split(",");

//   if(Kt[Kt.length-1].trim().equals("++") ){Kt[Kt.length-1]="1111";check=1;}

 } //=========空调处理

else{         //         ++/空调开关/20/power/251/+1   

 rv=STR[i].split("/"); 

     int s=(Integer.parseInt(rv[2]));  //按键位置号

 name[s]=(rv[1]).trim();

 code[s]=(rv[4]+","+rv[5]); //指向代码位

//    int k=Integer.parseInt(rv[4]);  

if (rv[1].equals("模式")){

for(int j=4;j<rv.length;j++){  Ktmode[j-4]=rv[j].trim();}}

else if (rv[1].equals("温度+")){  for(int j=4;j<rv.length;j++){

Ktwendu[j-4]=rv[j].trim();}}

else if (rv[1].equals("风量")){  for(int j=4;j<rv.length;j++){Ktwind[j-4]=rv[j].trim();}}

else if (rv[1].equals("空调开关")){ Ktonof=Integer.parseInt(rv[4].trim());  }

else if (rv[6].equals("p3")){ for(int j=4;j<rv.length;j++){Ktp3[j-4]=rv[j].trim();}}   

else if (rv[6].equals("p4")){ for(int j=4;j<rv.length;j++){Ktp4[j-4]=rv[j].trim();}}   

else if (rv[6].equals("t2")){ for(int j=4;j<rv.length;j++){Ktt2[j-4]=rv[j].trim();}}   

String m=rv[3];

   if (s>Count){Count=s;} 

  Resources res=getResources();

  image[s]= res.getIdentifier(m, "drawable", getPackageName());  

 }  

  }else{                   //==================一般按键处理

    rv=STR[i].split("/");

   int s=(Integer.parseInt(rv[1]));

   name[s]=(rv[0]);

   code[s]=(rv[3]);

   String m=rv[2];

   if (s>Count){Count=s;} 

  Resources res=getResources();

  image[s]= res.getIdentifier(m, "drawable", getPackageName());}

}

array = getData();

adapter = new MyAdapter();

layout.setAdapter(adapter);

layout.setOnItemClickListener(new ItemClickEvent()); 

if(Ktonof!=0){   show(); }  //显示空调状态

  }      

public String readFileSdcard(String fileName) {     //读取txt文件

// Temp=Environment.getExternalStorageDirectory()+"/SUMIR/code.txt";

String res = "";  

        try {  

             FileInputStream fin = new FileInputStream(

              Environment.getExternalStorageDirectory()+"/SUMIR/"+fileName+".txt");  

            int length = fin.available();  

             byte[] buffer = new byte[length];  

            fin.read(buffer);  

             res = EncodingUtils.getString(buffer, "UNICODE"); 

            fin.close();  

        }  

        catch (Exception e) {    e.printStackTrace();   }  

        return res;  

    }  

class MyAdapter extends ArrayAdapter<Map<String, Object>> {

MyAdapter() {

super(room.this, R.layout.mygrid, array);

}

public ArrayList<Map<String, Object>> getList() {

return array;

}

public View getView(int position, View convertView, ViewGroup parent) {

View row = convertView;

// String[] name1=new String[Count+1];name1=name;

if (row == null) {

LayoutInflater inflater = getLayoutInflater();

row = inflater.inflate(R.layout.mygrid, parent, false);

}

ImageView imageView = (ImageView) row.findViewById(R.id.img);

   imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);  

imageView.setImageResource(Integer.valueOf(array.get(position)

.get("img").toString()));

TextView tv1 = (TextView) row.findViewById(R.id.txt);  

        tv1.setText(name[position]);  

return (row); } }

private ArrayList<Map<String, Object>> getData() {

ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

for (int i = 0; i < Count+1; i++) {

Map<String, Object> map = new HashMap<String, Object>();

map.put("img", image[i]);

list.add(map);

} return list; }

                                 //点击处理============================================================

class ItemClickEvent implements AdapterView.OnItemClickListener {

String ircode;

RelativeLayout view = (RelativeLayout) findViewById(R.id.view); 

       @Override

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

       // Toast.makeText(room.this, name[arg2], Toast.LENGTH_SHORT).show();

arg1.setPressed(false);

arg1.setSelected(false);

if (code[arg2]!=null) {

if (code[arg2].length()>20 ) { ircode=code[arg2];}else{

rv=code[arg2].split(",");

int k1= Integer.parseInt(rv[0]);int LimUP=Integer.parseInt(rv[1]);

if(name[arg2].substring(name[arg2].length()-1).equals("-")){

opj(k1,0,LimUP); }else{opj(k1,1,LimUP);   } //Kt 位置,±,上限

ircode=readcode();

if(Kt[Kt.length-1].trim().equals("++") ){ircode+=check(ircode);}

   show();

}

try   {

     Object localObject = getSystemService("irda");

     localObject.getClass();

     localObject.getClass().getMethod("write_irsend", new Class[] { String.class }).invoke(localObject, new Object[] {ircode });

     return;  }

   catch (Exception localException)  {   localException.printStackTrace();   }

}}}

private  void opj ( int ktsit, int bb,int Lm){    //===========+-操作 代码

 Kt[ktsit]=Kt[ktsit].trim();

 int L=Kt[ktsit].length();

 int m=readKt(ktsit);if (bb==0){m--;}else{m++;}

 if ( m>=Lm){ if (Lm>10){m=Lm;}else{m=0;}}

 if (m<0){m=0;}

 Temp="0000000000"+Integer.toBinaryString(m);

  Temp=Temp.substring(Temp.length()-L);

  Kt[ktsit]="";for(int i=0;i<L;i++){

  Kt[ktsit]+=Temp.substring(L-i-1, L-i);

  }  

  }

private  String check (String SS ){  //==========================检查校验码

String T1="";int lim=Integer.parseInt(base[0])/2+Integer.parseInt(base[1])/2;

int   sum =0; int x=0; int Y=0;

rv=SS.split(",");

for (int i=4;i<rv.length;i+=2){

if(x==8){x=0;sum+=Y;Y=0;     }

if(Integer.parseInt(rv[i])>lim){Y+=1<<x;}

x++;

}

    sum=sum%16;  //  T1=String.valueOf( sum);

   T1=","+base[2]+"," +base[sum%2]+","+base[2]+"," +base[(sum%4)/2]+","+base[2]+"," 

       +base[(sum%8)/4]+","+base[2]+"," +base[sum%16/8]+","+base[2] ;

    return T1;

}

private  void show (){  //====================================设置显示

ImageView Pv1=(ImageView) findViewById(R.id.p1);

ImageView Pv2=(ImageView) findViewById(R.id.p2);

ImageView Pv3=(ImageView) findViewById(R.id.p3);

ImageView Pv4=(ImageView) findViewById(R.id.p4);

TextView Tv1=(TextView) findViewById(R.id.t1);

TextView Tv2=(TextView) findViewById(R.id.t2);

Resources res=getResources();

if(Kt[Ktonof].trim().equals("0")){ 

Pv1.setVisibility(View.INVISIBLE);

Pv2.setVisibility(View.INVISIBLE);

Pv3.setVisibility(View.INVISIBLE);

Pv4.setVisibility(View.INVISIBLE);

Tv1.setVisibility(View.INVISIBLE);

Tv2.setVisibility(View.INVISIBLE);

} else{

Pv1.setVisibility(View.VISIBLE);

Pv2.setVisibility(View.VISIBLE);

Pv3.setVisibility(View.VISIBLE);

Pv4.setVisibility(View.VISIBLE);

Tv1.setVisibility(View.VISIBLE);

Tv2.setVisibility(View.VISIBLE);

int m=readKt(Integer.parseInt(Ktmode[0]));   //模式显示

int Pv= res.getIdentifier(Ktmode[m+3] , "drawable", getPackageName());

Pv1.setImageResource(Pv);

m=readKt(Integer.parseInt(Ktwendu[0]));   //温度显示

Tv1.setText(Ktwendu[m+3]);

if(Ktt2[0]!=""){m=readKt(Integer.parseInt(Ktt2[0]));   //温度显示

Tv2.setText(Ktwendu[m+3]);}

if(Ktwind[0]!=""){m=readKt(Integer.parseInt(Ktwind[0]));   //风量显示

Pv= res.getIdentifier(Ktwind[m+3] , "drawable", getPackageName());

Pv2.setImageResource(Pv); }

if(Ktp3[0]!=""){

m=readKt(Integer.parseInt(Ktp3[0]));   //p3显示

Pv= res.getIdentifier(Ktp3[m+3] , "drawable", getPackageName());

Pv3.setImageResource(Pv); }

if(Ktp4[0]!=""){m=readKt(Integer.parseInt(Ktp4[0]));   //p4显示

Pv= res.getIdentifier(Ktp4[m+3] , "drawable", getPackageName());

Pv4.setImageResource(Pv);}

}

}

private  int readKt ( int ktsit){    //============读取 KT 指定位置   数值

byte[] b = (Kt[ktsit].trim()).getBytes();  

int sum=0;     

for(int i=0; i<b.length;i++){  

    sum =sum+((b[i]-48)<<i);   }  return sum;   

}

  private  String readcode (){  //===================转换成发射码

String T1=Kt[2].trim(); 

 for (int i=3;i<Kt.length;i++){

 Kt[i]=Kt[i].trim(); 

 if (Kt[i].substring(0,1).equals(",")){ T1=T1+Kt[i]; }   //直接代码

 else if(Kt[i].substring(0,1).equals("-")){           //执行反码

rv=Kt[i].split("-"); Temp="";

for(int j=1;j< rv.length;j++){ Temp+=Kt[Integer.parseInt(rv[j])]; }

Temp=Temp.replace(" ", "");

    for(int j=0;j< Temp.length();j++){ T1+=","+base[2]+","+base[ (Integer.parseInt(Temp.substring(j,j+1))+1)%2 ] ;   }

}else if(Kt[i].substring(0,1).equals("+")){

continue;}

 else{

 byte[] b = (Kt[i]).getBytes();  

    for(int j=0;j<b.length;j++){  

    T1+=","+base[2]+","+base[b[j]-48] ;   }       

           } }

 return T1;}

  }

Android 手机红外遥控器实现(转)的更多相关文章

  1. android 手机红外遥控器实现

    经过连续几天的编制,安卓手机代码终于完成了,目前已经将我宿舍,家里,集控室的红外遥控电气设备完好的遥控了,另外还遥控了我的D7000相机,不错终于完工了.代码分为二类:各种电视.相机.等等遥控编码最简 ...

  2. DIY手机万能红外遥控器

    DIY手机万能红外遥控器 1.手机安装软件:遥控精灵 2.红外二极管两个(旧的遥控器里面可以拆) 3.耳机的插头一个 步骤:首选讲两个二极管的正负相接(即a二极管的正极连接b二极管的负极,a二极管的负 ...

  3. RK3288 红外遥控器增加自定义按键

    转载请注明出处:https://www.cnblogs.com/lialong1st/p/10071557.html CPU:RK3288 系统:Android 5.1 1.在 dts 中增加红外遥控 ...

  4. RK3288 红外遥控器增加系统中已有的键值

    转载请注明出处:https://www.cnblogs.com/lialong1st/p/10066673.html CPU:RK3288 系统:Android 5.1 1.查看遥控器的用户码和键值, ...

  5. 手把手教你DIY尼康ML-L3红外遥控器

    项目介绍 ML-L3是用于尼康部分型号相机的无线红外遥控器,可以通过红外方式来控制快门的释放,支持B门拍摄.官方售价100RMB左右,山寨版售价10RMB左右.虽然也能实现基本的遥控功能,但是功能还是 ...

  6. android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码

    Android精选源码 android身份证.银行卡号扫描源码 android仿bilibili客户端 android一款3D 指南针 源码 android手机卫士app源码 android提醒应用, ...

  7. android手机登录时遇到“QQ安全登录发现病毒”解决

    android手机作为开源系统非常容易感染病毒,有时候我们会经常遇到手机QQ登录时检测到app被感染,一般情况是由手机感染病毒所引起的,安装腾讯管家后只能检测病毒和卸载感染病毒的软件,不能清除病毒.解 ...

  8. Android手机越用越卡?

    一直不懂Android手机为什么会越用越卡,而ios就几乎能一直保持流畅度.后来发现这个锅不该google背,而是国内混乱的Android软件开发商的锅.主要是Android对应用没什么限制,而goo ...

  9. Android 手机卫士--参照文档编写选择器

    本文来实现<Android 手机卫士--导航界面1的布局编写>中的图片选择器部分的代码. 本文地址:http://www.cnblogs.com/wuyudong/p/5944356.ht ...

随机推荐

  1. 图片应该放在drawable-hdpi下不要放在drawable下

    图片应该放在drawable-hdpi下或者mipmap-hdpi 不要放在drawable下,要不然显示有些不同

  2. postfix防垃圾邮件

    Postfix 2.x 打开/etc/postfix/main.cf文件,在其中增加如下的几行(如果相关的配置存在,就替换之): vi /etc/postfix/main.cf [...] smtpd ...

  3. wpf之Popup弹出自定义输入"键盘"

    在很多工厂的信息化MES系统中,车间的采集数据的机器是触摸屏电脑(工厂环境所限,用外接鼠标键盘反而不方便). 由于没有外接键盘,所以用户无法像坐在办公室一样,用鼠标键盘进行录入信息. 这时我们可以用w ...

  4. web工程中地址的写法

    硬盘地址用\   如:c:\\ 虚拟地址用 / /* 只要是写地址,建议大家最好以"/"开头,/到底代表什么呢? 1.看这个地址是给服务器用的,还是给浏览器用的. 2.如果给浏览器 ...

  5. 观光公交noip<贪心>

    题目链接:https://www.oj.swust.edu.cn/problem/show/1190 思路: 每在一段路上使用一次加速器,就会对某些人或者说某些路段上的人产生影响,目的是使产生的影响最 ...

  6. iOS 开发之照片框架详解

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework.html 一. 概要 在 iOS 设备中,照片和视频是相当重 ...

  7. 关于SVN更新注意

    SVN更新时其实大部分都可以直接更新但是只有在 当然为0就没有事但是如果不是0的话就要注意了表示你修改的和别人修改了相同的文件先点开 次文件然后看看那些不一样主要看如果是这样就直接点更新就好了,如果有 ...

  8. margin:0 auto

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. hdu 1535 Invitation Cards(SPFA)

    Invitation Cards Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) T ...

  10. ListView使用的时候遇到的一些问题

    昨天在做项目时,请求服务器的好友动态后,将好友动态和评论显示到界面上,用ListView显示,发现一进这个界面时,listView的适配器的getVIew()方法就会执行6次,后来发现原来是ListV ...