InputStream 在监听 BluetoothSocket 时没有得到任何东西
InputStream not getting anything while listening on a BluetoothSocket
我制作了一个简单的应用程序来监听 Bluetooth
与我的蓝牙模块的串行通信。在这种情况下,蓝牙模块充当服务器,而我的 Android phone 作为客户端。
我能够配对设备并连接到它。但是,我没有得到 InputStream
的任何信息。知道为什么吗?可能与模块具有 PIN 1234 并且我从未对 PIN 进行硬编码(但我能够连接)这一事实有关
监听线程的代码:
public class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
//private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
// tmpOut = socket.getOutputStream();
} catch (IOException e) {
System.out.println("IO EXCEPTION: "+ e.toString());
}
mmInStream = tmpIn;
// mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
processBytes(bytes);
} catch (IOException e) {
System.out.println("IO EXCEPTION: "+ e.toString());
break;
}
}
}
编辑:
我刚刚注意到这个错误:android bluetooth connection fail (isSocketAllowedBySecurityPolicy start : device null)
但我已经尝试获取 UUID,而且我有正确的 UUID:
00001101-0000-1000-8000-00805f9b34fb
编辑 2:
这也可能是我的问题,因为我在 SG3 上并且使用 SPP BT 模块。
Android Bluetooth SPP with Galaxy S3
编辑3:
我也试过改变:
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
与:
tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
他们在这里建议:Bluetooth pairing without user confirmation
编辑4:
我尝试使用 Android 官方示例进行 BT 聊天。它有同样的问题。我确定我的 BT 模块可以正常工作,因为我已经在 PC 上尝试过它,并且还在带有另一个 BT 终端应用程序的同一个 SG3 上尝试过。但是,有几个 BT 终端无法使用,我必须找到合适的终端。能有什么区别吗?
你也应该知道,我正在向红外接收器发送红外信号,红外接收器将其传递给 BT 模块,然后再将其传递给移动应用程序。红外接收器的波特率为9600,与红外灯相同。
您在连接线程中的代码看起来没问题,直到您到达这里:
// Send the obtained bytes to the UI activity
processBytes(bytes);
因此,在没有看到您的其余代码的情况下,我假设问题出在这里。
它没有抓住,因为没有抛出异常。但是您没有处理字节如何正确传递回 UI。
我注意到您在此处使用 api 中的代码:
developer.android.com/guide/topics/connectivity/bluetooth
而你缺少的是:
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
我在编写第一个蓝牙应用程序时也遇到了这个问题。我试图简化代码示例并试图排除处理程序。
/**
* The Handler that gets information back from the BTManager
*/
private final Handler mHandler = new Handler() {
@Override public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case Constants.MESSAGE_STATE_CHANGE:
switch (msg.arg1) {
case BluetoothManager.STATE_CONNECTED:
// TODO
break;
// todo .../
}
break;
case Constants.MESSAGE_READ:
byte[] readBuf = (byte[]) msg.obj;
// construct a string from the valid bytes in
// the buffer
String readMessage =
new String(readBuf, 0, msg.arg1);
// TODO display your string message
break;
// todo .../
}
}
};
如果需要,您可以下载示例 developer.android.com/samples, it is important to manage the threads, I use sychroninized methods。
除了看到更多您的代码之外,这是最有可能的猜测。
如果这不能回答您的问题,请告诉我。
我制作了一个简单的应用程序来监听 Bluetooth
与我的蓝牙模块的串行通信。在这种情况下,蓝牙模块充当服务器,而我的 Android phone 作为客户端。
我能够配对设备并连接到它。但是,我没有得到 InputStream
的任何信息。知道为什么吗?可能与模块具有 PIN 1234 并且我从未对 PIN 进行硬编码(但我能够连接)这一事实有关
监听线程的代码:
public class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
//private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
// tmpOut = socket.getOutputStream();
} catch (IOException e) {
System.out.println("IO EXCEPTION: "+ e.toString());
}
mmInStream = tmpIn;
// mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
processBytes(bytes);
} catch (IOException e) {
System.out.println("IO EXCEPTION: "+ e.toString());
break;
}
}
}
编辑:
我刚刚注意到这个错误:android bluetooth connection fail (isSocketAllowedBySecurityPolicy start : device null) 但我已经尝试获取 UUID,而且我有正确的 UUID:
00001101-0000-1000-8000-00805f9b34fb
编辑 2:
这也可能是我的问题,因为我在 SG3 上并且使用 SPP BT 模块。 Android Bluetooth SPP with Galaxy S3
编辑3: 我也试过改变:
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
与:
tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
他们在这里建议:Bluetooth pairing without user confirmation
编辑4: 我尝试使用 Android 官方示例进行 BT 聊天。它有同样的问题。我确定我的 BT 模块可以正常工作,因为我已经在 PC 上尝试过它,并且还在带有另一个 BT 终端应用程序的同一个 SG3 上尝试过。但是,有几个 BT 终端无法使用,我必须找到合适的终端。能有什么区别吗?
你也应该知道,我正在向红外接收器发送红外信号,红外接收器将其传递给 BT 模块,然后再将其传递给移动应用程序。红外接收器的波特率为9600,与红外灯相同。
您在连接线程中的代码看起来没问题,直到您到达这里:
// Send the obtained bytes to the UI activity
processBytes(bytes);
因此,在没有看到您的其余代码的情况下,我假设问题出在这里。 它没有抓住,因为没有抛出异常。但是您没有处理字节如何正确传递回 UI。
我注意到您在此处使用 api 中的代码:
developer.android.com/guide/topics/connectivity/bluetooth
而你缺少的是:
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
我在编写第一个蓝牙应用程序时也遇到了这个问题。我试图简化代码示例并试图排除处理程序。
/**
* The Handler that gets information back from the BTManager
*/
private final Handler mHandler = new Handler() {
@Override public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case Constants.MESSAGE_STATE_CHANGE:
switch (msg.arg1) {
case BluetoothManager.STATE_CONNECTED:
// TODO
break;
// todo .../
}
break;
case Constants.MESSAGE_READ:
byte[] readBuf = (byte[]) msg.obj;
// construct a string from the valid bytes in
// the buffer
String readMessage =
new String(readBuf, 0, msg.arg1);
// TODO display your string message
break;
// todo .../
}
}
};
如果需要,您可以下载示例 developer.android.com/samples, it is important to manage the threads, I use sychroninized methods。 除了看到更多您的代码之外,这是最有可能的猜测。
如果这不能回答您的问题,请告诉我。