Java Code Examples for android.bluetooth.BluetoothGatt#discoverServices()

The following examples show how to use android.bluetooth.BluetoothGatt#discoverServices() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: SerialSocket.java    From SimpleBluetoothLeTerminal with MIT License 6 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    // status directly taken from gat_api.h, e.g. 133=0x85=GATT_ERROR ~= timeout
    if (newState == BluetoothProfile.STATE_CONNECTED) {
        Log.d(TAG,"connect status "+status+", discoverServices");
        if (!gatt.discoverServices())
            onSerialConnectError(new IOException("discoverServices failed"));
    } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
        if (connected)
            onSerialIoError     (new IOException("gatt status " + status));
        else
            onSerialConnectError(new IOException("gatt status " + status));
    } else {
        Log.d(TAG, "unknown connect state "+newState+" "+status);
    }
    // continues asynchronously in onServicesDiscovered()
}
 
Example 2
Source File: MainActivity.java    From BTLETest with MIT License 6 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);
    if (newState == BluetoothGatt.STATE_CONNECTED) {
        writeLine("Connected!");
        // Discover services.
        if (!gatt.discoverServices()) {
            writeLine("Failed to start discovering services!");
        }
    }
    else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
        writeLine("Disconnected!");
    }
    else {
        writeLine("Connection state changed.  New state: " + newState);
    }
}
 
Example 3
Source File: BaseMyo.java    From myolib with Apache License 2.0 6 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    if (newState == BluetoothProfile.STATE_CONNECTING) {
        mConnectionState = ConnectionState.CONNECTING;
    } else if (newState == BluetoothProfile.STATE_CONNECTED) {
        mConnectionState = ConnectionState.CONNECTED;
        Logy.d(TAG, "Device connected, discovering services...");
        gatt.discoverServices();
    } else if (newState == BluetoothProfile.STATE_DISCONNECTING) {
        mConnectionState = ConnectionState.DISCONNECTING;
        mWaitToken.drainPermits();
    } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
        mConnectionState = ConnectionState.DISCONNECTED;
    } else {
        throw new RuntimeException("Unknown connection state");
    }
    Logy.d(TAG, "status:" + status + ", newState:" + mConnectionState.name());
    for (ConnectionListener listener : mConnectionListeners)
        listener.onConnectionStateChanged(this, mConnectionState);
    super.onConnectionStateChange(gatt, status, newState);
}
 
Example 4
Source File: BikeService.java    From android with MIT License 6 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);

    print(String.format("status:%d, newState:%d", status, newState));

    if (status != BluetoothGatt.GATT_SUCCESS) {
        closeConnect();
    }

    switch (newState) {
        case BluetoothProfile.STATE_CONNECTED:
            print("连接GATT服务成功,开始发现服务...");
            gatt.discoverServices();
            break;
        case BluetoothProfile.STATE_DISCONNECTED:
            print("断开GATT服务,Bye");
            closeConnect();
            break;

        default:
            break;
    }
}
 
Example 5
Source File: BLETransport.java    From esp-idf-provisioning-android with Apache License 2.0 6 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {

    super.onConnectionStateChange(gatt, status, newState);
    Log.d(TAG, "onConnectionStateChange, New state : " + newState + ", Status : " + status);

    if (status == BluetoothGatt.GATT_FAILURE) {
        EventBus.getDefault().post(new DeviceConnectionEvent(ESPConstants.EVENT_DEVICE_CONNECTION_FAILED));
        return;
    } else if (status == 133) {
        EventBus.getDefault().post(new DeviceConnectionEvent(ESPConstants.EVENT_DEVICE_CONNECTION_FAILED));
        return;
    } else if (status != BluetoothGatt.GATT_SUCCESS) {
        // TODO need to check this status
        return;
    }
    if (newState == BluetoothProfile.STATE_CONNECTED) {
        Log.e(TAG, "Connected to GATT server.");
        gatt.discoverServices();
    } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
        Log.e(TAG, "Disconnected from GATT server.");
        EventBus.getDefault().post(new DeviceConnectionEvent(ESPConstants.EVENT_DEVICE_CONNECTION_FAILED));
    }
}
 
