0

在我的应用程序中,我想通过蓝牙将文件或文本发送到另一个蓝牙设备(接收设备可能是 android、Nokia、LG 等)。每当服务器返回数据时,我都想发送一个文件。例如,如果气候水平低于任何特定的给定值,我正在检查天气。它自动地,需要通过蓝牙向接收设备发送数据。它不会允许用户发送。如何使用 android 蓝牙 API 实现它?

而且我还需要通过蓝牙传输任何文件,将其转换为字节数组。我已经通过蓝牙聊天示例。因为他们给出的缓冲区大小为 1024。如果文件大小超过 1024 字节意味着我应该如何传输。我是否必须每次发送每个 1024 字节并且必须在接收端合并它,或者还有其他更好的方法可用?

提前致谢。

4

1 回答 1

1

据我了解,你问了三个问题。

  1. 如何在服务器返回数据时发送文件:您基本上打开了与服务器的连接(例如http,但也可能是任何其他基于 TCP 或 UDP 的协议)。然后你监听传入的数据;一旦你收到数据,你就会触发你想要的任何动作。当您的服务器未使用时,这些是作为起点的一些相关调用http(未经测试,请参阅文档以获取详细信息和替代方案):

    Socket s = new Socket('your.server.com', 47000);
    s.connect();
    SocketChannel c = s.getChannel();
    ByteBuffer buffer = new ByteBuffer(1);
    c.read(buffer); // blocks until bytes are available
    
  2. 如何自动启动蓝牙连接:获取目标设备的BluetoothDevice对象,然后连接到它 - 就像在 BluetoothChat 演示中一样。

  3. 如何通过蓝牙发送文件/超过 1024 字节:是的,您必须在发送端将数据拆分为块并在接收端重新组合它们(注意在实际数据之前发送文件大小,以便接收器知道何时文件完整)。您还可以使用相当大的字节缓冲区。我建议使用 64 Kb 的最大块大小:这允许您重新发送块而不会花费太多(时间)成本并且不会消耗太多内存。

作为关于 3. 的初学者,这样的东西可能是发送方的核心(未经测试且没有错误处理,只是为了给出想法):

// Send the file size
OutputStream out = socket.getOutputStream();
ByteBuffer header = ByteBuffer.allocate(8);
header.putLong(file.length();
out.write(header.array());

// Send the file in chunks
byte buffer[1024];
InputStream in = new BufferedInputStream(new FileInputStream(file));
int length = in.read(buffer);
while (length > 0) {
    out.write(buffer, 0, length);
    if (length < 1024) break;
    length = in.read(buffer, 0, sizeof(buffer));
};

...和接收方:

// Receive and unmarshal the file size
InputStream in = socket.getInputStream();
ByteBuffer header = ByteBuffer.allocate(8);
byte buffer[1024];
in.read(buffer, 0, 8);
header.put(buffer);
long filesize = header.getLong();
long receivedBytes = 0;

// Receive the file
OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
int length = in.read(buffer);
while ((receivedBytes < filesize) && (length > 0)){
    out.write(buffer, 0, length);
    receivedBytes += length;
    length = in.read(buffer);
}
if (receivedBytes != filesize) ... // Assure the transfer was successful
于 2013-01-03T20:29:21.830 回答