2025-07-15 15:57:16 +08:00
|
|
|
|
# NTK_NFY_Communication_Protocol
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 一.概述
|
|
|
|
|
|
|
|
|
|
NTK_NFY_Communication_Protocol © 2025 by JiangXiNaoTiaoKong is licensed under CC BY-NC-ND 4.0.
|
|
|
|
|
To view a copy of this license, visit [https://creativecommons.org/licenses/by-nc-nd/4.0/](https://creativecommons.org/licenses/by-nc-nd/4.0/)
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 二.目录
|
|
|
|
|
|
|
|
|
|
一.概述
|
|
|
|
|
二.目录
|
|
|
|
|
三.修改记录
|
|
|
|
|
四.基本数据格式
|
|
|
|
|
五.头戴设备功能码表
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 三.修改记录
|
|
|
|
|
|
|
|
|
|
* V0.2:2025.0530.0909 江鑫辉
|
|
|
|
|
1.数据格式增加设备ID
|
|
|
|
|
2.增加头戴设备部分功能码
|
|
|
|
|
* V0.3: 2025.0715.1556 江鑫辉
|
|
|
|
|
1.改写 markdown 格式
|
|
|
|
|
2.增加头戴设备部分功能码
|
2025-07-29 14:58:25 +08:00
|
|
|
|
* V0.4: 2025.0729.1457 江鑫辉
|
|
|
|
|
1.增加头戴设备功能控制指令
|
2025-08-20 13:23:46 +08:00
|
|
|
|
2.增加主机端0x8F,0x9C,0x9D功能码
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 四.基本数据格式
|
|
|
|
|
|
|
|
|
|
通信数据采用HEX编码,采用主从应答方式进行通信,头戴设备、平板、电视大屏为主端(客户端),电脑端软件为从端(服务器)响应客户端的服务请求。
|
|
|
|
|
|
|
|
|
|
### 4.1 数据包结构总览
|
|
|
|
|
|
|
|
|
|
| 起始位置 | 结束位置 | 名称/描述 | 类型 | 长度(字节) | 是否固定值 | 大小端 |
|
|
|
|
|
| --------- | --------------- | ----------- | -------------------- | ------------ | ---------- | -------- |
|
|
|
|
|
| 0 | 1 | 帧头 | uint8_t | 1 | 0x5A | \\ |
|
|
|
|
|
| 1 | 2 | 类型 | uint8_t | 1 | \\ | \\ |
|
|
|
|
|
| 2 | 3 | 设备ID | uint8_t | 1 | \\ | \\ |
|
|
|
|
|
| 3 | 4 | 功能码 | uint8_t | 1 | \\ | \\ |
|
|
|
|
|
| 4 | 6 | 数据长度 | uint16_t | 2 | \\ | 大端模式 |
|
|
|
|
|
| 6 | 8 | 保留位 | \\ | 3 | \\ | \\ |
|
2025-08-20 13:58:32 +08:00
|
|
|
|
| 8 | CRC_H = ( 8+N ) | 数据 | (非固定 常用int32_t) | N | \\ | 小端模式 |
|
|
|
|
|
| CRC_H | CRC_H + 2 | CRC16校验和 | uint16_t | 1 | \\ | 小端模式 |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
| CRC_H + 2 | CRC_H + 3 | 帧尾 | uint8_t | 1 | 0xA5 | \\ |
|
|
|
|
|
|
|
|
|
|
### 4.2 数据包各结构描述
|
|
|
|
|
|
|
|
|
|
#### 帧头
|
|
|
|
|
|
|
|
|
|
固定0x5A
|
|
|
|
|
|
|
|
|
|
#### 类型
|
|
|
|
|
|
|
|
|
|
类型00表示电脑端,01表示头戴设备,02表示平板,03表示电视大屏
|
|
|
|
|
|
|
|
|
|
#### 设备ID
|
|
|
|
|
|
|
|
|
|
当类型为01头戴设备时,用于区分设备。当头戴设备不知道设备ID时,使用0xff临时设备ID。
|
|
|
|
|
当类型为其他时无意义。
|
|
|
|
|
|
|
|
|
|
#### 功能码
|
|
|
|
|
|
|
|
|
|
功能码对应本条数据的类型,需要根据功能码来解析数据段。
|
|
|
|
|
|
|
|
|
|
#### 数据长度
|
|
|
|
|
|
|
|
|
|
数据长度字段的内容表示数据段的字节数量,大端模式。
|
|
|
|
|
|
|
|
|
|
#### 数据
|
|
|
|
|
|
|
|
|
|
数据段内容,具体格式根据功能码来定义,小端模式。
|
|
|
|
|
|
|
|
|
|
#### CRC校验和
|
|
|
|
|
|
|
|
|
|
从头开始到校验码前所有字节生成的CRC16,小端模式。
|
|
|
|
|
|
|
|
|
|
#### 帧尾
|
|
|
|
|
|
|
|
|
|
固定0xA5
|
|
|
|
|
|
|
|
|
|
### 4.3 数据包示例
|
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 01 FF 40 00 64 00 00 00 93 9E FF 3F 93 9E FF 3F 93 9E FF 3F 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 CE 1F A5
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
1. 帧头: 5A
|
|
|
|
|
2. 类型: 01
|
|
|
|
|
3. 设备ID: FF
|
|
|
|
|
4. 功能码: 40
|
|
|
|
|
对应脑电数据,int32_t类型
|
|
|
|
|
5. 数据长度: 00 64
|
2025-07-16 09:55:30 +08:00
|
|
|
|
大端模式,N = ( 0x00 << 8 | 0x64 ) == 0x0064 == 100
|
2025-07-15 15:57:16 +08:00
|
|
|
|
根据int32_t类型反推数据点个数: 100 / 4 = 25
|
|
|
|
|
6. 保留位:00 00 00
|
|
|
|
|
7. 数据段:
|
|
|
|
|
`93 9E FF 3F 93 9E FF 3F 93 9E FF 3F 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00 7F 4B 00 00`
|
|
|
|
|
取前16个字节为例
|
|
|
|
|
`93 9E FF 3F 93 9E FF 3F 93 9E FF 3F 7F 4B 00 00`
|
|
|
|
|
每4字节对应一个数据点
|
|
|
|
|
`93 9E FF 3F`
|
|
|
|
|
`93 9E FF 3F`
|
|
|
|
|
`93 9E FF 3F`
|
|
|
|
|
`7F 4B 00 00`
|
|
|
|
|
小端模式
|
|
|
|
|
Point1 = 0x3FFF9E93
|
|
|
|
|
Point2 = 0x3FFF9E93
|
|
|
|
|
Point3 = 0x3FFF9E93
|
|
|
|
|
Point4 = 0x00004B7F
|
|
|
|
|
8. CRC16校验: CE 1F
|
|
|
|
|
9. 数据段尾: 0xA5
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 五.电脑端功能码表
|
|
|
|
|
|
|
|
|
|
当连接建立后,电脑端向外发送数据时的功能码对应的功能
|
|
|
|
|
|
|
|
|
|
### 5.1 总览
|
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 5.1. 0x80~0x9f: 向头戴设备发送数据或指令
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-24 16:52:49 +08:00
|
|
|
|
| 功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
|
|
|
|
|
| ------ | ------------------------ | -------------- | -------------- | ---------------------------------------------------- |
|
|
|
|
|
| 0x80 | 一个表示正常的编码 | 0 | \\ | 直接被头戴设备丢弃 |
|
|
|
|
|
| 0x81 | 接收的信息出错 | 1 | uint8_t | 提示接收出现问题,不一定被处理 |
|
2025-08-26 17:35:27 +08:00
|
|
|
|
| 0x8C | 检测测试使用的指令 | 1 | uint8_t | 手册要求的一些指标的测试指令,如丢包率等测试 |
|
2025-08-24 16:52:49 +08:00
|
|
|
|
| 0x8D | 控制MCU软重启 | 0 | \\ | 控制MCU软重启 |
|
|
|
|
|
| 0x8E | 调试 | 0 | \\ | 仅用于开发调试 |
|
|
|
|
|
| 0x8F | 将MCU恢复出厂设置 | 0 | \\ | 此操作会清除 如心率拟合系数、保存的设备ID等 所有信息 |
|
|
|
|
|
| 0x90 | 启动配对流程 | 0 | \\ | 头戴设备接收此指令后清除设备ID等信息,并重新尝试配对 |
|
|
|
|
|
| 0x91 | 告知设备ID | 1 | uint8_t | 告知设备ID |
|
|
|
|
|
| 0x98 | 控制开启下位机功能 | 1 | uint16_t | 开启 FFT LPF HPF NOTCH 等功能 |
|
|
|
|
|
| 0x99 | 控制关闭下位机功能 | 1 | uint16_t | 关闭 FFT LPF HPF NOTCH 等功能 |
|
|
|
|
|
| 0x9A | 控制下位机灯光常量或闪烁 | 3 | uint8_t | 控制LED灯,可用于寻找设备 |
|
2025-08-26 17:35:27 +08:00
|
|
|
|
| 0x9B | 控制播放音频与音量 | 2 | uint8_t | 控制播放音频或调整音量 |
|
2025-08-24 16:52:49 +08:00
|
|
|
|
| 0x9C | 修改下位机心率拟合系数 | 9 | int32_t | 微调心率计算结果 |
|
|
|
|
|
| 0x9D | 告知治疗阶段与疾病类型 | 2 | uint8_t | 告知治疗阶段与疾病类型 |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
### 5.2 功能码详解
|
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 5.2. 0x80 一个表示正常的编码
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 80 00 00 00 00 00 crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
表示正常
|
|
|
|
|
暂时无用
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ----------- | -------- | ------ | ------------------ |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 5.2. 0x81 一个表示异常的编码
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 81 00 01 00 00 00 data1 crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
表示异常
|
|
|
|
|
仅起到提示作用
|
|
|
|
|
头戴设备收到此指令后,不一定会进行数据处理
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ------------ | -------- | ------ | -------------------------------------- |
|
|
|
|
|
| data1 | 表示异常类型 | uint8_t | 0x00 | 未定义的错误 |
|
|
|
|
|
| data1 | 表示异常类型 | uint8_t | 0x01 | 校验出错 |
|
|
|
|
|
| data1 | 表示异常类型 | uint8_t | 0x02 | 数值异常(检测出上传的参数超过阈值等) |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
#### 5.2.0x8C.检测测试使用的指令
|
|
|
|
|
|
|
|
|
|
描述:
|
|
|
|
|
手册要求的一些指标的测试指令,如丢包率等测试
|
|
|
|
|
|
|
|
|
|
数据帧结构示意:
|
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 8C 00 01 00 00 00 data1 crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ------------------ | -------- | ------ | ----------------------------------------------------------- |
|
|
|
|
|
| data1 | 需要测试的功能编号 | uint8_t | 0 | 暂未定义 |
|
|
|
|
|
| | | | 1 | 测试丢包率,下位机将回应100字节的数据包(0x3C功能码)进行测试 |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | \ | \ |
|
|
|
|
|
|
|
|
|
|
示例:
|
|
|
|
|
|
|
|
|
|
* 测试丢包率
|
|
|
|
|
`HEX: 5A 00 00 8C 00 01 00 00 00 01 AE E2 A5`
|
|
|
|
|
|
2025-08-20 18:15:51 +08:00
|
|
|
|
#### 5.2. 0x8D 控制MCU软重启
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-08-20 18:15:51 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 8D 00 00 00 00 00 8E 96 A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
控制MCU软重启
|
|
|
|
|
|
2025-08-20 13:58:32 +08:00
|
|
|
|
#### 5.2. 0x8E 调试
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-08-20 13:58:32 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 8E 00 00 00 00 00 BD 96 A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
此操作仅供开发使用 输出调试信息
|
|
|
|
|
|
2025-08-20 13:23:46 +08:00
|
|
|
|
#### 5.2. 0x8F 将MCU恢复出厂设置
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-08-20 13:23:46 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-08-20 18:15:51 +08:00
|
|
|
|
HEX: 5A 00 00 8F 00 00 00 00 00 6C 97 A5
|
2025-08-20 13:23:46 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
此操作会清除 如心率拟合系数、保存的设备ID等 所有信息
|
2025-08-20 18:15:51 +08:00
|
|
|
|
随后MCU会自动重启
|
2025-08-20 13:23:46 +08:00
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 5.2. 0x90 启动配对流程
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-08-25 00:48:11 +08:00
|
|
|
|
HEX: 5A 00 00 90 00 00 00 00 00 03 95 A5
|
2025-07-15 15:57:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
电脑端主动发起配对流程
|
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 5.2. 0x91 告知设备ID
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 91 00 01 00 00 00 data1 crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ------------ | -------- | ----------------------- | ------------------ |
|
|
|
|
|
| data1 | 表示异常类型 | uint8_t | 0x00~0x20(共32个编号) | 成功分配的设备ID号 |
|
|
|
|
|
| data1 | 表示异常类型 | uint8_t | 0xff | 设备未获得设备ID号 |
|
2025-08-20 13:58:32 +08:00
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-25 00:48:11 +08:00
|
|
|
|
PS `HEX: 5A 00 00 91 00 01 00 00 00 01 AF 2F A5`
|
|
|
|
|
|
2025-07-29 14:58:25 +08:00
|
|
|
|
#### 5.2. 0x98 控制开启下位机功能
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 98 00 02 00 00 00 data1_L data1_H crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ------------ | -------- | ------ | -------------------------- |
|
|
|
|
|
| data1 | 要开启的功能 | uint16_t | 见下表 | 见下表 对应位置1则代表开启 |
|
2025-08-20 13:58:32 +08:00
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
|
|
|
|
**data1参数值对应功能描述:**
|
|
|
|
|
|
2025-08-19 11:55:25 +08:00
|
|
|
|
| bit Num | 对应功能 | 参数值对应功能描述 |
|
|
|
|
|
| ---------- | -------------- | ------------------ |
|
|
|
|
|
| MSB ==> 15 | 暂无 | |
|
|
|
|
|
| 7~14 | 暂无 | |
|
2025-08-04 11:42:42 +08:00
|
|
|
|
| 6 | EMG 带通滤波器 | NOTCH |
|
|
|
|
|
| 5 | EMG 高通滤波器 | HPF |
|
|
|
|
|
| 4 | EMG 低通滤波器 | LPF |
|
|
|
|
|
| 3 | EEG 带通滤波器 | NOTCH |
|
|
|
|
|
| 2 | EEG 高通滤波器 | HPF |
|
|
|
|
|
| 1 | EEG 低通滤波器 | LPF |
|
2025-08-19 11:55:25 +08:00
|
|
|
|
| LSB ==> 0 | FFT 脑波分解 | |
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
|
|
|
|
#### 5.2. 0x99 控制关闭下位机功能
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 99 00 02 00 00 00 data1_L data1_H crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ------------ | -------- | --------------------- | ------------------- |
|
|
|
|
|
| data1 | 要关闭的功能 | uint16_t | 参考5.2. 0x98对应表格 | 对应位置1则代表关闭 |
|
2025-08-20 13:58:32 +08:00
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
2025-08-24 16:52:49 +08:00
|
|
|
|
#### 5.2. 0x9A 控制下位机灯光常量或闪烁
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-08-24 16:52:49 +08:00
|
|
|
|
HEX: 5A 00 00 9A 00 03 00 00 00 color keeptime gap crc16_L crc16_H A5
|
2025-07-29 14:58:25 +08:00
|
|
|
|
```
|
|
|
|
|
|
2025-08-24 16:52:49 +08:00
|
|
|
|
控制下位机灯光常量或闪烁
|
|
|
|
|
|
|
|
|
|
可以指定本次亮灯的时长
|
|
|
|
|
但是不保证一定亮灯达到指定的时长
|
|
|
|
|
下位机的LED灯会被新的亮灯事件(内部生成或外部控制)覆盖
|
|
|
|
|
|
2025-08-24 22:44:26 +08:00
|
|
|
|
LED闪烁时,LED灯固定亮1s
|
2025-08-24 16:52:49 +08:00
|
|
|
|
每次亮起的时间间隔为传入的`gap`
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ---------------- | -------- | --------- | --------------------------- |
|
|
|
|
|
| color | 控制灯光颜色 | uint8_t | 见下表 | 见下表 |
|
|
|
|
|
| keeptime | 灯光动作保持时间 | uint8_t | 0x00~0xFF | 这个动作最长持续时间,单位s |
|
|
|
|
|
| gap | 每次闪烁间隔 | uint8_t | 0x00 | 常亮模式 |
|
|
|
|
|
| gap | 每次闪烁间隔 | uint8_t | 0x01~0xFF | 每次闪烁的间隔时间,单位s |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | \ | |
|
|
|
|
|
|
|
|
|
|
**color参数值对应功能描述:**
|
|
|
|
|
|
|
|
|
|
| color 参数值 | 对应color |
|
|
|
|
|
| ------------ | -------------------------- |
|
|
|
|
|
| 0x07 | RED + GREEN + BLUE = WHITE |
|
|
|
|
|
| 0x06 | RED + GREEN = CYAN |
|
|
|
|
|
| 0x05 | RED + BLUE = YELLOW |
|
|
|
|
|
| 0x04 | RED |
|
|
|
|
|
| 0x03 | GREEN + BLUE = MAGENTA |
|
|
|
|
|
| 0x02 | GREEN |
|
|
|
|
|
| 0x01 | BLUE |
|
|
|
|
|
| 0x00 | BLACK |
|
|
|
|
|
|
|
|
|
|
##### 5.2. 0x9A 参数配置示例
|
|
|
|
|
|
|
|
|
|
1. * 设置灯光全部熄灭:
|
|
|
|
|
`HEX: 5A 00 00 9A 00 03 00 00 00 00 00 00 7C 5D A5`
|
|
|
|
|
2. * 设置蓝灯常亮10s
|
|
|
|
|
`HEX: 5A 00 00 9A 00 03 00 00 00 01 0A 00 1C 0A A5`
|
|
|
|
|
3. * 设置白灯常亮10s
|
|
|
|
|
`HEX: 5A 00 00 9A 00 03 00 00 00 07 0A 00 1D EA A5`
|
|
|
|
|
4. * 设置蓝灯闪烁20s 闪烁间隔为2s
|
|
|
|
|
`HEX: 5A 00 00 9A 00 03 00 00 00 01 14 02 7D 82 A5`
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
#### 5.2.0x9B.控制播放音频
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
##### 5.2.0x9B.数据帧结构
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 9B 00 02 00 00 00 audio_id volume crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | -------------- | -------- | --------- | ---------------------------------------------------- |
|
|
|
|
|
| audio_id | 播放音频的编号 | uint8_t | 0x00~0xFE | 对应的音频编号 参考`5.2.0x9D.治疗阶段/语音播报 编号表` |
|
|
|
|
|
| audio_id | 播放音频的编号 | uint8_t | 0xFF | 不播放音频仅设置音量 |
|
|
|
|
|
| volume | 设置音量 | uint8_t | 0x00~0x0F | 音量大小 0x00最小 0x0F最大 |
|
|
|
|
|
| volume | 设置音量 | uint8_t | 0xFF | 不设置音量仅播放音频 |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | xx | \\ |
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
2025-08-19 11:55:25 +08:00
|
|
|
|
#### 5.2. 0x9C 微调心率计算结果
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-08-19 11:55:25 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 9C 00 24 00 00 00 data1_LL data1_LH data1_HL data1_HH (data2_ * 4) (data3_ * 4) ... (data9_ * 4) crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
2025-08-19 12:00:47 +08:00
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ------------------ | ----------- | ------ | ----------------------------------------------------------------------------------------------------- |
|
|
|
|
|
| data_n | 对应下方公式的参数 | int32_t * 9 | \ | 接收到的9个数据会作为数组传入下方代码中的HR_fitting_update_parameters (int32 *HR_fitting_parameters); |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | xx | \\ |
|
2025-08-19 11:55:25 +08:00
|
|
|
|
|
|
|
|
|
```C
|
|
|
|
|
// ====== HR 三段拟合的9个参数 =======
|
|
|
|
|
// a与b需乘以0.000001保证小数点后6位
|
|
|
|
|
static int32_t HR_fitting_parameters_f1;
|
|
|
|
|
static float HR_fitting_parameters_a1;
|
|
|
|
|
static float HR_fitting_parameters_b1;
|
|
|
|
|
|
|
|
|
|
static int32_t HR_fitting_parameters_f2;
|
|
|
|
|
static float HR_fitting_parameters_a2;
|
|
|
|
|
static float HR_fitting_parameters_b2;
|
|
|
|
|
|
|
|
|
|
static int32_t HR_fitting_parameters_f3;
|
|
|
|
|
static float HR_fitting_parameters_a3;
|
|
|
|
|
static float HR_fitting_parameters_b3;
|
|
|
|
|
// ===== 更新 HR 三段拟合的9个参数 ========
|
|
|
|
|
static void
|
|
|
|
|
HR_fitting_update_parameters (int32 *HR_fitting_parameters)
|
|
|
|
|
{
|
|
|
|
|
HR_fitting_parameters_f1 = HR_fitting_parameters[0];
|
|
|
|
|
HR_fitting_parameters_a1 = HR_fitting_parameters[1] * 0.000001;
|
|
|
|
|
HR_fitting_parameters_b1 = HR_fitting_parameters[2] * 0.000001;
|
|
|
|
|
HR_fitting_parameters_f2 = HR_fitting_parameters[3];
|
|
|
|
|
HR_fitting_parameters_a2 = HR_fitting_parameters[4] * 0.000001;
|
|
|
|
|
HR_fitting_parameters_b2 = HR_fitting_parameters[5] * 0.000001;
|
|
|
|
|
HR_fitting_parameters_f3 = HR_fitting_parameters[6];
|
|
|
|
|
HR_fitting_parameters_a3 = HR_fitting_parameters[7] * 0.000001;
|
|
|
|
|
HR_fitting_parameters_b3 = HR_fitting_parameters[8] * 0.000001;
|
|
|
|
|
WriteParametersIntoFlash (); // 保存参数
|
|
|
|
|
};
|
|
|
|
|
// ===== HR 三段拟合 ========
|
|
|
|
|
static void
|
|
|
|
|
HR_fitting (uint16_t *inputHR_p, uint16_t *outputHR_p)
|
|
|
|
|
{
|
|
|
|
|
uint16_t HR_temp = *inputHR_p;
|
|
|
|
|
|
|
|
|
|
if (HR_temp < HR_fitting_parameters_f1)
|
|
|
|
|
{
|
|
|
|
|
*outputHR_p = (uint16_t)(HR_fitting_parameters_a1 * HR_temp
|
|
|
|
|
+ HR_fitting_parameters_b1);
|
|
|
|
|
}
|
|
|
|
|
else if (HR_temp < HR_fitting_parameters_f2)
|
|
|
|
|
{
|
|
|
|
|
*outputHR_p = (uint16_t)(HR_fitting_parameters_a2 * HR_temp
|
|
|
|
|
+ HR_fitting_parameters_b2);
|
|
|
|
|
}
|
|
|
|
|
else if (HR_temp < HR_fitting_parameters_f3)
|
|
|
|
|
{
|
|
|
|
|
*outputHR_p = (uint16_t)(HR_fitting_parameters_a3 * HR_temp
|
|
|
|
|
+ HR_fitting_parameters_b3);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
*outputHR_p = HR_temp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2025-08-24 16:52:49 +08:00
|
|
|
|
##### 5.2. 0x9C 参数配置示例
|
2025-08-20 00:58:33 +08:00
|
|
|
|
|
|
|
|
|
1. * 对BPM低于300的值不进行矫正
|
|
|
|
|
九个参数分别为
|
|
|
|
|
`300 1000000 0 0 0 0 0 0 0`
|
2025-08-24 16:52:49 +08:00
|
|
|
|
`HEX: 5A 00 00 9C 00 24 00 00 00 2C 01 00 00 40 42 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 71 A8 A5`
|
2025-08-20 00:59:50 +08:00
|
|
|
|
2. * 对所有BPM低于300的值进行校准, 使用公式 **outBPM(校正后BPM) = 0.95 * BPM(矫正前BMP) + 2**
|
2025-08-20 00:58:33 +08:00
|
|
|
|
九个参数分别为
|
|
|
|
|
`300 950000 2000000 0 0 0 0 0 0`
|
2025-08-24 16:52:49 +08:00
|
|
|
|
`HEX: 5A 00 00 9C 00 24 00 00 00 2C 01 00 00 f07e0e00 80841e00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 490e A5`
|
2025-08-20 00:59:50 +08:00
|
|
|
|
3. * 对所有BPM低于300的值进行校准, 使用公式 **outBPM(校正后BPM) = 1.099 * BPM(矫正前BMP) - 1.945**
|
2025-08-20 00:58:33 +08:00
|
|
|
|
九个参数分别为
|
|
|
|
|
`300 1099000 -1945000 0 0 0 0 0 0`
|
|
|
|
|
|
2025-08-20 00:59:50 +08:00
|
|
|
|
4. * 对所有BPM低于300的值进行校准, 使用公式 **outBPM(校正后BPM) = a1 * BPM(矫正前BMP) + b1**
|
2025-08-20 00:58:33 +08:00
|
|
|
|
九个参数分别为
|
|
|
|
|
`300 1000000*a1 1000000*b1 0 0 0 0 0 0`
|
|
|
|
|
|
2025-08-20 00:59:50 +08:00
|
|
|
|
5. * 对所有BPM低于150的值进行校准, 使用公式 **outBPM(校正后BPM) = 0.9 * BPM(矫正前BMP) + 1**
|
|
|
|
|
* 对所有BPM低于300的值进行校准, 使用公式 **outBPM(校正后BPM) = 0.8 * BPM(矫正前BMP) + 2**
|
2025-08-20 00:58:33 +08:00
|
|
|
|
九个参数分别为
|
|
|
|
|
`150 900000 1000000 300 800000 2000000 0 0 0`
|
|
|
|
|
|
2025-08-20 00:59:50 +08:00
|
|
|
|
6. * 对所有BPM低于100的值进行校准, 使用公式 **outBPM(校正后BPM) = 0.712456 * BPM(矫正前BMP) + 3.32211**
|
|
|
|
|
* 对所有BPM低于200的值进行校准, 使用公式 **outBPM(校正后BPM) = 0.6 * BPM(矫正前BMP) + 4**
|
|
|
|
|
* 对所有BPM低于300的值进行校准, 使用公式 **outBPM(校正后BPM) = 0.5 * BPM(矫正前BMP) + 5**
|
2025-08-20 00:58:33 +08:00
|
|
|
|
九个参数分别为
|
|
|
|
|
`100 712456 3322110 200 600000 4000000 300 500000 5000000`
|
|
|
|
|
|
2025-08-19 11:55:25 +08:00
|
|
|
|
```mermaid
|
|
|
|
|
flowchart TD
|
|
|
|
|
A[开始] --> B{更新矫正参数}
|
|
|
|
|
B --> C[从输入获取新参数]
|
|
|
|
|
C --> D[对a/b乘以0.000001转小数]
|
|
|
|
|
D --> E[保存到存储器]
|
|
|
|
|
E --> F[参数更新完成]
|
|
|
|
|
|
|
|
|
|
G[心率矫正] --> H{判断心率值}
|
|
|
|
|
H --> |心率 < f1| I[用第一段公式矫正:\n输出 = a1*心率 + b1]
|
|
|
|
|
H --> |f1 ≤ 心率 < f2| J[用第二段公式矫正:\n输出 = a2*心率 + b2]
|
|
|
|
|
H --> |f2 ≤ 心率 < f3| K[用第三段公式矫正:\n输出 = a3*心率 + b3]
|
|
|
|
|
H --> |心率 ≥ f3| L[直接输出原始心率]
|
|
|
|
|
L --> M[矫正结束]
|
|
|
|
|
```
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
#### 5.2.0x9D.告诉下位机当前治疗阶段与疾病类型
|
2025-08-19 11:55:25 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
描述:
|
|
|
|
|
下位机接收到此命令后,会触发对应编号的语音进行提示。
|
|
|
|
|
|
|
|
|
|
##### 5.2.0x9D.数据帧结构
|
2025-08-19 11:55:25 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 00 00 9D 00 02 00 00 00 TreatmentPhase DiseaseTypes crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------------- | -------------- | -------- | --------- | ------------------------------------------------ |
|
|
|
|
|
| TreatmentPhase | 治疗阶段的编号 | uint8_t | 0x00 | 待机阶段 用于停止基线采集 或 仅指定疾病类型 |
|
|
|
|
|
| TreatmentPhase | 治疗阶段的编号 | uint8_t | 0x01 | 前基线评估 开始记录各指标平均值 直到切换模式结束 |
|
|
|
|
|
| TreatmentPhase | 治疗阶段的编号 | uint8_t | 0x02 | 后基线评估 开始记录各指标平均值 直到切换模式结束 |
|
|
|
|
|
| DiseaseTypes | 疾病类型编号 | uint8_t | 0x00 | 不传输疾病类型 仅传输治疗阶段的编号 |
|
|
|
|
|
| DiseaseTypes | 疾病类型编号 | uint8_t | 0x01~0xFE | 疾病类型编号 |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | xx | \\ |
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
##### 5.2.0x9D.治疗阶段/语音播报 编号表
|
|
|
|
|
|
|
|
|
|
| | 编号 | | 语音 |
|
|
|
|
|
| ----------------------- | ---- | ------------------------------ | ---------------------------------------------------------- |
|
|
|
|
|
| 评估阶段 | 1 | 前基线评估 | 现在进行前基线评估,请放松身体,清空杂念,保持静坐 |
|
|
|
|
|
| | 2 | 后基线评估 | 现在进行后基线评估,请放松身体,清空杂念,保持静坐 |
|
|
|
|
|
| | 3 | 一般压力评估 | 现在进行一般压力评估,请注意大屏幕,保持静坐 |
|
|
|
|
|
| | 4 | 应激压力评估 | 现在进行应激压力评估,请注意大屏幕,保持静坐 |
|
|
|
|
|
| 治疗阶段 | 5 | 呼吸训练 | 现在进行呼吸训练,在呼吸时,尽量保持肩部、颈部、胸部放松哦 |
|
|
|
|
|
| | 6 | 松弛治疗 | 现在进行松弛治疗,请跟随指导语的提示进行放松 |
|
|
|
|
|
| | 7 | 暗示治疗 | 现在进行暗示治疗,请闭上双眼,继续跟随指导语的声音 |
|
|
|
|
|
| | 8 | 音乐治疗 | 现在进行音乐治疗,保持放松,倾听音乐的声音,倾听内心的声音 |
|
|
|
|
|
| 训练阶段 | 9 | 游戏 | 现在进入游戏训练环节 |
|
|
|
|
|
| | 10 | 音乐 | 现在进入音乐训练环节 |
|
|
|
|
|
| | 11 | 视频 | 现在进入视频训练环节 |
|
|
|
|
|
| | 12 | 团体合作+个人放松/专注(提示) | 调整到舒服的坐姿,放慢呼吸 |
|
|
|
|
|
| | 13 | 团队竞争(提示) | 要加油哦,调整呼吸,获得小组胜利 |
|
|
|
|
|
| 开始所有阶段之前 | 14 | 注意缺陷多动障碍 | 现在进行注意缺陷多动障碍治疗 |
|
|
|
|
|
| | 15 | 焦虑症 | 现在进行焦虑症治疗 |
|
|
|
|
|
| | 16 | 抑郁症 | 现在进行抑郁症治疗 |
|
|
|
|
|
| | 17 | 失眠症 | 现在进行失眠症治疗 |
|
|
|
|
|
| | 18 | 孤独症 | 现在进行孤独症治疗 |
|
|
|
|
|
| | 19 | 成瘾行为 | 现在进行成瘾行为治疗 |
|
|
|
|
|
| | 20 | 精神分裂症 | 现在进行精神分裂症康复期治疗 |
|
|
|
|
|
| 状态:治疗阶段/训练阶段 | 21 | 舒缓 | 做得很好,我们继续保持哦 |
|
|
|
|
|
| | 22 | 一般 | 状态不错,请继续保持 |
|
|
|
|
|
| | 23 | 焦虑 | 没关系,让我们慢慢调整哦,加油。 |
|
|
|
|
|
| | 24 | 检测到导联脱落 | 佩戴不正确,请调整 |
|
|
|
|
|
|
|
|
|
|
##### 5.2.0x9D.疾病类型编号
|
|
|
|
|
|
|
|
|
|
下位机暂无需要
|
2025-08-19 11:55:25 +08:00
|
|
|
|
|
2025-07-15 15:57:16 +08:00
|
|
|
|
## 六.头戴设备功能码表
|
|
|
|
|
|
2025-07-29 14:58:25 +08:00
|
|
|
|
当连接建立后,头戴设备向电脑发送数据时的功能码对应的功能
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
### 6.1 总览
|
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 6.1. 0x00~0x1f: 设备基本信息相关
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-07-29 14:58:25 +08:00
|
|
|
|
| 功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
|
|
|
|
|
| ------ | ---------------- | -------------- | -------------- | -------------- |
|
|
|
|
|
| 0x00 | 设备工作状态 | 1 | uint8_t | |
|
|
|
|
|
| 0x01 | 设备WIFI信号强度 | 1 | uint8_t | |
|
|
|
|
|
| 0x02 | 设备电池电量 | 1 | uint8_t | |
|
|
|
|
|
| 0x10 | 上传文字日志 | N | char * N | 上传一个字符串 |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 6.1. 0x20~0x3f: 与电脑端交互
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
| 功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
|
|
|
|
|
| ------ | ------------------------------- | -------------- | -------------- | --------------------------------------------- |
|
|
|
|
|
| 0x20 | 发送MAC地址与IP地址,申请设备ID | 10 | uint8_t | |
|
|
|
|
|
| 0x21 | 配对成功 | 0 | | 拿到设备ID后发送 |
|
|
|
|
|
| 0x3C | 发送一百字节测试丢包率功能 | 88 | uint8_t | 帧头+帧尾+88=100字节 内部数据为无意义的非零数 |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 6.1. 0x40~0x5f: 脑电数据的上传
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-24 16:52:49 +08:00
|
|
|
|
| 功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
|
|
|
|
|
| ------ | -------------------------------------------------------- | -------------- | -------------- | ---------------------------------------- |
|
|
|
|
|
| 0x40 | 发送脑电信号采集到的电压值 的 100倍 | N | int32_t | 接收到的数据缩小100倍后单位为uV |
|
|
|
|
|
| 0x41 | ~~发送 脑电信号采集到的值 换算为电压值的**系数的倒数**~~ | 1 | int32_t | ~~真实电压 = 原始值 * (1 / 系数的倒数)~~ |
|
|
|
|
|
| 0x42 | 分解出的5种脑波的值 | 5 | int32_t | 顺序:Delta,Theta,Alpha,Beta,Gamma。 |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 6.1. 0x60~0x7f:心率数据的上传
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-24 16:52:49 +08:00
|
|
|
|
| 功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
|
|
|
|
|
| ------ | ----------------------------------------------------- | -------------- | -------------- | ---- |
|
|
|
|
|
| 0x60 | 计算得出的每分钟心率值计算得出的每分钟心率值 的 100倍 | 1 | int16_t | |
|
|
|
|
|
| 0x61 | 心率波形 | N | int32_t | |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 6.1. 0x80~0x9f:肌电数据的上传
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-24 16:52:49 +08:00
|
|
|
|
| 功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
|
|
|
|
|
| ------ | -------------------------------------------------------- | -------------- | -------------- | ------------------------------------------------------------------------- |
|
|
|
|
|
| 0x80 | 发送肌电信号采集到的电压值 的 100倍 | N | int32_t | 接收到的数据缩小100倍后单位为uV |
|
|
|
|
|
| 0x81 | ~~发送 肌电信号采集到的值 换算为电压值的**系数的倒数**~~ | 1 | int32_t | ~~真实电压 = 原始值 * (1 / 系数的倒数); 此系数与0x41功能码的系数应一致;~~ |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
### 6.2 功能码详解
|
|
|
|
|
|
|
|
|
|
#### 6.2. 0x00 设备工作状态
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-07-16 09:55:30 +08:00
|
|
|
|
HEX: 5A 01 ID 00 00 01 00 00 00 data1 crc16_L crc16_H A5
|
2025-07-15 15:57:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
表示设备工作状态
|
|
|
|
|
仅起到提示作用
|
|
|
|
|
一般不会发送此指令
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ------------ | -------- | ------ | ------------------ |
|
2025-07-16 09:55:30 +08:00
|
|
|
|
| ID | 设备ID | uint8_t | | |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
| data1 | 表示异常类型 | uint8_t | 0x00 | 正常运行 |
|
|
|
|
|
| data1 | 表示异常类型 | uint8_t | other | 其他异常 |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
|
|
|
|
|
|
|
|
|
#### 6.2. 0x01 设备WIFI信号强度
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-07-16 09:55:30 +08:00
|
|
|
|
HEX: 5A 01 ID 01 00 01 00 00 00 data1 crc16_L crc16_H A5
|
2025-07-15 15:57:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
表示设备WIFI信号强度
|
|
|
|
|
不会主动发送此功能码
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ------------ | -------- | ------ | ------------------ |
|
2025-07-16 09:55:30 +08:00
|
|
|
|
| ID | 设备ID | uint8_t | | |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
| data1 | WIFI信号强度 | int8_t | | 单位dBm |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
|
|
|
|
|
|
|
|
|
#### 6.2. 0x02 设备电池电量
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-07-16 09:55:30 +08:00
|
|
|
|
HEX: 5A 01 ID 02 00 02 00 00 00 data1_L data1_H crc16_L crc16_H A5
|
2025-07-15 15:57:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
表示设备电池电量
|
|
|
|
|
定时主动发送此功能码
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ------------ | -------- | ------ | ------------------ |
|
2025-07-16 09:55:30 +08:00
|
|
|
|
| ID | 设备ID | uint8_t | | |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
| data1 | 设备电池电量 | int16_t | | 单位mV |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
|
|
|
|
|
2025-07-29 14:58:25 +08:00
|
|
|
|
#### 6.2. 0x10 上传文字日志
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-29 14:58:25 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 01 ID 10 00 N 00 00 00 char1 char2 ... charN crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
表示设备电池电量
|
|
|
|
|
定时主动发送此功能码
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| --------------------- | ---------- | -------- | ------ | ------------------ |
|
|
|
|
|
| ID | 设备ID | uint8_t | | |
|
|
|
|
|
| N | 字符串长度 | int16_t | | |
|
|
|
|
|
| char1 char2 ... charN | 字符串 | char | | |
|
|
|
|
|
|
2025-07-15 15:57:16 +08:00
|
|
|
|
#### 6.2. 0x20 发送MAC地址,申请设备ID
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-07-16 09:55:30 +08:00
|
|
|
|
HEX: 5A 01 ID 20 00 0A 00 00 00 MAC_AA MAC_BB MAC_CC MAC_DD MAC_EE MAC_FF IP_AA IP_BB IP_CC IP_DD crc16_L crc16_H A5
|
2025-07-15 15:57:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
发送MAC地址,申请设备ID
|
|
|
|
|
启动时发送 接收到上位机重新配对指令后发送
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| ----------------------------------------- | ------------- | ----------- | ------ | ------------------------------- |
|
|
|
|
|
| ID | 设备ID | uint8_t | | |
|
|
|
|
|
| MAC_AA MAC_BB MAC_CC MAC_DD MAC_EE MAC_FF | 设备的MAC地址 | 6 * uint8_t | | |
|
|
|
|
|
| IP_AA IP_BB IP_CC IP_DD | 设备的IP地址 | 4 * uint8_t | | 0xIP_AA.0xIP_BB.0xIP_CC.0xIP_DD |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
#### 6.2. 0x21 配对成功
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-07-16 09:55:30 +08:00
|
|
|
|
HEX: 5A 01 ID 21 00 00 00 00 00 crc16_L crc16_H A5
|
2025-07-15 15:57:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
2025-07-16 09:55:30 +08:00
|
|
|
|
拿到设备的IP地址后,响应配对成功
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ----------- | -------- | ------ | ------------------ |
|
2025-07-16 09:55:30 +08:00
|
|
|
|
| ID | 设备ID | uint8_t | | |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
示例:
|
|
|
|
|
|
|
|
|
|
`HEX: 5A 01 01 21 00 00 00 00 00 EE 5F A5`
|
|
|
|
|
|
|
|
|
|
#### 6.2.0x3C.发送一百字节测试丢包率功能
|
|
|
|
|
|
|
|
|
|
数据帧结构示意:
|
|
|
|
|
|
|
|
|
|
``` HEX
|
|
|
|
|
HEX: 5A 01 ID 3C 00 64 00 00 00 (uint8_t)*88 crc16_L crc16_H A5
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
当收到上位机的测试功能码后,发送100字节数据回应
|
|
|
|
|
|
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| ------------ | ------------------ | ------------ | ------ | ------------------ |
|
|
|
|
|
| ID | 设备ID | uint8_t | | |
|
|
|
|
|
| (uint8_t)*88 | 生成的88个非零数据 | 88 * uint8_t | | |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
|
|
|
|
|
|
|
|
|
示例:
|
|
|
|
|
|
|
|
|
|
```HEX
|
|
|
|
|
|
|
|
|
|
```
|
2025-08-25 00:35:12 +08:00
|
|
|
|
|
2025-07-15 15:57:16 +08:00
|
|
|
|
#### 6.2. 0x40 发送脑电信号采集到的原始值
|
|
|
|
|
|
|
|
|
|
参考 4.3 节
|
|
|
|
|
|
2025-08-24 22:44:26 +08:00
|
|
|
|
#### ~~6.3. 0x41 发送 脑电信号采集到的值 换算为电压值的系数的倒数~~
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-07-16 09:55:30 +08:00
|
|
|
|
HEX: 5A 01 ID 41 00 04 00 00 00 data1_LL data1_LH data1_HL data1_HH crc16_L crc16_H A5
|
2025-07-15 15:57:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
发送
|
2025-07-15 15:57:16 +08:00
|
|
|
|
实际值 = 脑电信号采集到的原始值 * (1/data1)
|
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ---------------------------------------------- | -------- | ------ | ------------------ |
|
|
|
|
|
| ID | 设备ID | uint8_t | | |
|
|
|
|
|
| data1 | ~~脑电信号采集到的值换算为电压值的系数的倒数~~ | int32_t | | |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-24 22:44:26 +08:00
|
|
|
|
#### 6.3. 0x44 发送分解出的8种脑波各自的占比
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-08-24 22:44:26 +08:00
|
|
|
|
HEX: 5A 01 ID 42 00 14 00 00 00 AA_L AA_H (uint16_t * 7) crc16_L crc16_H A5
|
2025-07-15 15:57:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
2025-08-24 22:44:26 +08:00
|
|
|
|
发送分解出的8种脑波各自的占比
|
|
|
|
|
数值原始值为 0 ~ 1 之间
|
|
|
|
|
为保留精度,下位机将原始值乘以 60000,转换成 uint16_t 类型,发送给至上位机
|
|
|
|
|
转化后的数值范围:0 ~ 60000
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| ------------------- | ---------------------------------------------------------------------- | ------------ | ------ | ------------------ |
|
|
|
|
|
| ID | 设备ID | uint8_t | | |
|
2025-08-24 22:44:26 +08:00
|
|
|
|
| AA + (uint16_t) * 7 | 顺序对应:Delta,Theta,Alpha,SMR,HighBeta,Beta,Gamma,还一个忘了。 | 8 * uint16_t | | |
|
2025-08-26 17:35:27 +08:00
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-24 16:52:49 +08:00
|
|
|
|
#### 6.3. 0x60 发送 计算得出的每分钟心率值 的 100倍
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-26 17:35:27 +08:00
|
|
|
|
数据帧结构示意:
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
``` HEX
|
2025-07-16 09:55:30 +08:00
|
|
|
|
HEX: 5A 01 ID 60 00 02 00 00 00 AA_L AA_H crc16_L crc16_H A5
|
2025-07-15 15:57:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
2025-08-24 16:52:49 +08:00
|
|
|
|
为保留两位小数,上传前下位机将数值放大了一百倍
|
|
|
|
|
上位机接收后需要缩小100倍
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-24 16:52:49 +08:00
|
|
|
|
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
|
|
|
|
|
| -------- | ------------------------------- | -------- | ------ | ------------------ |
|
|
|
|
|
| ID | 设备ID | uint8_t | | |
|
|
|
|
|
| AA | 计算得出的每分钟心率值 的 100倍 | uint16_t | | |
|
|
|
|
|
| crc16 | crc16校验值 | uint16_t | | |
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
|
|
|
|
#### 6.3. 0x61 发送 心率波形
|
|
|
|
|
|
|
|
|
|
参考 4.3 节 , 仅功能码不同
|
|
|
|
|
|
|
|
|
|
#### 6.3. 0x80 发送 肌电信号采集到的原始值
|
|
|
|
|
|
|
|
|
|
参考 4.3 节 , 仅功能码不同
|
|
|
|
|
|
|
|
|
|
#### 6.3. 0x81 发送 肌电信号采集到的原始值 换算为电压值的系数的倒数
|
|
|
|
|
|
|
|
|
|
参考 6.3. 0x41 发送 脑电信号采集到的值 换算为电压值的系数的倒数,仅功能码不同。
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 七.头戴设备与医生端通信各场景通信流程
|
|
|
|
|
|
2025-08-04 11:42:42 +08:00
|
|
|
|
### 7.1 TODO
|
2025-07-15 15:57:16 +08:00
|
|
|
|
|
2025-08-04 11:42:42 +08:00
|
|
|
|
--TODO
|
2025-08-19 11:55:25 +08:00
|
|
|
|
|
|
|
|
|
## 附录
|