我正在使用android上的蓝牙做一些事情,我想连接到其中一个发现的设备并为其打开套接字连接。
我已授予所有必需的权限:Bluetooth,Bluetooth_Admin,Access_Fine_Location和Access_Coarse_Location,并在我对蓝牙进行任何操作之前先询问他们。
现在,我发现了一些带有adapter.startDiscovery();
和activity.registerReceiver(receiver, filter);
的设备
在接收器中找到某个名称的设备,我尝试像这样连接到它:
adapter.cancelDiscovery();
Log.d(TAG, "Create Bond");
device.createBond();
try {
socket = device.createRfcommSocketToServiceRecord(uuid);
Log.d(TAG, "Sleep 10");
sleep(10000);
Log.d(TAG, "Create Socket");
//socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
Log.d(TAG, "Connect socket");
socket.connect();
Log.d(TAG, "Connecting Done");
} catch (Exception e) {
Log.d(TAG, "Failed to connect to device", e);
try {
socket.close();
} catch (Exception e2) {
Log.d(TAG, "Failed to close socket", e2);
}
}
这是一个测试代码,我正在尝试使用该代码创建一个套接字并打开连接。
我在.connect()上收到以下异常:
java.io.IOException:读取失败,套接字可能关闭或超时,读取 ret:-1 在android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:684) 在android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:696) 在android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:373)
我在做什么错了。
我连接的蓝牙设备是Android移动设备,但是我计划在设法建立连接时使用其他设备。
Update1: Android版本是7.0
答案 0 :(得分:1)
使用fetchUuidsWithSdp()
和getUuids()
查找所有已发布的服务及其关联的UUID值。
答案 1 :(得分:0)
您无需致电device.createBond();
即可连接到蓝牙设备。
尝试删除此行。另外,请检查您的手机是否尚未与您要连接的设备配对。 您可以在“蓝牙设置”屏幕上进行检查(长按智能手机上的“蓝牙”图标将其打开。
以下是启动蓝牙连接的示例代码:
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;
try {
// Get a BluetoothSocket to connect with the given BluetoothDevice.
// MY_UUID is the app's UUID string, also used in the server code.
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.e(TAG, "Socket's create() method failed", e);
}
mmSocket = tmp;
}
public void run() {
// Cancel discovery because it otherwise slows down the connection.
bluetoothAdapter.cancelDiscovery();
try {
// Connect to the remote device through the socket. This call blocks
// until it succeeds or throws an exception.
mmSocket.connect();
} catch (IOException connectException) {
// Unable to connect; close the socket and return.
try {
mmSocket.close();
} catch (IOException closeException) {
Log.e(TAG, "Could not close the client socket", closeException);
}
return;
}
// The connection attempt succeeded. Perform work associated with
// the connection in a separate thread.
manageMyConnectedSocket(mmSocket);
}
// Closes the client socket and causes the thread to finish.
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "Could not close the client socket", e);
}
}
}
此代码来自Android官方文档: https://developer.android.com/guide/topics/connectivity/bluetooth#ConnectAsAClient
答案 2 :(得分:0)
我写了另一个代码,而不是我在服务器端使用的代码。
ruby-2.4+
我在启动线程中使用了此代码,而不是从问题中调用代码。
在一个应用程序上安装带有服务器代码的应用程序,然后在套接字上调用“ connect”就可以了。 我使用了相同的UUID(上一个是随机生成的,新的是字符串中的静态字符串)。