BLE Отключение соединения
Я пытаюсь передавать данные с помощью BLE, но устройство не остается подключенным. В настоящее время мы можем подключить и распечатать все UUID сервисов и характеристик и установить соединение. Он подключается к устройству BLE в течение очень короткого периода времени, после чего устройство впоследствии не подключается к приложению.
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattDescriptor;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Semaphore;
public class ConnectActivity extends AppCompatActivity {
private BluetoothAdapter mBluetoothAdapter;
Set<BluetoothDevice> pairedDevices;
BluetoothDevice connectDevice;
BluetoothGatt bluetoothGatt;
List<BluetoothGattService> services;
private Queue<BluetoothGattCharacteristic> chars;
private static final String DAQSERVICE = "FFD7";
private static final String SAMPLING_RATE_UUID = "FFD8";
private static final String DATA_UUID = "FFD9";
private static final String BATTERY_UUID = "FFDA";
private static final String CONTROL_UUID = "FFDB";
private static final String TAG = "error";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_connect);
Button btn = (Button) findViewById(R.id.connect_button);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
pairedDevices = mBluetoothAdapter.getBondedDevices();
chars = new LinkedList<BluetoothGattCharacteristic>();
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
streamData();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
//pop up bluetooth settings menu if we cannot find device
void streamData() throws IOException {
for (BluetoothDevice device : pairedDevices) {
if (device.getName().equals("Connection Test")) {
connectDevice = device;
mBluetoothAdapter.cancelDiscovery();
System.out.println("connecting to gatt");
bluetoothGatt = connectDevice.connectGatt(this, false, btleGattCallback);
}
}
}
@SuppressLint("New API")
private BluetoothGattCallback btleGattCallback = new BluetoothGattCallback() {
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) {
//this will get called anytime you perform a read or write characteristic operation
byte[] data = characteristic.getValue();
System.out.print("data buffer updated: ");
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]);
}
System.out.println();
}
@Override
public void onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState) {
// this will get called when a device connects or disconnects
if (newState == BluetoothProfile.STATE_CONNECTED) {
discoverServices();
}
}
@Override
public void onServicesDiscovered(final BluetoothGatt gatt, final int status) {
// this will get called after the client initiates a BluetoothGatt.discoverServices() call
//getServices();
Thread workerThread = new Thread(new Runnable() {
@Override
public void run() {
getServices();
}
});
workerThread.start();
try{
workerThread.join();
System.out.println("joined thread");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
byte[] data = descriptor.getValue();
System.out.print("data buffer updated: ");
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]);
}
System.out.println();
}
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
System.out.println("in read");
if (status == BluetoothGatt.GATT_SUCCESS) {
System.out.println("UUID: " + characteristic.getUuid());
byte[] data = characteristic.getValue();
System.out.println("reading");
for (byte temp : data) {
System.out.print(temp);
}
}
}
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status){
System.out.println("in write");
if (status == BluetoothGatt.GATT_SUCCESS) {
System.out.println("UUID: " + characteristic.getUuid());
byte[] data = characteristic.getValue();
System.out.println("reading in write mode");
System.out.println(new String(data));
}
}
};
void discoverServices() {
System.out.println("discovering services");
bluetoothGatt.discoverServices();
}
void getServices() {
System.out.println("getting services");
services = bluetoothGatt.getServices();
System.out.println("number of services: " + services.size());
for (BluetoothGattService service : services) {
List<BluetoothGattCharacteristic> characteristics = service.getCharacteristics();
System.out.println("service uuid: " + service.getUuid().toString());
for (BluetoothGattCharacteristic characteristic : characteristics){
System.out.println("characteristic uuid: " + characteristic.getUuid().toString());
bluetoothGatt.setCharacteristicNotification(characteristic, true);
for (BluetoothGattDescriptor descriptor : characteristic.getDescriptors()) {
descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
}
bluetoothGatt.readCharacteristic(characteristic);
}
}
System.out.println("got all services");
}
}
1 ответ
Вам нужно выяснить, где проблема.
Удаленное устройство? другие мобильные телефоны и приложения могут подключаться к вашему удаленному устройству? Вы также можете проверить RF и часы удаленного устройства.