@Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { Log.d(mTAG, "onCharacteristicChanged"); byte[] mValue = characteristic.getValue(); if(characteristic.getUuid().equals(UUID_nRF51822_GET_TEMP)){ mAirTemperature = (mValue[0] << 8 | mValue[1])/10; gatt.setCharacteristicNotification(characteristic, false); List<BluetoothGattCharacteristic> lstChars = mGattnRF51822Service.getCharacteristics(); for(BluetoothGattCharacteristic mCharacteristic : lstChars){ List<BluetoothGattDescriptor> descriptors = mCharacteristic.getDescriptors(); BluetoothGattDescriptor mGattnRF51822Descriptor = mCharacteristic.getDescriptor(UUID_nRF51822_DESCRIPTOR_ID); if(mGattnRF51822Descriptor != null && mCharacteristic.getUuid().equals(UUID_nRF51822_GET_LIGHT)){ gatt.setCharacteristicNotification(mCharacteristic, true); byte[] mDesValue = {0x01, 0x00}; mGattnRF51822Descriptor.setValue(mDesValue); gatt.writeDescriptor(mGattnRF51822Descriptor); } } } else if(characteristic.getUuid().equals(UUID_nRF51822_GET_LIGHT)){ mLight = (mValue[0] << 8 | mValue[1]); gatt.close(); Log.d(mTAG, "onCharacteristicChanged data=" + getData()); mIsConnecting = false; } }
public List<BluetoothGattService> getSupportedGattServices() { if (mBluetoothGatt == null) { return null; } List<BluetoothGattService> gattServices = mBluetoothGatt.getServices(); for (BluetoothGattService gattService : gattServices) { List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics(); for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) { String uuid = gattCharacteristic.getUuid().toString(); if(uuid.equalsIgnoreCase(UUID_NOTIFY.toString())){ mNotifyCharacteristic = gattCharacteristic; mBluetoothGatt.setCharacteristicNotification(gattCharacteristic, true); ULog.i("setCharacteristicNotification : " + uuid); BluetoothGattDescriptor descriptor = gattCharacteristic .getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); mBluetoothGatt.writeDescriptor(descriptor); } } } return gattServices; }
/** * Enables or disables notification on a give characteristic. * * @param characteristic Characteristic to act on. * @param enabled If true, enable notification. False otherwise. */ public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); List<BluetoothGattDescriptor> descriptors = characteristic.getDescriptors(); for(BluetoothGattDescriptor dp:descriptors){ dp.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); mBluetoothGatt.writeDescriptor(dp); } }
public BLEServer(Context context, BLEServerDelegate delegate){ this.context = context; this.delegate = delegate; if(this.delegate == null){ this.delegate = new BLEServerDelegate() { @Override public void onAdvertise(AdvertiseError error) {} @Override public void onDeviceConnected(BluetoothDevice device) {} @Override public void onDeviceDisconnected(BluetoothDevice device) {} @Override public void onCharacteristicChangedServer(BluetoothGattCharacteristic characteristic) {} @Override public void onDescriptorChanged(BluetoothGattDescriptor descriptor) {} }; } }
@Override public void onDescriptorReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattDescriptor descriptor) { if (TimeProfile.CLIENT_CONFIG.equals(descriptor.getUuid())) { Log.d(TAG, "Config descriptor read"); byte[] returnValue; if (mRegisteredDevices.contains(device)) { returnValue = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE; } else { returnValue = BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE; } mBluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_FAILURE, 0, returnValue); } else { Log.w(TAG, "Unknown descriptor read request"); mBluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_FAILURE, 0, null); } }
private void setCharacteristicNotification( @NonNull BluetoothGatt bluetoothgatt, @NonNull BluetoothGattCharacteristic bluetoothgattcharacteristic, boolean flag ) { bluetoothgatt.setCharacteristicNotification(bluetoothgattcharacteristic, flag); if (FIND_ME_CHARACTERISTIC.equals(bluetoothgattcharacteristic.getUuid())) { BluetoothGattDescriptor descriptor = bluetoothgattcharacteristic.getDescriptor( CLIENT_CHARACTERISTIC_CONFIG ); if (descriptor != null) { descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); bluetoothgatt.writeDescriptor(descriptor); } } }
/** * Enable or disable notifications/indications for a given characteristic. * * 是否允许刷新特征码 * * <p>Once notifications are enabled for a characteristic, a * {@link BluetoothGattCallback#onCharacteristicChanged} callback will be * triggered if the remote device indicates that the given characteristic * has changed. * * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. * * @param characteristic The characteristic for which to enable notifications * @param enable Set to true to enable notifications/indications * @return true, if the requested notification status was set successfully */ public boolean setCharacteristicNotification(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, boolean enable) { if (gatt != null && characteristic != null) { BleLog.i(TAG, "Characteristic set notification value: " + enable); /** 是否允许刷新特征码获取数据 */ boolean success = gatt.setCharacteristicNotification(characteristic, enable); // This is specific to Heart Rate Measurement.(心率测量专用) if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) { BleLog.i(TAG, "Heart Rate Measurement set [descriptor] notification value: " + enable); BluetoothGattDescriptor descriptor = characteristic .getDescriptor(UUID.fromString(CLIENT_CHARACTERISTIC_CONFIG)); // 向描述符中写入 'ENABLE_NOTIFICATION_VALUE' descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); gatt.writeDescriptor(descriptor); } return success; } return false; }
@Override public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) { if (DESCRIPTOR_CONFIG.equals(descriptor.getUuid())) { if (Arrays.equals(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE, value)) { Log.d(TAG, "Subscribe device to notifications: " + device); mRegisteredDevices.add(device); } else if (Arrays.equals(BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE, value)) { Log.d(TAG, "Unsubscribe device from notifications: " + device); mRegisteredDevices.remove(device); } if (responseNeeded) { mBluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, null); } } else { Log.w(TAG, "Unknown descriptor write request"); if (responseNeeded) { mBluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_FAILURE, 0, null); } } }
@Override public final boolean enableNotifications(final BluetoothGattCharacteristic characteristic) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || characteristic == null) return false; // Check characteristic property final int properties = characteristic.getProperties(); if ((properties & BluetoothGattCharacteristic.PROPERTY_NOTIFY) == 0) return false; gatt.setCharacteristicNotification(characteristic, true); final BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID); if (descriptor != null) { descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); return gatt.writeDescriptor(descriptor); } return false; }
@Override public final boolean enableIndications(final BluetoothGattCharacteristic characteristic) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || characteristic == null) return false; // Check characteristic property final int properties = characteristic.getProperties(); if ((properties & BluetoothGattCharacteristic.PROPERTY_INDICATE) == 0) return false; gatt.setCharacteristicNotification(characteristic, true); final BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID); if (descriptor != null) { descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); return gatt.writeDescriptor(descriptor); } return false; }
@Override public void onDescriptorWriteRequest(final BluetoothDevice device, final int requestId, final BluetoothGattDescriptor descriptor, final boolean preparedWrite, final boolean responseNeeded, final int offset, final byte[] value) { super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value); Log.d(TAG, "onDescriptorWriteRequest descriptor: " + descriptor.getUuid() + ", value: " + Arrays.toString(value) + ", responseNeeded: " + responseNeeded + ", preparedWrite: " + preparedWrite); descriptor.setValue(value); if (responseNeeded) { if (BleUuidUtils.matches(DESCRIPTOR_CLIENT_CHARACTERISTIC_CONFIGURATION, descriptor.getUuid())) { // send empty if (gattServer != null) { gattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, EMPTY_BYTES); } } } }
/** * Enables notifications on given characteristic * * @return true is the request has been sent, false if one of the arguments was <code>null</code> or the characteristic does not have the CCCD. */ protected final boolean enableNotifications(final BluetoothGattCharacteristic characteristic) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || characteristic == null) return false; // Check characteristic property final int properties = characteristic.getProperties(); if ((properties & BluetoothGattCharacteristic.PROPERTY_NOTIFY) == 0) return false; Logger.d(mLogSession, "gatt.setCharacteristicNotification(" + characteristic.getUuid() + ", true)"); gatt.setCharacteristicNotification(characteristic, true); final BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID); if (descriptor != null) { descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); Logger.v(mLogSession, "Enabling notifications for " + characteristic.getUuid()); Logger.d(mLogSession, "gatt.writeDescriptor(" + CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID + ", value=0x01-00)"); return gatt.writeDescriptor(descriptor); } return false; }
@Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { Log.d(mTAG, "onServicesDiscovered"); if(status == BluetoothGatt.GATT_SUCCESS){ mGattnRF51822Service = gatt.getService(UUID_nRF51822_SERVICE_ID); if(mGattnRF51822Service != null){ List<BluetoothGattCharacteristic> lstChars = mGattnRF51822Service.getCharacteristics(); for(BluetoothGattCharacteristic mCharacteristic : lstChars){ List<BluetoothGattDescriptor> descriptors = mCharacteristic.getDescriptors(); BluetoothGattDescriptor mGattnRF51822Descriptor = mCharacteristic.getDescriptor(UUID_nRF51822_DESCRIPTOR_ID); if(mGattnRF51822Descriptor != null && mCharacteristic.getUuid().equals(UUID_nRF51822_GET_TEMP)){ gatt.setCharacteristicNotification(mCharacteristic, true); byte[] mValue = {0x01, 0x00}; mGattnRF51822Descriptor.setValue(mValue); gatt.writeDescriptor(mGattnRF51822Descriptor); } } } } else{ gatt.close(); mIsConnecting = false; } }
/** * 读描述符 * @param bleCallback */ private void handleDescriptorReadCallback(final BleDescriptorCallback bleCallback) { if (bleCallback != null) { listenAndTimer(bleCallback, MSG_READ_DES, new BluetoothGattCallback() { AtomicBoolean msgRemoved = new AtomicBoolean(false); @Override public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { if (!msgRemoved.getAndSet(true)) { handler.removeMessages(MSG_READ_DES, this); } if (status == BluetoothGatt.GATT_SUCCESS) { bleCallback.onSuccess(descriptor); } else { bleCallback.onFailure(new GattException(status)); } } }); } }
@Override public final void onCharacteristicChanged(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) { final String data = ParserUtils.parse(characteristic); if (isBatteryLevelCharacteristic(characteristic)) { Logger.i(mLogSession, "Notification received from " + characteristic.getUuid() + ", value: " + data); final int batteryValue = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0); Logger.a(mLogSession, "Battery level received: " + batteryValue + "%"); mCallbacks.onBatteryValueReceived(batteryValue); } else { final BluetoothGattDescriptor cccd = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID); final boolean notifications = cccd == null || cccd.getValue() == null || cccd.getValue().length != 2 || cccd.getValue()[0] == 0x01; if (notifications) { Logger.i(mLogSession, "Notification received from " + characteristic.getUuid() + ", value: " + data); onCharacteristicNotified(gatt, characteristic); } else { // indications Logger.i(mLogSession, "Indication received from " + characteristic.getUuid() + ", value: " + data); onCharacteristicIndicated(gatt, characteristic); } } }
@Override public void onDescriptorRead(final BluetoothGatt gatt, final BluetoothGattDescriptor descriptor, final int status) { if (status == BluetoothGatt.GATT_SUCCESS) { if (CLIENT_CHARACTERISTIC_CONFIG.equals(descriptor.getUuid())) { if (SERVICE_CHANGED_UUID.equals(descriptor.getCharacteristic().getUuid())) { // We have enabled indications for the Service Changed characteristic mServiceChangedIndicationsEnabled = descriptor.getValue()[0] == 2; mRequestCompleted = true; } } } else { loge("Descriptor read error: " + status); mError = ERROR_CONNECTION_MASK | status; } // Notify waiting thread synchronized (mLock) { mLock.notifyAll(); } }
/** * Return a configured {@link BluetoothGattService} instance for the * Current Time Service. */ public static BluetoothGattService createTimeService() { BluetoothGattService service = new BluetoothGattService(TIME_SERVICE, BluetoothGattService.SERVICE_TYPE_PRIMARY); // Current Time characteristic BluetoothGattCharacteristic currentTime = new BluetoothGattCharacteristic(CURRENT_TIME, //Read-only characteristic, supports notifications BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_NOTIFY, BluetoothGattCharacteristic.PERMISSION_READ); BluetoothGattDescriptor configDescriptor = new BluetoothGattDescriptor(CLIENT_CONFIG, //Read/write descriptor BluetoothGattDescriptor.PERMISSION_READ | BluetoothGattDescriptor.PERMISSION_WRITE); currentTime.addDescriptor(configDescriptor); // Local Time Information characteristic BluetoothGattCharacteristic localTime = new BluetoothGattCharacteristic(LOCAL_TIME_INFO, //Read-only characteristic BluetoothGattCharacteristic.PROPERTY_READ, BluetoothGattCharacteristic.PERMISSION_READ); service.addCharacteristic(currentTime); service.addCharacteristic(localTime); return service; }
public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) { if (bluetoothAdapter == null || bluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } bluetoothGatt.setCharacteristicNotification(characteristic, enabled); for (BluetoothGattDescriptor descriptor : characteristic.getDescriptors()) { descriptor.setValue( enabled ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : new byte[] {0x00, 0x00}); bluetoothGatt.writeDescriptor(descriptor); } }
private void setNotifySensor(BluetoothGatt gatt) { BluetoothGattCharacteristic characteristic = gatt.getService(Globals.SNACH_SYSTEM_SERVICE_UUID).getCharacteristic(Globals.SNACH_SYSTEM_UART_TX_UUID); gatt.setCharacteristicNotification(characteristic, true); BluetoothGattDescriptor desc = characteristic.getDescriptor(Globals.SNACH_DESCRIPTOR_UUID); if(desc != null) { desc.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); Log.i("BLE", "Descriptor write: " + gatt.writeDescriptor(desc)); } }
@Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { Log.i(TAG, "onDescriptorWrite: " + status); descriptorWriteQueue.remove(); //pop the item that we just finishing writing //if there is more to write, do it! if(descriptorWriteQueue.size() > 0) { gatt.writeDescriptor(descriptorWriteQueue.element()); } else if(characteristicReadQueue.size() > 0) { gatt.readCharacteristic(characteristicReadQueue.element()); } }
@Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { super.onDescriptorWrite(gatt, descriptor, status); NLog.d("call onDescriptorWrite status : " + status); NLog.d("found service v2"); // broadcastUpdate(ACTION_GATT_SERVICES_READY_TO_CONNECT); StartConnection(); }
@Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { super.onDescriptorWrite(gatt, descriptor, status); Log.d("BLUETOOTH", "onDescriptorWrite: " + status); sIsWritting = false; nextWrite(); //Si la cola de escriuras y no se está escribiendo -> escribeme }
public void mensaje_encenderSensorCC2650(){ if(this.config != null){ mBluetoothGatt.setCharacteristicNotification(movementCharacteristic, true); movementConf.setValue(ENCENDER_SENSOR_ACELEROMETRO); write(movementConf); this.config.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); write(config); this.movementPeriod.setValue(PERIODO_MOVEMENT_SENSOR); write(movementPeriod); } }
/** * write data to specified descriptor */ public boolean writeDescriptor(BluetoothGattDescriptor descriptor, byte[] data, BleDescriptorCallback bleCallback) { if (BleLog.isPrint) { BleLog.i(TAG, descriptor.getUuid() + " descriptor write bytes: " + Arrays.toString(data) + " ,hex: " + HexUtil.encodeHexStr(data)); } handleDescriptorWriteCallback(bleCallback); descriptor.setValue(data); return handleAfterInitialed(getBluetoothGatt().writeDescriptor(descriptor), bleCallback); }
/** * 操作2:通知 * 操作结果返回到 GattCallback 中 onCharacteristicChanged()回调方法当中 * * @param characteristic 需要操作的特征 * @param enable 若为 true 表示要开启notify,若为 false 表示要停止 notify * @return 若为 true 表示设置 notify 状态成功 */ private boolean notifyCharacteristic(BluetoothGattCharacteristic characteristic, boolean enable) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { LogUtils.w(TAG, "蓝牙适配器为 null:notify"); return false; } if (mState != State.STATE_CONNECTED) { LogUtils.w(TAG, "notify(): 当前状态为非连接状态"); return false; } if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_NOTIFY) == 0) { LogUtils.w(TAG, "characteristic不能被notify"); return false; } boolean suc = mBluetoothGatt.setCharacteristicNotification(characteristic, enable); if (!suc) { //notify 操作失败 LogUtils.w(TAG, "set notify 操作失败"); return false; } //特殊操作,注意三元表达式 BluetoothGattDescriptor descriptor = characteristic.getDescriptor(Attributes.UUID_CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR); if (null != descriptor) { descriptor.setValue(enable ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE); return mBluetoothGatt.writeDescriptor(descriptor); } return false; }
@Override public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) { if (TimeProfile.CLIENT_CONFIG.equals(descriptor.getUuid())) { if (Arrays.equals(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE, value)) { Log.d(TAG, "Subscribe device to notifications: " + device); mRegisteredDevices.add(device); } else if (Arrays.equals(BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE, value)) { Log.d(TAG, "Unsubscribe device from notifications: " + device); mRegisteredDevices.remove(device); } if (responseNeeded) { mBluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, null); } } else { Log.w(TAG, "Unknown descriptor write request"); if (responseNeeded) { mBluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_FAILURE, 0, null); } } }
@Override public void actionGattServicesDiscovered(Device deviceName) { if (bleService.getInternalBleService() == null) return; if(!isPhoneFindingEnabled()) return; List<BluetoothGattService> services = bleService.getInternalBleService().getSupportedGattServices(); for (BluetoothGattService service : services) { if (service.getUuid().equals(CASIO_IMMEDIATE_ALERT_SERVICE_UUID)) { BluetoothGattCharacteristic characteristic = service.getCharacteristic(ALERT_LEVEL_CHARACTERISTIC_UUID); if (characteristic != null) { bleService.getInternalBleService().setCharacteristicNotification(characteristic, true); try { Thread.sleep(1000); } catch (InterruptedException e) {} BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CCC_DESCRIPTOR_UUID); if(descriptor == null) return; descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); bleService.getInternalBleService().writeDescriptor(descriptor); Log.i(TAG, "PhoneFinderService - Discovered!"); connectedDevice = deviceName; break; } } } }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); deviceCount = (TextView) findViewById(R.id.lbl_device_count); slider = (SeekBar) findViewById(R.id.seekBar); listView = (ListView) findViewById(R.id.lst_main_options); deviceList = new ArrayList<>(); deviceAddresses = new ArrayList<>(); deviceNames = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1); devices = (ListView) findViewById(R.id.lst_discovered_devices); devices.setAdapter(deviceNames); listView.setOnItemClickListener(this); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { bleServer = new BLEServer(MainActivity.this, this); sliderCharacteristic = bleServer.buildCharacteristic(sliderCharacteristicUuid, new BluetoothGattDescriptor[0], BLEServer.CharProperties.Read | BLEServer.CharProperties.Write | BLEServer.CharProperties.Notify, BLEServer.CharPermissions.Read | BLEServer.CharPermissions.Write); comService = bleServer.buildService(communicationServiceUuid, BLEServer.ServiceType.Primary, new BluetoothGattCharacteristic[]{sliderCharacteristic}); bleServer.addService(comService); } if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){ bleClient = new BLEClient(MainActivity.this, this); bleClient.setUseNewMethod(false); //This requires more work with permissions than the old method } }
@Override public void actionGattServicesDiscovered(Device deviceName) { if (bleService.getInternalBleService() == null) return; connectedDevice = deviceName; if (!deviceName.isGBA400() && !connectedDevice.isSTB1000()) return; List<BluetoothGattService> services = bleService.getInternalBleService().getSupportedGattServices(); for (BluetoothGattService service : services) { if (service.getUuid().equals(WATCH_FEATURES_SERVICE_UUID)) { BluetoothGattCharacteristic characteristic = service.getCharacteristic(FUNCTION_SWITCH_CHARACTERISTIC); if (characteristic != null) { BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CCC_DESCRIPTOR_UUID); descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); bleService.getInternalBleService().writeDescriptor(descriptor); gattCharacteristic = characteristic; gattCharacteristic.setValue(READY_MESSAGE.getBytes()); gattCharacteristic.setWriteType(2); bleService.getInternalBleService().writeCharacteristic(gattCharacteristic); clientAvailable = true; Log.i(TAG, "WatchCtrlService - Discovered!" + characteristic.getUuid().toString()); reloadPhoneControlModes(); break; } } } }
@Override public void onDescriptorChanged(final BluetoothGattDescriptor descriptor) { runOnUiThread(new Runnable() { @Override public void run() { outText.setText("Descriptor\nValue: " + server.getDescriptorValueString(serviceUuid, charUuid, descUuid)); } }); }
@Override public BluetoothGattService createService() { BluetoothGattService bluetoothgattservice = new BluetoothGattService(WATCH_CTRL_SERVICE_UUID, 0); BluetoothGattCharacteristic bluetoothgattcharacteristic = new BluetoothGattCharacteristic(KEY_CONTAINER_CHARACTERISTIC_UUID, 4, 16); bluetoothgattcharacteristic.setValue(new byte[0]); BluetoothGattCharacteristic bluetoothgattcharacteristic1 = new BluetoothGattCharacteristic(NAME_OF_APP_CHARACTERISTIC_UUID, 2, 3); bluetoothgattcharacteristic1.setValue(READY_MESSAGE.getBytes()); BluetoothGattDescriptor bluetoothgattdescriptor = new BluetoothGattDescriptor(CCC_DESCRIPTOR_UUID, 17); bluetoothgattdescriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); bluetoothgattcharacteristic1.addDescriptor(bluetoothgattdescriptor); bluetoothgattservice.addCharacteristic(bluetoothgattcharacteristic); bluetoothgattservice.addCharacteristic(bluetoothgattcharacteristic1); return bluetoothgattservice; }
public boolean setDescriptorValue(UUID serviceUuid, UUID characteristicUuid, UUID descriptorUuid, String value){ BluetoothGattService service = gattServer.getService(serviceUuid); if(service == null) return false; BluetoothGattCharacteristic characteristic = service.getCharacteristic(characteristicUuid); if(characteristic == null) return false; BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descriptorUuid); if(descriptor == null) return false; return descriptor.setValue(value.getBytes()); }
public BluetoothGattCharacteristic buildCharacteristic(UUID characteristicUuid, BluetoothGattDescriptor[] descriptors, int properties, int permissions){ BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(characteristicUuid, properties, permissions); for(BluetoothGattDescriptor descriptor : descriptors){ characteristic.addDescriptor(descriptor); } return characteristic; }
public boolean setDescriptorValue(UUID serviceUuid, UUID characteristicUuid, UUID descriptorUuid, byte[] value){ if(gattConnection == null) return false; BluetoothGattService service = gattConnection.getService(serviceUuid); if(service == null) return false; BluetoothGattCharacteristic characteristic = service.getCharacteristic(characteristicUuid); if(characteristic == null) return false; BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descriptorUuid); if(descriptor == null) return false; descriptor.setValue(value); return gattConnection.writeDescriptor(descriptor); }
public boolean setDescriptorValue(UUID serviceUuid, UUID characteristicUuid, UUID descriptorUuid, String value){ if(gattConnection == null) return false; BluetoothGattService service = gattConnection.getService(serviceUuid); if(service == null) return false; BluetoothGattCharacteristic characteristic = service.getCharacteristic(characteristicUuid); if(characteristic == null) return false; BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descriptorUuid); if(descriptor == null) return false; descriptor.setValue(value.getBytes()); return gattConnection.writeDescriptor(descriptor); }
public String getDescriptorValueString(UUID serviceUuid, UUID characteristicUuid, UUID descriptorUuid){ BluetoothGattService service = gattConnection.getService(serviceUuid); if(service == null) return null; BluetoothGattCharacteristic characteristic = service.getCharacteristic(characteristicUuid); if(characteristic == null) return null; BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descriptorUuid); if(descriptor == null) return null; return new String(descriptor.getValue()); }
public BluetoothGattDescriptor getDescriptor(UUID serviceUuid, UUID characteristicUuid, UUID descriptorUuid){ if(gattConnection == null) return null; BluetoothGattService service = gattConnection.getService(serviceUuid); if(service == null) return null; BluetoothGattCharacteristic characteristic = service.getCharacteristic(characteristicUuid); if(characteristic == null) return null; return characteristic.getDescriptor(descriptorUuid); }
public void receiveNotifications(UUID serviceUuid, UUID characteristicUuid, UUID descriptorUuid, boolean receive){ BluetoothGattCharacteristic characteristic = getCharacteristic(serviceUuid, characteristicUuid); gattConnection.setCharacteristicNotification(characteristic, receive); BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG)); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); gattConnection.writeDescriptor(descriptor); }
/** * Callback indicating the result of a descriptor write operation. * * @param gatt GATT client invoked {@link BluetoothGatt#writeDescriptor} * @param descriptor Descriptor that was writte to the associated * remote device. * @param status The result of the write operation * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds. */ @Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { super.onDescriptorWrite(gatt, descriptor, status); // boolean indicating whether or not the next step is successful, default is false boolean success = false; // Check if writing descriptor was successful and force the action notification if it // was if (status == BluetoothGatt.GATT_SUCCESS) { // Check if the SPIN Service is found final BluetoothGattService spinService = gatt.getService(SPIN_SERVICE_UUID); if (spinService != null) { // Check if the Command Characteristic is found, write the new value and store // the result final BluetoothGattCharacteristic commandCharacteristic = spinService.getCharacteristic(COMMAND_CHARACTERISTIC_UUID); if (commandCharacteristic != null) { // Set the value to 0x0801 commandCharacteristic.setValue( new byte[]{ (byte) 0x08, // commandId = force action notification (8) (byte) 0x01 // enable = false (0) or true (1) } ); success = gatt.writeCharacteristic(commandCharacteristic); } } } onStep(gatt, success); }