Блютуз Android создает незащищенный RfcommSocketToServiceRecord при переподключении
Когда я пытаюсь подключиться в первый раз, и устройство на стороне сервера находится в зоне действия - все в порядке!
Но, если устройство недоступно (обнаружение службы не удалось), мой BT сохраняет эту запись SDP и больше не хочет подключаться. Я действительно думаю, что довольно глупо кешировать это, это выглядит как "О, мы не нашли этот UUID на этом устройстве. Его никогда не существует во всем мире, давайте запомним это навсегда".
Только если я изменю UUID или адрес, попробуйте еще раз. Но я не могу закрыть старый и открыть новый порт прослушивания UUID в любое время, когда устройство не найдено на стороне клиента.
Как я могу сказать ему "Очистить эту глупую запись" или что-то вроде этого.
PS: мне нужен API10, поэтому я использую "bConnected" вместо isConnected();
Код клиента:
public void fire(View view) {
final BluetoothAdapter BA = BluetoothAdapter.getDefaultAdapter();
final String sUuid = "SuperHidenUuid";
final UUID uuid = UUID.nameUUIDFromBytes(sUuid.getBytes());
Thread t = new Thread(new Runnable() {
@Override
public void run() {
OutputStream sOut;
InputStream sIn;
BluetoothSocket sConnection;
BA.cancelDiscovery(); //shotgun debuging
BluetoothDevice BD = BA.getRemoteDevice(sVictimBsid);
try {
sConnection = BD.createInsecureRfcommSocketToServiceRecord(uuid);
} catch (IOException e) {
return;
}
boolean bConnected = false;
try {
sConnection.connect();
bConnected = true;
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bConnected) {
sIn = sConnection.getInputStream();
sOut = sConnection.getOutputStream();
sOut.write((sVictimPass + "\n").getBytes());
BufferedReader reader = new BufferedReader(new InputStreamReader(sIn));
// here I send and receive some data
sIn.close(); //shotgun debuging
sOut.close(); //shotgun debuging
}
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000); //shotgun debuging
sConnection.close();
BA.cancelDiscovery(); //shotgun debuging
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
}