使用MI BAND 2进行蓝牙低功耗

时间:2018-01-29 15:17:50

标签: android bluetooth bluetooth-lowenergy

我使用MI BAND 2 BLE。我为BLE的现成特性制作了演示应用程序。我的示例代码在这里

package id.aashari.code.miband2.Activities;

公共类MainActivity扩展了Activity {

Boolean isListeningHeartRate = false;

BluetoothAdapter bluetoothAdapter;
BluetoothGatt bluetoothGatt;
BluetoothDevice bluetoothDevice;

Button btnStartConnecting, btnGetBatteryInfo, btnGetHeartRate, btnWalkingInfo, btnStartVibrate, btnStopVibrate;
EditText txtPhysicalAddress;
TextView txtState, txtByte;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initializeObjects();
    initilaizeComponents();
    initializeEvents();

    getBoundedDevice();

}

void getBoundedDevice() {
    Set<BluetoothDevice> boundedDevice = bluetoothAdapter.getBondedDevices();
    for (BluetoothDevice bd : boundedDevice) {
        if (bd.getName().contains("MI Band 2")) {
            txtPhysicalAddress.setText(bd.getAddress());
        }
    }
}

void initializeObjects() {
    bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}

void initilaizeComponents() {
    btnStartConnecting = (Button) findViewById(R.id.btnStartConnecting);
    btnGetBatteryInfo = (Button) findViewById(R.id.btnGetBatteryInfo);
    btnWalkingInfo = (Button) findViewById(R.id.btnWalkingInfo);
    btnStartVibrate = (Button) findViewById(R.id.btnStartVibrate);
    btnStopVibrate = (Button) findViewById(R.id.btnStopVibrate);
    btnGetHeartRate = (Button) findViewById(R.id.btnGetHeartRate);
    txtPhysicalAddress = (EditText) findViewById(R.id.txtPhysicalAddress);
    txtState = (TextView) findViewById(R.id.txtState);
    txtByte = (TextView) findViewById(R.id.txtByte);
}

void initializeEvents() {
    btnStartConnecting.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startConnecting();
        }
    });
    btnGetBatteryInfo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getBatteryStatus();
        }
    });
    btnStartVibrate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startVibrate();
        }
    });
    btnStopVibrate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            stopVibrate();
        }
    });
    btnGetHeartRate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startScanHeartRate();
        }
    });
}

void startConnecting() {

    String address = txtPhysicalAddress.getText().toString();
    bluetoothDevice = bluetoothAdapter.getRemoteDevice(address);

    Log.v("test", "Connecting to " + address);
    Log.v("test", "Device name " + bluetoothDevice.getName());

    bluetoothGatt = bluetoothDevice.connectGatt(this, true, bluetoothGattCallback);

}

void stateConnected() {
    bluetoothGatt.discoverServices();
    txtState.setText("Connected");
}

void stateDisconnected() {
    bluetoothGatt.disconnect();
    txtState.setText("Disconnected");
}

void startScanHeartRate() {
    txtByte.setText("...");
    BluetoothGattCharacteristic bchar = bluetoothGatt.getService(CustomBluetoothProfile.HeartRate.service)
            .getCharacteristic(CustomBluetoothProfile.HeartRate.controlCharacteristic);
    bchar.setValue(new byte[]{21, 2, 1});
    bluetoothGatt.writeCharacteristic(bchar);
}

void listenHeartRate() {
    BluetoothGattCharacteristic bchar = bluetoothGatt.getService(CustomBluetoothProfile.HeartRate.service)
            .getCharacteristic(CustomBluetoothProfile.HeartRate.measurementCharacteristic);
    bluetoothGatt.setCharacteristicNotification(bchar, true);
    BluetoothGattDescriptor descriptor = bchar.getDescriptor(CustomBluetoothProfile.HeartRate.descriptor);
    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
    bluetoothGatt.writeDescriptor(descriptor);
    isListeningHeartRate = true;
}

