如何从android传输红外线以实现电视开机、音量增大和减小

use*_*010 6 java android infrared

我使用这个代码来打开三星电视,调高和调低音量,但它对我不起作用。所以想知道我错过了什么或者我做错了什么,请建议我。

 power.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                irSend(v);
            }
        });

        volup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                irSend(v);
            }
        });

        voldown.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                irSend(v);
            }
        });
        irData = new SparseArray<String>();
            irData.put(R.id.voldown,
                    hex2dec("0000 006d 0022 0003 00a9 00a8 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0040 0015 0015 0015 003f 0015 003f 0015 003f 0015 003f 0015 003f 0015 003f 0015 0702 00a9 00a8 0015 0015 0015 0e6e"));
            irData.put(R.id.volup,
                    hex2dec("0000 006d 0022 0003 00a9 00a8 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 003f 0015 003f 0015 0702 00a9 00a8 0015 0015 0015 0e6e"));
            irData.put(R.id.power,
                    hex2dec("0000 006d 0022 0003 00a9 00a8 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 0015 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 0015 0015 003f 0015 003f 0015 003f 0015 003f 0015 0702 00a9 00a8 0015 0015 0015 0e6e"));



        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

            irInit4KitKat();

        }
    }

@TargetApi(Build.VERSION_CODES.KITKAT)
public void irInit4KitKat() {

    // Get a reference to the ConsumerIrManager
    mCIR = (ConsumerIrManager) getSystemService(Context.CONSUMER_IR_SERVICE);

}


public void irSend(View view) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){

        irSend4Kitkat(view);
    }
}

    @TargetApi(Build.VERSION_CODES.KITKAT)
    private void irSend4Kitkat(View view) {

if(mCIR.hasIrEmitter() == true){
    String data = irData.get(view.getId());
    if (data != null) {
    String values[] = data.split(",");
    int[] pattern = new int[values.length-1];

    for (int i=0; i<pattern.length; i++){
        pattern[i] = Integer.parseInt(values[i+1]);
    }
    Log.e("LOG", mCIR.getCarrierFrequencies()+ "@" + Integer.parseInt(values[0]) + "@" + pattern);

    mCIR.transmit(Integer.parseInt(values[0]), pattern);
    }
}else{
        Log.e("LOG", "not supported options");
        Toast.makeText(MainActivity.this , "This device is not Support infrared." , Toast.LENGTH_LONG).show();
        }
    }



    protected String hex2dec(String irData) {
    List<String> list = new ArrayList<String>(Arrays.asList(irData
        .split(" ")));
    list.remove(0); // dummy
    int frequency = Integer.parseInt(list.remove(0), 16); // frequency
    list.remove(0); // seq1
    list.remove(0); // seq2

    for (int i = 0; i < list.size(); i++) {
    list.set(i, Integer.toString(Integer.parseInt(list.get(i), 16)*26));
    }

    frequency = (int) (1000000 / (frequency * 0.241246));
        list.add(0, Integer.toString(frequency));

    irData = "";
    for (String s : list) {
    irData += s + ",";
    }
    return irData;
     }
    }
Run Code Online (Sandbox Code Playgroud)

我还在menifest文件中设置了权限。

 <uses-permission android:name="android.permission.TRANSMIT_IR"
    android:required="false" />
<uses-feature android:name="android.hardware.consumerir" />
Run Code Online (Sandbox Code Playgroud)

我只使用了 19 及以上版本。当我们单击“文本电源”时,红外灯就会燃烧。

Som*_*boy 1

虽然我不熟悉 Android 红外 API,但我可以分享一些我在过去构建的几个玩具项目中收集到的知识。

语境

本质上,我想制作一个应用程序来控制我家周围的红外设备。我的问题是我以前(和当前)的 Android 设备没有任何红外线功能。

我的问题的解决方案

为了解决这个问题,我做了几个 Arduino 草图,它们能够使用红外 LED 向这些设备发送信号,并让我的 Android 设备使用蓝牙与 Arduino 进行通信。当 Arduino 通过蓝牙接收到特定消息时,会发出精确的红外信号,向某个设备发出命令。

它成功了!

