private void broadcastUpdate( final String action, final BluetoothGattCharacteristic characteristic) { final Intent intent = new Intent(action); if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) { int flag = characteristic.getProperties(); int format = -1; if ((flag & 0x01) != 0) { format = BluetoothGattCharacteristic.FORMAT_UINT16; } else { format = BluetoothGattCharacteristic.FORMAT_UINT8; } final int heartRate = characteristic.getIntValue(format, 1); LogUtil.info(TAG, "心率数据Received heart rate: %d" + heartRate); LogUtil.info(TAG, String.format("Received heart rate: %d", heartRate)); intent.putExtra(EXTRA_DATA, receiveData); } else { // 脂肪秤和血糖仪设备数据返回 final byte[] data = characteristic.getValue(); if (data != null && data.length > 0) { String s = FatScaleDataUtil.byteToHexStringFormat(data); LogUtil.info(TAG, "原始数据:" + s); if (DEVICE_TYPE == 1) { intent.putExtra(EXTRA_DATA, s); } else { intent.putExtra(EXTRA_DATA, receiveData); } } } sendBroadcast(intent); }
public BluetoothGattService getSupportedGattService() { if (mBluetoothGatt == null) { LogUtil.info(TAG, "mBluetoothGatt is null ,try reconnect!"); boolean isconnectok = connect(); if (!isconnectok) { connect(); } return null; } String UUID_SERVICE; switch (DEVICE_TYPE) { case 1: // 脂肪秤 UUID_SERVICE = BLEConstants.UUID_FATSCALE_SERVICE; break; case 2: // 血压计 UUID_SERVICE = BLEConstants.UUID_BLOOD_PRESSURE_SERVICE; break; case 3: // 血糖仪 UUID_SERVICE = BLEConstants.UUID_BLOODSUGAR_SERVICE; break; default: UUID_SERVICE = BLEConstants.UUID_FATSCALE_SERVICE; break; } LogUtil.info(TAG, "device type=" + DEVICE_TYPE); BluetoothGattService service = mBluetoothGatt.getService(UUID.fromString(UUID_SERVICE)); return service; }
/** * After using a given BLE device, the app must call this method to ensure resources are released * properly. */ public void close() { LogUtil.info(TAG, "mBluetoothGatt is close before"); if (mBluetoothGatt == null) { return; } mBluetoothGatt.close(); mBluetoothGatt = null; broadcastUpdate(ACTION_GATT_CLOSE); LogUtil.info(TAG, "mBluetoothGatt is close"); }
public void wirteCharacteristic(BluetoothGattCharacteristic characteristic) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { LogUtil.info(TAG, "BluetoothAdapter not initialized"); return; } boolean isWrite = mBluetoothGatt.writeCharacteristic(characteristic); if (isWrite) { LogUtil.info(TAG, "写入数据成功"); } else { LogUtil.info(TAG, "写入数据失败"); } }
/** * Disconnects an existing connection or cancel a pending connection. The disconnection result is * reported asynchronously through the {@code * BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)} * callback. */ public void disconnect() { if (mBluetoothAdapter == null || mBluetoothGatt == null) { LogUtil.info(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.disconnect(); }
@Override public boolean onUnbind(Intent intent) { LogUtil.info("smarhit", "service中的onUnbind()"); close(); isBind = false; return super.onUnbind(intent); }
/** * Request a read on a given {@code BluetoothGattCharacteristic}. The read result is reported * asynchronously through the {@code * BluetoothGattCallback#onCharacteristicRead(android.bluetooth.BluetoothGatt, * android.bluetooth.BluetoothGattCharacteristic, int)} callback. * * @param characteristic The characteristic to read from. */ public void readCharacteristic(BluetoothGattCharacteristic characteristic) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { LogUtil.info(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.readCharacteristic(characteristic); }
/** * 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) { LogUtil.info(TAG, "BluetoothAdapter not initialized"); return; } LogUtil.info(TAG, "write set notification " + enabled); mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); BluetoothGattDescriptor descriptor = characteristic.getDescriptor( UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG)); if (descriptor != null) { LogUtil.info(TAG, "write descriptor"); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); mBluetoothGatt.writeDescriptor(descriptor); } }
/** * Initializes a reference to the local Bluetooth adapter. * * @return Return true if the initialization is successful. */ public boolean initialize() { if (mBluetoothManager == null) { mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); if (mBluetoothManager == null) { LogUtil.info(TAG, "Unable to initialize BluetoothManager."); return false; } } mBluetoothAdapter = mBluetoothManager.getAdapter(); if (mBluetoothAdapter == null) { LogUtil.info(TAG, "Unable to obtain a BluetoothAdapter."); return false; } return true; }
@Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { LogUtil.info(TAG, "发现蓝牙服务onServicesDiscovered()"); if (status == BluetoothGatt.GATT_SUCCESS) { broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); // enable notification enableNotify(); } }
public boolean reConnect() { if (mBluetoothAdapter == null || mDevice == null) { LogUtil.info(TAG, "BluetoothAdapter not initialized or unspecified address."); return false; } // if (mBluetoothDeviceAddress != null && // address.equals(mBluetoothDeviceAddress) && mBluetoothGatt != null) { // LogUtil.info(TAG, // "Trying to use an existing mBluetoothGatt for connection."); // if (mBluetoothGatt.connect()) { // mConnectionState = STATE_CONNECTING; // return true; // } else { // return false; // } // } // We want to directly connect to the device, so we are setting the // autoConnect // parameter to false. mBluetoothGatt = mDevice.connectGatt(BluetoothLeService.this, true, mGattCallback); LogUtil.info(TAG, "Trying to reConnect."); if (mDevice.getName().equals(BLEConstants.TYPE_FATSCALE_DEVICE_NAME)) { DEVICE_TYPE = 1; } else if (mDevice.getName().equals(BLEConstants.TYPE_BLOODPRESSURE_DEVICE_NAME)) { DEVICE_TYPE = 2; } else if (mDevice.getName().equals(BLEConstants.TYPE_BLOODSUGAR_DEVICE_NAME)) { DEVICE_TYPE = 3; } if (mBluetoothGatt != null) { if (mBluetoothGatt.connect()) { mConnectionState = STATE_CONNECTING; LogUtil.info(TAG, "Trying to reConnect. ok."); return true; } else { return false; } } return false; }
@Override public void onCharacteristicChanged( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { LogUtil.info(TAG, "接收数据onCharacteristicChanged()"); String str = ""; switch (DEVICE_TYPE) { case 1: // 脂肪秤 broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); if (characteristic.getValue() != null) { LogUtil.info(TAG, characteristic.getStringValue(0)); } break; case 2: // 血压计 LogUtil.info(TAG, "数据长度:" + characteristic.getValue().length); for (int i = 0; ; ++i) { if (i >= characteristic.getValue().length) { receiveData = str; broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); LogUtil.info(TAG, "血压计结果数据:" + receiveData); return; } str = str + (0xFF & characteristic.getValue()[i]) + " "; } case 3: // 血糖仪 for (int i = 0; ; ++i) { if (i >= characteristic.getValue().length) { receiveData = str; broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); LogUtil.info(TAG, "血糖仪结果数据:" + receiveData); return; } str = str + (0xFF & characteristic.getValue()[i]) + " "; } default: break; } }
@Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { String intentAction; // isStateChange = true; LogUtil.info(TAG, "蓝牙连接状态发生变化!onConnectionStateChange()"); if (newState == BluetoothProfile.STATE_CONNECTED) { intentAction = ACTION_GATT_CONNECTED; mConnectionState = STATE_CONNECTED; mBluetoothGatt.discoverServices(); broadcastUpdate(intentAction); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { intentAction = ACTION_GATT_DISCONNECTED; mConnectionState = STATE_DISCONNECTED; mBluetoothGatt.close(); broadcastUpdate(intentAction); } }
@Override public void onCharacteristicRead( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { LogUtil.info(TAG, "读取数据onCharacteristicRead()"); }
private void enableNotify() { BluetoothGattService service = getSupportedGattService(); if (null == service) { LogUtil.info(TAG, "BluetoothGattService service is null"); boolean isconnectok = connect(); if (!isconnectok) { connect(); } return; } BluetoothGattCharacteristic gattCharacteristic = null; switch (DEVICE_TYPE) { case 1: gattCharacteristic = service.getCharacteristic(UUID.fromString(BLEConstants.UUID_CHARACTERISTIC)); break; case 2: gattCharacteristic = service.getCharacteristic( UUID.fromString(BLEConstants.UUID_BLOOD_PRESSURE_CHARACTERISTIC)); break; case 3: gattCharacteristic = service.getCharacteristic(UUID.fromString(BLEConstants.UUID_BLOODSUGAR_CHARACTERISTIC)); break; default: gattCharacteristic = service.getCharacteristic(UUID.fromString(BLEConstants.UUID_CHARACTERISTIC)); break; } if (null == gattCharacteristic) { LogUtil.info(TAG, "BluetoothGattCharacteristic gattCharacteristic is null"); return; } boolean bool = mBluetoothGatt.setCharacteristicNotification(gattCharacteristic, true); LogUtil.info(TAG, "setCharacteristicNotification:" + bool); BluetoothGattDescriptor descriptor = null; switch (DEVICE_TYPE) { case 1: descriptor = gattCharacteristic.getDescriptor(UUID.fromString(BLEConstants.UUID_DESCRIPTER)); case 2: descriptor = gattCharacteristic.getDescriptor( UUID.fromString(BLEConstants.UUID_BLOOD_PRESSURE_DESCRIPTER)); break; case 3: descriptor = gattCharacteristic.getDescriptor( UUID.fromString(BLEConstants.UUID_BLOODSUGAR_DESCRIPTER)); break; default: descriptor = gattCharacteristic.getDescriptor(UUID.fromString(BLEConstants.UUID_DESCRIPTER)); break; } if (null != descriptor) { descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); mBluetoothGatt.writeDescriptor(descriptor); } }
@Override public void onDescriptorWrite( BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { LogUtil.info(TAG, "写入数据onDescriptorWrite()"); }
@Override public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { LogUtil.info(TAG, "执行了onReadRemoteRssi()! rssi = " + rssi); }
@Override public void onCharacteristicWrite( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { LogUtil.info(TAG, "-----------onCharacteristicWrite---------status:" + status); };
@Override public IBinder onBind(Intent intent) { LogUtil.info("smarhit", "service中的onBind()"); isBind = true; return mBinder; }
public void scanLeDevice(String collectedDevice) { this.mCollectedDevice = collectedDevice; LogUtil.info("smarhit", collectedDevice + "数据已收集,开始扫描其他设备"); mScanTime = System.currentTimeMillis(); mBluetoothAdapter.startLeScan(mLeScanCallback); }