У меня возникли проблемы с подключением к WML-C46 AH Bluetooth Chip с использованием небезопасного соединения RFCOMM. Я написал приложение для Android с соответствующим кодом, чтобы показать вам мою проблему.Android-соединение с неактивным/нестабильным подключением
Приложение
Приложение имеет только одну кнопку. Если вы нажмете на эту кнопку, начнется обнаружение устройства Bluetooth. По завершении открытия приложение подключается к устройству bluetooth (я использую только одно устройство Bluetooth для тестирования, поэтому он не может найти никаких других устройств). Затем он открывает входной поток для чтения данных этого устройства. Если соединение ломается (сбрасывается ioexception) или кнопка снова нажата, соединение отключается (закрытие всех потоков, сокетов и потоков). Если нажать на кнопку еще раз новое открытие устройства запускается и так далее ...
Проблема
соединение не работает должным образом. Входной поток данных, по-видимому, немного отсталый, и иногда соединение прерывается без какой-либо видимой причины (IOException: программное обеспечение вызвало прерывание соединения или IOException: попробуйте еще раз). Это довольно упрощенная версия примера чата Bluetooth для Android, которая использует обнаружение устройств вместо сопряженных устройств и всего лишь одно действие.
Кодекс
public class MainActivity extends Activity implements View.OnClickListener {
BluetoothDevice btDevice;
BluetoothSocket btSocket;
InputStream inStream;
OutputStream outStream;
Object lock = new Object();
boolean connected = false;
boolean canceled = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(this);
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
getApplicationContext().registerReceiver(btReceiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
getApplicationContext().registerReceiver(btReceiver, filter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View arg0) {
if (!connected) {
connected = true;
canceled = false;
new Thread(new Runnable() {
@Override
public void run() {
BluetoothAdapter btAdapter = BluetoothAdapter
.getDefaultAdapter();
try {
if (btAdapter.isDiscovering())
btAdapter.cancelDiscovery();
btAdapter.startDiscovery();
// block until device discovery has finished
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
Log.d("EXCEPTION", "", e);
}
}
btSocket = btDevice.createInsecureRfcommSocketToServiceRecord(UUID
.fromString("00001101-0000-1000-8000-00805F9B34FB"));
btSocket.connect();
inStream = btSocket.getInputStream();
outStream = btSocket.getOutputStream();
new Thread(new Runnable() {
@Override
public void run() {
while (!canceled) {
try {
int in;
while ((in = inStream.read()) != -1) {
Log.d("Received new byte: ", in
+ "");
}
} catch (IOException e) {
Log.d("EXCEPTION IN LISTENER", "", e);
disconnect();
}
}
}
}).start();
} catch (IOException e) {
Log.d("", "", e);
}
}
}).start();
} else {
disconnect();
}
}
private void disconnect() {
connected = false;
canceled = true;
try {
btSocket.close();
} catch (Exception e) {
Log.d("EXCEPTION DISCONNECTING", "", e);
}
try {
inStream.close();
} catch (Exception e) {
Log.d("EXCEPTION DISCONNECTING", "", e);
}
try {
outStream.close();
} catch (Exception e) {
Log.d("EXCEPTION DISCONNECTING", "", e);
}
btDevice = null;
btSocket = null;
inStream = null;
outStream = null;
}
private final BroadcastReceiver btReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
try {
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
synchronized (lock) {
lock.notifyAll();
}
}
} catch (Exception e) {
Log.d(this.getClass().getName(), "", e);
}
}
};
}
Я только с использованием методов блокировки или сделать блокировку самостоятельно. Таким образом, создание соединения работает довольно процедурно. Я, вероятно, потерял поток соединений в примере андроида, когда я его адаптировал, но я не могу найти проблему.
Выход
Установление соединения:
01-16 16:52:46.234: V/BluetoothSocket.cpp(6961): initSocketNative
01-16 16:52:46.234: V/BluetoothSocket.cpp(6961): ...fd 47 created (RFCOMM, lm = 0)
01-16 16:52:46.234: V/BluetoothSocket.cpp(6961): initSocketFromFdNative
01-16 16:52:46.257: D/BluetoothUtils(6961): isSocketAllowedBySecurityPolicy start : device null
01-16 16:52:47.171: V/BluetoothSocket.cpp(6961): connectNative
01-16 16:52:47.570: V/BluetoothSocket.cpp(6961): ...connect(47, RFCOMM) = 0 (errno 115)
разрывы соединения:
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): java.io.IOException: Software caused connection abort
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): at android.bluetooth.BluetoothSocket.readNative(Native Method)
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:388)
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:60)
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): at com.example.bttest.MainActivity$2$1.run(MainActivity.java:100)
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): at java.lang.Thread.run(Thread.java:856)
Спасибо!
Что такое Android-версия вашего устройства? Вы нашли решение? – Bomberlatinos9
Это было фактическое устройство bluetooth, которое вызвало проблемы, а не андроид или класс BluetoothDevice;) – Horrorente