我正在经历一个场景,我需要从非Android设备(例如带有蓝牙适配器的PC)接收数据。我需要显示自己的UI,并希望通过我的应用程序本身处理传入的数据。那么有没有什么好方法可以实现这个目标。
的 - 修改 的
正如@Trevor在他的回答中提到的,下面的段落没有任何意义,我只是在对该主题进行了一点长时间的研究后才明白这个事实。无论如何,感谢大家的建议。
到目前为止,我尝试使用listenUsingRfcommWithServiceRecord(...)
和createRfcommSocketToServiceRecord(...)
但是这样,我们需要在两个设备中运行我们的应用程序。目前不是我的情况。
的 - 修改 的
那么,有没有什么好方法可以从非Android设备接收数据?
提前致谢...
答案 0 :(得分:2)
您的问题有点模糊,因为当您尝试连接到您尝试使用的任何蓝牙设备时,您没有准确解释发生了什么问题。你的第二段(“到目前为止我尝试使用listenUsingRfcommWithServiceRecord(...)和createRfcommSocketToServiceRecord(...)但是这样,我们需要在两个设备中运行我们的应用程序。目前它不是我的情况。”< / em>)对我没有意义。
但是,我假设它是您尝试连接的SPP设备(即蓝牙到串行接口,或者设置有虚拟COM端口的USB PC蓝牙适配器)。在这种情况下,您可以使用蓝牙聊天示例代码,除了使用SPP UUID的一个重要更改:
/** UUID for Serial Port Profile */
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
顺便说一下,如果您使用蓝牙聊天示例作为项目的基础,请注意我在蓝牙聊天代码中发现的错误,如果以更快的速度收到打字速度,会导致收到的字符丢失。有关此信息,请参阅此处给出的答案:Android InputStream dropping first two bytes (modified BluetoothChat)
答案 1 :(得分:1)
我发现this link 非常有用,它展示了如何从Arduino发送以及从Android接收数据。
答案 2 :(得分:0)
在android sdk示例中查看一下BluetoothChat,
您需要两个线程来传达数据
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
public ConnectThread(BluetoothDevice device) {
this.mmDevice = device;
BluetoothSocket tmp = null;
try {
tmp = device.createRfcommSocketToServiceRecord(UUID.fromString(SPP_UUID));
} catch (IOException e) {
e.printStackTrace();
}
mmSocket = tmp;
}
@Override
public void run() {
setName("ConnectThread");
mBluetoothAdapter.cancelDiscovery();
try {
mmSocket.connect();
} catch (IOException e) {
try {
mmSocket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
connectionFailed();
return;
}
synchronized (PrinterService.this) {
mConnectThread = null;
}
connected(mmSocket, mmDevice);
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
Log.e("PrinterService", "close() of connect socket failed", 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;
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.e("Printer Service", "temp sockets not created", e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
@Override
public void run() {
while (true) {
try {
if (!encodeData(mmInStream)) {
mState = STATE_NONE;
connectionLost();
break;
} else {
}
// mHandler.obtainMessage(AbstractActivity.MESSAGE_READ,
// bytes, -1, buffer).sendToTarget();
} catch (Exception e) {
e.printStackTrace();
connectionLost();
PrinterService.this.stop();
break;
}
}
}