主要内容

从健身监测设备收集数据

此示例演示如何使用Bluetooth®低能通信从健身监测设备收集和绘制数据。

硬件设置

本例使用了安德玛心率监测带和一双安德玛智能跑鞋。两种设备都支持低功耗蓝牙通金宝app信。

发现并连接设备

首先,通过在MATLAB中查找Bluetooth Low Energy设备来检查它们是否支持连接。金宝app的布莱斯特功能扫描附近正在广告的蓝牙低能耗外围设备。

布莱斯特
ans =14×5表UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUD03B759BC7“-65[1×1结构]2”““12377421-4EA3-4F77-9365-EFD580C34DE9”-66[1×1结构]3“UA E39模块”“8206F662-BA4A-483F-A908-516FF506BFB0“-67[1×1结构]4”“CF65AD36-2146-4CA1-BCEA-FED47F6195CA”-76[1×1结构]5“UA脚垫239AE2”“CF7B117-4104-4D7B-AE70-1837CAE9C9D0”-78[1×1结构]6”““67A1A92A-5F1C-4AF8-857A-99F194E9A5F8”-”-82[1×1结构]7”““5609D68D-0EED-41D7-BE19-F3ACA119C7A”-84[1×1结构]8”““5A194E9F8结构”--41D7-41D7-BE19-F37A结构”-9675A0FA-0394-468B-B908-040696E1C5BC“-88[1×1结构]10”““61540D17-C2DD-41D4-B107-E2E7374B11F4”-88[1×1结构]11”““C2A5CCC3-CA6C-4688-AAE9-A5BE039561F9”-92[1×1结构]12”““AF5E1195-4088-4A4B-ADA5-0BD3C91BFE62”-93[1×1结构]13”““C69EFB-0FADE9-4B167-245结构]993276FD-07EC-433D-85E1-E144B289B648“-95[1×1结构]

在MATLAB中找到设备后,通过调用祝福.如果设备名称唯一,请指定设备名称或指定设备地址。

皮带=ble(“UA E39模块”)
皮带=带属性的电缆:名称:“UA E39模块”地址:“8206F662-BA4A-483F-A908-516FF506BFB0”连接:1个服务:[4×2表]特征:[22×5表]显示服务和特征
鞋=祝福(“UA Footpod 239 ae2”)
属性:名称:"UA Footpod 239AE2"地址:"CF7B1A17-4104-4D7B-AE70-1837CAE9C9D0"连接:1服务:[8×2表]特性:[39×5表]显示服务和特性

属性的特征属性祝福物体带。该设备具有“心率”服务,其中包含“心率测量”特性。

带。特征
ans =22×5表名ServiceUUID CharacteristicName CharacteristicUUID属性  ____________________ ______________________________________ _____________________________________________________ ______________________________________ ____________ " 心率”“180 d”“心率测量”“2 a37{(“通知”)}“心跳”“180 d”“身体传感器位置”"2A38" {["Read"]} " "心率" "180D" "心率控制点" "2A39" {["Write"]} "电池服务" "180F" "电池电平" "2A19" {1×2 string} "设备信息" "180A" "系统ID" "2A23" {["Read"]} "设备信息" "180A" "型号字符串" "2A24" {["Read"]} "设备信息" "180A" "序列号字符串" "2A25" {["Read"]}"设备信息" "180A" "固件版本字符串" "2A26" {["Read"]} "设备信息" "180A" "硬件版本字符串" "2A27" {["Read"]} "设备信息" "180A" "软件版本字符串" "2A28" {["Read"]} "设备信息" "180A" "厂商名称字符串" "2A29" {["Read"]} "设备信息" "180A" "厂商名称字符串" "2A29" {["Read"]} "设备信息" "180A" "IEEE 11073-20601 .Certification Data List" "2A2A" {["Read"]} "设备信息" "180A" "PnP ID" "2A50" {["Read"]} "Custom" "21A51000-4C86-11E2-BCFD-0800200C9A66" "Custom" "21A51011-4C86-11E2-BCFD-0800200C9A66" {1×2 string} "Custom" "21A51000-4C86-11E2-BCFD-0800200C9A66" "Custom" "21A51021-4C86-11E2-BCFD-0800200C9A66" {1×2 string} " "Custom""21A51000-4C86-11E2-BCFD-0800200C9A66" "Custom" "21A51022-4C86-11E2-BCFD-0800200C9A66" {["Write"]}⋮

属性的特征属性祝福对象鞋。该设备具有“运行速度和节奏”服务,其中包含“RSC测量”特性。

