如何使用蓝牙套接字从游戏控制器接收按钮事件?
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
目前我与我的游戏控制器建立了蓝牙连接。现在我正试图捕捉按钮事件,但这并不容易。我有以下代码:
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