16 KiB
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/
二.目录
一.概述 二.目录 三.修改记录 四.基本数据格式 五.头戴设备功能码表
三.修改记录
- V0.2:2025.0530.0909 江鑫辉 1.数据格式增加设备ID 2.增加头戴设备部分功能码
- V0.3: 2025.0715.1556 江鑫辉 1.改写 markdown 格式 2.增加头戴设备部分功能码
四.基本数据格式
通信数据采用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 | \ | \ |
8 | CRC_H = ( 8+N ) | 数据 | (非固定 常用int32_t) | N | \ | 小段模式 |
CRC_H | CRC_H + 2 | CRC16校验和 | uint16_t | 1 | \ | 小段模式 |
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: 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
- 帧头: 5A
- 类型: 01
- 设备ID: FF
- 功能码: 40 对应脑电数据,int32_t类型
- 数据长度: 00 64 大端模式,N = ( 0x00 << 8 | 0x64 ) == 0x0064 == 100 根据int32_t类型反推数据点个数: 100 / 4 = 25
- 保留位: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
取前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 - CRC16校验: CE 1F
- 数据段尾: 0xA5
五.电脑端功能码表
当连接建立后,电脑端向外发送数据时的功能码对应的功能
5.1 总览
5.1. 0x80~0x9f: 向头戴设备发送数据或指令
功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
---|---|---|---|---|
0x80 | 一个表示正常的编码 | 0 | \ | 直接被头戴设备丢弃 |
0x81 | 接收的信息出错 | 1 | uint8_t | 提示接收出现问题,不一定被处理 |
0x90 | 启动配对流程 | 0 | \ | 头戴设备接收此指令后清除设备ID等信息,并重新尝试配对 |
0x91 | 告知设备ID | 1 | uint8_t | 告知设备ID |
5.2 功能码详解
5.2. 0x80 一个表示正常的编码
数据帧示例:
HEX: 5A 00 00 80 00 00 00 00 00 crc16_L crc16_H A5
表示正常 暂时无用
参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
---|---|---|---|---|
crc16 | crc16校验值 | uint16_t |
5.2. 0x81 一个表示异常的编码
数据帧示例:
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 |
5.2. 0x90 启动配对流程
数据帧示例:
HEX: 5A 00 00 90 00 00 00 00 00 crc16_L crc16_H A5
电脑端主动发起配对流程
参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
---|---|---|---|---|
crc16 | crc16校验值 | uint16_t |
5.2. 0x91 告知设备ID
数据帧示例:
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号 |
crc16 | crc16校验值 | uint16_t | xx | \ |
六.头戴设备功能码表
当连接建立后,电脑端向外发送数据时的功能码对应的功能
6.1 总览
6.1. 0x00~0x1f: 设备基本信息相关
功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
---|---|---|---|---|
0x00 | 设备工作状态 | 1 | uint8_t | |
0x01 | 设备WIFI信号强度 | 1 | uint8_t | |
0x02 | 设备电池电量 | 1 | uint8_t |
6.1. 0x20~0x3f: 与电脑端交互
功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
---|---|---|---|---|
0x20 | 发送MAC地址与IP地址,申请设备ID | 10 | uint8_t | |
0x21 | 配对成功 | 0 | 拿到设备ID后发送 |
6.1. 0x40~0x5f: 脑电数据的上传
功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
---|---|---|---|---|
0x40 | 发送脑电信号采集到的原始值 | N | int32_t | |
0x41 | 发送 脑电信号采集到的值 换算为电压值的系数的倒数 | 1 | int32_t | 真实电压 = 原始值 * (1 / 系数的倒数) |
0x42 | 分解出的5种脑波的值 | 5 | int32_t | 顺序:Delta,Theta,Alpha,Beta,Gamma。 |
6.1. 0x60~0x7f:心率数据的上传
功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
---|---|---|---|---|
0x60 | 计算得出的每分钟心率值 | 1 | int16_t | |
0x61 | 心率波形 | N | int32_t |
6.1. 0x80~0x9f:肌电数据的上传
功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
---|---|---|---|---|
0x80 | 发送肌电信号采集到的原始值 | N | int32_t | |
0x81 | 发送 肌电信号采集到的值 换算为电压值的系数的倒数 | 1 | int32_t | 真实电压 = 原始值 * (1 / 系数的倒数); 此系数与0x41功能码的系数应一致; |
6.2 功能码详解
6.2. 0x00 设备工作状态
数据帧示例:
HEX: 5A 01 ID 00 00 01 00 00 00 data1 crc16_L crc16_H A5
表示设备工作状态 仅起到提示作用 一般不会发送此指令
参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
---|---|---|---|---|
ID | 设备ID | uint8_t | ||
data1 | 表示异常类型 | uint8_t | 0x00 | 正常运行 |
data1 | 表示异常类型 | uint8_t | other | 其他异常 |
crc16 | crc16校验值 | uint16_t |
6.2. 0x01 设备WIFI信号强度
数据帧示例:
HEX: 5A 01 ID 01 00 01 00 00 00 data1 crc16_L crc16_H A5
表示设备WIFI信号强度 不会主动发送此功能码
参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
---|---|---|---|---|
ID | 设备ID | uint8_t | ||
data1 | WIFI信号强度 | int8_t | 单位dBm | |
crc16 | crc16校验值 | uint16_t |
6.2. 0x02 设备电池电量
数据帧示例:
HEX: 5A 01 ID 02 00 02 00 00 00 data1_L data1_H crc16_L crc16_H A5
表示设备电池电量 定时主动发送此功能码
参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
---|---|---|---|---|
ID | 设备ID | uint8_t | ||
data1 | 设备电池电量 | int16_t | 单位mV | |
crc16 | crc16校验值 | uint16_t |
6.2. 0x20 发送MAC地址,申请设备ID
数据帧示例:
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
发送MAC地址,申请设备ID 启动时发送 接收到上位机重新配对指令后发送
参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
---|---|---|---|---|
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 |
6.2. 0x21 配对成功
数据帧示例:
HEX: 5A 01 ID 21 00 00 00 00 00 crc16_L crc16_H A5
拿到设备的IP地址后,响应配对成功
参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
---|---|---|---|---|
ID | 设备ID | uint8_t | ||
crc16 | crc16校验值 | uint16_t |
6.2. 0x40 发送脑电信号采集到的原始值
参考 4.3 节
6.3. 0x41 发送 脑电信号采集到的值 换算为电压值的系数的倒数
数据帧示例:
HEX: 5A 01 ID 41 00 04 00 00 00 data1_LL data1_LH data1_HL data1_HH crc16_L crc16_H A5
发送 实际值 = 脑电信号采集到的原始值 * (1/data1)
参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
---|---|---|---|---|
ID | 设备ID | uint8_t | ||
data1 | 脑电信号采集到的值换算为电压值的系数的倒数 | int32_t | ||
crc16 | crc16校验值 | uint16_t |
6.3. 0x44 发送分解出的5种脑波的值
数据帧示例:
HEX: 5A 01 ID 42 00 14 00 00 00 AA_LL AA_LH AA_HL AA_HH BB_LL BB_LH BB_HL BB_HH CC_LL CC_LH CC_HL CC_HH DD_LL DD_LH DD_HL DD_HH EE_LL EE_LH EE_HL EE_HH crc16_L crc16_H A5
发送分解出的5种脑波的值
参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
---|---|---|---|---|
ID | 设备ID | uint8_t | ||
AA BB CC DD EE | 顺序对应:Delta,Theta,Alpha,Beta,Gamma。 | 5 * int32_t | ||
crc16 | crc16校验值 | uint16_t |
6.3. 0x60 发送 计算得出的每分钟心率值
数据帧示例:
HEX: 5A 01 ID 60 00 02 00 00 00 AA_L AA_H crc16_L crc16_H A5
表示设备电池电量 定时主动发送此功能码
参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
---|---|---|---|---|
ID | 设备ID | uint8_t | ||
AA | 计算得出的每分钟心率值 | uint16_t | ||
crc16 | crc16校验值 | uint16_t |
6.3. 0x61 发送 心率波形
参考 4.3 节 , 仅功能码不同
6.3. 0x80 发送 肌电信号采集到的原始值
参考 4.3 节 , 仅功能码不同
6.3. 0x81 发送 肌电信号采集到的原始值 换算为电压值的系数的倒数
参考 6.3. 0x41 发送 脑电信号采集到的值 换算为电压值的系数的倒数,仅功能码不同。
七.头戴设备与医生端通信各场景通信流程
7.1
--TODO