通过蓝牙从android中的raspberry pi接收数据

时间:2015-06-15 05:17:21

标签: android bluetooth raspberry-pi

我正在创建一个Android应用程序,我将通过蓝牙连接到Raspberry pi。 我能够将数据发送到Raspberry pi并且它在终端上可见的问题(我在android中使用OutputStream发送数据),但是无论Ras发送了什么,我都无法在我的InputStream中获取它。

我已经阅读过使用listenrfcomm来获取另一台设备发送的数据,但在使用createrfcomm时,我也输入了输出流。我很困惑如何使用和如何使用。

注意:使用createrfcomm我能够成功地将数据发送到Raspberry pi。只有来自Rasperry pi的数据接收是剩下的部分。

请相应地告知。

1 个答案:

答案 0 :(得分:1)

使用您的代码专门回答会更容易,但我发现API指南示例很有帮助,但最初略有脱节:

有一个要连接的线程:

private class ConnectThread extends Thread {
   private final BluetoothSocket mmSocket;
   private final BluetoothDevice mmDevice;

   public ConnectThread(BluetoothDevice device) {
       // Use a temporary object that is later assigned to mmSocket,
       // because mmSocket is final
       BluetoothSocket tmp = null;
       mmDevice = device;

       // Get a BluetoothSocket to connect with the given BluetoothDevice
       try {
           // MY_UUID is the app's UUID string, also used by the server code
           tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
       } catch (IOException e) { }
       mmSocket = tmp;
   }

   public void run() {
       // Cancel discovery because it will slow down the connection
       mBluetoothAdapter.cancelDiscovery();

       try {
           // Connect the device through the socket. This will block
           // until it succeeds or throws an exception
           mmSocket.connect();
       } catch (IOException connectException) {
           // Unable to connect; close the socket and get out
           try {
               mmSocket.close();
           } catch (IOException closeException) { }
           return;
       }

       // Do work to manage the connection (in a separate thread)
       manageConnectedSocket(mmSocket);
   }

   /** Will cancel an in-progress connection, and close the socket */
   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;

       // Get the input and output streams, using temp objects because
       // member streams are final
       try {
           tmpIn = socket.getInputStream();
           tmpOut = socket.getOutputStream();
       } catch (IOException e) { }

       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
               mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                       .sendToTarget();
           } catch (IOException e) {
               break;
           }
       }
   }

   /* Call this from the main activity to send data to the remote device */
   public void write(byte[] bytes) {
       try {
           mmOutStream.write(bytes);
       } catch (IOException e) { }
   }

   /* Call this from the main activity to shutdown the connection */
   public void cancel() {
       try {
           mmSocket.close();
       } catch (IOException e) { }
   }

}

我假设您已经发送了BluetoothDevice和BluetoothAdapter,并且可以创建并运行连接线程

mConnectThread = new ConnectThread(bluetoothAdapter.getRemoteDevice(deviceAddress));
mConnectThread.start();

在示例中,bytes是读取的数据,使用mHandler.obtainMessage发送到UI线程。可以编辑此行以适应您要对接收的数据执行的操作。

示例来自http://developer.android.com/guide/topics/connectivity/bluetooth.html