我正在开发一个Android应用程序,将覆盆子pi连接到本地wifi网络,通过蓝牙从我的Android手机发送ssid和ssid密码信息。 rpi正在使用bleno运行节点服务器。
我的申请设置如下。
BluetoothLeService
的新活动。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);
}
};
由于
答案 0 :(得分:0)
当注册接收者时,还必须取消注册。
编辑:对于任何进入Android版本的人来说,Github上的googlesamples/android-BluetoothLeGatt回购都是生命之源。