void getBatteryStatus() {
    txtByte.setText("...");
    BluetoothGattCharacteristic bchar = bluetoothGatt.getService(CustomBluetoothProfile.Basic.service)
            .getCharacteristic(CustomBluetoothProfile.Basic.batteryCharacteristic);
    if (!bluetoothGatt.readCharacteristic(bchar)) {
        Toast.makeText(this, "Failed get battery info", Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(getApplicationContext(),"Successfully readed", Toast.LENGTH_LONG).show();
    }

}

void startVibrate() {
    BluetoothGattCharacteristic bchar = bluetoothGatt.getService(CustomBluetoothProfile.AlertNotification.service)
            .getCharacteristic(CustomBluetoothProfile.AlertNotification.alertCharacteristic);
    bchar.setValue(new byte[]{2});
    if (!bluetoothGatt.writeCharacteristic(bchar)) {
        Toast.makeText(this, "Failed start vibrate", Toast.LENGTH_SHORT).show();
    }
}

void stopVibrate() {
    BluetoothGattCharacteristic bchar = bluetoothGatt.getService(CustomBluetoothProfile.AlertNotification.service)
            .getCharacteristic(CustomBluetoothProfile.AlertNotification.alertCharacteristic);
    bchar.setValue(new byte[]{0});
    if (!bluetoothGatt.writeCharacteristic(bchar)) {
        Toast.makeText(this, "Failed stop vibrate", Toast.LENGTH_SHORT).show();
    }
}

final BluetoothGattCallback bluetoothGattCallback = new BluetoothGattCallback() {

    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        super.onConnectionStateChange(gatt, status, newState);
        Log.v("test", "onConnectionStateChange");

        if (newState == BluetoothProfile.STATE_CONNECTED) {
            stateConnected();
        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            stateDisconnected();
        }

    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        super.onServicesDiscovered(gatt, status);
        Log.v("test", "onServicesDiscovered");
        listenHeartRate();
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        super.onCharacteristicRead(gatt, characteristic, status);
        Log.v("test", "onCharacteristicRead");
        byte[] data = characteristic.getValue();

        txtByte.setText(Arrays.toString(data));


    }

    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        super.onCharacteristicWrite(gatt, characteristic, status);
        Log.v("test", "onCharacteristicWrite");
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
        super.onCharacteristicChanged(gatt, characteristic);
        Log.v("test", "onCharacteristicChanged");
        byte[] data = characteristic.getValue();
        txtByte.setText(Arrays.toString(data));
    }

    @Override
    public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
        super.onDescriptorRead(gatt, descriptor, status);
        Log.v("test", "onDescriptorRead");
    }

    @Override
    public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
        super.onDescriptorWrite(gatt, descriptor, status);
        Log.v("test", "onDescriptorWrite");
    }

    @Override
    public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {
        super.onReliableWriteCompleted(gatt, status);
        Log.v("test", "onReliableWriteCompleted");
    }

    @Override
    public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
        super.onReadRemoteRssi(gatt, rssi, status);
        Log.v("test", "onReadRemoteRssi");
    }

    @Override
    public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
        super.onMtuChanged(gatt, mtu, status);
        Log.v("test", "onMtuChanged");
    }

};

}

this is the output

我可以读取特性,但它只显示我转换成字符串的字节值,但它的值总是相同的。示例我读取电池电量它只显示字节类型值我附加输出屏幕

1 个答案:

答案 0 :(得分:0)

我试图对Mi Band 3做同样的事情。

我的代码是:

private void connect(){
    String macAddress = "E9:FD:0C:CB:67:2C";
    bleDevice = rxBleClient.getBleDevice(macAddress);

    connectDisposable = bleDevice.establishConnection(true)
            .subscribe(
                    rxBleConnection -> {
                        // All GATT operations are done through the rxBleConnection.
                        Log.d(TAG, "Is connected");
                        rxBleConnection.readCharacteristic(UUID_CHARACTERISTIC_HEART_RATE_MEASUREMENT).subscribe(
                                bytes -> {
                                    Log.d(TAG, "Data " + bytes);
                                },
                                throwable -> {
                                    Log.d(TAG, "Error " + throwable.getMessage());
                                }
                        );
                    },
                    throwable -> {
                        // Handle an error here.
                        Log.d(TAG, "Error " + throwable.getMessage());
                    }
            );
}

您能否提供任何解决方法的解释?