Example 6
Source File: BleManager.java    From BLEChat with GNU General Public License v3.0 6 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    if (newState == BluetoothProfile.STATE_CONNECTED) {
        mState = STATE_CONNECTED;
        Logs.d(TAG, "# Connected to GATT server.");
        mHandler.obtainMessage(MESSAGE_STATE_CHANGE, STATE_CONNECTED, 0).sendToTarget();
        
        gatt.discoverServices();
        
    } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
        mState = STATE_IDLE;
        Logs.d(TAG, "# Disconnected from GATT server.");
        mHandler.obtainMessage(MESSAGE_STATE_CHANGE, STATE_IDLE, 0).sendToTarget();
        mBluetoothGatt = null;
		mGattServices.clear();
        mDefaultService = null;
		mGattCharacteristics.clear();
		mWritableCharacteristics.clear();
        mDefaultChar = null;
        mDefaultDevice = null;
    }
}
 
Example 7
Source File: DeviceMirror.java    From BLE with Apache License 2.0 6 votes vote down vote up
/**
 * 连接状态改变,主要用来分析设备的连接与断开
 * @param gatt GATT
 * @param status 改变前状态
 * @param newState 改变后状态
 */
@Override
public void onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState) {
    ViseLog.i("onConnectionStateChange  status: " + status + " ,newState: " + newState +
            "  ,thread: " + Thread.currentThread());
    if (newState == BluetoothGatt.STATE_CONNECTED) {
        gatt.discoverServices();
    } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
        close();
        if (connectCallback != null) {
            if (handler != null) {
                handler.removeCallbacksAndMessages(null);
            }
            ViseBle.getInstance().getDeviceMirrorPool().removeDeviceMirror(deviceMirror);
            if (status == BluetoothGatt.GATT_SUCCESS) {
                connectState = ConnectState.CONNECT_DISCONNECT;
                connectCallback.onDisconnect(isActiveDisconnect);
            } else {
                connectState = ConnectState.CONNECT_FAILURE;
                connectCallback.onConnectFailure(new ConnectException(gatt, status));
            }
        }
    } else if (newState == BluetoothGatt.STATE_CONNECTING) {
        connectState = ConnectState.CONNECT_PROCESS;
    }
}
 
Example 8
Source File: GattClientDiscoverServicesTransaction.java    From bitgatt with Mozilla Public License 2.0 5 votes vote down vote up
@Override
protected void transaction(GattTransactionCallback callback) {
    super.transaction(callback);
    getConnection().setState(GattState.DISCOVERING);
    boolean success;
    BluetoothGatt localGatt = getConnection().getGatt();
    if(localGatt == null) {
        Timber.w("The gatt was null during discovery, are you sure the connection wasn't cancelled?  Please make sure to handle the transaction results.");
        success = false;
    } else {
        success = localGatt.discoverServices();
    }
    if(!success) {
        getConnection().setState(GattState.DISCOVERY_FAILURE);
        TransactionResult.Builder builder = new TransactionResult.Builder();
        builder.gattState(getConnection().getGattState())
                .resultStatus(TransactionResult.TransactionResultStatus.FAILURE);
        mainThreadHandler.post(() -> {
            callCallbackWithTransactionResultAndRelease(callback, builder.build());
            getConnection().setState(GattState.IDLE);
        });
    } else {
        synchronized (NAME) {
            try {
                NAME.wait(DEFAULT_GATT_TRANSACTION_TIMEOUT);
            } catch (InterruptedException e) {
                Timber.e(e, "[%s] Not the end of the world, we'll just let it go", getDevice());
            }
        }
    }
}
 
Example 9
Source File: TestBeanBLE.java    From bean-sdk-android with MIT License 5 votes vote down vote up
private void discoverServices(BluetoothGatt gatt) throws InterruptedException {
    gatt.discoverServices();
    discoverServicesLatch.await(20, TimeUnit.SECONDS);
    if (discoverServicesLatch.getCount() > 0) {
        fail("FAILURE: Couldn't discover services");
    }

    Log.i(TAG, "SUCCESS: Services discovered");
}
 
Example 10
Source File: MkrSciBleManager.java    From science-journal with Apache License 2.0 5 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
  if (status == BluetoothGatt.GATT_SUCCESS && newState == BluetoothProfile.STATE_CONNECTED) {
    this.gatt = gatt;
    characteristics.clear();
    gatt.discoverServices();
  } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
    readyForAction = false;
    gatt.disconnect();
  }
}
 
