Android 手机红外遥控器实现(转)
源:http://www.cnblogs.com/xiaochao1234/p/3615467.html
经过连续几天的编制,安卓手机代码终于完成了,目前已经将我宿舍,家里,集控室的红外遥控电气设备完好的遥控了,另外还遥控了我的D7000相机,不错终于完工了。 代码分为二类: 各种电视、相机、等等遥控编码最简单,只要将按键的编码复制下来,直接变成手机发射码就可以了。(这种编码单个按键只发射单个信息) 最难的是空调编码,由于空调编码是将单个按键要发射所有控制信息,如增加一度温度,同时要将控制模式、温度、风量等等所有信息一同发射出去,还有检验码,通过长时间实验,如果像一般模仿遥控器的设备(例如万能遥控器)编码是将各种组合分别保存起来,这要就很长,也很麻烦,但用第一种方法实现起来就很容易。第二种方法主要是找规律比较麻烦,而且要再程序中变成组合再变成安卓发射码,比较麻烦。 经过摸索 格力遥控器编码规则如下(前面的资料是网上搜集来的,这里是自己总结的):
下面是直接编码:
下面是安卓语言源代码:不喜好编程的人就不用看了:(感兴趣的朋友可以联系我,图片上有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 手机红外遥控器实现(转)相关推荐
- 红外遥控及Android手机红外遥控器开发
一.红外遥控 红外遥控技术是通过红外技术.红外通信技术和遥控技术的结合实现的一种无线控制技术.由于红外线的波长较短,对障碍物的衍射能力较差,无法穿透墙壁,所以红外遥控术更适合应用在短距离直线控制的场合 ...
- android 手机红外遥控器
原文地址:http://blog.csdn.net/zhangxy0605/article/details/74344345 现在红外遥控的使用越来越多,android 手机基本都带有红外,自己可以写 ...
- Android 手机红外遥控器实现
连续几天的努力,终于把红外遥控弄懂,可以控制红外小车了.终于完工了~~ 1.权限: android.permission.TRANSMIT_IR 2.发射红外代码 大多数的家用电器红外遥控编码为NEC ...
- Android手机红外开发—点击和长按事件
上一篇文章<红外技术及Android手机红外遥控器开发>中简单介绍了红外遥控技术和Android 手机红外遥控开发操控中的点击事件,只需要按照编码协议规则对键值等进行编码解析,最后转化成数 ...
- android手机红外代码HAL,Android 红外遥控器适配
红外遥控器协议简介 目前有如下几类标准1. RC5 2. NEC 3. SAMSWNG 4. ...... 5. SIRC (Sony Infrared Remote Control) 目前RK平台只 ...
- android如何编程红外遥控,全志A20[android教程]-红外遥控器调试
第1章 前言 要在树莓派3 (A20)android系统上实现红外遥控器,因为super3上有红外接收头,所以可以直接支持红外遥控器,可以把树莓派3应用到家庭控制当中.当作网络机顶盒用 树莓派3的 ...
- rk3568 Android 适配红外遥控器
rk3568 适配红外遥控器 生活中充满了各种波长的电磁波,所谓的可见(色)光就是人眼可见的电磁波谱,其波长为 380~770nm,为了避免遥控器发射的光造成人眼不适及减少一般人造光源干扰,故选用人眼 ...
- android手机红外代码HAL,手机红外遥控器发送红外信号到STM32【HAL库】
现在大部分手机上都有红外遥控功能,而且好像大部分信号STM32都是可以收到的.现在就使用STM32发送红外信号,由STM32上的红外接收器接收后执行不同的操作.以下是注意事项: 在标准库中有 EXT ...
- Android 手机蓝牙遥控器解决方案
驱动力(需求): 女朋友觉得躺床上用ipad看电视剧不爽,对睡姿要求太高,还容易砸到自己,所以提出需求,没辙,搞起来: 现有设备: Rk3288 开发版一个,dell 显示器一个,小音箱一对: 思路: ...
最新文章
- 数字图像处理:(1)图像梯度以及算子应用
- Android之全面解析OkHttp源码
- 列表,集合,元组,字典
- 了解c语言程序员(工程师)岗位需要掌握哪些能力?_码畜,码农,码皇,程序员有什么区别?...
- Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程)
- 用多态和组合替换多个条件
- 计算机基础知识二进制转换,计算机基础知识数制转换
- 微软五月份安全补丁发布
- 单目视觉里程计 mono vo
- juc包下四大并发工具
- 'System.Data.SqlClient' could not be loaded解决办法
- 那天有个小孩跟我说LINQ(三)
- linux下hadoop 环境搭建
- 图像颜色与强度分离(intensity and color decouple)方法 matlab代码
- 工大助手--加权平均分计算
- CRC-16/MODBUS x16+x15+x2+1校验计算 C++
- Final阶段基于spec评论作品
- 关于中国新能源发展最近趋势的深度分析!政府和科技巨头抓住了历史拐点
- 区块链系统开发介绍模块
- EIB智能家居系统技术及应用