源: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;
@Overrideprotected 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); @Overridepublic 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手机红外遥控器开发

    一.红外遥控 红外遥控技术是通过红外技术.红外通信技术和遥控技术的结合实现的一种无线控制技术.由于红外线的波长较短,对障碍物的衍射能力较差,无法穿透墙壁,所以红外遥控术更适合应用在短距离直线控制的场合 ...

  2. android 手机红外遥控器

    原文地址:http://blog.csdn.net/zhangxy0605/article/details/74344345 现在红外遥控的使用越来越多,android 手机基本都带有红外,自己可以写 ...

  3. Android 手机红外遥控器实现

    连续几天的努力,终于把红外遥控弄懂,可以控制红外小车了.终于完工了~~ 1.权限: android.permission.TRANSMIT_IR 2.发射红外代码 大多数的家用电器红外遥控编码为NEC ...

  4. Android手机红外开发—点击和长按事件

    上一篇文章<红外技术及Android手机红外遥控器开发>中简单介绍了红外遥控技术和Android 手机红外遥控开发操控中的点击事件,只需要按照编码协议规则对键值等进行编码解析,最后转化成数 ...

  5. android手机红外代码HAL,Android 红外遥控器适配

    红外遥控器协议简介 目前有如下几类标准1. RC5 2. NEC 3. SAMSWNG 4. ...... 5. SIRC (Sony Infrared Remote Control) 目前RK平台只 ...

  6. android如何编程红外遥控,全志A20[android教程]-红外遥控器调试

    第1章 前言 要在树莓派3 (A20)android系统上实现红外遥控器,因为super3上有红外接收头,所以可以直接支持红外遥控器,可以把树莓派3应用到家庭控制当中.当作网络机顶盒用 树莓派3的 ...

  7. rk3568 Android 适配红外遥控器

    rk3568 适配红外遥控器 生活中充满了各种波长的电磁波,所谓的可见(色)光就是人眼可见的电磁波谱,其波长为 380~770nm,为了避免遥控器发射的光造成人眼不适及减少一般人造光源干扰,故选用人眼 ...

  8. android手机红外代码HAL,手机红外遥控器发送红外信号到STM32【HAL库】

    现在大部分手机上都有红外遥控功能,而且好像大部分信号STM32都是可以收到的.现在就使用STM32发送红外信号,由STM32上的红外接收器接收后执行不同的操作.以下是注意事项: 在标准库中有  EXT ...

  9. Android 手机蓝牙遥控器解决方案

    驱动力(需求): 女朋友觉得躺床上用ipad看电视剧不爽,对睡姿要求太高,还容易砸到自己,所以提出需求,没辙,搞起来: 现有设备: Rk3288 开发版一个,dell 显示器一个,小音箱一对: 思路: ...

最新文章

  1. 数字图像处理:(1)图像梯度以及算子应用
  2. Android之全面解析OkHttp源码
  3. 列表,集合,元组,字典
  4. 了解c语言程序员(工程师)岗位需要掌握哪些能力?_码畜,码农,码皇,程序员有什么区别?...
  5. Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程)
  6. 用多态和组合替换多个条件
  7. 计算机基础知识二进制转换,计算机基础知识数制转换
  8. 微软五月份安全补丁发布
  9. 单目视觉里程计 mono vo
  10. juc包下四大并发工具
  11. 'System.Data.SqlClient' could not be loaded解决办法
  12. 那天有个小孩跟我说LINQ(三)
  13. linux下hadoop 环境搭建
  14. 图像颜色与强度分离(intensity and color decouple)方法 matlab代码
  15. 工大助手--加权平均分计算
  16. CRC-16/MODBUS x16+x15+x2+1校验计算 C++
  17. Final阶段基于spec评论作品
  18. 关于中国新能源发展最近趋势的深度分析!政府和科技巨头抓住了历史拐点
  19. 区块链系统开发介绍模块
  20. EIB智能家居系统技术及应用

热门文章

  1. 桌面HTML更换图标,怎样更改桌面图标?更改桌面图标方法【图文详解】
  2. 期货现货升跌水(期货下跌现货一定下跌吗)
  3. 有一种蓝叫 APEC 蓝
  4. 电网风险、风险评估、风光不确定性 考虑蒙特卡洛考虑风光不确定性的配电网运行风险
  5. APP定制开发,移动市场重要的生存利器
  6. 测试主管面试必问合集:get 与 post 的区别
  7. 验证“哥德巴赫猜想”思路分析
  8. Android微信浏览器标题,微信浏览器设置网页标题
  9. 最新国内云计算服务商市场占有率排名,阿里云腾讯云华为云谁排名高
  10. js实现圆柱形轮播图