我们有一个硬件会尝试连接到Android手机,因此在Android手机上打开一个服务器套接字并且监听将起作用。
我现在遇到的问题是我们有一个广播接收器正在侦听ACL_CONNECTED和ACL_DISCONNECTED。
广播接收器没有接收到这些事件,服务器套接字也不接受来自硬件的连接,只是保留在accept()
方法。
要使其正常工作,我必须先从Android手机连接到硬件,然后从那一点开始,我将获得所有ACL_CONNECTED / ACL_DISCONNECTED事件,而我的服务器套接字正在接受来自硬件。
这是正常行为吗?在收到ACL_CONNECTED / ACL_DISCONNECTED事件之前,Android必须先与硬件建立一次连接吗?一旦我这样做,我将始终收到这些事件,直到我确实想要在设备上重置工厂,然后再次出现同样的问题。
由于
答案 0 :(得分:1)
如果没有提供任何代码,很难弄清楚到底出了什么问题。但是我想要猜测一下。连接失败的最常见原因是因为未提供适当的UUID。
在大多数情况下,普通设备(如打印机,键盘,耳机等)的最通用UUID为00001101-0000-1000-8000-00805F9B34FB。当您要求您的手机连接到此类设备并且您在大多数时间使用此UUID时它将连接。但是,当您告诉硬件设备连接到手机(初始化连接)时,如果手机没有相应的UUID,则无法建立连接。
总结如下: 检查您的UUID定义。
你的android端代码看起来这个吗?
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
public ConnectThread(BluetoothDevice device) {
// Use a temporary object that is later assigned to mmSocket,
// because mmSocket is final
BluetoothSocket tmp = null;
mmDevice = device;
// Get a BluetoothSocket to connect with the given BluetoothDevice
try {
// MY_UUID is the app's UUID string, also used by the server code
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) { }
mmSocket = tmp;
}
public void run() {
// Cancel discovery because it will slow down the connection
mBluetoothAdapter.cancelDiscovery();
try {
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
} catch (IOException connectException) {
// Unable to connect; close the socket and get out
try {
mmSocket.close();
} catch (IOException closeException) { }
return;
}
// Do work to manage the connection (in a separate thread)
manageConnectedSocket(mmSocket);
}
/** Will cancel an in-progress connection, and close the socket */
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
}
如果是这种情况,则它是客户端而不是服务器。并且您的硬件正在侦听客户端连接到它而不是相反。