上一篇文章《红外技术及Android手机红外遥控器开发》中简单介绍了红外遥控技术和Android 手机红外遥控开发操控中的点击事件,只需要按照编码协议规则对键值等进行编码解析,最后转化成数组形式表示的电平信号,调用Android红外技术API发送电平信号数组即可。
但是在实际开发过程中,不仅需要实现点击按键模拟遥控器短按,也需要模拟遥控器的长按操作。那遥控器的长按操作发送的波形电平信号又是怎样的呢?仍然以NEC6121协议来说明,对重复发送的介绍如下:
解释一下:发送红外指令(引导码+用户码+数据码+数据反码+补齐108ms),然后发送重复指令(重复码+补齐108ms)。
代码如下:
- 电平信号数组构造类NecPattern.java
/**
* Created by huangr on 2019/8/8.
* ClassName : NecPattern
* Description : 构造NEC协议的pattern数组编码
*/
public class NecPattern {
private static final String TAG = "NecPattern";
//电平信号总时长
private static final int TOTAL_TIME = 108000;
//引导码
private static final int START_H = 9000;
private static final int START_L = 4500;
//结束码
private static final int END_L = 560;
private static final int END_H = 2000;
//重复码
private static final int LOOP_H = 9000;
private static final int LOOP_L = 2250;
//高电平
private static final int HIGH = 560;
//低电平0:1125
private static final int LOW_0 = 565;
//低电平1:2250
private static final int LOW_1 = 1690;
private static int[] pattern;
private static PatternList patternList = new PatternList();
/**
* 正常发码:引导码(9ms+4.5ms)+用户编码(高八位)+用户编码(低八位)+键数据码+键数据反码+结束码
*/
public static int[] buildPattern(int userCodeH, int userCodeL, int keyCode) {
//用户编码高八位00
String userH = constructBinary(userCodeH);
//用户编码低八位DF
String userL = constructBinary(userCodeL);
//数字码
String key = constructBinaryCode(keyCode);
//数字反码
String keyReverse = constructBinaryCode(~keyCode);
Log.d(TAG, " 键值 = [" + keyCode + "], 逆向编码 = [" + userH +userL+key+keyReverse+ "]");
patternList.clear();
//引导码
patternList.add(START_H);
patternList.add(START_L);
//用户编码
changeAdd(userH);
changeAdd(userL);
//键数据码
changeAdd(key);
//键数据反码
changeAdd(keyReverse);
//结束码
patternList.add(END_L);
patternList.add(END_H);
int size = patternList.size();
pattern = new