android 空调遥控器——简单发送内容
android 空调遥控器——简单发送内容
接着上一篇我们接着研究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. * <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,二进制为10111,取低四位为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[] 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<pattern.length;i++){ content += String.valueOf(pattern[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、跑起来效果如下
原文地址http://www.bieryun.com/2889.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android ShareSDK 微博分享 (8995)app auth fail for appKey&sign&package 解决
小菜这两天接到客户的问题反馈,说微博分享失败,一直提示程序签名错误,这可把我们急坏了,紧急解决。我们借助的是 Mob 的 ShareSDK 分享功能,实际应用中相对比较稳定,集成也不复杂。 解决尝试如下: 1. 核对程序包名,签名文件MD5,AppKey 和 AppSecret,多人轮流挨个字母的核对,都是正确的,可依旧是微博分享报程序签名错误; 2. 因为当前用的 MD5签名生成器 是用的微信的 GenSignature,担心有不一致的情况,立刻下载微博官方的 MD5签名生成器;测试两者生成的 MD5 值完全一致; 微博-MD5签名生成器 微信-GenSignature 3. 不得已找到 Mob 的官方客服小哥咨询,优先让我们核对的就是程序包名,签名文件MD5,AppKey 和 AppSecret 等信息,确认一致,把截图信息和 apk 等发给客服小哥测试,确实分享失败,客服小哥也很头痛;之后检查 ShareSDK 版本,项目中应用的是 3.1.2 版本的,客服小哥建议升级一下最新的 3.1.4 版本尝试一下; 4. 集成主要包括 MobSDK.gradle 参数与微博开放平台中参数...
- 下一篇
iOS ijkplayer 数据缓存过程 详解
iOS ijkplayer 数据缓存过程 详解 [objc] view plain copy ijkplayerbuffering过程 staticvoidvoid*SDL_RunThread(voidvoid*data) { @autoreleasepool{ SDL_Thread*thread=data; pthread_setname_np(thread->name); thread->retval=thread->func(thread->data); returnNULL; } } //read_thread线程在此处开启 在read_thread函数内如果ijkplayer播放器处于缓冲状态ffp->packet_buffering标志位为true if(ffp->packet_buffering){ io_tick_counter=SDL_GetTickHR(); if(abs((int)(io_tick_counter-prev_io_tick_counter))>BUFFERING_CHECK_PER_MILLISECONDS...
相关文章
文章评论
共有0条评论来说两句吧...