草庐IT

运动健康南向设备接入服务传输数据解析举例

华为开发者论坛 2023-03-28 原文
随着穿戴设备的普及,运动数据的采集变的更加便捷,越来越多的运动健康类App步入人们的视野。对于日常运动数据的跟踪记录,成为形形色色运动类App的核心功能。

 

华为运动健康服务提供的南向服务-设备接入服务,可以帮助开发者实现运动数据的写入。开发者在开发过程中,需要在App中对设备回传的数据进行字段解析,还原成对应的参数,在App的用户界面进行展示。

 

 

那么运动设备返回的数据该如何解析呢?

 

首先我们要了解,华为运动健康提供的设备接入服务,是基于标准FTMS协议进行数据传输的,所谓FTMS - 健身器材服务是标准蓝牙协议针对运动健身中的训练数据传输做出的单独定义

 

从协议文档中我们可以了解到,标准的FMTS协议已经定义了运动状态(热身,低强度,高强度等),健身器材状态(开启,停滞等),以及支持的健身器材类型(跑步机,交叉训练器,阶梯攀登者,爬楼梯者,划艇者,室内自行车)

 

对于不同健身器材类型的支持情况,可以参考FTMS协议第三章

对于特定健身器材支持的具体参数,可以参考FTMS协议第四章

 

需要注意的是,在FTMS协议中,我们已经对字节顺序已经做了约定,FTMS协议中均采用小端序(little endian),即高的地址位存储的是低字节位数据。具体描述可以参考FTMS协议3.2章节

 

FMTS协议文档链接如下:
https://www.bluetooth.com/specifications/specs/fitness-machine-service-1-0/

 

好了,具备了上述基础,我们来举个例子

 

以划船机为例(Rower Data),我们收到划船机发来的一串数据,他代表什么含义呢

7e19002700d69c0000000061000000e4000d0000000024000000

 

我们先看下协议中的数据格式,数据可以分为两大段,第一段是Flags,第二段是参数

 

Flags字段解析

依据上图,我们看到数据是以2字节(16比特位)的Flags开头的,即7E19,这个16进制的表示转换成二进制,即为0111 1110 0001 1001

但是不要忘了,FTMS是小端序,即左边8位存储的其实是低比特位的数据,所以实际上的读取顺序应该是

 

依据文档,我们可以发现,这个Flags标识这段数据上报了以下字段的内容(需要参考FTMS协议中描述的字段含义)

 

比特位

定义

数据

意义

0

More Data

0

已上报,需解析

1

Average Stroke

1

已上报,需解析

2

Total Distance

1

已上报,需解析

3

Instantaneous Pace

1

已上报,需解析

4

Average Pace

1

已上报,需解析

5

Instantaneous Power

1

已上报,需解析

6

Average Power

1

已上报,需解析

7

Resistance Level

0

未上报,无需解析

8

Expended Energy

1

已上报,需解析

9

Heart Rate

0

未上报,无需解析

10

Metabolic Equivalent

0

未上报,无需解析

11

Elapsed Time

1

已上报,需解析

12

Remaining Time

1

已上报,需解析

13

保留

0

未上报,无需解析

14

保留

0

未上报,无需解析

15

保留

0

未上报,无需解析

  

此时此刻,我们再参考一下FTMS标准协议中4.8.1.1 Flags Field的描述,我们就可以知道这个Flag指示的后续字段包含的信息;

 

这里需要注意的是,每个比特位标识的参数个数并不相同,存在一个比特位对应多个参数的情况,本例中具体的比特位与参数的对应情况可参考下表

 

No.

比特位

参数

1

More Data

Stroke Rate

2

Stroke Count

3

Average Stroke

Average Stroke Rate

4

Total Distance

Total Distance

5

Instantaneous Pace

Instantaneous Pace

6

Average Pace

Average Pace

7

Instantaneous Power

Instantaneous Power

8

Average Power

Average Power

9

Resistance Level

Resistance Level

10

Expended Energy

Total Energy

11

Energy Per Hour

12

Energy Per Minute

13

Heart Rate

Heart Rate

14

Metabolic Equivalent

Metabolic Equivalent

15

Elapsed Time

Elapsed Time

16

Remaining Time

Remaining Time

 

 

综上,我们知道这条数据Flags段告诉我们,接下来的参数段,包含了以下13个参数:

Stroke Rate

Stroke Count

Average Stroke Rate

Total Distance

Instantaneous Pace

Average Pace

Instantaneous Power

Average Power

Total Energy

Energy Per Hour

Energy Per Minute

Elapsed Time

Remaining Time

 

接下来就可以开始具体参数的解析了

 

Parameter字段解析

 

参考指导文档中对各个参数的格式定义,我们可以将参数段的数据按照格式定义的长度进行划分,以匹配到各个参数,此例数据分割如下:

 

00-2700-d6-9c0000-0000-6100-0000-e400-0d00-0000-00-2400-0000

 

参数

格式

Stroke Rate

Uint8

Stroke Count

Uint16

Average Stroke Rate

Uint8

Total Distance

Uint24

Instantaneous Pace

Uint16

Average Pace

Uint16

Instantaneous Power

Sint16

Average Power

Sint16

Total Energy

Uint16

Energy Per Hour

Uint16

Energy Per Minute

Uint8

Elapsed Time

Uint16

Remaining Time

Uint16

 

我们将上述分割好的参数字节段转换成十进制,即可知晓每个参数的含义了。这里依然不要忘记FTMS的字节顺序,将各字段的16进制的数据转换为十进制时,依然要注意读取顺序。解析结果如下:

 

 

参数

格式

数据(HEX)

数据(OCT)

单位

Stroke Rate

Uint8

00

0

0.5 stroke/m

Stroke Count

Uint16

2700

47

Unitless

Average Stroke Rate

Uint8

D6

326

0.5 stroke/m

Total Distance

Uint24

9C0000

234

metre

Instantaneous Pace

Uint16

0000

0

Seconds(500m)

Average Pace

Uint16

6100

141

Seconds(500m)

Instantaneous Power

Sint16

0000

0

watt

Average Power

Sint16

E400

344

watt

Total Energy

Uint16

0D00

15

Unitless

Energy Per Hour

Uint16

0000

0

kcal

Energy Per Minute

Uint8

00

0

kcal

Elapsed Time

Uint16

2400

44

kcal

Remaining Time

Uint16

0000

0

Beats/m

 

至此,这样一条运动数据就解读完成了,我们可以看到,此用户在这次划船机运动中,共计划动了234米,消耗了15千卡的能量;另外我们还可以了解具体的划桨数,浆频,运动消耗的时间等数据。

 

通过这样一条条运动数据的传递及解读,我们可以记录跟踪用户的锻炼情况及日常运动情况,已帮助用户实现对自身健康和健身的管理需求。

 

更多设备的接入,请参考

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/rd-0000001050725868-V5?ha__source=hms1

 

欲了解HMS Core更多详情,请参阅:
>>华为开发者联盟官网

>>获取开发指导文档
>>参与开发者讨论请到CSDN社区或者Reddit社区
>>下载demo和示例代码请到Github或者Gitee
>>解决集成问题请到Stack Overflow

原文链接:https://developer.huawei.com/...
原作者:胡椒

有关运动健康南向设备接入服务传输数据解析举例的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  9. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  10. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

随机推荐