当前位置: 首页 > 知识库问答 >
问题:

从BLE设备读取值

卢黎昕
2023-03-14

我拥有一个极地H10胸带,它以蓝牙低能量运行,并提供心率和心率变化。

我想用Android应用程序读取这些值。由于官方BLE教程中的帮助,我能够连接到设备。现在的问题是从设备中读取心率和心率变异性值。每次设备上有新值可用时,我都要读取该值(并且至少每秒都有新值)。

我找到了以下代码:

private static double extractHeartRate(
            BluetoothGattCharacteristic characteristic) {

        int flag = characteristic.getProperties();
        Log.d(TAG, "Heart rate flag: " + flag);
        int format = -1;
        // Heart rate bit number format
        if ((flag & 0x01) != 0) {
            format = BluetoothGattCharacteristic.FORMAT_UINT16;
            Log.d(TAG, "Heart rate format UINT16.");
        } else {
            format = BluetoothGattCharacteristic.FORMAT_UINT8;
            Log.d(TAG, "Heart rate format UINT8.");
        }
        final int heartRate = characteristic.getIntValue(format, 1);
        Log.d(TAG, String.format("Received heart rate: %d", heartRate));
        return heartRate;
    }



private static Integer[] extractBeatToBeatInterval(
            BluetoothGattCharacteristic characteristic) {

        int flag = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0);
        int format = -1;
        int energy = -1;
        int offset = 1; // This depends on hear rate value format and if there is energy data
        int rr_count = 0;

        if ((flag & 0x01) != 0) {
            format = BluetoothGattCharacteristic.FORMAT_UINT16;
            Log.d(TAG, "Heart rate format UINT16.");
            offset = 3;
        } else {
            format = BluetoothGattCharacteristic.FORMAT_UINT8;
            Log.d(TAG, "Heart rate format UINT8.");
            offset = 2;
        }
        if ((flag & 0x08) != 0) {
            // calories present
            energy = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, offset);
            offset += 2;
            Log.d(TAG, "Received energy: {}"+ energy);
        }
        if ((flag & 0x16) != 0){
            // RR stuff.
            Log.d(TAG, "RR stuff found at offset: "+ offset);
            Log.d(TAG, "RR length: "+ (characteristic.getValue()).length);
            rr_count = ((characteristic.getValue()).length - offset) / 2;
            Log.d(TAG, "RR length: "+ (characteristic.getValue()).length);
            Log.d(TAG, "rr_count: "+ rr_count);
            if (rr_count > 0) {
                Integer[] mRr_values = new Integer[rr_count];
                for (int i = 0; i < rr_count; i++) {
                    mRr_values[i] = characteristic.getIntValue(
                            BluetoothGattCharacteristic.FORMAT_UINT16, offset);
                    offset += 2;
                    Log.d(TAG, "Received RR: " + mRr_values[i]);
                }
                return mRr_values;
            }
        }
        Log.d(TAG, "No RR data on this update: ");
        return null;
    }

假设我与设备有连接,我如何使用它来提取心率和r-r间隔(节拍到节拍间隔)?如果有人能举个简短的例子,我会很高兴。此外,我想使用一项服务,以便它在后台运行,我可以做其他工作,并且消耗更少的电池。但该服务应该具有最高优先级,以免被杀死。

在提取beattobeatinterval()方法中,有一个int offset=1 和描述

这取决于听到率值格式以及是否有能量数据

我不明白这个提议的意思。我应该使用什么偏移值?

其次,如果连接中断,我想收到一个通知,以便我可以处理它(例如显示消息)。我该怎么做?

共有1个答案

松秦斩
2023-03-14

在这件事上,我可以帮你做几件事。对于连接中断,可以这样处理

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            if (newState == BluetoothGatt.STATE_CONNECTED) {
                Log.e(Constants.TAGGattConnectThread, "Connected to the GATT Server " + status + " " +newState);
                Log.e(Constants.TAGGattConnectThread, "Attempting to discover services");
                bluetoothGatt.discoverServices();
            }
            else if(newState == BluetoothGatt.STATE_DISCONNECTED)
            {
                Log.e(Constants.TAGGattConnectThread,"Band disconnected");
               //Write you disconnect handling code here
            }

您还可以在连接到Gatt时将“自动连接”选项设置为“True”

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

对于创建服务,您可以创建一个Sticky服务,除非强制停止,否则该服务将自行重启。

 类似资料:
  • 我正在开发一个与硬件设备连接的BLE(蓝牙LE)应用程序。我能够发现并连接到设备,从设备读取数据,将数据写入设备。 我在苹果的BLE文档中找不到的是,当你靠近一台设备时,当应用程序关闭时,如何获得通知。 我知道如何注册到特征通知,但此通知仅在应用程序位于后台时发生。 我知道可以在应用程序关闭时检测蓝牙,并发送通知,但我想在设备发现具有的特定BLE时收到通知。 iBeacon正在将BLE与UUID、

  • 我正在尝试使用Android Studio作为IDE和Java作为编程语言与温度计BLE设备进行交互。使用智能手机上的应用程序,我发现了该设备在运行过程中暴露的服务:有很多通用服务/特性和一个自定义服务。 首先,我试着阅读 健康温度计服务(UUID=00001809-0000-1000-8000-00805F9B34FB) 从服务列表中恢复特征并访问其描述符: 在这种情况下,我可以看到测量的结果在

  • 我是新来的JavaScript,所以我可能有一些非常规的编程方式。也就是说,我正在做一个项目,我需要读写数据到自定义BLE设备。我使用gatt服务器协议进行连接。我能够与设备连接,但现在我试图从寄存器中读取数据。 我看了从谷歌以及网络蓝牙github的网络样本,但我无法理解它。下面的代码是我目前试图打破这一点。早期的尝试让我陷入了这样一个事实,即我得到的值是一个对象或一个promise对象。

  • 如何从设备读取RAW数据?

  • 问题内容: 我正在使用在Xcode上使用Swift的应用程序,该应用程序连接到蓝牙BLE外设。我已经建立了与设备的连接,并想从特定特征(特别是服务UUID FFF0中的FFF1)读取一些数据。 如果要查找其信息的特征是,我可以使用以下代码请求特征的读取: 我想知道的是:如何检查此读取值是否是我要的值。我希望能够执行if语句,以针对该特征的发现值检查我的值。 例如:如果发现的值为X,则执行其他操作;

  • 我读过很多关于用Android通过代码读取APN的话题,自从Android 4.2以来,这似乎已经不可能了。然而,所有的主题都超过了2/3年,我想知道是否有一个好的解决方案,使我能够读取设备的当前APN。我看到过一些关于SQLiteWrapper的东西,但它不起作用,或者我只是没有足够的资格让它起作用。