[英]Android BLE peripheral service received after disconnect
我正在使用一個android應用程序將樹莓派連接到本地wifi網絡,並通過藍牙從我的android手機發送它們的ssid和ssid密碼信息。 rpi正在使用bleno運行節點服務器。
我的應用程序的設置如下。
BluetoothLeService
的新活動。 BluetoothLeService
取消綁定,完成該活動,然后啟動成功屏幕活動,該活動將用戶路由回掃描屏幕,以重新開始該過程。 這樣就可以了。 我什至可以選擇多個外圍設備來發送兩個數據,並且可以正常工作。
我的問題出在步驟4之后。如果用戶決定在已經完成一個onServiceConnected
之后選擇另一個外圍設備,則該新外圍設備將被調用,但是mBluetoothGatt.discoverServices()
似乎選擇了兩個服務。 一次用於先前連接的外圍設備,一次用於新外圍設備。
注意:僅當我解除與服務的綁定,然后稍后再次綁定時,才會發生這種情況。 綁定一次並與兩個外圍設備一起工作似乎可行。
是什么原因造成的? 我已經進行了十多次檢查,證明BluetoothLeService
被銷毀,綁定到BluetoothLeService
的活動也被銷毀,甚至檢查第一個外圍設備是否不在廣播或接受ble連接。 我什至已經拔掉了第一個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);
}
};
謝謝
當一個人注冊一個接收者時,也必須取消注冊。
編輯:對於任何進入android ble的人,Github上的googlesamples / android-BluetoothLeGatt回購是命脈。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.