如何使用蓝牙套接字从游戏控制器接收按钮事件?

How to receive button events from a gamecontroller using a Bluetooth socket?

目前我与我的游戏控制器建立了蓝牙连接。现在我正试图捕捉按钮事件,但这并不容易。我有以下代码:

    private Stream mmInStream;
    private Stream mmOutStream;

    public BluetoothController()
    {

    }

    public void Read(BluetoothSocket socket)
    {
        Stream tmpIn = null;
        Stream tmpOut = null;

        try
        {
            tmpIn = socket.InputStream;
            tmpOut = socket.OutputStream;
        }
        catch (IOException ex)
        {
            throw ex;
        }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;

        Thread thread = new Thread(new ThreadStart(Run));
        thread.Start();
    }

    protected void Run()
    {
        byte[] buffer = new byte[1024];
        int bytes;

        while (true)
        {
            try
            {
                // Thanks to @spaceplane
                if (mmInStream.IsDataAvailable())
                {
                    // Read from the InputStream
                    bytes = mmInStream.Read(buffer, 0, buffer.Length);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

当我按下游戏控制器上的按钮时,它没有进入下一行:

if (mmInStream.IsDataAvailable())

这是怎么回事?

如果流中当前没有数据可供读取,

mmInStream.read() 将阻塞。因此,如果没有数据,它就会卡在那里等待。在从流中读取之前,您应该检查是否有任何可用数据。变化

bytes = mmInStream.Read(buffer, 0, buffer.Length);

if(mmInStream.available() > 0) {
  bytes = mmInStream.Read(buffer, 0, buffer.Length);
}

问题已解决。我不需要蓝牙插座。我刚刚使用了覆盖方法 "KeyDown" 和 "KeyUp"。现在效果很好:)

如果你需要一个套接字并且你有像 IOException 这样的异常:读取失败,套接字可能关闭那么你应该在这里阅读我的修复:

IOException:读取失败,套接字可能已关闭 - 蓝牙开启 Android 4.3