Example 11
Source File: SerialInterface_BLE.java    From PodEmu with GNU General Public License v3.0 5 votes vote down vote up
@Override
@TargetApi(21)
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState)
{
    PodEmuLog.debug("SIBLE: GATT onConnectionStateChange");
    switch (newState)
    {
        case BluetoothProfile.STATE_CONNECTED:
            setState(STATE_CONNECTED);
            gatt.discoverServices();
            synchronized (SerialInterface_BLE.this)
            {
                SerialInterface_BLE.this.notifyAll();
            }
            break;
        case BluetoothProfile.STATE_CONNECTING:
            setState(STATE_CONNECTING);
            break;
        case BluetoothProfile.STATE_DISCONNECTING:
            setState(STATE_LOST);
            break;
        case BluetoothProfile.STATE_DISCONNECTED:
            setState(STATE_NONE);
            break;
    }
    //PodEmuService.communicateSerialStatusChange();
}
 
Example 12
Source File: Device.java    From neatle with MIT License 5 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    boolean didConnect = false;
    NeatleLogger.d("onConnectionStateChange status: " + status + " newState:" + newState);
    if (newState == BluetoothGatt.STATE_CONNECTED && status == BluetoothGatt.GATT_SUCCESS) {
        didConnect = gatt.discoverServices();
    }

    if (!didConnect) {
        gatt.close();
        connectionFailed(status);
    } else {
        connectionSuccess();
    }
}
 
Example 13
Source File: GattManager.java    From thunderboard-android with Apache License 2.0 5 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);

    BluetoothDevice device = gatt.getDevice();

    Timber.d("device: %s, status: %d, newState: %d", (device != null), status, newState);

    if (BluetoothGatt.GATT_SUCCESS != status) {
        gatt.disconnect();
        return;
    }

    if (BluetoothProfile.STATE_DISCONNECTED == newState) {
        gatt.close();
    } else if (BluetoothProfile.STATE_CONNECTED == newState) {
        gatt.discoverServices();
        preferenceManager.addConnected(device.getAddress(), device.getName());
    }

    ThunderBoardDevice bgd = bleManager.getDeviceFromCache(device.getAddress());
    if (bgd != null) {
        bgd.setState(newState);
        bleManager.selectedDeviceMonitor.onNext(bgd);
        bleManager.selectedDeviceStatusMonitor.onNext(new StatusEvent(bgd));
    }
}
 
Example 14
Source File: ESenseManager.java    From flutter-plugins with MIT License 5 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    if (newState == BluetoothProfile.STATE_CONNECTED) {
        gatt.discoverServices();
    } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
        gatt.close();
        mCharacteristicMap.clear();
        if(mConnectionListener != null) {
            mConnectionListener.onDisconnected(ESenseManager.this);
        }
    }

}
 
Example 15
Source File: H7ConnectThread.java    From PolarHeartRateApplication with MIT License 5 votes vote down vote up
@Override
 public void onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState) { 
 	if (newState ==  BluetoothGatt.STATE_DISCONNECTED)
 	{
Log.e("H7ConnectThread", "device Disconnected");
ac.connectionError();
 	}
 	else{
gatt.discoverServices();
Log.d("H7ConnectThread", "Connected and discovering services");
 	}
 }
 
