我们的设备通过蓝牙发送数据,在Android应用中我们需要读取这些数据。
我能够建立蓝牙连接,接下来我正在调用一个线程来使用BluetoothDevice建立蓝牙连接。这里读取字节时返回0(零) while循环也只运行一次。
我在下面的代码中使用的UUID也来自某些蓝牙代码段。我是否需要获取设备的正确UUID。
请有人帮忙吗?。如果你给我一个有用的答案,我们将不胜感激。
//Calling ConnectThread after Bluetooth is paired
public class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
private final UUID MY_UUID = UUID
.fromString("00001101-0000-1000-8000-00805f9b34fb");
public ConnectThread(BluetoothDevice device) {
BluetoothSocket tmp = null;
mmDevice = device;
try {
String name = device.getName();
Log.e("Device Name ", name);
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
}
mmSocket = tmp;
}
public void run() {
// mAdapter.cancelDiscovery();
try {
mmSocket.connect();
ConnectedThread mConnectedThread = new ConnectedThread(mmSocket);
mConnectedThread.start();
} catch (IOException connectException) {
// try {
// mSocket.close();
// } catch (IOException closeException) { }
return;
}
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
}
}
}
private 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;
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[1024];
int begin = 0;
int bytes = 0;
while (true) {
try {
// bytes += mmInStream.read(buffer, bytes, buffer.length
// - bytes);
if (mmSocket.isConnected()) {
Log.e("Socket is connected", "Socket is connected");
}
int numOfBytes = mmInStream.available();
Log.e("numOfBytes", String.valueOf(+numOfBytes));
bytes = mmInStream.read(buffer);
// mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
// .sendToTarget();
} catch (IOException e) {
break;
}
}
}
i am struck and unable to read the data from the Bluetooth
答案 0 :(得分:1)
我是否需要获取设备的正确UUID。
是。您可以使用getUuids()
BluetoothDevice
返回远程设备支持的功能(UUID),如果需要新的UUID,则fetchUuidsWithSdp()
。
while循环只运行一次。
这是因为您的代码抛出错误而您正在处理此错误并退出循环
while (true) {
try {
// bytes += mmInStream.read(buffer, bytes, buffer.length
// - bytes);
if (mmSocket.isConnected()) {
Log.e("Socket is connected", "Socket is connected");
}
int numOfBytes = mmInStream.available();
Log.e("numOfBytes", String.valueOf(+numOfBytes));
bytes = mmInStream.read(buffer);
// mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
// .sendToTarget();
} catch (IOException e) {
// THIS BREAK INTERRUPT YOUR WHILE-LOOP SENTENCE
break;
}
}
这里读取字节时返回0
因为您创建了一个套接字的InputStream,但它没有连接到任何东西(因为您创建套接字所创建的UUID在您进行蓝牙连接的设备中不存在)
修改强>
获取uuids的其他方法是配置广播接收器以取回uuids:
//Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothDevice.ACTION_UUID);
//Set your other filters
registerReceiver(ActionFoundReceiver, filter); // Don't forget to unregister during onDestroy
创建您的BroadcastRecievier以获取UUID:
private final BroadcastReceiver ActionFoundReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(BluetoothDevice.ACTION_UUID.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Parcelable[] uuidExtra = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID);
for (int i=0; i<uuidExtra.length; i++) {
Log.i("TEST-UUIDS","Device: " + device.getName() + ", " + device + ", Service: " + uuidExtra[i].toString());
}
}
else if(BluetoothDevice.YOUR_OTHER_ACTION_1){
//YOUR CODE FOR ACTION 1
}
else if(BluetoothDevice.YOUR_OTHER_ACTION_2){
//YOUR CODE FOR ACTION 2
}
}
};
注意:并非每个蓝牙设备都显示其服务uuids'