当前文档版本为 v1.2.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

Bluetooth: Peripheral FTM

1 功能概述

此项目演示了蓝牙从机的功能,该工程专门演示FTMS(Fitness Machine Service)GATT服务。

2 环境要求

  • board: 支持 BLE 的蓝牙设备

  • uart(option): 用来显示串口log

  • 测试软件: nRF Connect,华为运动健康,华为Fitness Tool

3 编译和烧录

例程位置:zephyr\samples_panchip\bluetooth\peripheral_ftm

使用 ZAL 工具可以对其进行编译、烧录、打开 VS Code 调试等操作。关于 ZAL 工具的详细介绍请参考:Zephyr APP Launcher 工具介绍

4 演示说明

  1. 烧录完成后,设备自动启动蓝牙广播,可以在手机或抓包工具上获取如下信息:

    • Service UUID: 0x1826

    • Device Name: PANCHIP_FTM

  2. 当手机或其它主设备与其建立连接后,串口log 会显示连接信息,如下:

    
    [10:51:26.784]Try to load HW calibration data.. DONE.
    - Chip Type         : 0x80
    - Chip CP Version   : None
    - Chip FT Version   : 7
    - Chip MAC Address  : D0000C06FB6E
    - Chip Flash UID    : 31373237304A23094330FFFFFFFFFFFF
    - Chip Flash Size   : 1024 KB
    *** Booting Zephyr OS version 2.7.0  ***
    *** llcontroller-v1.0.0-0d3e2c9f ***
    controller initializing....
    
    [10:51:26.830]tx power changed to 0 dBm
    
    [10:51:26.851]Bluetooth initialized
    Advertising successfully started
    [00:00:00.001,000] [1;33m<wrn> bt_hci_core: Failed to set device name (-12)
    [00:00:00.061,000] [0m<inf> bt_hci_core: Identity: D7:87:67:5F:29:25 (random)
    [00:00:00.061,000] [0m<inf> bt_hci_core: HCI: version 5.1 (0x0a) revision 0x0003, manufacturer 0x07d1
    [00:00:00.061,000] [0m<inf> bt_hci_core: LMP: version 5.1 (0x0a) subver 0x0000
    [00:00:00.064,000] [0m<inf> bt_adv: Start Advertising as D7:87:67:5F:29:25 (random)
    
  3. 通过nRF Connect App连接PANCHIP_FTM设备显示如下服务:

    image

    Peripheral FTMS 手机端 nRF Connect 界面

  4. 使用华为运动健康app连接PANCHIP_FTM设备后动态刷新SPEED,CADENCE相关数据:

    image

    Peripheral FTMS 华为Fitness Tool app界面

5 开发说明

5.1 FTMS GATT服务说明

  1. FTMP profile要求DIS服务和FTMS服务都需要实现,zephyr中已经默认集成好DIS服务,参考项目中的prj.conf文件.

CONFIG_BT_DIS=y
CONFIG_BT_DIS_PNP=n
CONFIG_BT_DIS_MODEL="Zephyr Model"
CONFIG_BT_DIS_MANUF="Zephyr"
CONFIG_BT_DIS_SERIAL_NUMBER=y
CONFIG_BT_DIS_FW_REV=y
CONFIG_BT_DIS_HW_REV=y
CONFIG_BT_DIS_SW_REV=y
CONFIG_BT_DIS_SERIAL_NUMBER_STR="Zephyr Serial"
CONFIG_BT_DIS_FW_REV_STR="Zephyr Firmware"
CONFIG_BT_DIS_HW_REV_STR="Zephyr Hardware"
CONFIG_BT_DIS_SW_REV_STR="Zephyr Software"
  1. FTMS服务实现

BT_GATT_SERVICE_DEFINE(ftm_svc,
               /*FTMS服务声明*/
		       BT_GATT_PRIMARY_SERVICE(BT_UUID_FTM),                            /*index:0*/

               /*FTMS feature:用于声明支持哪些上报数据类型,以及目标设定类型*/
		       BT_GATT_CHARACTERISTIC(BT_UUID_FTM_FEATURE, BT_GATT_CHRC_READ,   /*index:1-2*/
					      BT_GATT_PERM_READ, read_ftm_feature, NULL, NULL),

                /*FTMS 跑步机数据*/
		       BT_GATT_CHARACTERISTIC(BT_UUID_FTM_TREADMIL_DATA, BT_GATT_CHRC_NOTIFY,   /*index:3-4*/
					      0x00, NULL, NULL, NULL),
		       BT_GATT_CCC(treadmil_data_ccc_cfg_changed,                               /*index:5*/
				   BT_GATT_PERM_READ | BT_GATT_PERM_WRITE),

              /*FTMS 训练状态*/
		       BT_GATT_CHARACTERISTIC(BT_UUID_FTM_TRAINING_STATUS, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY,
					      BT_GATT_PERM_READ, read_training_status, NULL, NULL),     /*index:6-7*/
		       BT_GATT_CCC(training_status_ccc_cfg_changed,                                     /*index:8*/
				   BT_GATT_PERM_READ | BT_GATT_PERM_WRITE),

               /*FTMS 设备支持的速度范围*/
		       BT_GATT_CHARACTERISTIC(BT_UUID_FTM_SUPPORT_SPEED_RANGE, BT_GATT_CHRC_READ, /*index:9-10*/
					      BT_GATT_PERM_READ, read_speed_range, NULL, NULL),

               /*FTMS 设备支持的角度范围*/
		       BT_GATT_CHARACTERISTIC(BT_UUID_FTM_SUPPORT_INCLINATION_RANGE, BT_GATT_CHRC_READ, /*index:11-12*/
					      BT_GATT_PERM_READ, read_inclination_range, NULL, NULL),

               /*FTMS 设备支持的阻尼水平范围*/
		       BT_GATT_CHARACTERISTIC(BT_UUID_FTM_SUPPORT_RESISTANCE_LEVEL_RANGE, BT_GATT_CHRC_READ, /*index:13-14*/
					      BT_GATT_PERM_READ, read_resistance_level_range, NULL, NULL),

               /*FTMS 设备支持的心率范围*/
		       BT_GATT_CHARACTERISTIC(BT_UUID_FTM_SUPPORT_HEART_RATE_RANGE, BT_GATT_CHRC_READ, /*index:15-16*/
					      BT_GATT_PERM_READ, read_heart_rate_range, NULL, NULL),

               /*FTMS 设备支持的控制点(重要),主要用于写入控制设备的命令,比如获取控制权,启动,停止,暂停等*/
		       BT_GATT_CHARACTERISTIC(BT_UUID_FTM_CONTROL_POINT, /*index:17-18*/
					      BT_GATT_CHRC_WRITE | BT_GATT_CHRC_INDICATE,
					      BT_GATT_PERM_WRITE, NULL, write_ctrl_point,
					      NULL),
		       BT_GATT_CCC(ctrl_point_ccc_cfg_changed, /*index:19*/
				   BT_GATT_PERM_READ | BT_GATT_PERM_WRITE),

               /*FTMS 设备的状态,只支持notify,一般是用于机器设备被人为按钮类触发的改变状态或者事件上报,类似于中断或者事件的概念,比如机器上调整了运动的参数,用户通过机器按钮停止或者暂停,这时要主动通知app端*/
		       BT_GATT_CHARACTERISTIC(BT_UUID_FTM_STATUS, BT_GATT_CHRC_NOTIFY,  /*index:20-21*/
					      0x00, NULL, NULL, NULL),
		       BT_GATT_CCC(ftm_status_ccc_cfg_changed,                          /*index:22*/
				   BT_GATT_PERM_READ | BT_GATT_PERM_WRITE),
		       );

5.2 FTMS 测试说明

目前网上测试FTMS的app并不多,当然可以通过国外的zwift等真实运动健康app去测试,也是支持的。目前国内测试的app推荐使用华为的运动健康app以及fitness tool,下载链接见下方FTMS 开发参考以及资源说明

使用华为的app需要通过二维码扫描连接设备,我们可以生成自己的二维码。

二维码的参考连接: 设计及部署二维码和 NFC 标签

例如文中的链接是:https://url.cloud.huawei.com/1Lfn1eswP6?a=c&pid=xxxx&t=31&n=Huawei-xxxx&p=2&k=x1x2x3x4x5x6

我们的设备名称是PANCHIP_FTM,我们直接把链接改为https://url.cloud.huawei.com/1Lfn1eswP6?a=c&pid=xxxx&t=31&n=PANCHIP_FTM&p=2&k=x1x2x3x4x5x6,将n=Huawei-xxxx更换为n=PANCHIP_FTM

然后将链接贴入一个二维码生成网站生成即可,例如https://cli.im/

然后我们就可以使用华为健康运动app或者fitness tool扫描二维码连接蓝牙设备了,这两个app均是通过设备名称连接的。

注意:华为官方建议健康运动app测试版使用的时候不建议联网

当前的项目已提供对应的测试二维码,默认的二维码在当前项目下的qr_code.png文件中。

image

Peripheral FTMS 华为运动健康app界面

5.3 FTMS 开发参考以及资源说明

  1. 华为FTMS特征值交互过程

  2. 华为FTMS测试工具下载

5.4 FTMS 示例限制说明

目前当前示例仅用于GATT服务框架实现的通信流程正确,并不包含所有功能以及服务特性,用户需要根据自己的需求扩充例程的设备工作状态逻辑以及流程逻辑代码。

6 RAM/Flash资源使用情况

Memory region         Used Size  Region Size  %age Used
FLASH:       67512 B       384 KB     17.17%
SRAM:       25800 B        50 KB     50.39%