在实际代码给出答案之前进行一些总结

这对我来说不是一件容易的事,必须做一些研究。在提供的示例代码中,我无法知道您对这个主题到底了解多少,所以我想当我解决问题时我会转储我所知道的一切。

它是如何工作的?

嗯,你们可能已经知道这一点,但红外线是使用红外线作为传输的串行通信的另一种方式。通俗地说,这意味着有某种东西可以模拟 1 和 0(灯亮与灯灭)以及特定的频率,两个设备都需要发送和读取位才能理解消息。

旁注:它对光干扰非常敏感,但在室内工作得很好。 Sidenote2:一些供应商(如索尼)会发送突发消息,而不是发送一次消息。索尼以 3 个信号的短脉冲形式发送一个短有效负载,然后进行较长的暂停。

Eastereg:我还注意到一些供应商发送静态前缀,以便他们的设备可以过滤掉命令的干扰。

例如: 以正确频率发送的以 开头的消息0xFEFEXXXX是 Vendor-X 的有效前缀

我如何知道我需要使用的消息和频率才能让我的电视/空调发出嘟嘟声?

好吧,你完蛋了。通常红外通信协议是专有的而不是开源的。这意味着您可以采取两项主要措施来解决此类问题:

  1. 您可以自己破解协议(建议)
  2. 您可以进行研究,看看是否有在线社区已经破解了您所针对的供应商的协议

1 - 自己破解协议

这听起来可能是一项艰巨的任务,但如果您已经拥有供应商设备,那么这并不难,真的。事实是,一旦供应商对某种通信协议感到满意,他们就会将其填充到其他所有设备中,直到发现重大缺陷。因此,一旦您破解了一台 Vendor-X 电视的代码,它也可能适用于其他 Vendor-X 电视。

我怎么做?

我为我的数码相框 (NIX X08G)、索尼 Bravia 电视和淡色 LED 灯条所做的方法是使用带有红外接收器的简单 Arduino 草图,将信号输出并精美打印。

您可以在这里找到所有代码

您要查找的是文件夹.ino下的草图ir_code_dump另请确保传感器符合README.md文件中描述的规格。

因此,只需组装硬件(非常简单且便宜),将ir_code_dump草图闪存到 Arduino 中,然后使用红外遥控器指向红外传感器并开始将输出拉入Serial console. 您可以将 Arduino IDE 的输出复制粘贴到文件中.txt,然后在您的 Android/Arduino 项目中使用该文件。

正如您在存储库的其他文件夹中看到的那样,我将非常小的 arduino 草图放在一起,用于切换框架、索尼电视和 LED 灯条。

嘿,但是你上面提到了空调。为什么没有AC的草图?

公平的。AC 发生的情况是,它们发出的消息太长,ir_code_dump由于内存限制和实现细节,我无法使用 arduino sketch 来提取消息。尽管如此,还是有一些开源项目试图提取这些消息并将其提供给社区。这是我使用过的存储库

2 - 进行研究

看到我上面描述的所有内容了吗?很可能其他人已经为您完成了这项工作并将其发布在 github 或类似的地方。您可以查找它,看看是否有人已经破解了您的供应商的代码。

在 Android 上发送消息

在这里,我可以提供一些指导,如果我必须自己实现的话,我会做什么,因为我从来没有机会使用给定的 API。

开源库

我敢打赌其他人已经解决了这个问题,并且很可能已经创建了一个您已经可以使用的开源库。这种方法将是最快的方法,而且麻烦也更少,因为其他人会使用它并测试它是否有效并解决手头的问题。您还可以先浏览一下代码,看看如何自己实现同样的事情。这个看起来很合适

自己实现

假设您已经破解了要发送的有效负载,并且还破解了您愿意发送该有效负载的频率:您缺少的是使用 Android API 对其进行编码。

查看 Arduino IR 库,了解它们如何实际切换红外 LED 的实现细节,看看您是否可以自己执行此操作,或者是否有包装 API 可以为您简化流程。

最后说明:

我知道我没有提供 Android 上的示例代码来解决您的具体问题,但我希望我能够为您提供一些启发,让您更轻松地找到正确的路径或自己解决问题。

节日快乐!