2016-08-09 24 views
17

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.

+0

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

+0

Câu hỏi được cập nhật. Xin vui lòng kiểm tra xem nó. – DJhon

+0

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

Trả lời

1

Tôi có một mã rất simmilar và nó làm việc, có lẽ một trong những khác biệt chính nó mà tôi đang làm một thiết lập lại của bài:

// Reset the ConnectThread because we're done 
      synchronized (blablabla.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; 
    } 

    // Start the thread to manage the connection and perform transmissions 
    mConnectedThread = new ConnectedThread(socket); 
    mConnectedThread.start(); 

Ngay sau khi bạn làm:

mmSocket.connect(); 

hy vọng nó giúp.

+0

Cảm ơn sự giúp đỡ của bạn, nhưng nó không làm việc cho tôi. Bất kỳ đề xuất nào khác sẽ thực sự hữu ích. Sau khi gỡ lỗi nó có vấn đề trong dòng này "mmSocket.connect();" – DJhon

+0

Vui lòng xem câu hỏi được cập nhật. – DJhon

1

Tôi đã thử thư viện này. Bạn có thể thử nó cũng https://github.com/palaima/AndroidSmoothBluetooth

+0

Thư viện ở trên có "Vấn đề về xây dựng". Cảm ơn vì sự giúp đỡ. Tôi đang cố gắng xây dựng nó. Khi tôi có cơ hội, tôi sẽ liên lạc lại với bạn. – DJhon

0

Như bạn đã nói rằng vấn đề này là có trên mmSocket.connect(); dòng vì thế, vấn đề không phải là khi bạn đang gửi lệnh nhưng việc tạo ra một kết nối tức là bạn không thể lấy một BluetoothSocket trong mở hoặc trạng thái kết nối.

Bạn nên làm gì?

Hãy thử sử dụng mã bên dưới với UUID, giá trị hợp lệ cho khóa bluetooth của tôi.

UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); createInsecureRfcommSocketToServiceRecord(MY_UUID)

Hãy cho tôi biết nếu điều này phù hợp với bạn.

Ngoài ra kiểm tra, https://stackoverflow.com/a/18786701/1503130

+0

Xin lỗi vì sự chậm trễ trong trả lời. Nhưng nó không hoạt động. – DJhon

+0

Xin chào .. Prateek, Bạn có thể gửi lệnh không? Cần đầu vào của bạn –

+0

Có, tôi đã có thể gửi lệnh. – Prateek

Các vấn đề liên quan