问题描述
想要在手机上获取到小米手环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");
}
});
}
}
文章评论