如何捕获来自未知USB OTG设备的信号?

如何解决如何捕获来自未知USB OTG设备的信号?

我有一个像鼠标一样工作的USB OTG设备,是在中国购买的,没有更多有关二手控制器的信息。当我将其连接到我的android时,有一个鼠标光标,并且该设备具有5个硬按钮(向左,向右,向上,向下,输入)。我想对应用程序的按钮进行编程以执行特定任务。所以我需要读取输入信号并将其覆盖。

如何捕捉信号?

我找到了供应商(0x04D9)和产品ID(0x2519)以及控制器名称​​ Lenovo Calliope USB Keyboard 。但是不知道使用过的芯片是秘密的。

它不适用于方法onKeyDowndispatchKeyEvent。同样,USB serial Lib也不可用,因为无法使用提供的VID和PID找到/识别该设备(请参见下面与FatihŞennik进行的讨论,其他设备也可以被识别)。

我目前的假设是这是硬件/芯片问题,我无法获得信号。但是奇怪的是,设备否则会执行应有的功能

解决方法

您可以使用USB串行库,例如https://github.com/mik3y/usb-serial-for-android,并提供USB OTG设备的供应商和产品ID来控制它。因此,您可以在任何监视器中捕获左,右,上,下和十六进制代码,并且可以基于原始字节进行类似操作的切换。

UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() { 
     //Defining a Callback which triggers whenever data is read.
        @Override
        public void onReceivedData(byte[] arg0) {
            String data = null;
            try {
                data = new String(arg0,"UTF-8");
                data.concat("/n");
                switch() // etc
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    };

首先让我们尝试将我们的android手机连接到USB otg设备。至于产品和供应商ID,将其插入PC时可以找到它。如果建立了连接,那么其余的将到来。如果您可以在此处共享USB Otg设备数据表,将会很有帮助。

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
        ProbeTable customTable = new ProbeTable();
        customTable.addProduct(0x0403,0x6001,CdcAcmSerialDriver.class);

        List<UsbSerialDriver> availableDrivers = new UsbSerialProber(customTable).findAllDrivers(manager);
        ArrayAdapter<String> deviceList = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_2);
        ListView listDevices = (ListView) findViewById(R.id.listView);
        if(!availableDrivers.isEmpty()) {
            for(UsbSerialDriver driver: availableDrivers) {
                deviceList.add(driver.getDevice().getDeviceName());
            }
            listDevices.setAdapter(deviceList);
        } else {
            Toast.makeText(getApplicationContext(),"No devices found",Toast.LENGTH_LONG).show();
        }
    }
}

如果它是USB隐藏设备,尝试使用此代码可能会有所帮助;

UsbManager mManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String,UsbDevice> deviceList = mManager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();

while (deviceIterator.hasNext())
    {
        UsbDevice device = deviceIterator.next();
        Log.i(TAG,"Model: " + device.getDeviceName());
        Log.i(TAG,"ID: " + device.getDeviceId());
        Log.i(TAG,"Class: " + device.getDeviceClass());
        Log.i(TAG,"Protocol: " + device.getDeviceProtocol());
        Log.i(TAG,"Vendor ID " + device.getVendorId());
        Log.i(TAG,"Product ID: " + device.getProductId());
        Log.i(TAG,"Interface count: " + device.getInterfaceCount());
        Log.i(TAG,"---------------------------------------");
   // Get interface details
        for (int index = 0; index < device.getInterfaceCount(); index++)
        {
        UsbInterface mUsbInterface = device.getInterface(index);
        Log.i(TAG,"  *****     *****");
        Log.i(TAG,"  Interface index: " + index);
        Log.i(TAG,"  Interface ID: " + mUsbInterface.getId());
        Log.i(TAG,"  Inteface class: " + mUsbInterface.getInterfaceClass());
        Log.i(TAG,"  Interface protocol: " + mUsbInterface.getInterfaceProtocol());
        Log.i(TAG,"  Endpoint count: " + mUsbInterface.getEndpointCount());
    // Get endpoint details 
            for (int epi = 0; epi < mUsbInterface.getEndpointCount(); epi++)
        {
            UsbEndpoint mEndpoint = mUsbInterface.getEndpoint(epi);
            Log.i(TAG,"    ++++   ++++   ++++");
            Log.i(TAG,"    Endpoint index: " + epi);
            Log.i(TAG,"    Attributes: " + mEndpoint.getAttributes());
            Log.i(TAG,"    Direction: " + mEndpoint.getDirection());
            Log.i(TAG,"    Number: " + mEndpoint.getEndpointNumber());
            Log.i(TAG,"    Interval: " + mEndpoint.getInterval());
            Log.i(TAG,"    Packet size: " + mEndpoint.getMaxPacketSize());
            Log.i(TAG,"    Type: " + mEndpoint.getType());
        }
        }
    }
    Log.i(TAG," No more devices connected.");
}
,

如果什么都没解决的解决方案:我得到了一个arduino控制器,并将其焊接到按钮上。没那么复杂。

重要的是控制器支持隐藏带有atmega32u4芯片的leonardo pro micro。可以通过google轻松找到控制器的代码。

然后可以与覆盖onKeyDown或onKeyUp等一起使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?