我想使用红外线制作Android应用程序' Universal Remote Control'我可以从这里找到许多XML格式的IR代码:https://github.com/probonopd/lirc-remotes。以下是密钥的IR代码示例:
<code name="KEY_PLAY" codeno="0x0000000000000059">
<decoding protocol="Sony12" device="17" subdevice="-1" obc="50" hex0="76" hex1="77" hex2="-1" hex3="-1" misc="no repeat" error=""/>
<ccf>0000 006d 000d 0000 005c 0016 0017 0016 002e 0016 0017 0016 0017 0016 002e 0016 002e 0016 0017 0016 002e 0016 0017 0016 0017 0016 0017 0016 002e 03d4</ccf>
</code>
现在我想从这些XML文件中获取我想在我的应用程序中显示的目标设备类型。设备类型可以是电视或DVD播放器或AC等。我知道可以获取设备代码,但如何获取设备类型与设备代码?
另一个问题是,是否存在所有上述XML文件的通用Android / Java代码,它只返回我需要传输的IR模式?
答案 0 :(得分:0)
不幸的是,&#34;设备代码&#34;之间没有简单的映射。和设备类型。实际上,XML中的设备代码与IR协议有关。虽然有些制造商可能会使用此字段来映射其设备类型,但大多数制造商都没有。即使是制造商使用设备代码映射到实际的设备类型,映射也不是通用的。
您可以从Pronto Hex格式的ccf字段中提取载波频率和模式。 (参见Pronto's IR Code Format)转换非常简单。
以下是供您参考的示例类。 (在C#中,但可以很容易地转换为Java。)
public class ProntoFormat
{
private int mFrequency = 0;
private List<int> mSequence1 = new List<int>();
private List<int> mSequence2 = new List<int>();
public int CarrierFrequency { get { return mFrequency; } }
public Boolean LoadData(int[] data)
{
// reset
mFrequency = 0;
mSequence1.Clear();
mSequence2.Clear();
// check length
if (null == data || data.Length < 6)
{
return false;
}
// check preamble: must be 0 for raw data, so far we only handle raw data
if (data[0] != 0)
{
return false;
}
// check frequency
if (data[1] != 0)
{
mFrequency = (int)(1000000 / ((double)data[1] * 0.241246));
if (mFrequency > 65000) // so we set the ceiling to 65KHz
{
return false;
}
}
else
{
return false;
}
// check burst pair sequence 1 count
int sequenceLen1 = data[2] * 2;
// check burst pair sequency 2 count
int sequenceLen2 = data[3] * 2;
if (data.Length < 4 + sequenceLen1 + sequenceLen2)
{
return false;
}
for (int i = 0; i < sequenceLen1; i++)
{
mSequence1.Add(data[4 + i]);
}
for (int i = 0; i < sequenceLen2; i++)
{
mSequence2.Add(data[4 + sequenceLen1 + i]);
}
return true;
}
public int[] GetWaveform()
{
if (CarrierFrequency == 0 ||
(mSequence1.Count == 0 && mSequence2.Count == 0))
{
return new int[0];
}
// carrier cycle time
int cycleTime = 1000000 / CarrierFrequency;
int[] waveform = new int[mSequence1.Count + mSequence2.Count];
for (int i = 0; i < mSequence1.Count; i++)
{
waveform[i] = mSequence1[i] * cycleTime;
}
for (int i = 0; i < mSequence2.Count; i++)
{
waveform[i + mSequence1.Count] = mSequence2[i] * cycleTime;
}
return waveform;
}
}