2.5. 详细时序图

2.5.1. 获取手环状态

!pragma teoz true
participant 网关 as G #cyan
box 手环 #LightBlue
participant BLE as B
end box

autonumber
hnote across: 连接 BLE
G -> B : <color #118888>CougarRequest.status</color>()
B -> G : <color #118888>CougarResponse.status</color>(\n\t<color purple>localTimestampInSecond</color>,\n\t<color purple>softwareVersion</color>,\n\t<color purple>hardwareVersion</color>,\n\t<color purple>lastHeartRateTime</color>,\n\t<color purple>lastAccTime</color>,\n\t<color purple>lastTemperatureTime</color>,\n\t<color purple>lastBeaconTime</color>,\n\t<color purple>lastStepTime</color>)

网关发送 CougarRequest.status() 可以获取手环的 时间戳,软件版本,硬件版本和上次获取数据的时间。

重要

如果手环重启,那么存储的数据不会丢失。

2.5.2. 设置手环

设置里包含多个设置项。这些设置项可以独立设置,也可以组合在一起一次设置。但是`擦除`需要单独一条命令。如果设置里包含`擦除`,那么其他设置会被忽略。

如果有多条设置项一起下发,手环是按下列顺序处理。一个设置项出错就会返回错误,剩余设置项会被跳过。

  • 新的时间戳(newTimestamp)

  • Beacon 扫描设置(beaconScanSettings)

  • 擦除(erase)

下面对每个设置项依次介绍:

2.5.2.1. 新的时间戳(newTimestamp)

!pragma teoz true
participant 网关 as G #cyan
box 手环 #LightBlue
participant BLE as B
end box

autonumber
hnote across: 连接 BLE
G -> B : <color #118888>CougarRequest.settings</color>(<color purple>newTimestamp</color>)
B -> G : <color #118888>CougarResponse.settings</color>(<color purple>errorCode</color>)

手环只关心以秒为单位的时间戳而非日期。初次上电或设置被删除之后,时间戳从0开始自增。每天网关需要用此命令同步手环的时间。

重要

  1. 因为更小的数字在传输时可以节约字节数,所以可以用最近的某个时间点(比如2025/01/01 00:00:00)作为初始时间。

  2. 手环会以每过2秒拨快(慢)1秒的速度慢慢更新到新时间,以防止记录的传感器数据的时间戳回退或大幅跳跃。

手环返回的 errorCode 范围和含义如下:

  • SettingErrorCode.SE_SUCCESS: 成功

2.5.2.2. Beacon 扫描设置(beaconScanSettings)

!pragma teoz true
participant 网关 as G #cyan
box 手环 #LightBlue
participant BLE as B
end box

autonumber
hnote across: 连接 BLE
G -> B : <color #118888>CougarRequest.settings.beaconScanSettings</color>(\n\t<color purple>bleInterval</color>, \n\t<color purple>bleWindow</color>, \n\t<color purple>bleDuration</color>, \n\t<color purple>beaconName</color>)
B -> G : <color #118888>CougarResponse.settings</color>(<color purple>errorCode</color>)

Beacon 扫描设置控制的是手环扫描Beacon的行为。总共包含五个参数,其中前三个是底层BLE的参数需要和Beacon的广播匹配,以便能尽快扫描到Beacon以节省电量。

  • bleInterval:手环会以这个周期开始持续扫描。数值合法范围是[4,16384],单位是625us

  • bleWindow: 一个 bleInterval 周期内 BLE 持续扫描的时间。数值合法范围是[4,16384],单位是625us,必须小于等于bleInterval。

  • bleDuration:一次BLE扫描的持续时间。数值合法范围是[1,6000],单位10ms。

  • beaconName:需要扫描的Beacon的名字。手环会记录所有以此命名的beacon的MAC。名字最长20字节,超过的话手环会解码失败,不会有任何response发送回去。

../_images/drawio-f33e7fca0477e2c3773b00d7cbee6b3a6973215e.png

几个扫描行为的参数的关系

手环返回的 errorCode 含义如下:

  • SettingErrorCode.SE_SUCCESS: 成功

  • SettingErrorCode.SE_INVALID_PARAMETER: 参数范围不合法。

2.5.2.3. 擦除(erase)

!pragma teoz true
participant 网关 as G #cyan
box 手环 #LightBlue
participant BLE as B
end box

autonumber
hnote across: 连接 BLE
G -> B : <color #118888>CougarRequest.settings</color>(<color purple>erase</color>)
B -> G : <color #118888>CougarResponse.settings</color>(<color purple>errorCode</color>)
note over B: 擦除

可以选择的擦除选项

  • 删除用户数据(EraseOptions.EO_PERSONAL)

  • 删除设置,然后重启(EraseOptions.EO_SETTINGS)

  • 删除用户数据和设置,然后重启(EraseOptions.EO_ALL)

  • 重启(EraseOptions.EO_REBOOT)

  • 格式化外置存储,包括设置和数据。然后重启(EraseOptions.EO_DEEP)