鞋。特征
ans =39×5表名ServiceUUID CharacteristicName CharacteristicUUID属性  ___________________________ ______________________________________ _____________________________________________________ ______________________________________ ____________ " 设备信息”“180年”“2”“系统ID a23{[“读”]}“设备信息”“180年”“型号String" "2A24" {["Read"]} "设备信息" "180A" "序列号String" "2A25" {["Read"]} "设备信息" "180A" "固件版本String" "2A26" {["Read"]} "设备信息" "180A" "硬件版本String" "2A27" {["Read"]} "设备信息" "180A" "软件版本String" "2A28" {["Read"]} "设备信息" "180A""厂商名称字符串" "2A29" {["Read"]} "设备信息" "180A" "IEEE 11073-20601法规认证数据列表" "2A2A" {["Read"]} "设备信息" "180A" "PnP ID" "2A50" {["Read"]} "电池服务" "180F" "电池电量" "2A19" {1×2 String} "运行速度和节拍" "1814" "RSC测量" "2A53" {["Notify"]} "运行速度和节奏”“1814年”“RSC功能”“2 a54“{[“读”]}”运行速度和节奏”“1814年”“2”“SC控制点a55{1×2字符串}“自定义”“21 a54000 - 4 - c86 - 11 - e2 - bcfd - 0800200 - c9a66”“自定义”“21 a54001 - 4 - c86 - 11 - e2 - bcfd - 0800200 - c9a66{1×2字符串}“自定义”“21 a54000 - 4 - c86 - 11 - e2 - bcfd - 0800200 - c9a66”“自定义”“21 a54002 - 4 - c86 - 11 - e2 - bcfd - 0800200 - c9a66“{1×2字符串}"Custom" "21A54000-4C86-11E2-BCFD-0800200C9A66" "Custom" "21A54003-4C86-11E2-BCFD-0800200C9A66" {1×3 string} ⋮

读取心率数据

接下来,通过指定其服务和特征信息,为“心率测量”特征创建一个对象。

hr=特性(皮带、,“心率”,“心率测量”)
hr=具有属性的特征:名称:“心率测量”UUID:“2A37”属性:“通知”描述符:[1x3表格]数据可用EFCN:[]显示描述符

然后从设备读取当前心率测量值。

data =阅读(人力资源)
data =1×422 96 73 3

根据中的心率服务规范蓝牙低能耗规格列表,“心率测量”特征值包含一个标志字节,后面跟着一个或多个心率值。测量值的格式由标志位值决定。将原始数据转换为每分钟(bpm)的心率。

flag=uint8(数据(1));%获取标志的第1位,表示心率值的格式heartRateValueFormat=bitget(标志,1);如果heartRateValueFormat==0%心率格式为uint8心率=数据(2);其他的%心率格式为uint16心率=双倍(类型转换(uint8)(数据(2:3)),“uint16”));终止fprintf('心率测量:%d(bpm)\n'心率);
心率测量:96(bpm)

读取运行速度和节拍数据

类似地,通过指定其服务和特征信息,为“RSC测量”特征创建一个对象。

rsc=特性(鞋,"奔跑速度与节奏",“rsc测量”)
rsc =带有属性的特征:Name: " rsc Measurement" UUID: "2A53" Attributes: "Notify" Descriptors: [1x3 table] DataAvailableFcn:[]显示描述符

然后从设备中读取当前的运行速度和节拍值。

data =阅读(rsc)
data =1×103 000 000 0 0 84 57 0 0

根据中的运行速度和节奏服务规范蓝牙低能耗规格列表“RSC测量”特征值包含表示瞬时速度的2个字节和表示瞬时节奏的1个字节。将原始数据转换为以米/秒(m/s)为单位的运行速度和以步数/分钟为单位的节奏。

瞬时速度=双(类型转换(uint8)(数据(2:3)),“uint16”))/瞬时频率=数据(4);fprintf('瞬时速度:%.2f(m/s)和瞬时节奏:%d(每分钟步数)\n',瞬时速度,瞬时节奏);
瞬时速度:0.00(m/s)和瞬时节奏:0(每分钟步数)

关联心率和跑步速度

读取心率和RSC数据后,跟踪跑步过程中的实时数据,并将两个测量值关联起来,以分析健身表现。

为了显示适合度数据的相关性,首先创建两个图,通过在循环中添加数据点来创建动画。

%创建跑步速度与心率的曲线图axSpeed =轴(“XLim”, [0, 5],“YLim”[220]);包含(axSpeed的运行速度(米/秒));ylabel (axSpeed“心率(bpm)”);子批次(1,2,1,axSpeed);hSpeed=动画线条(axSpeed,“标记”,“o”,“MarkerFaceColor”,“绿色”);%创建跑步节奏与心率的曲线图axCadence=轴(“XLim”[0, 200),“YLim”[220]);包含(axCadence“跑步节奏(每分钟的步数)”);ylabel (axCadence“心率(bpm)”);subplot(1, 2, 2, axCadence);hCadence = animatedline (axCadence,“标记”,“o”,“MarkerFaceColor”,“蓝”);

接下来,循环读取设备数据,并在用户从步行到慢跑再到跑步的过程中更新图。

对于循环=1:30获得心率数据data =阅读(人力资源);国旗= uint8(数据(1));heartRateValueFormat=bitget(标志,1);如果心率值格式==0心率=数据(2);其他的心率=双倍(类型转换(uint8)(数据(2:3)),“uint16”));终止%获取运行速度数据data =阅读(rsc);瞬时速度=双(类型转换(uint8)(数据(2:3)),“uint16”))/瞬时频率=数据(4);%用新数据更新绘图添加点(hSpeed、瞬时速度、心率);addpoints(心率、瞬时频率、心率);现在抽;终止

这些图一般表明,较高的跑步速度和节奏值对应着增加的心率。

断开与设备的连接

使用完设备对象后,请清除这些对象。

清晰的