传输蓝牙数据

⟁ sportstream365 ⏳ 2025-08-08 07:56:04 👤 admin 👁️ 4800 ❤️ 292
传输蓝牙数据

在您成功连接到蓝牙后

设备,每个

有一个已连接的

BluetoothSocket。现在,您可以

在设备之间共享信息。使用 BluetoothSocket,

数据转移过程如下所示:

获取 InputStream 和

处理传输的 OutputStream

使用套接字

getInputStream()

getOutputStream()、

使用

read(byte[])和

write(byte[])。

当然,还需要考虑实现细节。具体而言,您

应使用专门的线程从数据流读取数据和向数据流写入数据。

这一点很重要,因为 read(byte[]) 和 write(byte[]) 方法

正在屏蔽来电。read(byte[]) 方法会阻塞,直到有需要处理的内容

从数据流中读取的内容。write(byte[]) 方法通常不会阻塞,

如果远程设备未调用 read(byte[]),则可以屏蔽以实施流控制

使中间缓冲区填满。因此,

应将线程中的主循环专门用于从 InputStream 读取数据。

您可以在线程中使用单独的公共方法向

OutputStream。

示例

以下示例展示了如何在两台设备之间传输数据

通过蓝牙连接:

Kotlin

private const val TAG = "MY_APP_DEBUG_TAG"

// Defines several constants used when transmitting messages between the

// service and the UI.

const val MESSAGE_READ: Int = 0

const val MESSAGE_WRITE: Int = 1

const val MESSAGE_TOAST: Int = 2

// ... (Add other message types here as needed.)

class MyBluetoothService(

// handler that gets info from Bluetooth service

private val handler: Handler) {

private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {

private val mmInStream: InputStream = mmSocket.inputStream

private val mmOutStream: OutputStream = mmSocket.outputStream

private val mmBuffer: ByteArray = ByteArray(1024) // mmBuffer store for the stream

override fun run() {

var numBytes: Int // bytes returned from read()

// Keep listening to the InputStream until an exception occurs.

while (true) {

// Read from the InputStream.

numBytes = try {

mmInStream.read(mmBuffer)

} catch (e: IOException) {

Log.d(TAG, "Input stream was disconnected", e)

break

}

// Send the obtained bytes to the UI activity.

val readMsg = handler.obtainMessage(

MESSAGE_READ, numBytes, -1,

mmBuffer)

readMsg.sendToTarget()

}

}

// Call this from the main activity to send data to the remote device.

fun write(bytes: ByteArray) {

try {

mmOutStream.write(bytes)

} catch (e: IOException) {

Log.e(TAG, "Error occurred when sending data", e)

// Send a failure message back to the activity.

val writeErrorMsg = handler.obtainMessage(MESSAGE_TOAST)

val bundle = Bundle().apply {

putString("toast", "Couldn't send data to the other device")

}

writeErrorMsg.data = bundle

handler.sendMessage(writeErrorMsg)

return

}

// Share the sent message with the UI activity.

val writtenMsg = handler.obtainMessage(

MESSAGE_WRITE, -1, -1, mmBuffer)

writtenMsg.sendToTarget()

}

// Call this method from the main activity to shut down the connection.

fun cancel() {

try {

mmSocket.close()

} catch (e: IOException) {

Log.e(TAG, "Could not close the connect socket", e)

}

}

}

}

Java

public class MyBluetoothService {

private static final String TAG = "MY_APP_DEBUG_TAG";

private Handler handler; // handler that gets info from Bluetooth service

// Defines several constants used when transmitting messages between the

// service and the UI.

private interface MessageConstants {

public static final int MESSAGE_READ = 0;

public static final int MESSAGE_WRITE = 1;

public static final int MESSAGE_TOAST = 2;

// ... (Add other message types here as needed.)

}

private class ConnectedThread extends Thread {

private final BluetoothSocket mmSocket;

private final InputStream mmInStream;

private final OutputStream mmOutStream;

private byte[] mmBuffer; // mmBuffer store for the stream

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

} catch (IOException e) {

Log.e(TAG, "Error occurred when creating input stream", e);

}

try {

tmpOut = socket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "Error occurred when creating output stream", e);

}

mmInStream = tmpIn;

mmOutStream = tmpOut;

}

public void run() {

mmBuffer = new byte[1024];

int numBytes; // bytes returned from read()

// Keep listening to the InputStream until an exception occurs.

while (true) {

try {

// Read from the InputStream.

numBytes = mmInStream.read(mmBuffer);

// Send the obtained bytes to the UI activity.

Message readMsg = handler.obtainMessage(

MessageConstants.MESSAGE_READ, numBytes, -1,

mmBuffer);

readMsg.sendToTarget();

} catch (IOException e) {

Log.d(TAG, "Input stream was disconnected", e);

break;

}

}

}

// Call this from the main activity to send data to the remote device.

public void write(byte[] bytes) {

try {

mmOutStream.write(bytes);

// Share the sent message with the UI activity.

Message writtenMsg = handler.obtainMessage(

MessageConstants.MESSAGE_WRITE, -1, -1, mmBuffer);

writtenMsg.sendToTarget();

} catch (IOException e) {

Log.e(TAG, "Error occurred when sending data", e);

// Send a failure message back to the activity.

Message writeErrorMsg =

handler.obtainMessage(MessageConstants.MESSAGE_TOAST);

Bundle bundle = new Bundle();

bundle.putString("toast",

"Couldn't send data to the other device");

writeErrorMsg.setData(bundle);

handler.sendMessage(writeErrorMsg);

}

}

// Call this method from the main activity to shut down the connection.

public void cancel() {

try {

mmSocket.close();

} catch (IOException e) {

Log.e(TAG, "Could not close the connect socket", e);

}

}

}

}

在构造函数获取必要的流后,线程会等待数据

通过 InputStream 进行传输。当 read(byte[]) 返回以下项中的数据时:

则数据会通过成员的

父类的 Handler。线程

然后等待从 InputStream 中读取更多字节。

如需发送传出数据,请从主线程调用线程的 write() 方法

activity 并传入要发送的字节。此方法会调用 write(byte[]),以

将数据发送到远程设备。如果

调用时抛出 IOException

write(byte[]),线程会向主 activity 发送一个消息框,向

设备无法向对方发送给定字节的用户

(已连接)设备。

线程的 cancel() 方法让您可以在任意时刻终止连接

关闭BluetoothSocket即可完成操作后,一律调用此方法。

使用蓝牙连接。

有关使用 Bluetooth API 的演示,请参阅蓝牙聊天示例

应用

相关推荐