警告

  1. 手环回复response之后再执行擦除。擦除 设置 或者 全部 之后,手环会重启。状态回到初次上电。

  2. 擦除用户数据可能会需要数秒。

手环返回的 errorCode 含义如下:

  • SettingErrorCode.SE_SUCCESS: 成功

2.5.3. 获取传感器记录的数据

!pragma teoz true
participant 网关 as G #cyan
box 手环 #LightBlue
participant BLE as B
end box

autonumber
...
hnote across: 连接 BLE
G -> B : <color #118888>CougarRequest.report</color>(\n\t<color purple>startTimestamp</color>,\n\t<color purple>endTimestamp</color>,\n\t<color purple>reportType</color>)
G <- B : <color #118888>CougarResponse.report</color>(<color purple>index = 0</color>,<color purple>startTimestamp = x</color>, <color purple>data = [...]</color> )
G <- B : <color #118888>CougarResponse.report</color>(<color purple>index = 1</color>,<color purple>startTimestamp = x</color>,<color purple>data = [...]</color> )
... 连续发送 ...
G <- B : <color #118888>CougarResponse.report</color>(<color purple>index = n</color>,<color purple>startTimestamp = 0</color>,<color purple>data = [空]</color> )

Step 1 中网关必须填写 startTimestamp 和 endTimestamp 来指定获取哪个时间段的数据。

手环收到request后会准备数据。因为要发送的数据可能会超过MTU,所以数据会被拆分成N个包发送。网关收到的 CougarResponse.report 规则如下:

  1. index 从 0 开始,每发送一个包,index会增加1。

  2. data是被拆分的数据。如果网关收到了一个 data 的长度为0,则表明数据全部发送完毕,

  3. 不同传感器的 data 格式各不相同,里面包含若干个传感器数据单元。

  4. 一个传感器数据单元不会被拆分到两个 CougarResponse.report.data 里。

  5. CougarResponse.report.data 里第一个数据对应的时间是 CougarResponse.report.startTimestamp

  6. CougarResponse.report.data 里除第一个数据外的其他数据的对应时间都是按固定时间间隔推算。时间误差在30秒内。

2.5.3.1. 心率数据的格式

每一个有效的 CougarResponse.report.data 里面都是一个 uint8_t 的数组。每个心率值都是uint8_t。 每5个心率值是一组,每组之间的时间间隔是82秒。示例如下:

../_images/drawio-ab56d0237b1abb333aa9899d017383ea26bc502f.png

心率数据格式

2.5.3.2. 加速度数据的格式

加速度data里的格式是一个 uint16_t 的小端数组。每个数据时间间隔是1秒。单位是1/1024 g,即0.0095703125 m/s2。示例如下:

../_images/drawio-4e3d8a00864ce745b1193c6bc72411d5c06d1d2a.png

加速度数据格式

2.5.3.3. Beacon扫描数据的格式

Beacon data里的格式是一个 MAC+rssi 结构 的数组。 每3个MAC+rssi为一组,每组之间时间间隔是5秒。示例如下:

../_images/drawio-a4af304c4ddb6bb9e3b1de3878c0cc95fba9e6ad.png

Beacon数据格式

重要

如果当次扫描到的beacon数不足3个。那么会补0填充满3个MAC+rssi的大小。

2.5.3.4. 体温数据的格式

体温的格式同心率。只是心率数据换成体温既可。体温是一个字节的 int8_t。时间间隔41秒。

2.5.3.5. 步数数据的格式

步数的格式同心率。只是心率数据换成体温既可。步数是一个字节的 uint8_t。时间间隔是60秒。

2.5.4. 获取Log数据

!pragma teoz true
participant 网关 as G #cyan
box 手环 #LightBlue
participant BLE as B
end box

autonumber
...
hnote across: 连接 BLE
G -> B : <color #118888>CougarRequest.report</color>(\n\t<color purple>0</color>,\n\t<color purple>0</color>,\n\t<color purple>reportType=RT_LOG</color>)
G <- B : <color #118888>CougarResponse.report</color>(<color purple>index = 0</color>,<color purple>data = [...]</color> )
G <- B : <color #118888>CougarResponse.report</color>(<color purple>index = 1</color>,<color purple>data = [...]</color> )
... 连续发送 ...
G <- B : <color #118888>CougarResponse.report</color>(<color purple>index = n</color>,<color purple>data = [空]</color> )

获取Log的命令同获取传感器数据的命令。startTimestamp 和 endTimestamp 的值会被忽略,直接设置成0即可。

每次手环收到命令之后,会把从上次发送的Log之后产生的新Log全部发送出去。每次手环重启之后会找到最早的一条log作为Log的发送起始点。

重要

Log 数据不是可打印的数据,而是经过压缩编码之后的二进制数据。需要用特殊工具解析。