美文网首页程序员
android红外遥控器

android红外遥控器

作者: Mitaer | 来源:发表于2018-05-15 16:48 被阅读332次

    前言

    上帝说要有光,于是便有了光。领导说要有遥控器,于是便。。。要加班了。

    丑也要上图

    P1 遥控器

    功能实现

    因为实体遥控器的实现分为红外和2.4G,此款android版遥控器则将红外功能全部红外实现,2.4G部分功能通过网络方式实现。

    终极奥义

    public class CIRdeal {
    
        // Android 4.4之后 红外遥控ConsumerIrManager
        private static ConsumerIrManager mCIR;
        //引导码
        private static int startH = 9000;
        private static int startL = 4500;
    
        private static int high8 = 560;
        //0:1125
        private static int low0 = 565;
        //1:2250
        private static int low1 = 1690;
    
        //用户编码高八位80
        private static String userH = "00000001";
        //用户编码低八位18
        private static String userL = "10001000";
    
        //38kHz
        private static int carrierFrequency = 38000;
        private static int[] pattern;
    
        private static List<Integer> list = new ArrayList<>();
    
        /**
         * 正常发码:引导码(9ms+4.5ms)+用户编码(低八位)+用户编码(高八位)+键数据码+键数据反码
         */
        public static void transmitKey(Context context,String key, String key2) {
            checkCIR(context);
            if (!mCIR.hasIrEmitter()) {
                L.toast(context, "未找到红外发射器!");
            } else {
                list.clear();
                //引导码
                list.add(startH);
                list.add(startL);
                //用户编码
                change(userH);
                change(userL);
                //键数据码
                change(key);
                //键数据反码
                change(key2);
                //发射时数据少一位???
                change("1");
    
                int size = list.size();
                pattern = new int[size];
                for (int i = 0; i < size; i++) {
                    pattern[i] = list.get(i);
                }
                mCIR.transmit(carrierFrequency, pattern);
            }
        }
    
        /**
         * 二进制转成电平
         *
         * @param code
         */
        public static void change(String code) {
            int len = code.length();
            String part;
            for (int i = 0; i < len; i++) {
                list.add(high8);
                part = code.substring(i, i + 1);
                if (part.equals("0"))
                    list.add(low0);
                else
                    list.add(low1);
            }
        }
    
        /**
         * 检测手机是否有红外功能
         */
        public static void checkCIR(Context context) {
            if (null == mCIR) {
                // 获取系统的红外遥控服务
                mCIR = (ConsumerIrManager) context.getSystemService(Context.CONSUMER_IR_SERVICE);
            }
            if (!mCIR.hasIrEmitter()) {
                L.toast(context, "未找到红外发射器!");
            } else {
                L.log("存在红外发射器");
            }
        }
    }
    

    举个栗子

    本次项目的红外编码格式为:6122


    6122编码格式

    用户码为:8018
    载波为:38KHz
    开关操作码值为:10

    正常发码:引导码(9ms+4.5ms)+用户编码(低八位)+用户编码(高八位)+键数据码+键数据反码
    那么发射开关命令则为:

    CIRdeal.transmitKey(this, "00001000", "11110111");
    

    百思不得姐

    当信心满满的以为一切ok的时候,测试的时候设备始终没有搭理我。嚯喔,那红外解码器一测原始遥控器发码与手机的发码对比才发现,每次发送的码值都少一位“1”,怪的很。

    举一反三

    其他类似的空调电视的控制还远吗?马上操练起来!

    相关文章

      网友评论

        本文标题:android红外遥控器

        本文链接:https://www.haomeiwen.com/subject/vqoedftx.html