2016-08-09 11 views
17

AndroidデバイスからBluetoothデバイスにコマンドを送信する際に問題が発生しています。AndroidデバイスからBluetoothにコマンドを送信する

ブルートゥースは、マイクロコントローラに関連付けられています。私の努力は以下の通りです:

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(); 
      } 
     } 
    } 
} 

少数ヘッドアップ私は

tmp.isConnected() 

で接続状態を確認するとき、私はそれが偽

を返していることがわかったこと値。

外部Bluetoothにこのコマンド(1010101100000001000000010000000100001110)を送信します。しかし、私は問題を起こしている。ボタンbtn_send上のクリックが、その後、私は、ログトレース内のメッセージの下に取得していた場合

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 

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) 

およびデバッグした後、私はその問題がある観察トレースがアプリケーションの時間起動時に以下の通りですログインこの行の

mmSocket.connect(); 

すべての必要なアクセス許可はマニフェストファイルで与えられています。この問題を取り除く手助けをしてください。前もって感謝します。

+0

アタッチlogcat出力は無関係ですので、あなたのコード内のすべての例外は、「沈黙」している - あなたがそれらをキャッチし、何もしません。例外をキャッチするときには、ログに記録することが最低限必要です(例えば、 'e.printStackTrace()')。すべての例外が記録された状態でコードを再実行してください。 – Vasiliy

+0

質問が更新されました。これをチェックしてください。 – DJhon

+0

もう一度 - 途中で例外がスローされていないことをどのように知ることができますか?何かが間違っていることを通知するために例外がスローされますが、無視するだけです。すべての 'catch'節に' e.printStackTrace() 'を追加して、logcat出力全体を投稿してください。 – Vasiliy

答えて

1

それは私がスレッドのリセットをやっていることの主な違いの多分1つ、私は非常にsimmilarコードを持っており、それが働いている:

// 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(); 

あなたは直後:

mmSocket.connect(); 

それが役に立てば幸い。

+0

あなたの助けてくれてありがとうが、私のために働いていない。それ以上の提案は本当に役立つだろう。デバッグ後、この行に問題があります。 "mmSocket.connect();" – DJhon

+0

更新された質問をご覧ください。 – DJhon

1

このライブラリを試しました。あなたは問題が故にmmSocket.connect();ラインであることを述べてきたように、コマンドを送信していますつまり、接続を作成している一方で、問題ではないにも https://github.com/palaima/AndroidSmoothBluetooth

+0

上記のライブラリには「ビルドの問題」があります。手伝ってくれてありがとう。私はそれを構築しようとしています。私はチャンスを得ると、私はあなたに戻ってきます。 – DJhon

0

それを試すことができます開いたでBluetoothSocketを取得することができませんまたは接続された状態。

あなたはどうしたらよいですか?

UUID、私のBluetoothドングルについてその有効と以下のコードを使用してみてください。

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

これはあなたのために働くなら、私に教えてください。また

確認し、 https://stackoverflow.com/a/18786701/1503130

+0

返信の遅れに対するお詫び。しかし、それは動作しません。 – DJhon

+0

こんにちは..プラテック、あなたはコマンドを送ることができますか?入力が必要です –

+0

はい、コマンドを送信できました。 – Prateek

関連する問題