使用Fastble获取小米手环4心率广播

2022年4月22日 146点热度 0人点赞 0条评论

问题描述

想要在手机上获取到小米手环4的心率广播,然后使用 http 推送到服务器。没找到有什么第三方软件可以实现该功能,就搞一个 app 实现。

解决方案

app 使用 java 开发,直接使用 FastBle 框架。

settings.gradle 中添加 jitpack 仓库。

allprojects {
  repositories {
    maven { url 'https://jitpack.io' }
  }
}

build.gradle 引用 fastble 。

dependencies {
  implementation 'com.github.Jasonchenlijian:FastBle:2.4.0'
}

获取小米手环4心率服务 uuid 和通知 uuid。手机须安装小米运动并连接到手环。然后下载安装 nRF Connect

打开 nF Connect ,在 BOUNED 中找到小米手环4,点击 CONNECT。找到 Heart Rate 服务点击订阅按钮。

向右滑动进入日志,在日志中找到完整的 uuid 和 mac 地址。

serviceUuid 可以搜索 Heart Rate UUID。

notifyUuid Notification received from 的 UUID。

连接并接收notify。

package com.example.heartrate;

import androidx.appcompat.app.AppCompatActivity;
import android.bluetooth.BluetoothGatt;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.clj.fastble.BleManager;
import com.clj.fastble.callback.BleGattCallback;
import com.clj.fastble.callback.BleNotifyCallback;
import com.clj.fastble.data.BleDevice;
import com.clj.fastble.exception.BleException;

public class MainActivity extends AppCompatActivity {

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

    public void receiveMibandHeartRateNotify(View view){
        String deviceMac = "";
        String serviceUuid = "";
        String notifyUuid = ""

        BleManager.getInstance().init(getApplication());
        BleManager.getInstance()
                .enableLog(true)
                .setReConnectCount(1, 5000)
                .setSplitWriteNum(20)
                .setConnectOverTime(10000)
                .setOperateTimeout(5000);

        BleManager.getInstance().connect(deviceMac, new BleGattCallback() {
            @Override
            public void onStartConnect() {
                Log.i("BLE","CONNECT START");
            }

            @Override
            public void onConnectFail(BleDevice bleDevice, BleException exception) {
                Log.i("BLE","CONNECT FAIL");
            }

            @Override
            public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
                Log.i("BLE","CONNECT SUCCESS");
                BleManager.getInstance().notify(
                        bleDevice,
                        serviceUuid,
                        notifyUuid,
                        new BleNotifyCallback() {
                            @Override
                            public void onNotifySuccess() {
                                Log.i("BLE","OPEN NOTIFY SUCCESS");
                            }

                            @Override
                            public void onNotifyFailure(BleException exception) {
                                Log.i("BLE","OPEN NOTIFY FAIL");
                            }

                            @Override
                            public void onCharacteristicChanged(byte[] data) {
                                StringBuilder sb = new StringBuilder();
                                for (byte b : data) {
                                    sb.append(String.format("%02x", b));
                                }
                                int heartRate = Integer.parseInt(sb.toString(),16);
                                Log.i("HEART RATE", String.valueOf(heartRate));
                             }
                        });
            }

            @Override
            public void onDisConnected(boolean isActiveDisConnected, BleDevice bleDevice, BluetoothGatt gatt, int status) {
                Log.i("BLE","CONNECT DISCONNECT");
            }
        });
    }
}

KAMINO

这个人很懒,什么都没留下

文章评论