Example 16
Source File: DfuBaseService.java    From microbit with Apache License 2.0 4 votes vote down vote up
@Override
        public void onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState) {
            // Check whether an error occurred
            logi("onConnectionStateChange() :: Start");
            if (status == BluetoothGatt.GATT_SUCCESS) {
                if (newState == BluetoothGatt.STATE_CONNECTED) {
                    logi("onConnectionStateChange() :: Connected to GATT server");
                    mConnectionState = STATE_CONNECTED;

					/*
                     *  The onConnectionStateChange callback is called just after establishing connection and before sending Encryption Request BLE event in case of a paired device.
					 *  In that case and when the Service Changed CCCD is enabled we will get the indication after initializing the encryption, about 1600 milliseconds later. 
					 *  If we discover services right after connecting, the onServicesDiscovered callback will be called immediately, before receiving the indication and the following 
					 *  service discovery and we may end up with old, application's services instead.
					 *  
					 *  This is to support the buttonless switch from application to bootloader mode where the DFU bootloader notifies the master about service change.
					 *  Tested on Nexus 4 (Android 4.4.4 and 5), Nexus 5 (Android 5), Samsung Note 2 (Android 4.4.2). The time after connection to end of service discovery is about 1.6s 
					 *  on Samsung Note 2.
					 *  
					 *  NOTE: We are doing this to avoid the hack with calling the hidden gatt.refresh() method, at least for bonded devices.
					 */
                    if (gatt.getDevice().getBondState() == BluetoothDevice.BOND_BONDED) {
                        try {
                            synchronized (this) {
                                logd("onConnectionStateChange() :: Waiting 1600 ms for a possible Service Changed indication...");
                                wait(1600);

                                // After 1.6s the services are already discovered so the following gatt.discoverServices() finishes almost immediately.

                                // NOTE: This also works with shorted waiting time. The gatt.discoverServices() must be called after the indication is received which is
                                // about 600ms after establishing connection. Values 600 - 1600ms should be OK.
                            }
                        } catch (InterruptedException e) {
                            Log.e(TAG, e.toString());
                            // Do nothing
                        }
                    }

                    // Attempts to discover services after successful connection.
                    final boolean success = gatt.discoverServices();
                    logi("onConnectionStateChange() :: Attempting to start service discovery... " + (success ? "succeed" : "failed"));

                    if (!success) {
                        mError = ERROR_SERVICE_DISCOVERY_NOT_STARTED;
                    } else {
                        // Just return here, lock will be notified when service discovery finishes
                        return;
                    }
                } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
                    logi("onConnectionStateChange() :: Disconnected from GATT server");
                    mPaused = false;
                    mConnectionState = STATE_DISCONNECTED;
                }
            } else {
                loge("Connection state change error: " + status + " newState: " + newState);
/*				if (newState == BluetoothGatt.STATE_DISCONNECTED) {
                    mConnectionState = STATE_DISCONNECTED;
                    if (mServicePhase == PAIRING_REQUEST ){
                        mServicePhase = PAIRING_FAILED ;
                        updateProgressNotification(status);
                    }
                }*/
                mPaused = false;
                mError = ERROR_CONNECTION_STATE_MASK | status;
            }

            // Notify waiting thread
            synchronized (mLock) {
                mLock.notifyAll();
            }
        }
 
Example 17
Source File: BleManagerHandler.java    From Android-BLE-Library with BSD 3-Clause "New" or "Revised" License 4 votes vote down vote up
@Override
public void onCharacteristicChanged(final BluetoothGatt gatt,
									final BluetoothGattCharacteristic characteristic) {
	final byte[] data = characteristic.getValue();

	if (isServiceChangedCharacteristic(characteristic)) {
		// TODO this should be tested. Should services be invalidated?
		// Forbid enqueuing more operations.
		operationInProgress = true;
		// Clear queues, services are no longer valid.
		taskQueue.clear();
		initQueue = null;
		log(Log.INFO, "Service Changed indication received");
		log(Log.VERBOSE, "Discovering Services...");
		log(Log.DEBUG, "gatt.discoverServices()");
		gatt.discoverServices();
	} else {
		final BluetoothGattDescriptor cccd =
				characteristic.getDescriptor(BleManager.CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID);
		final boolean notifications = cccd == null || cccd.getValue() == null ||
				cccd.getValue().length != 2 || cccd.getValue()[0] == 0x01;

		final String dataString = ParserUtils.parse(data);
		if (notifications) {
			log(Log.INFO, "Notification received from " +
					characteristic.getUuid() + ", value: " + dataString);
			onCharacteristicNotified(gatt, characteristic);
		} else { // indications
			log(Log.INFO, "Indication received from " +
					characteristic.getUuid() + ", value: " + dataString);
			onCharacteristicIndicated(gatt, characteristic);
		}
		if (batteryLevelNotificationCallback != null && isBatteryLevelCharacteristic(characteristic)) {
			batteryLevelNotificationCallback.notifyValueChanged(gatt.getDevice(), data);
		}
		// Notify the notification registered listener, if set
		final ValueChangedCallback request = valueChangedCallbacks.get(characteristic);
		if (request != null && request.matches(data)) {
			request.notifyValueChanged(gatt.getDevice(), data);
		}
		// If there is a value change request,
		if (awaitingRequest instanceof WaitForValueChangedRequest
				// registered for this characteristic
				&& awaitingRequest.characteristic == characteristic
				// and didn't have a trigger, or the trigger was started
				// (not necessarily completed)
				&& !awaitingRequest.isTriggerPending()) {
			final WaitForValueChangedRequest valueChangedRequest = (WaitForValueChangedRequest) awaitingRequest;
			if (valueChangedRequest.matches(data)) {
				// notify that new data was received.
				valueChangedRequest.notifyValueChanged(gatt.getDevice(), data);

				// If no more data are expected
				if (!valueChangedRequest.hasMore()) {
					// notify success,
					valueChangedRequest.notifySuccess(gatt.getDevice());
					// and proceed to the next request only if the trigger has completed.
					// Otherwise, the next request will be started when the request's callback
					// will be received.
					awaitingRequest = null;
					if (valueChangedRequest.isTriggerCompleteOrNull()) {
						nextRequest(true);
					}
				}
			}
		}
		if (checkCondition()) {
			nextRequest(true);
		}
	}
}
 
