android - 用于蓝牙通信的 OutputStream 到 DataOutputStream

标签 android sockets bluetooth datainputstream dataoutputstream

我已经借助在 Internet 上找到的教程编写了一个连接到蓝牙设备的 Android 应用程序。此应用程序使用 InputStream 和 OutputStream 对象进行连接并建立连接。因为我必须传输少量数据,所以这个解决方案是可行的,因为我只能发送字节。

现在我想更改我的旧代码以使用 DataInputStream 和 DataOutputStream 轻松发送复杂数据。我试图通过简单地在我的 InputStream 和 OutputStream 之前添加数据标识符来修改我的原始代码,但这在我的代码中造成了错误。有人可以向我解释如何正确使用 DataInputStream 和 DataOutputStream 这样我就不会出错。这是我的旧代码:

 private class ConnectedThread extends Thread {
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket 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);        // Get number of bytes and message in "buffer"
                hBluetooth.obtainMessage(RECEIVE_MESSAGE, bytes, -1, buffer).sendToTarget();        // Send to message queue Handler
            } catch (IOException e) {
                break;
            }
        }
    }

    /* Call this from the main activity to send data to the remote device */
    public void send(String message) {
        if(D)   Log.d(TAG, "...Data to send: " + message + "...");
        if (btSocket != null && btSocket.isConnected()) {

        byte[] msgBuffer = message.getBytes();
        try {
            mmOutStream.write(msgBuffer);
            Log.e(TAG, "Int" +msgBuffer);
        } catch (IOException e) {
            Log.d(TAG, "...Error data send: " + e.getMessage() + "...");     
          }
        }

    }

这里是修改后的版本:

 private class ConnectedThread extends Thread {
     DataInputStream mmInStream;
     DataOutputStream mmOutStream;


    public ConnectedThread(BluetoothSocket socket) {
       InputStream tmpIn = null;
       OutputStream tmpOut = null;

        mmInStream = new DataInputStream(tmpIn);
        mmOutStream = new DataOutputStream(tmpOut);

        // 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;
    }

感谢您的任何意见!

最佳答案

如果我正确理解了你的问题,那么做这样的事情来获取 DataInputStream 和 DataOutputStream 对象:

  mmInStream = new DataInputStream(tmpIn);
  mmOutStream = new DataInputStream(tmpOut);

如果您需要它们是全局的,那么这些变量将在类外像下面这样声明,正如我从您所做的编辑中看到的那样:

   DataInputStream mmInStream;
   DataOutputStream mmOutStream;

编辑更新的问题:

public ConnectedThread(BluetoothSocket 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 = new DataInputStream(tmpIn);
    mmOutStream = new DataOutputStream(tmpOut);


}

关于android - 用于蓝牙通信的 OutputStream 到 DataOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15421476/

相关文章:

java - 应用发布错误,即使在删除 CALL_LOG 和 SMS 权限之后

android - DecorView 未在 SurfaceView 上绘制

c# - System.Sockets中的C#接收数据包

c++ - 如何衡量和修复上下文切换瓶颈?

c - '目标无法到达' ('Port unreachable' ) 将数据发送到 127.0.0.1 (localhost) 上的 UDP 套接字时

macos - 低功耗蓝牙 (BLE) 服务 - Mac OS X

android - CloudJobTicket (CJT) 中的 vendor_id 是什么?

android - Xamarin Android : FirebaseInstanceIdService was deprecated but no OnNewToken in FirebaseMessagingService

java - 将字符串从字节数组转换为 int

android - 蓝牙连接的线程在连接后立即关闭 socket