@zifeng328573112
2026-05-14T01:22:22.000000Z
字数 19057
阅读 160
所有指令均采用统一帧格式:
| 字段 | 偏移 | 长度 | 描述 |
|---|---|---|---|
| 帧头 | 0 | 2 | 固定值 0xAA55(大端序) |
| 协议版本 | 2 | 1 | 当前版本 0x01 |
| 帧序号 | 3 | 2 | 递增序列号(大端序,0x0000-0xFFFF) |
| 命令码 | 5 | 2 | 命令类型标识(大端序) |
| 数据长度 | 7 | 2 | Payload字节数(大端序,0-236字节) |
| 数据域 | 9 | 0-N | 命令参数 (小端序) |
| 校验码 | 9+N | 2 | CRC-16/CCITT(大端序) |
帧长度约束:
- 最小帧长度:11字节(无Payload)
- 最大帧长度:247字节(Payload最大236字节)
- 字节序:全部多字节字段采用大端序
- 数据域:小端序
加密模式:
加密数据域格式(模式2):
| 字段 | 长度 | 描述 |
|---|---|---|
| 加密会话密钥 | 256 | RSA-2048加密的AES-256密钥 |
| GCM认证标签 | 16 | AES-GCM认证标签 |
| 加密数据 | N | AES-256-GCM加密的实际数据 |
| GCM Nonce | 12 | GCM模式随机数(从帧序号派生) |
密钥管理:
- RSA密钥对: IPG出厂时预置,公钥可通过安全通道读取
- 会话密钥: 每次连接握手时协商生成,有效期30分钟
- 密钥派生: 使用HKDF-SHA256从主密钥派生会话密钥
- 密钥更新: 会话密钥每传输10000帧或30分钟后自动更新
安全约束:
- 刺激参数类指令(0x002x)必须使用加密模式1或2
- OTA升级类指令(0x005x)必须使用加密模式2
- 认证类指令(0x00xx)必须使用加密模式2
- 心跳、状态查询等非敏感指令可使用模式0
方向: 程控仪 → IPG
功能: 连接建立后由程控仪发起握手
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 程控仪型号 | 0 | 4 | uint32 | 程控仪型号标识 |
| App版本 | 4 | 4 | uint32 | App版本号 |
| 随机数 | 8 | 8 | bytes | 随机数Nonce_C |
Payload长度: 16字节
方向: IPG → 程控仪
功能: IPG收到握手请求后回复
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| IPG型号 | 0 | 4 | uint32 | IPG型号标识 |
| 固件版本 | 4 | 4 | uint32 | 固件版本号 |
| 随机数 | 8 | 8 | bytes | 随机数Nonce_P |
| 会话令牌 | 16 | 4 | uint32 | 会话令牌(有效期30分钟) |
Payload长度: 20字节
方向: 程控仪 → IPG
功能: 基于Challenge-Response机制的应用层身份认证
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 认证数据 | 0 | 16 | bytes | AES-128加密后的认证数据 |
Payload长度: 16字节
方向: IPG → 程控仪
功能: IPG回复认证结果
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 结果码 | 0 | 1 | uint8 | 0x00=认证成功,0x01=认证失败 |
Payload长度: 1字节
方向: 双向
功能: 连接保活心跳包,默认间隔5秒
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 时间戳 | 0 | 4 | uint32 | 当前时间戳 |
Payload长度: 4字节
说明: 超过3次心跳无响应应判定连接异常
方向: 程控仪 → IPG
功能: 请求IPG上报完整设备信息
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| (无数据域) | - | - | - | 此命令无Payload数据 |
Payload长度: 0字节
方向: IPG → 程控仪
功能: 响应0x0010命令,返回完整设备信息
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 制造商名称长度 | 0 | 1 | uint8 | 制造商名称字符串长度 |
| 制造商名称 | 1 | N1 | string | UTF-8编码,如"上海脑玑医疗科技有限公司" |
| 型号长度 | 1+N1 | 1 | uint8 | 型号字符串长度 |
| 型号 | 2+N1 | N2 | string | 如"SCS-IPG-X100" |
| 序列号长度 | 2+N1+N2 | 1 | uint8 | 序列号字符串长度 |
| 序列号 | 3+N1+N2 | N3 | string | 唯一序列号,如"2026042200001" |
| 固件版本长度 | 3+N1+N2+N3 | 1 | uint8 | 固件版本字符串长度 |
| 固件版本 | 4+N1+N2+N3 | N4 | string | 如"FW_v1.0.0" |
| 硬件版本长度 | 4+N1+N2+N3+N4 | 1 | uint8 | 硬件版本字符串长度 |
| 硬件版本 | 5+N1+N2+N3+N4 | N5 | string | 如"HW_v1.0" |
| 软件版本长度 | 5+N1+N2+N3+N4+N5 | 1 | uint8 | 软件版本字符串长度 |
| 软件版本 | 6+N1+N2+N3+N4+N5 | N6 | string | 嵌入式软件版本 |
| System ID | 6+N1+N2+N3+N4+N5+N6 | 8 | bytes | 系统标识符 |
Payload长度: 可变(典型值60-100字节)
方向: 程控仪 → IPG
功能: 请求IPG上报当前电池电量及健康状态
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| (无数据域) | - | - | - | 此命令无Payload数据 |
Payload长度: 0字节
方向: IPG → 程控仪
功能: 响应0x0011命令,返回电池状态
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 电池电量 | 0 | 1 | uint8 | 0-100 | 电池剩余电量百分比 |
| 电池状态 | 1 | 1 | uint8 | 见状态表 | 电池健康状态 |
| 电池电压 | 2 | 2 | uint16 | 0-5000 | 单位0.001 V,实际值=字段值×0.001 |
| 预计剩余时间 | 4 | 4 | uint32 | 0-876000 | 单位小时,0xFFFFFFFF=无法估算 |
| 充电次数 | 8 | 2 | uint16 | 0-65535 | 累计充电次数(若为可充电电池) |
| 保留 | 10 | 2 | - | 0x00 | 预留扩展 |
Payload长度: 12字节
电池状态标志:
- 0x00:正常
- 0x01:低电量警告(<20%)
- 0x02:极低电量(<10%)
- 0x03:电池老化
- 0x04:电池故障
- 0xFF:未知状态
方向: 程控仪 → IPG
功能: 设置目标刺激模式
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 模式码 | 0 | 1 | uint8 | 0x00=关闭,0x01=常规,0x02=Burst,0x03=高频 |
Payload长度: 1字节
方向: 程控仪 → IPG
功能: 下发常规(Tonic)模式刺激参数
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 单位 | 描述 |
|---|---|---|---|---|---|---|
| 频率 | 0 | 2 | uint16 | 2-1000 | 0.1 Hz | 实际值=字段值×0.1 |
| 分频 | 2 | 1 | uint8 | 1-20 | 1 | 程序组频率的1 ~ 20 分频 |
| 脉宽 | 3 | 2 | uint16 | 20-1000 | 10 µs | 默认 60µs |
| 幅值 | 5 | 2 | uint16 | 0-25500 | 0.01 mA | 默认 0mA |
| 相间间隔 | 7 | 2 | uint16 | 0-200 | 5 µs | 默认 60µs |
| 电极配置 | 9 | 4 | uint32 | bitmap | - | 高16位阳极,低16位阴极 |
| 斜坡时间 | 13 | 2 | uint16 | 0-10000 | 1 ms | 启停幅值渐变时间 |
| 刺激时长 | 15 | 4 | uint32 | 0-86400 | 1 s | 0=持续刺激 |
| 保留 | 19 | 4 | - | 0x00 | - | 必须全部填充0x00 |
Payload长度: 23字节
方向: 程控仪 → IPG
功能: 下发Burst模式刺激参数
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 单位 | 描述 |
|---|---|---|---|---|---|---|
| 簇内频率 | 0 | 2 | uint16 | 250-1000 | 10 Hz | 默认 500Hz |
| 簇间频率 | 2 | 2 | uint16 | 10-100 | 10 Hz | Burst重复频率(没有传 0x00) |
| 簇内脉冲数 | 4 | 1 | uint8 | 1-10 | 1 | 默认 5 |
| 频率 | 5 | 2 | uint16 | 10-60 | 10 | 默认 10 |
| 分频 | 7 | 1 | uint8 | 1-20 | 1 | 默认 1 |
| 脉宽 | 8 | 2 | uint16 | 20-1000 | 10 µs | 默认 130µs |
| 相间间隔 | 10 | 2 | uint16 | 0-200 | 5 µs | 默认 60µs |
| 幅值 | 12 | 2 | uint16 | 0-25500 | 0.01 mA | 恒流幅值 |
| 电极配置 | 14 | 4 | uint32 | bitmap | - | 高16位阳极,低16位阴极 |
| 斜坡时间 | 18 | 2 | uint16 | 0-10000 | 1 ms | 启停幅值渐变时间 |
| 刺激时长 | 20 | 4 | uint32 | 0-86400 | 1 s | 0=持续刺激 |
| 保留 | 24 | 1 | - | 0x00 | - | 必须为0x00 |
Payload长度: 25字节
方向: 程控仪 → IPG
功能: 下发高频(10 kHz)模式刺激参数
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 单位 | 描述 |
|---|---|---|---|---|---|---|
| 频率 | 0 | 2 | uint16 | 1500-10000 | 500 Hz | 高频刺激频率 默认 1500Hz |
| 脉宽 | 2 | 1 | uint8 | 30 | 30 µs | 窄脉冲宽度 |
| 幅值 | 3 | 2 | uint16 | 0-25500 | 0.01 mA | 最大25.5 mA |
| 电极配置 | 5 | 4 | uint32 | bitmap | - | 高16位阳极,低16位阴极 |
| 占空比 | 9 | 1 | uint8 | 10-100 | 1 % | 100%表示持续输出 |
| 周期时长 | 10 | 4 | uint32 | 1-86400 | 1 s | 单个占空比周期总时长 |
| 刺激时长 | 14 | 4 | uint32 | 0-86400 | 1 s | 0=持续刺激 |
| 保留 | 16 | 3 | - | 0x00 | - | 必须全部为0x00 |
Payload长度: 19字节
方向: 程控仪 → IPG
功能: 启动当前已配置模式的刺激输出
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 程序组编号 | 0 | 1 | uint8 | 1-8 | 待启动的程序组编号 |
Payload长度: 1字节
说明: IPG应先校验指定程序组的参数完整性后再执行
方向: IPG → 程控仪
功能: 响应0x0030命令,返回启动结果
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 结果码 | 0 | 1 | uint8 | 0x00=成功,其他=错误码 |
| 当前模式 | 1 | 1 | uint8 | 0x01=常规,0x02=Burst,0x03=高频 |
| 预计斜坡时间 | 2 | 2 | uint16 | 单位ms,斜坡上升预计时间 |
| 附加信息 | 4 | 4 | bytes | 保留,用于扩展信息 |
Payload长度: 8字节
方向: 程控仪 → IPG
功能: 正常停止刺激输出
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 程序组编号 | 0 | 1 | uint8 | 1-8 | 待停止的程序组编号 |
Payload长度: 1字节
说明: IPG按配置的斜坡时间逐步降低输出后停止
方向: IPG → 程控仪
功能: 响应0x0031命令,返回停止结果
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 结果码 | 0 | 1 | uint8 | 0x00=成功,其他=错误码 |
| 停止方式 | 1 | 1 | uint8 | 0x01=正常斜坡停止,0x02=紧急停止 |
| 预计斜坡时间 | 2 | 2 | uint16 | 单位ms,斜坡下降预计时间 |
| 累计刺激时长 | 4 | 4 | uint32 | 单位秒,本次刺激的总时长 |
Payload长度: 8字节
方向: 程控仪 → IPG
功能: 紧急立即停止全部刺激输出
Payload格式: 无
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 程序组编号 | 0 | 1 | uint8 | 1-8 或 0xFF | 待停止的程序组编号,0xFF表示停止所有程序组 |
Payload长度: 1字节
说明:
- 无斜坡过程,立即停止
- 此命令同时通过GATT特征0xFFF4冗余下发
- IPG须在50 ms内停止输出
- 最高优先级命令
- 程序组编号为0xFF时,停止所有正在运行的程序组
方向: IPG → 程控仪
功能: 响应0x0032命令,返回紧急停止结果
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 结果码 | 0 | 1 | uint8 | 0x00=成功 |
| 停止时间戳 | 1 | 4 | uint32 | 停止时的系统时间戳 |
| 停止前状态 | 5 | 1 | uint8 | 停止前的刺激状态 |
| 停止前幅值 | 6 | 2 | uint16 | 停止前的刺激幅值,单位0.01 mA |
Payload长度: 8字节
说明: 紧急停止响应为可选,IPG可不返回响应以确保最快停止速度
方向: 程控仪 → IPG
功能: 发起全阻抗测量,对所有已设置电极通道进行逐一阻抗检测
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 参考电极编号 | 0 | 1 | uint8 | 1-16 | 参考电极触点编号 |
| 测量幅度 | 1 | 2 | uint16 | 20/50/100/200 | 单位0.01 mA,对应0.2/0.5/1.0/2.0 mA |
| 保留 | 3 | 1 | - | 0x00 | 预留扩展 |
Payload长度: 4字节
说明:
- 测量脉宽:固定80 µs
- 测量频率:固定100 Hz
- 正常范围:100-10000 Ω
- <100 Ω提示"电极短路"
- >10000 Ω提示"电极故障"
方向: IPG → 程控仪
功能: 返回各通道阻抗值及状态标志
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 通道数量 | 0 | 1 | uint8 | 1-16 | 本次测量的通道总数 |
| 通道1电极编号 | 1 | 1 | uint8 | 1-16 | 第1个通道的触点编号 |
| 通道1阻抗值 | 2 | 4 | uint32 | 0-99999 | 单位1 Ω |
| 通道1状态 | 6 | 1 | uint8 | 见状态表 | 通道状态标志 |
| ... | ... | ... | ... | ... | 每个额外通道重复6字节 |
Payload长度: 1 + N×6 字节(N为通道数)
通道状态标志:
- 0x00:正常(100 Ω ≤ Z ≤ 10000 Ω)
- 0x01:电极短路(Z < 100 Ω)
- 0x02:电极故障/开路(Z > 10000 Ω)
- 0x03:测量超时
- 0xFF:测量失败(未知错误)
方向: 程控仪 → IPG
功能: 发起指定程序组的阻抗测量
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 程序组编号 | 0 | 1 | uint8 | 1-8 | 待测量的程序组编号 |
| 保留 | 1 | 1 | - | 0x00 | 预留扩展 |
Payload长度: 2字节
说明: 测量参数继承程序组中已设定的刺激参数
方向: IPG → 程控仪
功能: 返回程序组各电极阻抗值及状态标志
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 程序组编号 | 0 | 1 | uint8 | 1-8 | 被测量的程序组编号 |
| 测量幅度 | 1 | 2 | uint16 | - | 实际使用的测量幅度,单位0.01 mA |
| 测量脉宽 | 3 | 2 | uint16 | - | 实际使用的测量脉宽,单位µs |
| 测量频率 | 5 | 2 | uint16 | - | 实际使用的测量频率,单位0.1 Hz |
| 通道数量 | 7 | 1 | uint8 | 1-16 | 本次测量的通道总数 |
| 通道1电极编号 | 8 | 1 | uint8 | 1-16 | 第1个通道的触点编号 |
| 通道1阻抗值 | 9 | 4 | uint32 | 0-99999 | 单位1 Ω |
| 通道1状态 | 13 | 1 | uint8 | 见状态表 | 通道状态标志 |
| ... | ... | ... | ... | ... | 每个额外通道重复6字节 |
Payload长度: 8 + N×6 字节(N为通道数)
通道状态标志:
- 0x00:正常(100 Ω ≤ Z ≤ 10000 Ω)
- 0x01:电极短路(Z < 100 Ω)
- 0x02:电极故障/开路(Z > 10000 Ω)
- 0x03:测量超时
- 0xFF:测量失败(未知错误)
示例:
程序组3,使用幅度1.0 mA、脉宽200 µs、频率50 Hz,测量3个通道:
- E0: 1250 Ω,正常
- E1: 1180 Ω,正常
- E8: 1320 Ω,正常
Payload(十六进制):03 - 程序组编号300 64 - 测量幅度100(1.0 mA)00 C8 - 测量脉宽200 µs01 F4 - 测量频率500(50.0 Hz)03 - 通道数量301 00 00 04 E2 00 - E0: 1250 Ω, 正常02 00 00 04 9C 00 - E1: 1180 Ω, 正常09 00 00 05 28 00 - E8: 1320 Ω, 正常
方向: 程控仪 → IPG
功能: 请求IPG进入OTA升级模式
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 目标固件版本 | 0 | 4 | uint32 | 目标固件版本号 |
| 固件包总大小 | 4 | 4 | uint32 | 固件包总字节数 |
| SHA-256摘要 | 8 | 32 | bytes | 固件包SHA-256校验值 |
Payload长度: 40字节
方向: 程控仪 → IPG
功能: 传输OTA固件数据块
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 块序号 | 0 | 2 | uint16 | 数据块序号 |
| 块数据 | 2 | ≤234 | bytes | 固件数据 |
Payload长度: 2 + N 字节(N≤234)
方向: 程控仪 → IPG
功能: 全部数据块传输完成后,请求IPG执行完整性校验
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| (无数据域) | - | - | - | 此命令无Payload数据 |
Payload长度: 0字节
说明: IPG执行SHA-256比对,通过后切换固件分区
方向: IPG → 程控仪
功能: 响应0x0052命令,返回校验结果
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 结果码 | 0 | 1 | uint8 | 0x00=校验成功,其他=错误码 |
| 接收块总数 | 1 | 2 | uint16 | IPG实际接收的数据块总数 |
| 计算SHA-256 | 3 | 32 | bytes | IPG计算的固件包SHA-256值 |
| 固件大小 | 35 | 4 | uint32 | IPG接收的固件总字节数 |
| 预计重启时间 | 39 | 2 | uint16 | 单位秒,预计重启所需时间 |
Payload长度: 41字节
说明:
- 若结果码为0x00,IPG将在返回响应后执行固件切换和重启
- 若结果码为0x0501(校验失败),计算SHA-256字段包含IPG实际计算的值,供程控仪对比分析
- 重启后BLE连接将断开,程控仪需等待IPG重新广播并重新连接
方向: IPG → 程控仪
功能: OTA传输过程中,IPG主动上报传输进度
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 已接收块数 | 0 | 2 | uint16 | 已成功接收的数据块数量 |
| 总块数 | 2 | 2 | uint16 | 固件包总数据块数量 |
| 进度百分比 | 4 | 1 | uint8 | 0-100,传输进度百分比 |
| 最后接收块序号 | 5 | 2 | uint16 | 最后成功接收的块序号 |
| 传输速率 | 7 | 2 | uint16 | 单位字节/秒 |
Payload长度: 9字节
说明: IPG每接收16个块或每5秒主动发送一次进度通知
方向: 程控仪 → IPG
功能: 读回IPG当前生效的刺激参数
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| (无数据域) | - | - | - | 此命令无Payload数据 |
Payload长度: 0字节
说明: 用于程控仪侧参数比对验证
方向: IPG → 程控仪
功能: 响应0x0060命令,返回当前生效的刺激参数
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 当前模式 | 0 | 1 | uint8 | 0x00=关闭,0x01=常规,0x02=Burst,0x03=高频 |
| 参数有效标志 | 1 | 1 | uint8 | 0x00=无有效参数,0x01=有有效参数 |
| 参数数据 | 2 | 20 | bytes | 当前模式的完整参数(格式同0x0021/0x0022/0x0023) |
| 参数设置时间戳 | 22 | 4 | uint32 | 参数最后设置的时间戳 |
| 参数校验和 | 26 | 2 | uint16 | 参数数据的CRC-16校验值 |
Payload长度: 28字节
说明:
- 若当前模式为0x00(关闭)或参数有效标志为0x00,参数数据字段全部填充0x00
- 参数校验和仅针对参数数据字段(偏移2-21)计算
- 程控仪应将读回的参数与下发的参数逐字节比对,确保一致性
示例:
当前模式为常规模式,参数为:频率50.0 Hz,脉宽200 µs,幅值5.00 mA
Payload(十六进制):01 - 当前模式:常规01 - 参数有效标志:有效01 F4 00 C8 01 F4 - 频率、脉宽、幅值01 00 00 03 - 电极配置03 E8 - 斜坡时间00 00 00 00 - 刺激时长00 00 00 00 - 保留66 1A 2B 3C - 参数设置时间戳A5 7F - 参数校验和
方向: IPG → 程控仪
功能: IPG检测到刺激参数变更时主动通知程控仪
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 变更原因 | 0 | 1 | uint8 | 变更原因码 |
| 变更参数 | 1 | N | bytes | 变更的参数内容 |
说明: 如安全限幅触发时使用
方向: 程控仪 → IPG
功能: 读取历史刺激记录摘要
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 起始索引 | 0 | 2 | uint16 | 0-65535 | 请求的起始记录索引 |
| 请求条数 | 2 | 1 | uint8 | 1-20 | 请求返回的记录条数 |
| 保留 | 3 | 1 | - | 0x00 | 预留扩展 |
Payload长度: 4字节
方向: IPG → 程控仪
功能: 返回历史刺激记录
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 总记录数 | 0 | 2 | uint16 | IPG存储的历史记录总数 |
| 返回记录数 | 2 | 1 | uint8 | 本次返回的记录条数 |
| 记录1-时间戳 | 3 | 4 | uint32 | 刺激开始时间戳 |
| 记录1-模式 | 7 | 1 | uint8 | 刺激模式 |
| 记录1-持续时长 | 8 | 4 | uint32 | 单位秒 |
| 记录1-平均幅值 | 12 | 2 | uint16 | 单位0.01 mA |
| 记录1-停止原因 | 14 | 1 | uint8 | 0x01=正常停止,0x02=紧急停止,0x03=异常断连 |
| ... | ... | ... | ... | 每条额外记录重复12字节 |
Payload长度: 3 + N×12 字节(N为返回记录数)
方向: 程控仪 → IPG
功能: 启动生理信号采集
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 采集通道 | 0 | 1 | uint8 | 1-8 | 采集通道编号 |
| 采样率 | 1 | 2 | uint16 | 100-10000 | 单位Hz,采样频率 |
| 采集时长 | 3 | 2 | uint16 | 1-3600 | 单位秒,0=持续采集 |
| 增益 | 5 | 1 | uint8 | 1/2/4/8 | 信号放大增益倍数 |
| 滤波模式 | 6 | 1 | uint8 | 见模式表 | 滤波器配置 |
| 保留 | 7 | 1 | - | 0x00 | 预留扩展 |
Payload长度: 8字节
滤波模式:
- 0x00:无滤波
- 0x01:50Hz陷波(工频滤波)
- 0x02:60Hz陷波
- 0x03:带通滤波(0.5-100Hz)
- 0x04:高通滤波(>0.5Hz)
方向: IPG → 程控仪
功能: 返回采集的生理信号数据
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 采集通道 | 0 | 1 | uint8 | 采集通道编号 |
| 时间戳 | 1 | 4 | uint32 | 数据包时间戳 |
| 采样率 | 5 | 2 | uint16 | 实际采样率,单位Hz |
| 数据点数 | 7 | 1 | uint8 | 本包包含的数据点数量(1-50) |
| 数据1 | 8 | 2 | int16 | 第1个采样点,单位µV |
| 数据2 | 10 | 2 | int16 | 第2个采样点,单位µV |
| ... | ... | ... | ... | 每个额外数据点2字节 |
Payload长度: 8 + N×2 字节(N为数据点数,最大108字节)
说明:
- IPG按配置的采样率持续采集并分包上报
- 每包最多包含50个数据点
- 数据为有符号16位整数,范围-32768至+32767 µV
- 程控仪需根据时间戳重建完整信号序列
方向: 程控仪 → IPG
功能: 停止正在进行的信号采集
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 采集通道 | 0 | 1 | uint8 | 1-8 或 0xFF | 待停止的采集通道编号,0xFF表示停止所有通道 |
Payload长度: 1字节
说明:
- 采集通道为0xFF时,停止所有正在运行的采集通道
- IPG收到命令后立即停止数据采集和上报
方向: 程控仪 → IPG
功能: 下发完整的定时治疗方案配置(1-16个方案)
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 方案总数 | 0 | 1 | uint8 | 1-16 | 本次下发的治疗方案数量 |
| 方案1-程序组编号 | 1 | 1 | uint8 | 1-16 | 绑定的刺激程序组编号 |
| 方案1-开启时刻 | 2 | 1 | uint8 | 0-47 | ON时刻,单位0.5小时 |
| 方案1-停止时刻 | 3 | 1 | uint8 | 1-48 | OFF时刻,单位0.5小时 |
| 方案1-保留 | 4 | 1 | - | 0x00 | 预留扩展 |
| ... | ... | ... | ... | ... | 每个额外方案重复4字节 |
Payload长度: 1 + N×4 字节(N为方案数,最大33字节)
说明:
- 时刻编码:0=0:00,1=0:30,47=23:30,48=24:00
- 开启时刻须在停止时刻之前
- 各方案时间段不得重叠
方向: 程控仪 → IPG
功能: 读取IPG当前存储的定时治疗方案
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| (无数据域) | - | - | - | 此命令无Payload数据 |
Payload长度: 0字节
方向: IPG → 程控仪
功能: 返回当前定时治疗方案配置
Payload格式: 与0x0070相同
方向: 程控仪 → IPG
功能: 使能或禁用定时治疗功能
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 使能标志 | 0 | 1 | uint8 | 0x00/0x01 | 0x00=禁用,0x01=使能 |
| 保留 | 1 | 1 | - | 0x00 | 预留扩展 |
Payload长度: 2字节
说明: 定时治疗与持续性治疗互斥,定时治疗优先级更高
方向: IPG → 程控仪
功能: IPG主动通知当前定时治疗执行状态
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 范围 | 描述 |
|---|---|---|---|---|---|
| 当前执行方案编号 | 0 | 1 | uint8 | 0-8 | 0表示无方案执行中 |
| 执行状态 | 1 | 1 | uint8 | 见状态表 | 当前方案执行状态 |
| 当前程序组编号 | 2 | 1 | uint8 | 1-8 | 当前执行的程序组编号 |
| 剩余时间 | 3 | 2 | uint16 | 0-1440 | 单位分钟 |
| 定时治疗总使能状态 | 5 | 1 | uint8 | 0x00/0x01 | 功能整体使能状态 |
Payload长度: 6字节
执行状态标志:
- 0x00:空闲/等待下一个方案
- 0x01:方案执行中(刺激输出中)
- 0x02:方案斜坡上升中
- 0x03:方案斜坡下降中
- 0x04:方案已完成,切换中
- 0x05:定时治疗已禁用
- 0x10:错误-绑定的程序组无效
- 0x11:错误-方案时间冲突
Service UUID: 0xFFF0(128位:0000FFF0-0000-1000-8000-00805F9B34FB)
| 特征名称 | UUID | 属性 | 长度 | 描述 |
|---|---|---|---|---|
| 刺激模式选择 | 0xFFF1 | Write | 1 | 设置刺激模式:0x01=常规,0x02=Burst,0x03=高频,0x00=关闭 |
| 刺激参数写入 | 0xFFF2 | Write | ≤20 | 写入当前模式的刺激参数 |
| 刺激状态通知 | 0xFFF3 | Notify | 4 | IPG主动上报刺激状态变化 |
| 即时停止 | 0xFFF4 | Write Without Response | 1 | 紧急停止刺激输出(写入0x01) |
刺激状态通知格式(0xFFF3):
- Byte 0:状态码(0x00=空闲,0x01=刺激中,0x02=斜坡上升,0x03=斜坡下降,0xFF=故障)
- Byte 1-3:附加信息
Service UUID: 0x180A(Bluetooth SIG标准服务)
| 特征名称 | UUID | 属性 | 长度 | 描述 |
|---|---|---|---|---|
| Manufacturer Name String | 0x2A29 | Read | ≤20 | 制造商名称(UTF-8) |
| Model Number String | 0x2A24 | Read | ≤20 | IPG型号 |
| Serial Number String | 0x2A25 | Read | ≤20 | IPG唯一序列号 |
| Firmware Revision String | 0x2A26 | Read | ≤20 | 固件版本号 |
| Hardware Revision String | 0x2A27 | Read | ≤20 | 硬件版本号 |
| Software Revision String | 0x2A28 | Read | ≤20 | 嵌入式软件版本号 |
| System ID | 0x2A23 | Read | 8 | 系统标识符 |
| IEEE 11073-20601 Regulatory Cert Data List | 0x2A2A | Read | ≤32 | IEEE监管认证数据 |
Service UUID: 0x180F(Bluetooth SIG标准服务)
| 特征名称 | UUID | 属性 | 长度 | 描述 |
|---|---|---|---|---|
| Battery Level | 0x2A19 | Read / Notify | 1 | 电池剩余电量百分比(0-100%) |
说明:
- 电量<20%时主动Notification告警
- 电量<10%时上报紧急低电量状态
Service UUID: 0xFFE0(128位:0000FFE0-0000-1000-8000-00805F9B34FB)
| 特征名称 | UUID | 属性 | 长度 | 描述 |
|---|---|---|---|---|
| OTA Control Point | 0xFFE1 | Write / Indicate | ≤20 | OTA控制点 |
| OTA Data | 0xFFE2 | Write Without Response | ≤244 | OTA固件数据传输通道 |
| OTA Version | 0xFFE3 | Read | ≤20 | 读取当前固件版本号及OTA协议版本号 |
Service UUID: 0xFFD0(128位:0000FFD0-0000-1000-8000-00805F9B34FB)
| 特征名称 | UUID | 属性 | 长度 | 描述 |
|---|---|---|---|---|
| 阻抗数据 | 0xFFD1 | Read / Notify | ≤64 | 各电极通道的阻抗测量值 |
| 刺激日志 | 0xFFD2 | Read | ≤200 | 历史刺激记录(TLV格式) |
| 事件日志 | 0xFFD3 | Notify | ≤20 | 实时事件通知 |
事件日志格式(0xFFD3):
- 事件码:2字节
- 时间戳:4字节
- 附加数据:可变长度
| 错误码 | 错误名称 | 严重等级 | 描述 |
|---|---|---|---|
| 0x0101 | CRC校验失败 | 中 | 接收帧的CRC-16/CCITT校验不通过 |
| 0x0102 | 帧序号不连续 | 低 | 接收到的帧序号与预期不一致 |
| 0x0103 | 帧长度异常 | 中 | 帧实际长度与Data Length字段不一致 |
| 0x0104 | 协议版本不匹配 | 高 | 帧头中的协议版本号与IPG不兼容 |
| 0x0105 | 命令码未定义 | 中 | 接收到的命令码不在已定义的命令码表中 |
| 0x0106 | MTU超限/命令过频 | 中 | 报文长度超出MTU或命令间隔<50 ms |
| 0x0107 | 响应超时 | 高 | 程控仪在3000 ms内未收到IPG响应 |
| 错误码 | 错误名称 | 严重等级 | 描述 |
|---|---|---|---|
| 0x0201 | 认证失败 | 高 | Challenge-Response认证不通过 |
| 0x0202 | 会话已过期 | 中 | 会话令牌已超时失效(默认30分钟) |
| 0x0203 | 设备未配对 | 高 | IPG未与当前程控仪建立有效的LESC配对关系 |
| 错误码 | 错误名称 | 严重等级 | 描述 |
|---|---|---|---|
| 0x0301 | 频率超出范围 | 高 | 刺激频率字段值超出当前模式允许的范围 |
| 0x0302 | 脉宽超出范围 | 高 | 脉冲宽度字段值超出当前模式允许的范围 |
| 0x0303 | 幅值超出范围 | 高 | 刺激幅值超出范围或单步增量超过0.50 mA |
| 0x0304 | 电极配置无效 | 高 | 电极bitmap无阳极或无阴极,或阳极阴极位重叠 |
| 0x0305 | 电荷密度超限 | 极高 | 每相电荷密度超过30 µC/cm²安全阈值 |
| 0x0306 | 参数组合不兼容 | 高 | 多个参数之间存在逻辑冲突 |
| 0x0307 | 斜坡时间无效 | 中 | 斜坡时间超出范围或超过刺激时长的一半 |
| 0x0308 | 保留字段非零 | 低 | 保留字段中存在非零字节 |
| 错误码 | 错误名称 | 严重等级 | 描述 |
|---|---|---|---|
| 0x0401 | IPG电池电量不足 | 高 | 电池电量低于10%,无法保障安全刺激输出 |
| 0x0402 | 电极阻抗异常 | 高 | 阻抗测量值超出200-5000 Ω有效范围 |
| 0x0403 | IPG温度过高 | 极高 | IPG内部温度超过安全阈值(41°C) |
| 0x0404 | 刺激输出过流 | 极高 | 刺激输出电流超过硬件安全限值 |
| 0x0405 | 存储空间不足 | 中 | IPG内部Flash存储空间不足 |
| 错误码 | 错误名称 | 严重等级 | 描述 |
|---|---|---|---|
| 0x0501 | 固件包校验失败 | 高 | OTA传输完成后SHA-256校验不通过 |
| 0x0502 | 固件版本不兼容 | 高 | 目标固件版本与当前硬件版本不兼容 |
| 0x0503 | OTA传输中断 | 中 | OTA数据传输过程中连接中断或超时 |
| 编号 | 约束规则 | 计算公式/限值 | 违反错误码 |
|---|---|---|---|
| C-01 | 每相电荷密度限制 | Q/A = (Amplitude × Pulse Width) / 电极面积 ≤ 30 µC/cm² | 0x0305 |
| C-02 | 每相电荷限制 | Q = Amplitude(mA) × Pulse Width(µs) × 10⁻³ ≤ 最大允许电荷 | 0x0305 |
| C-03 | 幅值单步增量限制 | 相邻两次幅值写入的差值 ≤ 0.50 mA | 0x0303 |
| C-04 | 电极阻抗有效范围 | 200-5000 Ω | 0x0402 |
| C-05 | 命令最小间隔 | 相邻两条参数写入命令间隔 ≥ 50 ms | 0x0106 |
| C-06 | 电极配置有效性 | 至少1位阳极和1位阴极置位;阳极与阴极不得重叠 | 0x0304 |
| C-07 | 保留字段校验 | 所有保留字段必须为 0x00 | 0x0308 |
| C-08 | 高频模式幅值上限 | 高频模式下幅值 ≤ 100.00 mA | 0x0303 |
| C-09 | 斜坡时间约束 | 斜坡时间 ≤ 刺激时长 × 0.5 | 0x0307 |
| C-10 | 参数组合兼容性 | Burst模式:簇内频率 > 簇间频率 × 簇内脉冲数 | 0x0306 |
| 参数 | 常规模式 | Burst模式 | 高频模式 | 步进 |
|---|---|---|---|---|
| 频率 | 0.2-120.0 Hz | 簇内:20.0-100.0 Hz 簇间:1.0-10.0 Hz |
1000-10000 Hz | 常规/Burst:0.1 Hz 高频:1 Hz |
| 脉宽 | 20-500 µs | 20-500 µs | 10-100 µs | 1 µs |
| 幅值 | 0-255.00 mA | 0-255.00 mA | 0-100.00 mA | 0.01 mA |
| 斜坡时间 | 0-10000 ms | 0-10000 ms | 不适用 | 1 ms |
| 刺激时长 | 0-86400 s | 0-86400 s | 0-86400 s | 1 s |
| 簇内脉冲数 | 不适用 | 2-10 | 不适用 | 1 |
| 占空比 | 不适用 | 不适用 | 10-100% | 1% |
| 周期时长 | 不适用 | 不适用 | 1-3600 s | 1 s |
方向: IPG → 程控仪
功能: 对任何命令的成功确认响应
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 原命令码 | 0 | 2 | uint16 | 被响应的原命令码 |
| 结果码 | 2 | 1 | uint8 | 0x00=成功 |
| 时间戳 | 3 | 4 | uint32 | IPG处理完成的时间戳 |
Payload长度: 7字节
方向: IPG → 程控仪
功能: 对任何命令的失败/错误响应
Payload格式:
| 字段 | 偏移 | 长度 | 类型 | 描述 |
|---|---|---|---|---|
| 原命令码 | 0 | 2 | uint16 | 被响应的原命令码 |
| 错误码 | 2 | 2 | uint16 | 具体错误码(见错误码表) |
| 错误参数 | 4 | 4 | bytes | 错误相关的附加信息 |
| 时间戳 | 8 | 4 | uint32 | IPG检测到错误的时间戳 |
Payload长度: 12字节
错误参数说明:
- 对于参数错误(0x03xx),错误参数字段包含:
- Byte 0-1:错误参数的偏移位置
- Byte 2-3:错误参数的实际值
- 对于其他错误,错误参数字段为0x00000000
IPG支持最多16个电极触点(E0-E15),电极配置字段(uint32)中:
- 高16位:阳极配置
- 低16位:阴极配置
| 电极编号 | 物理触点 | 阴极位(低16位) | 阳极位(高16位) |
|---|---|---|---|
| E0 | 触点1 | Bit 0 | Bit 16 |
| E1 | 触点2 | Bit 1 | Bit 17 |
| E2 | 触点3 | Bit 2 | Bit 18 |
| E3 | 触点4 | Bit 3 | Bit 19 |
| E4 | 触点5 | Bit 4 | Bit 20 |
| E5 | 触点6 | Bit 5 | Bit 21 |
| E6 | 触点7 | Bit 6 | Bit 22 |
| E7 | 触点8 | Bit 7 | Bit 23 |
| E8 | 触点9 | Bit 8 | Bit 24 |
| E9 | 触点10 | Bit 9 | Bit 25 |
| E10 | 触点11 | Bit 10 | Bit 26 |
| E11 | 触点12 | Bit 11 | Bit 27 |
| E12 | 触点13 | Bit 12 | Bit 28 |
| E13 | 触点14 | Bit 13 | Bit 29 |
| E14 | 触点15 | Bit 14 | Bit 30 |
| E15 | 触点16 | Bit 15 | Bit 31 |
示例:
- 阴极设为E0+E1,阳极设为E8
- 阳极高16位 = 0x0100(Bit 24)
- 阴极低16位 = 0x0003(Bit 0 + Bit 1)
- uint32值 = 0x01000003
请求(0x0010):
AA 55 01 00 05 00 10 00 00 C2 1A
响应(0x0011):
AA 55 01 00 06 00 11 00 3C1B - 制造商名称长度27E4 B8 8A E6 B5 B7 E8 84 91 E7 8E 91 ... - "上海脑玑医疗科技有限公司"(UTF-8)0D - 型号长度1353 43 53 2D 49 50 47 2D 58 31 30 30 - "SCS-IPG-X100"0D - 序列号长度1332 30 32 36 30 34 32 32 30 30 30 30 31 - "2026042200001"0A - 固件版本长度1046 57 5F 76 31 2E 30 2E 30 - "FW_v1.0.0"08 - 硬件版本长度848 57 5F 76 31 2E 30 - "HW_v1.0"08 - 软件版本长度853 57 5F 76 31 2E 30 - "SW_v1.0"01 02 03 04 05 06 07 08 - System IDA3 4F - CRC16
请求(0x0060):
AA 55 01 00 10 00 60 00 00 8F 2D
响应(0x0061):
AA 55 01 00 11 00 61 00 1C01 - 当前模式:常规01 - 参数有效标志:有效01 F4 00 C8 01 F4 01 00 00 03 03 E8 - 参数数据(20字节)00 00 00 00 00 00 00 0066 1A 2B 3C - 参数设置时间戳A5 7F - 参数校验和D2 8E - CRC16
请求(0x0042):
AA 55 01 00 15 00 42 00 0203 - 程序组编号300 - 保留7B 9A - CRC16
响应(0x0043):
AA 55 01 00 16 00 43 00 1A03 - 程序组编号300 64 - 测量幅度100(1.0 mA)00 C8 - 测量脉宽200 µs01 F4 - 测量频率500(50.0 Hz)03 - 通道数量301 00 00 04 E2 00 - E0: 1250 Ω, 正常02 00 00 04 9C 00 - E1: 1180 Ω, 正常09 00 00 05 28 00 - E8: 1320 Ω, 正常C5 3F - CRC16
请求(0x0052):
AA 55 01 00 20 00 52 00 00 4E 7B
响应(0x0053):
AA 55 01 00 21 00 53 00 2900 - 结果码:成功01 2C - 接收块总数300A3 5F 7D 9E ... (32字节) - 计算SHA-25600 01 E2 40 - 固件大小123456字节00 0A - 预计重启时间10秒F8 A2 - CRC16
场景: 频率50.0 Hz,脉宽200 µs,幅值5.00 mA,电极配置阴极E0+E1阳极E8,斜坡时间1000 ms,持续刺激
完整报文(十六进制):AA 55 01 00 0A 00 21 00 14 01 F4 00 C8 01 F4 01 00 00 03 03 E8 00 00 00 00 00 00 00 00 3A 7F字段解析:AA 55 - 帧头01 - 协议版本00 0A - 帧序号(第10帧)00 21 - 命令码(写入常规刺激参数)00 14 - 数据长度(20字节)01 F4 - 频率(500 → 50.0 Hz)00 C8 - 脉宽(200 µs)01 F4 - 幅值(500 → 5.00 mA)01 00 00 03 - 电极配置(阳极E8,阴极E0+E1)03 E8 - 斜坡时间(1000 ms)00 00 00 00 - 刺激时长(0 = 持续刺激)00 00 00 00 - 保留(全零)3A 7F - CRC16校验值
场景: 簇内频率500.0 Hz,簇间频率40.0 Hz,5脉冲/Burst,脉宽300 µs,幅值3.50 mA
完整报文(十六进制):AA 55 01 00 0B 00 22 00 14 13 88 01 90 05 01 2C 01 5E 01 00 00 03 01 F4 00 00 00 00 00 B2 4D
场景: 频率10000 Hz,脉宽30 µs,幅值2.00 mA,占空比50%,周期60 s
完整报文(十六进制):AA 55 01 00 0C 00 23 00 14 27 10 00 1E 00 C8 01 00 00 03 32 00 3C 00 00 00 00 00 00 00 C5 E1
场景: 紧急停止,无Payload
完整报文(十六进制):AA 55 01 00 0D 00 32 00 00 8E 27字段解析:AA 55 - 帧头01 - 协议版本00 0D - 帧序号(第13帧)00 32 - 命令码(紧急停止)00 00 - 数据长度(0字节)8E 27 - CRC16校验值总长度:11字节(最小帧)
算法参数:
- 算法名称:CRC-16/CCITT-FALSE
- 生成多项式:0x1021
- 初始值:0xFFFF
- 输入反转:否
- 输出反转:否
- 最终异或值:0x0000
- 校验范围:从帧头到数据域末尾,不含CRC字段本身
伪代码:
FUNCTION crc16_ccitt(data: BYTE[], length: INTEGER) -> UINT16crc ← 0xFFFFFOR i ← 0 TO length - 1crc ← crc XOR (data[i] LEFT_SHIFT 8)FOR j ← 0 TO 7IF (crc AND 0x8000) ≠ 0 THENcrc ← (crc LEFT_SHIFT 1) XOR 0x1021ELSEcrc ← crc LEFT_SHIFT 1END IFEND FORcrc ← crc AND 0xFFFFEND FORRETURN crcEND FUNCTION
正常启动:
1. 发送启动命令(0x0030)
2. IPG执行前检查(电池、阻抗、温度、参数)
3. 斜坡上升阶段(状态0x02)
4. 稳态刺激阶段(状态0x01)
正常停止:
1. 发送停止命令(0x0031)
2. 斜坡下降阶段(状态0x03)
3. 刺激停止(状态0x00)
紧急停止:
1. 双通道下发(0x0032 + GATT特征0xFFF4)
2. 立即停止(50 ms内)
3. 状态上报(状态0x00 + 事件日志)
| 参数 | 规定值 | 说明 |
|---|---|---|
| BLE版本 | 5.0+ | 最低支持BLE 5.0,推荐BLE 5.3 |
| 首选PHY | LE 2M PHY | 支持LE 1M PHY回退 |
| 广播间隔 | 20-100 ms | IPG广播间隔,快速发现模式 |
| 连接间隔 | 7.5-30 ms | 由Central在连接时请求协商 |
| 从机延迟 | 0 | 刺激控制场景不允许跳过连接事件 |
| 监督超时 | 2000 ms | 连接丢失判定时间 |
| MTU | ≥ 247字节 | 连接建立后由Central发起MTU Exchange协商 |
| 安全级别 | LE Secure Connections (LESC) | AES-128-CCM加密,Numeric Comparison配对 |
| 绑定 | 必须(Required) | 首次配对后保存密钥,后续自动加密重连 |
文档结束