Example 18
Source File: BLEService.java    From android_wear_for_ios with MIT License 4 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    Log.d(TAG_LOG, "onConnectionStateChange: " + status + " -> " + newState);
    if (newState == BluetoothProfile.STATE_CONNECTED) {
        // success, connect to gatt.
        // find service
        gatt.discoverServices();
    } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
        Log.d(TAG_LOG, "onDisconnect: ");

        if(api_level >= 21) {
            if (le_scanner != null) {
                Log.d(TAG_LOG, "status: ble reset");
                stop_le_scanner();
            }
        }
        if(bluetooth_gatt != null) {
            bluetooth_gatt.disconnect();
            bluetooth_gatt.close();
            bluetooth_gatt = null;
        }
        if(bluetooth_adapter != null) {
            bluetooth_adapter = null;
        }
        is_connect = false;
        is_subscribed_characteristics = false;
        skip_count = 0;
        is_time = false;


        // Initializes a Bluetooth adapter.  For API level 18 and above, get a reference to
        // BluetoothAdapter through BluetoothManager.
        final BluetoothManager bluetoothManager =
                (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        bluetooth_adapter = bluetoothManager.getAdapter();

        // Checks if Bluetooth is supported on the device.
        if (bluetooth_adapter == null) {
            Log.d(TAG_LOG, "ble adapter is null");
            return;
        }

        is_reconnect = true;
        Log.d(TAG_LOG, "start BLE scan");
        if(api_level >= 21) {
            start_le_scanner();
        }else {
            bluetooth_adapter.startLeScan(le_scan_callback);
        }
    }
}
 
Example 19
Source File: BleGattImpl.java    From EasyBle with Apache License 2.0 4 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, final int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);
    if (status != BluetoothGatt.GATT_SUCCESS) {
        gatt.close();
    }
    String address = gatt.getDevice().getAddress();
    Map.Entry<BleDevice, BleConnectCallback> entry = findMapEntry(mConnectCallbackMap, address);
    if (entry == null) {
        return;
    }
    final BleConnectCallback callback = entry.getValue();
    final BleDevice device = entry.getKey();
    if (status == BluetoothGatt.GATT_SUCCESS) {
        switch (newState) {
            case BluetoothProfile.STATE_CONNECTED:
                //start discovering services, only services are found do we deem
                //connection is successful
                gatt.discoverServices();
                break;
            case BluetoothProfile.STATE_DISCONNECTED:
                device.connected = false;
                refreshDeviceCache(gatt);
                gatt.close();
                removeDevice(device);
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (callback != null) {
                            callback.onDisconnected("The connection has been disconnected", status, device);
                        }
                    }
                });
                break;
        }
    } else {
        removeDevice(device);
        if (device.connecting) {
            device.connecting = false;
            mHandler.removeCallbacksAndMessages(address);
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    callback.onFailure(BleCallback.FAIL_OTHER, "connect fail,  status = " + status, device);
                }
            });
        } else if (device.connected && newState == BluetoothProfile.STATE_DISCONNECTED) {
            device.connected = false;
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    String tips = "The connection with remote device(mac=" + device.getDevice().getAddress() +
                            ") has been disconnected abnormally, see more details from status code";
                    callback.onDisconnected(tips, status, device);
                }
            });
        }
    }
}
 
Example 20
Source File: BluetoothSite.java    From physical-web with Apache License 2.0 4 votes vote down vote up
@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
  Log.i(TAG, "MTU changed to " + mtu);
  transferRate = mtu - 5;
  gatt.discoverServices();
}