Я работаю над приложением для Android, чтобы подключить Raspberry Pi к локальной сети Wi-Fi, посылая им информацию о пароле ssid и ssid через Bluetooth с моего телефона Android. Rpi работают на серверах узлов, используя bleno.
Моя заявка настроена следующим образом.
- Я сканирую все устройства, отображающие контрольный список устройств для выбора пользователем
- После выбора пользователь нажимает кнопку «Далее», открывая новую привязку активности к новой
BluetoothLeService
.
- У этого действия есть кнопка подтверждения, при нажатии которой запускается процесс подключения периферийного устройства к телефону.
- После завершения отправки данных ssid и ssid_pwd на периферийное устройство, которое я разрываю и отсоединяю от
BluetoothLeService
, завершите это действие, а затем запустите действие экрана успеха, которое перенаправит пользователя обратно на экран сканирования, чтобы снова начать этот процесс .
Так что с этой частью все в порядке. Я даже могу выбрать несколько периферийных устройств для отправки данных два, и это работает.
Моя проблема возникает после шага 4. Если пользователь решает выбрать другое периферийное устройство после того, как он уже это сделал, вызывается onServiceConnected
, вызываемый для нового периферийного устройства, но mBluetoothGatt.discoverServices()
, кажется, выбирает две службы. Один раз для ранее подключенного периферийного устройства и один раз для нового.
Примечание: это происходит только тогда, когда я отменяю связь со службой, а затем связываюсь позже. Кажется, работает связывание один раз и работа с двумя периферийными устройствами.
Что может быть причиной этого? Более десятка раз я проверял, что BluetoothLeService
уничтожается, уничтожается действие, связывающееся с BluetoothLeService
, даже проверяя, что первое периферийное устройство не передает или не принимает соединения. Я даже физически отключил первый RPI. btsnoop_hci.log
показывает подключение к одному периферийному устройству, а затем к другому, поэтому оно должно быть в коде приложения. У кого-нибудь есть идеи?
Это часть кода, которая запускает беспорядок.
private final BluetoothGattCallback mGattCallback =
new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status,
int newState) {
String intentAction;
if (newState == BluetoothProfile.STATE_CONNECTED) {
intentAction = ACTION_GATT_CONNECTED;
mConnectionState = STATE_CONNECTED;
broadcastUpdate(intentAction,gatt);
Log.i(TAG, "Connected to GATT server.");
Log.i(TAG, "Attempting to start service discovery:" +
mBluetoothGatt.discoverServices()); // <-- The problem starts here
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
intentAction = ACTION_GATT_DISCONNECTED;
mConnectionState = STATE_DISCONNECTED;
Log.i(TAG, "Disconnected from GATT server.");
broadcastUpdate(intentAction,gatt);
}
}
@Override
// New services discovered
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
Log.w(TAG, "onServicesDiscovered received: " + status);
} else {
Log.e("ERROR", "Gatt onServiceDiscovered failed. Error code + " + status);
}
}
@Override
public void onCharacteristicWrite(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
Log.d("DEBUG", characteristic.getValue().toString());
}
@Override
// Result of a characteristic read operation
public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
Log.d("DEBUG", characteristic.getValue().toString());
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
Log.d("DEBUG", characteristic.getValue().toString());
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
};
Спасибо