Tôi gặp sự cố khi gửi Lệnh từ thiết bị Android của tôi đến thiết bị Bluetooth.Gửi Lệnh tới Bluetooth từ thiết bị Android
Bluetooth được kết hợp với bộ điều khiển vi mô. Nỗ lực của tôi là dưới đây:
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_ENABLE_BT = 2;
private BluetoothAdapter mBluetoothAdapter;
public static final String TAG = "CustomPOC BLEEEEEEE";
private Button btn_send;
private BluetoothDevice mdevice;
private Handler mHandler;
private ConnectThread mConnectThread;
private ConnectedThread mConnectedThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
btn_send = (Button)findViewById(R.id.senddata);
if (mBluetoothAdapter == null) {
Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
finish();
return;
}
if (!mBluetoothAdapter.isEnabled()) {
Log.i(TAG, "onClick - BT not enabled yet");
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
}
pairedOrNot();
btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mConnectThread = new ConnectThread(mdevice);
mConnectThread.start();
// new ConnectAsynk(mdevice).execute();
}
});
}
private void pairedOrNot() {
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
List<String> s = new ArrayList<String>();
for(BluetoothDevice bt : pairedDevices) {
s.add(bt.getAddress());
s.add(bt.getName());
if("08:7C:BE:00:00:01".equals(bt.getAddress())) {
mdevice = bt;
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_ENABLE_BT:
// When the request to enable Bluetooth returns
if (resultCode == Activity.RESULT_OK) {
Toast.makeText(this, "Bluetooth has turned on ", Toast.LENGTH_SHORT).show();
} else {
// User did not enable Bluetooth or an error occurred
Log.d(TAG, "BT not enabled");
Toast.makeText(this, "Problem in BT Turning ON ", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
Log.e(TAG, "wrong request code");
break;
}
}
private 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 {
tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
/*Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);*/
System.out.println("BTTTTTTTTTTT Address "+mmDevice.getAddress());
BluetoothDevice hxm = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress());
// Method m;
// m = hxm.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
// tmp = (BluetoothSocket)m.invoke(hxm, Integer.valueOf(1));
}
catch (Exception e){
e.printStackTrace();
}
mmSocket = tmp;
}
public void run() {
mBluetoothAdapter.cancelDiscovery();
try {
mmSocket.connect();
// Reset the ConnectThread because we're done
synchronized (MainActivity.this) {
mConnectThread = null;
}
// Cancel the thread that completed the connection
if (mConnectThread != null) {
mConnectThread.cancel();
mConnectThread = null;
}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
ConnectedThread mConnectedThread = new ConnectedThread(mmSocket);
mConnectedThread.start();
} catch (IOException connectException) {
try {
connectException.printStackTrace();
mmSocket.close();
} catch (IOException closeException) { }
} catch (Exception ex){
ex.printStackTrace();
}
}
public void cancel(){
try {
mmSocket.close();
} catch (IOException e) { e.printStackTrace();}
}
}
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) { e.printStackTrace();}
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);
for(int i = begin; i < bytes; i++) {
if(buffer[i] == "1010101100000001000000100000000100001110".getBytes()[0]) {
mHandler.obtainMessage(1, begin, i, buffer).sendToTarget();
begin = i + 1;
if(i == bytes - 1) {
bytes = 0;
begin = 0;
}
}
}
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ít heads-up mà khi tôi kiểm tra tình trạng kết nối bởi
tmp.isConnected()
tôi thấy rằng nó đang trở lại một
sai
giá trị.
Tôi muốn gửi lệnh này (1010101100000001000000010000000100001110) đến Bluetooth bên ngoài. Nhưng tôi đang gặp vấn đề. Đăng dấu vết thấp hơn ít thời gian ra mắt của ứng dụng:
08-17 07:48:39.718: W/art(14551): Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.
drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList,
android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
Khi nhấp chuột vào nút btn_send, sau đó tôi nhận được dưới đây thông điệp trong log dấu vết:
08-17 07:51:32.046: W/BluetoothAdapter(14984): getBluetoothService() called with no BluetoothManagerCallback
08-17 07:51:38.448: W/System.err(14984): java.io.IOException: read failed, socket might closed or timeout, read ret: -1
08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:573)
08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:584)
08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:321)
08-17 07:51:38.449: W/System.err(14984): at com.mahmad.custompoc11aug.MainActivity$ConnectThread.run(MainActivity.java:164)
và sau khi debug tôi quan sát vấn đề đó là trong dòng này
mmSocket.connect();
Tất cả các quyền cần thiết được đưa ra trong tệp kê khai. Vui lòng giúp tôi giải quyết vấn đề này. Cảm ơn trước.
Sản lượng logcat bạn kèm theo là không thích hợp vì trong mã của bạn tất cả các trường hợp ngoại lệ được "im lặng" - bạn bắt họ và không làm gì cả. Tối thiểu bạn phải làm khi bắt ngoại lệ là ghi lại nó (ví dụ: 'e.printStackTrace()'). Vui lòng chạy lại mã của bạn với tất cả ngoại lệ được ghi lại và sau đó chúng tôi có thể giúp bạn – Vasiliy
Câu hỏi được cập nhật. Xin vui lòng kiểm tra xem nó. – DJhon
Và một lần nữa - làm thế nào bạn có thể biết rằng không có ngoại lệ đang được ném trên đường đi? Ngoại lệ được ném để thông báo cho bạn rằng đã xảy ra sự cố, nhưng bạn chỉ cần bỏ qua chúng. Thêm 'e.printStackTrace()' vào tất cả các mệnh đề 'catch' của bạn và đăng toàn bộ kết xuất logcat. – Vasiliy