在 Android 内使用蓝牙在 2 台设备之间发送数据
Send data between 2 devices using Bluetooth in Android
我正在开发一个应用程序,您可以在其中使用蓝牙将对象数组列表发送到另一台设备。
由于我是新手,我已经能够将这 2 台设备配对,但我无法发送内容。我遵循了 google 指南,但我很难理解它。
这是代码:
public class ServerThread implements Runnable {
private final BluetoothServerSocket serverSocket;
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
private final String APPNAME = "Quick";
private final java.util.UUID UUID = java.util.UUID.fromString("aeeb5480-1c74-45e2-bfd0-f592958cba2a");
private Handler handler;
public ServerThread(Handler handler) {
this.handler = handler;
BluetoothServerSocket tmp = null;
try {
tmp = bluetoothAdapter.listenUsingRfcommWithServiceRecord(APPNAME, UUID);
} catch (IOException e) {
}
serverSocket = tmp;
}
@Override
public void run() {
BluetoothSocket socket;
while (true) {
try {
BluetoothSocket tmp;
tmp = serverSocket.accept();
socket = tmp;
} catch (IOException e) {
break;
}
if (socket != null) {
}
}
}
}
.
public class ClientThread implements Runnable {
private static final UUID UUID = java.util.UUID.fromString("aeeb5480-1c74-45e2-bfd0-f592958cba2a");
private static BluetoothSocket socket;
BluetoothDevice device;
private Handler handler;
public ClientThread(BluetoothDevice device, Handler handler) {
this.handler = handler;
BluetoothSocket tmp = null;
this.device = device;
try {
tmp = device.createRfcommSocketToServiceRecord(UUID);
} catch (IOException e) {
e.printStackTrace();
}
socket = tmp;
}
@Override
public void run() {
if (BluetoothAdapter.getDefaultAdapter().isDiscovering()) {
BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
}
try {
socket.connect();
} catch (IOException e) {
try {
socket.close();
} catch (IOException e1) {
}
return;
}
}
public static BluetoothSocket getSocket() {
return socket;
}
}
问题是我不知道如何在设备之间传输数据以及我需要在哪里调用允许我这样做的方法。如果有人可以帮助我会很棒。
谢谢
一旦您获得服务器端的 BluetoothSocket,在 accept() 例程之后,以及您的客户端通过 connect() 方法,您就可以开始设备之间的通信。为此,您需要一个 InputStream 和一个 Outputstream 对象链接到客户端和服务器端的套接字:您可以通过简单地使用 BluetoothSocket 方法 getInputStream() 和 getOutputStream 来获取它们。使用OutputStream向通信的另一端写入数据(通过write(byte[])方法)和InputStream read()方法(有3种,如果我没记错的话)收集接收到的数据。
您可能已经想到,蓝牙通信由字节流组成;你不能直接发送复杂的对象,但你必须在发送前分解它们并在接收后重新组合它们,所以你需要为你的arraylist对象实现一个解析例程。
[编辑:使用java.io你实际上可以发送复杂的"objects"; Reader 和 Writers 用于 send/receive 字符串,而 FileInputStream 和 FileOutputStream 用于交换文件。您甚至可以序列化对象并通过流发送它们;我的回答缺乏经验,所以请注意,存在可以简化数据交换例程的解决方案;看看 java.io 图书馆。]
我还建议您查看有关 Android 蓝牙 API 和一般蓝牙架构的所有文档,以开发强大的应用程序!蓝牙可能很棘手。
我正在开发一个应用程序,您可以在其中使用蓝牙将对象数组列表发送到另一台设备。 由于我是新手,我已经能够将这 2 台设备配对,但我无法发送内容。我遵循了 google 指南,但我很难理解它。 这是代码:
public class ServerThread implements Runnable {
private final BluetoothServerSocket serverSocket;
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
private final String APPNAME = "Quick";
private final java.util.UUID UUID = java.util.UUID.fromString("aeeb5480-1c74-45e2-bfd0-f592958cba2a");
private Handler handler;
public ServerThread(Handler handler) {
this.handler = handler;
BluetoothServerSocket tmp = null;
try {
tmp = bluetoothAdapter.listenUsingRfcommWithServiceRecord(APPNAME, UUID);
} catch (IOException e) {
}
serverSocket = tmp;
}
@Override
public void run() {
BluetoothSocket socket;
while (true) {
try {
BluetoothSocket tmp;
tmp = serverSocket.accept();
socket = tmp;
} catch (IOException e) {
break;
}
if (socket != null) {
}
}
}
}
.
public class ClientThread implements Runnable {
private static final UUID UUID = java.util.UUID.fromString("aeeb5480-1c74-45e2-bfd0-f592958cba2a");
private static BluetoothSocket socket;
BluetoothDevice device;
private Handler handler;
public ClientThread(BluetoothDevice device, Handler handler) {
this.handler = handler;
BluetoothSocket tmp = null;
this.device = device;
try {
tmp = device.createRfcommSocketToServiceRecord(UUID);
} catch (IOException e) {
e.printStackTrace();
}
socket = tmp;
}
@Override
public void run() {
if (BluetoothAdapter.getDefaultAdapter().isDiscovering()) {
BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
}
try {
socket.connect();
} catch (IOException e) {
try {
socket.close();
} catch (IOException e1) {
}
return;
}
}
public static BluetoothSocket getSocket() {
return socket;
}
}
问题是我不知道如何在设备之间传输数据以及我需要在哪里调用允许我这样做的方法。如果有人可以帮助我会很棒。 谢谢
一旦您获得服务器端的 BluetoothSocket,在 accept() 例程之后,以及您的客户端通过 connect() 方法,您就可以开始设备之间的通信。为此,您需要一个 InputStream 和一个 Outputstream 对象链接到客户端和服务器端的套接字:您可以通过简单地使用 BluetoothSocket 方法 getInputStream() 和 getOutputStream 来获取它们。使用OutputStream向通信的另一端写入数据(通过write(byte[])方法)和InputStream read()方法(有3种,如果我没记错的话)收集接收到的数据。
您可能已经想到,蓝牙通信由字节流组成;你不能直接发送复杂的对象,但你必须在发送前分解它们并在接收后重新组合它们,所以你需要为你的arraylist对象实现一个解析例程。
[编辑:使用java.io你实际上可以发送复杂的"objects"; Reader 和 Writers 用于 send/receive 字符串,而 FileInputStream 和 FileOutputStream 用于交换文件。您甚至可以序列化对象并通过流发送它们;我的回答缺乏经验,所以请注意,存在可以简化数据交换例程的解决方案;看看 java.io 图书馆。]
我还建议您查看有关 Android 蓝牙 API 和一般蓝牙架构的所有文档,以开发强大的应用程序!蓝牙可能很棘手。