killapp/Assets/BLE通信方案V2.2.md

2106 lines
109 KiB
Markdown
Raw Normal View History

2026-03-30 16:25:00 +08:00
激光灭害虫设备 BLE 通信方案
文档版本信息
**版本**: v2.2
**创建日期**: 2025-12-09
**最后更新**: 2026-02-26
**状态**: 当前版本
更改记录
1. 方案概述
1.1 产品背景
激光灭害虫设备是一款智能家居安全设备,通过激光技术精准消灭蚊虫等害虫。由于激光设备存在安全风险,需要严格的用户注册和认证机制。本方案从产品经理和用户角度出发,设计完整的 APP 与设备交互方案,确保安全性和易用性。
1.2 通信架构
**通信链路**:
**APP ****↔**** ****BLE模块**: 通过 BLE 透传模式通信
**BLE模块**** ****↔**** MCU**: 通过 UART9 串口通信
**MCU**: STM32H7 主控制器,处理所有业务逻辑
1.3 通信特点
**透传模式**: BLE 模块工作在透传模式,数据透明传输
**双向通信**: 支持 APP 到设备和设备到 APP 的双向数据传输
**状态监控**: BLE 模块提供 LINK 和 WORK 状态引脚,实时监控连接状态
**安全认证**: 支持用户注册绑定、密码登录、指纹登录等多种认证方式
**OTA ****支持**: 支持BLE对MCU的固件更新
**主动通知**: 设备可主动上报状态变化、错误信息、统计数据等
2. BLE 指令分类表
本表按功能分类展示了所有 BLE 通信指令,便于快速查找和理解指令体系结构。
2.1 设备注册与认证类 (0x01-0x0F)
2.2 系统控制类 (0x10-0x1F)
2.3 外设控制类 (0x20-0x3F)
2.4 害虫消灭控制类 (0x40-0x4F)
2.5 安全设置类 (0x50-0x5F)
2.6 高级管理类 (0x60-0x6F)
2.7 连接管理类 (0x70-0x7F)
2.8 OTA 升级类 (0x80-0x9F)
2.9 状态查询类 (0xA0-0xBF)
3. 设备功能归纳
基于设备实际功能模块,从用户角度归纳 APP 可控制的功能。内部控制细节(如振镜电机参数)对用户隐藏,仅暴露用户友好的接口。
3.1 数据库模块
3.1.1 设备信息
**设备序列号**: 唯一标识设备,用于设备识别和绑定(主要标识符)
**固件信息**: 固件版本号,用于 OTA 升级判断
**设备**** MAC ****地址**: BLE 模块 MAC 地址(通过 BLE 命令从设备端获取Android/iOS 无法直接获取)
**硬件版本**: 硬件版本信息
**设备名称**: 用户自定义的设备名称(可选)
**说明**:
Android 6.0+ 和 iOS 7+ 出于隐私保护,无法直接获取 BLE 设备的真实 MAC 地址
设备识别主要使用设备序列号
如需 MAC 地址,需通过 BLE 命令(如查询设备信息命令)从设备端获取
3.1.2 人员管理
**用户名**: 用户注册时设置的用户名(最大长度 16 字节)
**用户密码**: 用户设置的登录密码(加密存储,最大长度 16 字节)
**指纹**** ID**: 用户指纹模板 ID设备端存储关联用户名
**绑定关系**: 设备与用户的绑定关系(一个设备可绑定多个用户,最多支持 10 个用户)
**用户权限**: 管理员/普通用户权限区分(可选)
3.2 系统控制
3.2.1 语言设置
**支持语言****: ****英文、中文**
**切换方式****: APP ****设置后同步到设备,影响设备**** LCD ****显示和提示音**
3.2.2 时间管理
**时间设置****: ****设置设备系统时间(年、月、日、时、分、秒)**
**日期显示****: ****设备**** LCD ****显示当前日期**
**时间同步****: APP ****与设备时间同步**
3.2.3 定时任务
**功能说明****: ****在指定时间范围内自动运行指定的设备模式,支持按周重复执行。定时关机功能通过设置运行模式为"待机"实现。**
**任务数量****: ****最多可设置5组定时任务**
**任务参数****:**
**任务ID**: 0-4对应数组索引标识不同的定时任务
**开关**控制: 启用/禁用该定时任务0x00=禁用, 0x01=启用)
**开始**时间: 开始小时(1字节0-23) + 开始分钟(1字节0-59)
**结束时间**: 结束小时(1字节0-23) + 结束分钟(1字节0-59)
**运行模式**: 待机(0x00)、扫描(0x01)、消杀(0x02)
**待机模式**: 设备进入待机状态,可用于定时关机功能
**扫描模式**: 设备进入扫描检测状态
**消杀模式**: 设备进入消杀工作状态
**重复设置**: 1字节按位表示星期几重复执行
bit0: 周一 (0x01)
bit1: 周二 (0x02)
bit2: 周三 (0x04)
bit3: 周四 (0x08)
bit4: 周五 (0x10)
bit5: 周六 (0x20)
bit6: 周日 (0x40)
示例0x3F (0b00111111) 表示周一到周六0x41 (0b01000001) 表示周一和周日
**自动执行**:
在设定的星期几,到达开始时间后,设备自动切换到指定模式
到达结束时间后,设备自动停止或切换到待机模式
对于待机模式(定时关机),设备进入待机状态并保持到结束时间
**使用场景**:
**定时关机**: 设置运行模式为"待机"在指定时间范围自动进入待机状态每天23:00-06:00自动关机
**自动化灭虫任务**: 设置运行模式为"消杀"在指定时间范围自动开始灭虫工作工作日20:00-22:00自动消杀
**定时扫描检测**: 设置运行模式为"扫描"在指定时间范围自动开始扫描检测每天08:00-18:00自动扫描
**节能管理**: 通过定时任务实现自动化控制,避免长时间工作
3.3 外设控制
3.3.1 LCD 显示屏
**休眠设置**:
**休眠开关**: 开启/关闭 LCD 休眠功能
**休眠时间**: 设置 LCD 无操作后进入休眠的时间1分钟、5分钟、10分钟、30分钟
**亮度调节**:
**自适应开关**: 开启/关闭自适应亮度功能(开启时根据环境光自动调节亮度)
**亮度值**: 手动设置亮度等级10-100%,仅在自适应关闭时有效)
3.3.2 RGB 指示灯
开关控制: 开启/关闭 RGB 指示灯
颜色设置: 设置指示灯颜色RGB 值)
效果模式: 设置指示灯效果(闪烁、常亮、警示)
3.3.3 WIFI 功能
**开关控制**: 开启/关闭 WIFI 功能(如设备支持)
开关值0x00=关闭0x01=开启
**WIFI ****配置**: WIFI SSID 和密码设置
SSID最多32字节的ASCII字符串以\0结尾
密码最多32字节的ASCII字符串以\0结尾
**数据格式**:
读操作固定返回65字节开关1字节 + SSID 32字节 + 密码32字节
写操作可变长度至少1字节开关可选包含SSID和密码
3.3.4 BLE 功能
**蓝牙名称**: 设置 BLE 广播名称
**说明**: BLE 功能始终开启,不支持通过 APP 关闭(关闭后无法通信)
3.3.5 多媒体功能
**视频录制**:
**开关控**制: 开启/关闭视频录制功能0x00=关闭0x01=开启)
录制时长: 设置单次录制时长支持3秒、5秒、10秒
**音效设置**:
**开关控制**: 开启/关闭音效0x00=关闭0x01=开启)
音效类型: 选择不同的提示音效5种类型
0x00 = Hello音效
0x01 = Goodbye音效
0x02 = Test音效
0x03 = BIU音效
0x04 = Main音效
音量**控制**: 设置音量大小0-15对应芯片E0-EF共16级
**数据格式**:
读操作固定返回5字节视频录制开关1字节 + 录制时长1字节 + 音效开关1字节 + 音效类型1字节 + 音量1字节
写操作可变长度至少1字节视频录制开关可选包含其他字段
3.3.6 补光灯
**功能说明**: 补光灯是外部设备,用于夜间补光,提高检测效果
**开关控制**: 开启/关闭补光灯
**补光类型**:
**红外光**: 用于夜间补光,不影响人眼
白光: 普通白光补光
**光照强度设置**: **设置**补光灯光照强度(低、中、高)
**连接状态监控**:
设备实时检测补光灯连接状态
补光灯连接/断开时主动上报状态
APP 可查询补光灯连接状态
3.3.7 可见光激光器
**功能说明**: 可见光激光器用于提供可见激光指示,辅助瞄准和定位
**开关控制**: 开启/关闭可见光激光器
**使用场景**:
激光瞄准辅助
设备调试和校准
用户可视化激光位置
3.4 害虫消灭控制
3.4.1 角度控制
**扫描角度**: 设置激光扫描角度范围
**数据**格式: 2字节小端序低字节在前高字节在后
单位: 0.1度
范围: 1-900对应0.1度-90度
读操作: 返回当前角度范围设置2字节
写操作: 设置角度范围2字节设备验证范围后更新数据库
**数据库字段**: db_cfg.pest_ctrl.angle_rangeuint16_t单位0.1度)
3.4.2 距离控制
**检测距离**: 设置害虫检测距离范围(米)
**瞄准距离**: 设置激光瞄准距离(米)
3.5 安全模块
3.5.1 毫米波雷达
**开关控制**: 开启/关闭毫米波雷达检测0x00=关闭0x01=开启)
**灵敏度设置**: 设置人体检测灵敏度
0x00 = 低灵敏度
0x01 = 中灵敏度
0x02 = 高灵敏度
**安全距离**: 设置安全保护距离
**数据格式**: 2字节小端序低字节在前高字节在后
单位: 0.1米
范围: 1-100对应0.1米-10米
**数据格式**:
读操作返回4字节固定长度数据开关1字节 + 灵敏度1字节 + 安全距离2字节
写操作接收4字节数据开关1字节 + 灵敏度1字节 + 安全距离2字节
**数据库字段**: db_cfg.safety.mmw_radar.enable、sensitivity、safe_distance
3.5.2 视觉检测
**开关控制**: 开启/关闭视觉检测功能0x00=关闭0x01=开启)
**灵敏度设置**: 设置视觉检测灵敏度
0x00 = 低灵敏度
0x01 = 中灵敏度
0x02 = 高灵敏度
**数据格式**:
读操作返回2字节固定长度数据开关1字节 + 灵敏度1字节
写操作接收2字节数据开关1字节 + 灵敏度1字节
**数据库字段**: db_cfg.safety.vision.enable、sensitivity
**说明**: 摄像头可视范围固定,无需软件设置检测范围
3.5.3 加速度传感器(振动检测)
**功能说明**: 3轴加速度传感器用于检测设备振动状态确保激光灭虫设备稳定放置
**开关控制**: 开启/关闭加速度传感器检测0x00=关闭0x01=开启)
**灵敏度设置**: 设置振动检测灵敏度
0x00 = 低灵敏度
0x01 = 中灵敏度
0x02 = 高灵敏度
**振动阈值**: 设置振动检测阈值
**范围**: 1-255
说明: 超过阈值时触发告警或停止工作
**数据格式命令0x52**** - ****加速度传感器设置)**:
读操作返回3字节固定长度数据开关1字节 + 灵敏度1字节 + 振动阈值1字节
写操作接收3字节数据开关1字节 + 灵敏度1字节 + 振动阈值1字节
**数据格式命令0x53**** - ****查询加速度传感器数据)**:
读操作返回6字节固定长度数据X轴加速度2字节 + Y轴加速度2字节 + Z轴加速度2字节
每个轴数据2字节小端序有符号整数int16_t单位mg
数据范围:-32768到32767对应-32768mg到32767mg
**数据库字段**: db_cfg.safety.accel.enable、sensitivity、threshold
**实时数据来源**: meas_ctrl.accel.x_mg、y_mg、z_mgfloat类型单位mg
**应用场景**:
设备放置稳定性检测
设备被移动或碰撞检测
设备异常振动告警
确保激光精准瞄准(设备不稳定时禁止或暂停激光发射)
实时数据监控查询X、Y、Z轴加速度值可通过命令0xA5"查询设备传感器数据"获取)
3.5.4 温度监控
**功能说明**: 监控设备当前温度,防止设备过热损坏
**温度检测**: 实时检测设备温度(单位:摄氏度)
**温度阈值**: 设置温度告警阈值和停止阈值
**超温保护**: 温度超过阈值时自动停止设备工作并上报状态
**温度数据查询**: 通过命令0xA5"查询设备传感器数据"获取当前温度值
**应用场景**:
设备温度实时监控
超温保护(防止设备过热)
温度异常告警
确保设备安全运行
**安全机制**:
温度超过停止阈值时,设备立即停止所有工作
设备主动上报超温状态给 APP通过通知类型0x02错误状态上报中的温度错误字段
温度恢复正常后,需要用户确认才能重新启动
3.6 设备状态监控
3.6.1 工作模式
**待机模式**: 设备已启动但未开始工作
**扫描模式**: 设备正在扫描检测害虫
**消杀模式**: 设备正在执行消杀任务
3.6.2 硬件状态
**硬件错误状态查询**: 通过命令0xA1查询各硬件模块的错误状态
温度错误: 0x00=无错误, 0x01=温度过高, 0x02=温度过低
电机错误: 0x00=无错误, 0x01=温度错误, 0x02=反馈错误
激光器错误: 0x00=无错误, 0x01=温度过高, 0x02=电压过低, 0x03=电压过高
视觉错误: 0x00=无错误, 0x01=通信错误
加速度错误: 0x00=无错误, 0x01=通信错误
毫米波雷达错误: 0x00=无错误, 0x01=通信错误
激光雷达错误: 0x00=无错误, 0x01=通信错误
**数据来源**: meas_ctrl.error测量控制模块的错误状态
**通信状态**: BLE 连接状态(由 APP 端 BLE SDK 检测,设备端通过硬件 LINK 引脚检测)
3.6.3 统计数据
**统计数据查询**: 通过命令0xA3查询设备工作统计数据和历史日志索引
统计数据: 灭虫数量、总工作时间、今日工作时间、扫描次数、激光发射次数、蚊虫数据数量
datalog日志记录数量。
数据来源: db_cfg.statistics统计数据和db_cfg.datalog日志索引
传感器异常: 传感器故障或异常
温度异常: 设备温度超过阈值
系统错误: 系统级错误
3.6.4 传感器数据查询
**传感器数据查询**: 通过命令0xA5一次性查询设备温度、3D传感器数据和电容电压
**温度数据**: 2字节单位0.1°C例如250表示25.0°C
**3D传**感器数据: 6字节X/Y/Z轴加速度各2字节单位mg有符号整数范围-32768到32767
电容电压: 2字节单位0.01V例如1530表示15.30V
数据来源:
温度meas_ctrl.temp测量控制模块的温度值
3D传感器meas_ctrl.accel.x_mg、y_mg、z_mg测量控制模块的加速度数据
电容电压capture_get_laser_gun_dev()->current_voltage激光器设备的当前电容电压
**应用场景**:
设备状态实时监控
传感器数据采集
设备健康检查
调试和诊断
3.7 高级管理
3.7.1 恢复出厂设置
**功能说明****: ****清除所有用户设置,恢复设备到出厂状态**
**安全要求****: ****需要管理员权限或特殊认证**
3.8 固件管理
3.8.1 固件更新OTA
**版本查询****: ****查询OTA版本信息命令0x80返回固件版本、硬件版本、OTA版本**
**升级检查****: ****检查是否有新版本固件**
**OTA ****升级****: ****通过**** BLE ****进行固件升级**
4. BLE 控制场景分类
基于用户功能模块,将 BLE 控制场景分为以下八大类:
4.1 设备注册与认证类
4.1.1 设备首次注册绑定
**场景描述**: 设备首次开机,用户在 APP 完成注册和安全考试后,将用户信息绑定到设备
**典型操作**:
APP 检测设备未注册状态(通过命令 0x01 查询)
用户在 APP 完成安全考试APP 端实现,考试内容关于激光安全使用)
用户填写用户名和密码APP 端验证)
APP 将设备序列号与用户信息绑定关系存储到云端数据库
APP 发送设备注册确认到设备(命令 0x02仅发送用户名不发送密码
设备存储用户名信息(设备端不存储密码)
设备返回绑定成功确认
**使用场景**:
新设备首次使用
设备恢复出厂设置后重新注册
**安全要求**:
设备与用户绑定关系存储在云端APP数据库
设备端仅存储用户名,不存储密码
一个设备最多绑定 10 个用户
首次注册后设备进入已注册状态,后续操作需要登录
**通信流程**:
4.1.2 用户登录认证
**场景描述**: 用户通过 APP 登录设备,验证用户权限
**认证方式**:
**密码登录**: APP 在云端验证用户名和密码,验证通过后发送用户名和解锁状态到设备(命令 0x03设备接收后解锁
**指纹登录**: 设备本地验证指纹指纹验证由设备端硬件模块完成不通过BLE命令
**典型操作**:
**密码登录流程**:
用户在 APP 输入用户名和密码
APP 在云端验证设备序列号与用户的绑定关系
APP 在云端验证用户名和密码
验证通过后APP 发送用户名和解锁状态到设备(命令 0x03
设备接收解锁状态,记录登录时间
设备返回解锁成功确认
**指纹登录使能设置流程**:
用户必须先通过密码登录解锁设备
APP 发送用户名和使能状态到设备(命令 0x04
设备验证用户名是否存在
设备设置该用户的指纹登录使能状态finger_id_valid字段
设备保存设置并返回结果
认证成功后APP 获得设备控制权限,可执行后续操作
**使用场景**:
每次 APP 连接设备时(已注册设备必须登录)
设备长时间未操作后重新认证(建议超时时间 30 分钟)
**安全要求**:
密码验证在云端完成,设备端不验证密码
设备与用户绑定关系存储在云端APP通过云端验证绑定关系
连续 5 次登录失败后APP 端锁定 5 分钟
登录成功后,设备记录登录时间,用于超时判断
**通信流程**:
**密码登录流程**:
**指纹登录使能设置流程**:
4.1.3 指纹录制管理
**场景描述**: 用户在设备上录制指纹,用于后续指纹登录
**典型操作**:
用户必须先通过APP登录首次录制需密码登录因为尚未有指纹
APP 发起指纹录制请求(命令 0x05指定用户名
设备检查用户是否已解锁(设备端记录登录状态)
设备验证用户名是否存在
设备确定page_id
如果用户已有finger_id使用它重新注册覆盖旧指纹
如果用户没有finger_id分配新的page_id查找数据库中已使用的最大page_id + 1
设备检查指纹库是否已满
设备启动指纹注册状态机(异步处理)
设备引导用户按压指纹循环采集9次
设备验证指纹质量,合并特征,存储模板
注册成功后,设备自动更新数据库:
设置 finger_id = page_id
设置 finger_id_valid = 1
保存到数据库
设备返回录制结果(成功/失败)
**使用场景**:
用户首次设置指纹登录
重新录制指纹(覆盖旧指纹)
**安全要求**:
必须已通过APP登录设备已解锁才能录制指纹
不能有注册正在进行中(同一时间只能有一个注册流程)
指纹数据仅存储在设备端,不传输到 APP
指纹模板与用户名关联存储到指纹库的指定page_id位置
注册完成后自动更新数据库,无需额外命令
**通信流程**:
4.1.4 用户权限查询
**场景描述**: 查询设备绑定的用户列表和权限信息
**典型操作**:
APP 从云端查询设备绑定的用户列表(绑定关系在云端)
APP 查询设备端存储的用户名列表(命令 0x07
设备返回用户名、指纹ID、指纹ID有效标志等信息设备端仅存储用户名和指纹信息
**使用场景**:
多用户管理
权限验证
**说明**: 设备与用户的完整绑定关系存储在云端,设备端仅存储用户名列表用于指纹验证
**通信流程**:
4.1.6 设备分享流程
**场景描述**: 设备所有者管理员将设备分享给其他用户被分享者通过BLE连接设备并完成注册绑定
**典型操作**:
**步骤1所有者发起分享**:
设备所有者管理员在APP中选择"分享设备"功能
APP向云端服务器发送分享请求设备序列号 + 被分享者手机号/账号)
云端验证所有者权限,生成分享邀请(可选:生成分享邀请码)
云端向被分享者发送分享通知(短信/推送消息)
**步骤2被分享者接受分享**:
被分享者收到分享通知打开APP查看分享邀请
APP从云端查询分享邀请状态和设备信息
被分享者确认接受分享
**步骤3被分享者连接设备并**注册:
被分享者需要**物理靠近设备**BLE连接需要近距离
被分享者APP扫描并发现设备通过设备序列号识别
被分享者APP发起BLE连接请求
BLE连接建立后APP查询设备注册状态命令 0x01
设备返回已注册状态
被分享者在APP上完成安全考试APP端实现
被分享者填写用户名和密码APP端验证格式
APP向云端验证分享邀请有效性
云端将设备序列号与新用户绑定(存储到云端数据库)
APP发送设备注册确认到设备命令 0x02仅发送用户名
设备检查用户数量最多支持10个用户
设备存储用户名信息(设备端不存储密码)
设备返回注册成功确认
APP向云端确认分享完成
云端通知所有者分享成功
**使用场景**:
家庭成员共享设备
多用户协作使用设备
**安全要求**:
被分享者必须物理靠近设备才能完成BLE配对安全要求
被分享者必须完成安全考试才能注册
设备最多支持10个用户超过限制时注册失败
设备与用户绑定关系存储在云端,设备端仅存储用户名
**重要说明**:
设备分享必须通过BLE本地连接完成不支持远程分享
被分享者需要在现场才能完成BLE配对和注册
分享流程与首次注册流程相同都需要通过BLE连接设备
**通信流程**:
4.2 系统控制类
4.2.1 语言设置
**场景描述**: 设置设备显示语言
**典型操作**:
APP 发送语言设置命令(英文/中文)
设备保存语言设置
设备 LCD 显示更新为对应语言
**使用场景**: 用户个性化设置
**通信流程**:
4.2.2 时间管理
**场景描述**: 设置和同步设备时间
**典型操作**:
APP 发送时间设置命令(年、月、日、时、分、秒)
设备保存时间设置
APP 查询设备当前时间
**使用场景**: 时间同步、定时功能设置
**通信流程**:
4.2.3 定时任务设置
**场景描述**: 设置定时任务,在指定时间范围内自动运行指定的设备模式,支持按周重复执行。定时关机功能通过设置运行模式为"待机"实现。
**典型操作**:
APP 添加/修改定时任务任务ID、开关、开始时间、结束时间、模式、重复设置
APP 查询所有定时任务列表
APP 删除定时任务(设置开关为关闭)
设备在指定时间范围内自动执行定时任务
**任务参数**:
**任务ID**: 0-4对应数组索引最多支持5组定时任务
**开关**: 启用/禁用该定时任务0x00=禁用, 0x01=启用)
**开始时间**: 开始小时(1字节0-23) + 开始分钟(1字节0-59)
**结束时间**: 结束小时(1字节0-23) + 结束分钟(1字节0-59)
**运行模式**: 待机(0x00)、扫描(0x01)、消杀(0x02)
**待机**模式**(0x00)**: 设备进入待机状态,可用于定时关机功能
扫描模式(0x01): 设备进入扫描检测状态
消杀模式(0x02): 设备进入消杀工作状态
**重复设置**: 1字节按位表示星期几重复执行
bit0: 周一 (0x01)
bit1: 周二 (0x02)
bit2: 周三 (0x04)
bit3: 周四 (0x08)
bit4: 周五 (0x10)
bit5: 周六 (0x20)
bit6: 周日 (0x40)
示例0x3F (0b00111111) 表示周一到周六0x41 (0b01000001) 表示周一和周日
**使用场景**:
**定时关机**: 设置运行模式为"待机"在指定时间范围自动进入待机状态每天23:00-06:00自动关机
自动化灭虫任务: 设置运行模式为"消杀"在指定时间范围自动开始灭虫工作工作日20:00-22:00自动消杀
定时扫描检测: 设置运行模式为"扫描"在指定时间范围自动开始扫描检测每天08:00-18:00自动扫描
节能管理: 通过定时任务实现自动化控制,避免长时间工作
**通信流程**:
4.3 外设控制类
4.3.1 LCD 控制
**场景描述**: 设置 LCD 显示屏休眠功能和亮度
**典型操作**:
APP 设置 LCD 休眠开关和休眠时间(命令 0x20
APP 设置亮度自适应开关和亮度值(命令 0x21
APP 设置亮度值10-100%,仅在自适应关闭时有效)
**使用场景**: 节能管理、显示优化
**休眠设置说明**:
**休眠**开关: 0x00=关闭休眠功能0x01=开启休眠功能
休眠时间: 0x01=1分钟0x05=5分钟0x0A=10分钟0x1E=30分钟
当休眠功能开启时LCD 在无操作达到设定时间后自动进入休眠状态
休眠状态下 LCD 关闭显示以节省电量,用户操作时自动唤醒
**通信流程**:
4.3.2 RGB 指示灯控制
**场景描述**: 控制 RGB 指示灯的颜色和效果
**典型操作**:
APP 控制指示灯开关
APP 设置指示灯颜色RGB 值)
APP 设置指示灯效果(闪烁、常亮、警示)
**使用场景**: 状态指示、个性化设置
**通信流程**:
4.3.3 WIFI 控制
**场景描述**: 控制 WIFI 功能开关和配置
**典型操作**:
APP 查询当前 WIFI 配置(读操作)
APP 控制 WIFI 开关(写操作,仅发送开关字节)
APP 配置 WIFI SSID 和密码(写操作,发送开关+SSID+密码)
**使用场景**: 网络连接管理
**数据格式说明**:
**读操作**: 设备返回65字节固定长度数据
字节0开关状态0x00=关闭0x01=开启)
字节1-32SSID字符串32字节ASCII编码
字节33-64密码字符串32字节ASCII编码
**写操作**: APP发送可变长度数据
字节0开关值0x00=关闭0x01=开启,必填)
字节1-NSSID字符串以\0结尾最多32字节可选
字节N+1-M密码字符串以\0结尾最多32字节可选
说明如果只更新开关只需发送1字节如果更新SSID发送开关+SSID如果同时更新SSID和密码发送完整数据
**通信流程**:
4.3.4 BLE 控制
**场景描述**: 设置 BLE 广播名称
**典型操作**:
APP 设置 BLE 广播名称
**使用场景**: 蓝牙管理、设备识别
**说明**:
BLE 功能始终开启,不支持通过 APP 关闭(关闭后无法与 APP 通信)
Android/iOS 无法直接获取 BLE MAC 地址,设备识别主要使用设备序列号
**通信流程**:
4.3.5 多媒体控制
**场景描述**: 控制视频录制和音效设置
**典型操作**:
APP 查询当前多媒体配置(读操作)
APP 控制视频录制开关(写操作,仅发送开关字节)
APP 设置录制时长(写操作,发送开关+时长)
APP 控制音效开关(写操作,发送视频录制相关字段+音效开关)
APP 选择音效类型和音量(写操作,发送完整数据)
**使用场景**: 功能配置
**数据格式说明**:
**读操作**: 设备返回5字节固定长度数据
字节0视频录制开关0x00=关闭0x01=开启)
字节1录制时长1字节0x03=3秒, 0x05=5秒, 0x0A=10秒
字节2音效开关0x00=关闭0x01=开启)
字节3音效类型0x00=Hello, 0x01=Goodbye, 0x02=Test, 0x03=BIU, 0x04=Main
字节4音量0-15对应芯片E0-EF共16级
**写操作**: APP发送可变长度数据
字节0视频录制开关0x00=关闭0x01=开启,必填)
字节1录制时长1字节可选0x03=3秒, 0x05=5秒, 0x0A=10秒
字节2音效开关0x00=关闭0x01=开启,可选)
字节3音效类型0x00-0x04可选
字节4音量0-15可选
说明如果只更新视频录制开关只需发送1字节如果更新录制时长发送开关+时长2字节如果同时更新音效发送完整数据5字节
**通信流程**:
4.3.6 补光灯控制
**场景描述**: 控制补光灯开关、类型和光照强度,监控补光灯连接状态
**典型操作**:
APP 控制补光灯开关
APP 选择补光类型(红外光/白光)
APP 设置补光光照强度(低/中/高)
APP 查询补光灯连接状态
设备检测到补光灯连接/断开时主动上报状态
**使用场景**:
夜间补光、检测优化
补光灯设备管理
连接状态监控
**连接状态**:
补光灯连接时,设备主动上报连接状态(通知类型 0x09
补光灯断开时,设备主动上报断开状态
APP 可随时查询补光灯连接状态
**通信流程**:
4.3.7 可见光激光器控制
**场景描述**: 控制可见光激光器开关
**典型操作**:
APP 控制可见光激光器开关
APP 查询可见光激光器状态
**使用场景**:
激光瞄准辅助
设备调试和校准
用户可视化激光位置
**通信流程**:
4.4 害虫消灭控制类
4.4.1 角度控制
**场景描述**: 设置激光扫描角度范围
**典型操作**:
APP 查询当前角度范围设置(读操作)
APP 设置扫描角度范围写操作发送2字节角度值
**使用场景**: 扫描范围调整
**数据格式说明**:
**读操作**: 设备返回2字节固定长度数据
字节0-1角度范围2字节小端序单位0.1度范围1-900
**写操作**: APP发送2字节数据
字节0-1角度范围2字节小端序单位0.1度范围1-900
说明设备会验证角度范围是否在有效范围内1-900超出范围将返回参数错误
**通信流程**:
4.4.2 距离控制
**场景描述**: 设置害虫检测和瞄准距离
**典型操作**:
APP 设置检测距离范围(米)
APP 设置瞄准距离(米)
**使用场景**: 检测范围优化
**通信流程**:
4.5 安全设置类
4.5.1 毫米波雷达设置
**场景描述**: 配置毫米波雷达检测参数
**典型操作**:
APP 查询当前毫米波雷达设置(读操作)
APP 控制毫米波雷达开关(写操作)
APP 设置检测灵敏度(低/中/高)
APP 设置安全保护距离
**使用场景**: 人体检测、安全保护
**数据格式说明**:
**读操作**: 设备返回4字节固定长度数据
字节0开关0x00=关闭0x01=开启)
字节1灵敏度0x00=低0x01=中0x02=高)
字节2-3安全距离2字节小端序单位0.1米范围1-100
**写操作**: APP发送4字节数据
字节0开关0x00=关闭0x01=开启)
字节1灵敏度0x00=低0x01=中0x02=高)
字节2-3安全距离2字节小端序单位0.1米范围1-100
说明:设备会验证所有参数的有效性,超出范围将返回参数错误
**通信流程**:
4.5.2 视觉检测设置
**场景描述**: 配置视觉检测参数
**典型操作**:
APP 查询当前视觉检测设置(读操作)
APP 控制视觉检测开关(写操作)
APP 设置检测灵敏度(低/中/高)
**使用场景**: 安全检测、目标识别
**说明**: 摄像头可视范围固定,无需软件设置检测范围
**数据格式说明**:
**读操作**: 设备返回2字节固定长度数据
字节0开关0x00=关闭0x01=开启)
字节1灵敏度0x00=低0x01=中0x02=高)
**写操作**: APP发送2字节数据
字节0开关0x00=关闭0x01=开启)
字节1灵敏度0x00=低0x01=中0x02=高)
说明:设备会验证所有参数的有效性,超出范围将返回参数错误
**通信流程**:
4.5.3 加速度传感器设置
**场景描述**: 配置3轴加速度传感器参数用于检测设备振动状态
**典型操作**:
APP 查询当前加速度传感器设置命令0x52读操作
APP 控制加速度传感器开关命令0x52写操作
APP 设置振动检测灵敏度(低/中/高)
APP 设置振动检测阈值
APP 查询加速度传感器实时数据命令0x53读操作
**使用场景**:
设备稳定性检测(确保设备稳定放置)
设备移动检测(检测设备是否被移动)
异常振动告警(检测设备异常振动)
安全保护(设备不稳定时禁止或暂停激光发射)
实时数据监控查询X、Y、Z轴加速度值
**安全要求**:
检测到设备不稳定时,设备自动停止激光发射
设备稳定后,需要用户确认才能重新启动
振动数据实时监控,超过阈值立即响应
**查询加速度传感器数据命令0x53**:
**数据格式说明**:
**读操作**: 设备返回6字节固定长度数据
字节0-1X轴加速度2字节小端序有符号整数int16_t单位mg
字节2-3Y轴加速度2字节小端序有符号整数int16_t单位mg
字节4-5Z轴加速度2字节小端序有符号整数int16_t单位mg
数据范围:-32768到32767对应-32768mg到32767mg
说明:数据格式为小端序(低字节在前,高字节在后),有符号整数
**数据格式说明命令0x52**** - ****加速度传感器设置)**:
**读操作**: 设备返回3字节固定长度数据
字节0开关0x00=关闭0x01=开启)
字节1灵敏度0x00=低0x01=中0x02=高)
字节2振动阈值1-255
**写操作**: APP发送3字节数据
字节0开关0x00=关闭0x01=开启)
字节1灵敏度0x00=低0x01=中0x02=高)
字节2振动阈值1-255
说明:设备会验证所有参数的有效性,超出范围将返回参数错误
**数据格式说明命令0x53**** - ****查询加速度传感器数据)**:
**读操作**: 设备返回6字节固定长度数据
字节0-1X轴加速度2字节小端序有符号整数int16_t单位mg
字节2-3Y轴加速度2字节小端序有符号整数int16_t单位mg
字节4-5Z轴加速度2字节小端序有符号整数int16_t单位mg
数据范围:-32768到32767对应-32768mg到32767mg
说明数据格式为小端序低字节在前高字节在后有符号整数数据来源于meas_ctrl.accel
**通信流程命令0x52**** - ****加速度传感器设置)**:
**通信流程命令0x53**** - ****查询加速度传感器数据)**:
**实时监控流程**:
4.5.4 温度监控设置
**场景描述**: 配置温度监控参数,监控设备温度状态
**典型操作**:
APP 设置温度告警阈值
APP 设置温度停止阈值
APP 查询温度数据通过命令0xA5"查询设备传感器数据"获取温度值)
**使用场景**:
设备温度实时监控
超温保护设置
温度异常告警
设备安全运行保障
**安全要求**:
温度超过停止阈值时,设备自动停止工作
温度超过告警阈值时,设备主动上报告警(通过通知类型 0x02 错误状态上报中的温度错误字段)
温度恢复正常后,需要用户确认才能重新启动
温度数据实时监控,超过阈值立即响应
**通信流程**:
4.6 高级管理类
4.6.1 恢复出厂设置
**场景描述**: 清除所有用户设置,恢复设备到出厂状态
**典型操作**:
APP 发送恢复出厂设置命令(需要管理员权限)
设备清除所有用户数据、绑定关系、参数设置
设备返回恢复完成确认
**使用场景**:
设备故障恢复
设备转售前清理
**通信流程**:
4.6.2 设备信息查询
**场景描述**: 查询设备基本信息
**典型操作**:
APP 查询设备序列号
APP 查询OTA版本信息命令0x80
APP 查询硬件版本
APP 查询设备 MAC 地址
**使用场景**: 设备识别、版本管理
**说明**:
Android 6.0+ 和 iOS 7+ 无法直接获取 BLE 设备的真实 MAC 地址
设备识别主要使用设备序列号
MAC 地址需通过查询设备信息命令0xA2从设备端获取
**通信流程**:
4.7 OTA 升级类
4.7.1 OTA版本信息查询
**场景描述**: 查询设备当前固件版本、硬件版本和OTA版本信息
**典型操作**:
APP 查询OTA版本信息命令0x80返回12字节版本信息固件版本4 + 硬件版本4 + OTA版本4
设备返回版本信息固件版本、硬件版本、OTA版本
或者 APP 查询设备信息命令0xA2从返回数据中提取版本信息
**使用场景**: 版本检查、升级判断、OTA升级前版本验证
**说明**:
命令0x80专门用于OTA升级场景返回12字节版本信息固件版本4 + 硬件版本4 + OTA版本4
命令0xA2返回完整的设备信息76字节包含版本信息和其他设备信息
数据来源db_cfg.device_info与命令0xA2的版本信息字段一致
**通信流程**:
4.7.2 固件升级
**场景描述**: 通过 BLE 进行设备固件升级
**操作流程**:
APP 查询OTA版本信息命令0x80检查是否需要升级
APP 发送升级开始命令命令0x81发送版本号、固件大小和CRC16校验和
设备擦除1MB SPI Flash区域地址0x100000写入文件头版本号、固件大小、CRC16占位为0保存期望的CRC16
APP 分包传输固件数据命令0x82设备写入Flash并实时计算CRC16
当所有数据接收完成时设备比较计算的CRC16与期望的CRC16如果匹配则设置force_boot=1有效否则设置force_boot=0无效
APP 发送结束传输命令命令0x83发送总大小
设备验证接收数据大小保存CRC16到文件头更新数据库OTA版本和force_boot标志返回成功
**使用场景**: 功能更新、Bug 修复
**Flash存储格式**:
存储位置SPI Flash地址0x100000大小1MB
文件头10字节版本号(4) + 固件大小(4) + CRC16(2)
文件体固件数据从地址0x10000A开始
数据格式:所有多字节数据采用小端序
**说明**: 升级进度由 APP 端和设备端各自计算无需查询命令。APP 端根据已发送数据包和总数据量计算进度,设备端根据已接收数据包和总数据量计算进度。
**通信流程**:
4.8 设备状态监控类
4.8.1 工作模式查询
**场景描述**: 查询设备当前工作模式
**典型操作**:
APP 查询设备工作模式(命令 0xA0
设备返回模式信息(待机/扫描/消杀)
**模式说明**:
**待机模式**** (0x00)**: 设备已启动但未开始工作
**扫描模式**** (0x01)**: 设备正在扫描检测害虫
**消杀模式**** (0x02)**: 设备正在执行消杀任务
**数据格式**:
**读操作**: 返回1字节
字节0工作模式值0x00=待机, 0x01=扫描, 0x02=消杀)
**写操作**: 不支持
**数据来源**: 从数据库 db_cfg.system.work_mode 读取当前工作模式设置
**使用场景**: 设备状态监控、工作流程判断
**通信流程**:
4.8.2 硬件状态查询
**场景描述**: 查询设备各硬件模块的错误状态
**典型操作**:
APP 查询硬件状态(命令 0xA1读操作
设备返回7字节硬件错误状态
**数据格式**:
字节0 - 温度错误: 0x00=无错误, 0x01=温度过高, 0x02=温度过低
字节1 - 电机错误: 0x00=无错误, 0x01=温度错误, 0x02=反馈错误
字节2 - 激光器错误: 0x00=无错误, 0x01=温度过高, 0x02=电压过低, 0x03=电压过高
字节3 - 视觉错误: 0x00=无错误, 0x01=通信错误
字节4 - 加速度错误: 0x00=无错误, 0x01=通信错误
字节5 - 毫米波雷达错误: 0x00=无错误, 0x01=通信错误
字节6 - 激光雷达错误: 0x00=无错误, 0x01=通信错误
**数据来源**: meas_ctrl.error测量控制模块的错误状态
**使用场景**: 故障诊断、设备维护、实时监控
**通信流程**:
4.8.3 统计数据查询
**场景描述**: 查询设备工作统计数据和历史日志索引信息
**典型操作**:
APP 查询统计数据(命令 0xA3读操作
设备返回统计数据灭虫数量、工作时间、扫描次数等和datalog日志索引信息
**统计数据说明**:
灭虫数量: 累计灭虫总数uint32_t
总工作时间: 设备累计工作时间uint32_t单位
今日工作时间: 今日累计工作时间uint32_t单位
扫描次数: 累计扫描次数uint32_t
激光发射次数: 累计激光发射次数uint32_t
蚊虫数据数量: 扫描到、杀了的蚊子总数uint32_t
本地数据记录数量;
**数据来源**: db_cfg.statistics统计数据和db_cfg.datalog日志索引
**使用场景**: 数据统计、历史数据查询、设备性能分析
**通信流程**:
4.8.4 蚊虫数据查询
**场景描述**: 从SPI Flash读取指定索引范围的蚊虫数据
**典型操作**:
APP 设置索引范围(命令 0xA4写操作
设备返回成功响应,然后通过通知机制发送每条数据
APP 接收通知数据包,解析并显示蚊虫数据
**索引范围设置**:
**指定范围**: start_index(4字节) + end_index(4字节)
**读取全部**: start_index=0xFFFFFFFF自动设置为0到kill_count-1
**数据格式**:
通知数据包: 索引(4字节) + 蚊虫数据(18字节)
蚊虫数据: 角度(*1000度int32_t支持负数例如90000表示90.000度,-22500表示-22.500度) + 距离(毫米) + 大小(毫米) + 时间(年月日时分秒) + 保留字段
**发送间隔**: 每条数据间隔10ms
**数据来源**: SPI Flash从SPI_FLASH_MOSQUITO_DATA_ADDR开始存储
**使用场景**: 历史数据查询、数据分析、数据导出
**通信流程**:
4.8.5 查询设备传感器数据
**场景描述**: 一次性查询设备温度、3D传感器数据和电容电压
**典型操作**:
APP 查询设备传感器数据(命令 0xA5
设备返回10字节传感器数据温度、X/Y/Z轴加速度、电容电压
APP 解析并显示传感器数据
**使用场景**:
设备状态实时监控
传感器数据采集
设备健康检查
调试和诊断
**通信流程**:
4.8.6 状态变化通知
**场景描述**: 设备状态变化时主动通知 APP
**典型操作**:
设备检测到状态变化(工作状态、硬件状态等)
设备主动发送状态通知(通知类型 0x01
APP 接收并显示状态变化
**使用场景**: 实时状态监控、异常告警
4.9 连接管理类
4.9.1 断开连接
**场景描述**: 主动断开 BLE 连接
**典型操作**:
APP 发送断开连接命令(命令 0x70
设备断开 BLE 连接
APP 端 BLE SDK 检测到连接断开,更新设备状态
**使用场景**: 用户主动断开、设备切换、多用户切换
**通信流程**:
**设备连接流程**:
4.9.2 多用户连接管理
**场景描述**: 多个设备使用者同时在设备边上时BLE连接管理策略
**BLE连接限制**:
点对点连接: BLE是点对点连接协议同一时间设备只能连接一个手机
连接独占: 当一个手机已连接设备时,其他手机无法连接
连接冲突: 多个手机同时尝试连接时,设备只能接受一个连接请求
**连接策略**:
**推荐方案:先连接者优先**** + ****主动断开机制**
**先连接者优先**:
第一个成功连接设备的手机获得连接权限
其他手机连接请求被拒绝
已连接的用户可以正常使用设备(登录、控制、查询等)
**主动断开机制**:
当前连接用户可以通过命令 0x70 主动断开连接
APP提供"断开连接"按钮,方便用户主动断开
断开后,设备释放连接资源,其他用户可以连接
**连接状态提示**:
尝试连接但设备已被占用时APP显示"设备已被其他用户连接,请等待或联系当前用户断开连接"
当前连接用户APP显示"设备已连接"状态
其他用户APP显示"设备已被占用"状态
**连接冲突处理流程**:
**可选优化策略**:
**超时自动断开**:
连接空闲超过一定时间如30分钟自动断开
释放连接资源,方便其他用户连接
需要用户重新连接和登录
**管理员优先连接**:
管理员用户连接时,可请求当前用户断开(需用户确认)
管理员连接请求优先级更高
需要用户确认机制,避免强制断开
**信号强度优先**:
多个连接请求时选择信号强度RSSI值最强的手机
适用于多个用户同时在场的情况
需要BLE模块支持多连接请求处理
**实现要点**:
**设备端**:
通过LINK引脚检测连接状态高电平=已连接)
连接建立时,记录连接状态
连接断开时,释放连接资源
拒绝新的连接请求(如果已有连接)
**APP端**:
通过BLE SDK回调检测连接状态
连接失败时,显示友好的错误提示
提供"断开连接"按钮,方便用户主动断开
显示连接状态(已连接/未连接/连接中)
**使用场景**:
多个家庭成员同时在场,需要切换用户控制设备
设备管理员需要临时接管设备控制权
用户离开设备后,其他用户可以连接使用
**注意事项**:
BLE连接是独占的同一时间只能有一个手机连接
切换用户需要当前用户主动断开连接
远程用户无法通过WiFi抢占BLE连接BLE和WiFi是独立的通信通道
5. OTA 升级功能
5.1 OTA 功能概述
OTAOver-The-Air升级功能允许通过 BLE 无线方式更新设备固件,无需物理连接,大大提升了设备维护和功能更新的便利性。用户可以通过 APP 方便地升级设备固件,获得新功能和 Bug 修复。
5.2 OTA 升级架构
5.3 OTA 升级流程
5.3.1 升级前准备
**版本检查**: APP 使用命令0x80查询设备OTA版本信息固件版本、硬件版本、OTA版本
**兼容性验证**: 验证升级包与设备硬件兼容
**存储空间检查**: 确认 Flash 有足够空间
**用户确认**: 用户确认是否进行升级
**进入升级模式**: 设备进入升级模式,停止正常工作
5.3.2 固件传输
**开始升级命令0x81**:
APP发送版本号(4字节) + 固件大小(4字节) + CRC16校验和(2字节)
设备擦除1MB SPI Flash区域地址0x100000256个扇区每个4KB
设备写入文件头:版本号(4) + 固件大小(4) + CRC16占位(2) = 10字节
文件头CRC16字段初始化为0等待后续验证通过后更新
设备保存期望的CRC16到状态跟踪结构用于后续实时校验
**分包传输命令0x82**:
将固件包分成多个数据包(建议 20-244 字节/包,适配 BLE MTU
每个数据包格式:数据包序号(2字节) + 数据(N字节)
设备将数据顺序写入Flash从地址0x10000A开始
设备实时计算并累积CRC16CRC16-CCITT算法多项式0x1021初始值0xFFFF
当所有数据接收完成时received_size >= firmware_size设备比较计算的CRC16与期望的CRC16
CRC16匹配设置force_boot=1固件有效标记在database的device_info.force_boot中
CRC16不匹配设置force_boot=0固件无效标记在database的device_info.force_boot中
设备返回成功响应,上位机继续发送下一帧
设备跟踪已接收数据大小和当前写入地址
**结束传输命令0x83**:
APP发送总大小(4字节)
设备验证接收数据大小是否匹配
设备保存CRC16到文件头偏移8字节处
设备更新数据库OTA版本db_cfg.device_info.ota_version = 固件版本号)
设备更新数据库force_boot标志db_cfg.device_info.force_boot已在0x82中设置
设备保存数据库
设备清除OTA升级状态
设备返回成功响应
注意CRC16校验已在0x82命令中完成这里只验证大小并保存CRC16到文件头
**进度反馈**: 设备实时跟踪接收进度APP端根据已发送数据包和总数据量计算进度
5.3.3 固件存储格式
**Flash存储格式**:
存储位置SPI Flash地址0x100000大小1MB
文件头10字节地址0x100000-0x100009
字节0-3版本号uint32_t4字节小端序
字节4-7固件大小uint32_t4字节小端序单位字节
字节8-9CRC16uint16_t2字节小端序
文件体从地址0x10000A开始固件数据Bin格式
5.3.4 升级后处理
**设置启动标志**: 在 Bootloader 中设置新固件启动标志
**系统复位**: 复位系统进入 Bootloader
**固件启动**: Bootloader 加载并启动新固件
**启动验证**: 验证新固件是否正常启动
**升级确认**: APP 重新连接设备,确认升级成功
5.4 OTA 安全机制
**固件签名**: 升级包包含数字签名,防止恶意固件
**版本验证**: 只允许升级到更高版本或指定版本
**回滚机制**: 升级失败时自动回滚到原固件
**双重备份**: 保留原固件备份,确保升级安全
**权限验证**: 升级操作需要用户登录认证
5.5 OTA 升级命令
(详细命令格式将在通信协议文档中定义)
OTA_VERSION_QUERY (0x80): 查询OTA版本信息返回固件版本、硬件版本、OTA版本
OTA_START (0x81): 开始升级接收版本号4 + 大小4 + CRC16 2擦除Flash写入文件头保存期望的CRC16
OTA_DATA (0x82): 传输固件数据包接收序号2 + 数据N写入Flash实时计算CRC16当所有数据接收完成时比较CRC16并设置force_boot标志
OTA_END (0x83): 结束传输接收总大小4验证接收数据大小保存CRC16到文件头更新数据库OTA版本和force_boot标志
OTA_VERIFY (0x84): 校验固件已废弃功能已合并到0x82在数据接收时实时校验
OTA_CANCEL (0x85): 取消升级清除OTA状态
**说明**:
升级进度由 APP 端和设备端各自计算,无需查询命令。
**Flash存储格式**
存储位置SPI Flash地址0x1000001MB起始地址大小1MB
文件头10字节版本号(4) + 固件大小(4) + CRC16(2)
文件体固件数据从地址0x10000A开始
CRC16算法CRC16-CCITT多项式0x1021初始值0xFFFF
6. 通信协议框架
6.1 协议结构
优化后的协议结构如下:
**协议优势**:
**统一结构**: 所有命令采用统一的数据包结构,便于解析和处理
**操作分离**: 读/写操作明确分离,简化命令设计
**长度标识**: 明确的数据长度字段,支持可变长度数据
**完整性校验**: 16位 CRC 校验,确保数据传输完整性
**扩展性强**: 命令码空间充足,便于后续功能扩展
6.2 命令分类
采用分组命令码分配策略,便于管理和扩展:
6.2.1 设备注册与认证类 (0x01-0x0F)
6.2.2 系统控制类 (0x10-0x1F)
6.2.3 外设控制类 (0x20-0x3F)
6.2.4 害虫消灭控制类 (0x40-0x4F)
6.2.5 安全设置类 (0x50-0x5F)
6.2.6 高级管理类 (0x60-0x6F)
6.2.7 连接管理类 (0x70-0x7F)
6.2.8 OTA 升级类 (0x80-0x9F)
OTA 命令采用固定长度和可变长度结合:
**说明**:
升级进度由 APP 端和设备端各自计算无需查询命令。APP 端根据已发送数据包和总数据量计算进度,设备端根据已接收数据包和总数据量计算进度。
**CRC16校验流程**
在0x81命令时上位机发送期望的CRC16校验值
在0x82命令传输数据时设备实时计算并累积CRC16
当所有数据接收完成时设备比较计算的CRC16与期望的CRC16
如果CRC16匹配设置force_boot=1固件有效否则设置force_boot=0固件无效
force_boot标志保存在database的device_info.force_boot变量中用于Bootloader判断是否启动新固件
**Flash存储格式**
存储位置SPI Flash地址0x1000001MB起始地址大小1MB
文件头10字节地址0x100000-0x100009
字节0-3版本号uint32_t4字节小端序
字节4-7固件大小uint32_t4字节小端序单位字节
字节8-9CRC16uint16_t2字节小端序
文件体从地址0x10000A开始固件数据Bin格式
数据格式:所有多字节数据采用小端序(低字节在前)
CRC16算法CRC16-CCITT多项式0x1021初始值0xFFFF
6.2.9 状态查询类 (0xA0-0xBF)
6.2.10 保留/扩展 (0xC0-0xFF)
**0xC0-0xDF**: 保留用于未来功能扩展
**0xE0-0xEF**: 设备特定命令
**0xF0-0xFF**: 调试和测试命令
6.3 响应格式
6.3.1 读操作响应
**成功响应**:
**错误响应**:
6.3.2 写操作响应
**成功响应**:
**错误响应**:
6.3.3 设备主动通知
**状态通知**:
**通知类型**:
0x01: 设备状态变化(工作模式变化等)
工作模式变化:待机→扫描、扫描→消杀、消杀→待机等
状态数据:状态码(1字节) + 状态描述(可选)
0x02: 错误状态上报(系统错误、硬件故障等)
数据格式7字节 = 温度错误(1) + 电机错误(1) + 激光器错误(1) + 视觉错误(1) + 加速度错误(1) + 毫米波雷达错误(1) + 激光雷达错误(1)
温度错误0x00=无错误, 0x01=温度过高, 0x02=温度过低
电机错误0x00=无错误, 0x01=温度错误, 0x02=反馈错误
激光器错误0x00=无错误, 0x01=温度过高, 0x02=电压过低, 0x03=电压过高
视觉错误0x00=无错误, 0x01=通信错误
加速度错误0x00=无错误, 0x01=通信错误
毫米波雷达错误0x00=无错误, 0x01=通信错误
激光雷达错误0x00=无错误, 0x01=通信错误
数据来源meas_ctrl.error测量控制模块的错误状态
0x03: 统计数据更新(灭虫数量、工作时间等)
数据格式44字节 = 灭虫数量(4) + 蚊虫数据数量(4) + 扫描次数(4) + 激光发射次数(4) + 总工作时间(4) + 今日工作时间(4) + 工作时间(4) + 角度(4) + 距离(2) + 大小(2) + 时间(6) + 保留(2)
统计数据:灭虫数量、蚊虫数据数量、扫描次数、激光发射次数、总工作时间、今日工作时间、工作时间(本次工作会话时间)
本次虫子数据:角度(*1000度int32_t支持负数例如90000表示90.000度,-22500表示-22.500度、距离毫米、大小毫米、时间year+month+day+hour+minute+second
触发条件每次成功写入蚊虫数据到Flash后发送
0x04: 保留(原连接状态变化通知已删除)
0x05: 安全告警(人体检测、安全保护触发等)
0x06: 参数变化通知(参数被修改时主动通知)
0x07: 保留原设备振动告警功能已合并到0x02错误状态上报中的加速度错误字段
0x08: 蓄能状态通知(电容充电开始/完成)
充电开始:设备开始充电
充电完成:设备准备就绪,可发射激光
0x09: 补光灯连接状态通知(补光灯连接/断开)
连接:补光灯设备已连接
断开:补光灯设备已断开
0x0A: 保留原温度告警通知功能已合并到0x02错误状态上报中的温度错误字段
0x0B: 蚊虫数据通知(查询蚊虫数据时发送)
数据格式:索引(4字节小端序) + 蚊虫数据(18字节)
蚊虫数据结构:角度(4字节*1000度int32_t支持负数例如90000表示90.000度,-22500表示-22.500度) + 距离(2字节毫米) + 大小(2字节毫米) + 时间(6字节year+month+day+hour+minute+second) + 保留(4字节)
发送间隔每条数据间隔10ms
触发条件命令0xA4写操作成功后设备自动发送指定索引范围的所有数据
6.3.4 错误码定义
错误码采用统一格式:
6.4 安全机制
采用多层安全机制:
**用户认证**:
密码验证在云端完成,设备端不验证密码
设备与用户绑定关系存储在云端APP通过云端验证绑定关系
除注册和登录命令外,其他命令需要设备已解锁(设备端记录登录状态)
**权限验证**: 设备端验证设备解锁状态,拒绝未解锁操作
**数据完整性**: CRC16 校验确保数据包完整性
**数据加密**: APP与云端之间的密码传输需要加密使用 HTTPS 或 AES-128
**命令超时**: 设置命令超时时间(建议 5 秒),防止长时间等待
**重传机制**: 校验失败时支持数据包重传(最多 3 次)
6.5 协议实现建议
协议设计遵循以下原则:
**统一包结构**: 所有命令采用统一的数据包结构,简化解析逻辑
**读/写分离**: 明确区分读操作和写操作,提高协议清晰度
**分组管理**: 命令码按功能分组,便于管理和扩展
**固定长度优先**: 优先使用固定长度数据包,提高处理效率
**可变长度支持**: 对于大数据传输(如 OTA支持可变长度数据包
**校验机制**: 使用 CRC16 校验,确保数据传输可靠性
7. 技术实现规范
7.1 通信协议实现规范
**详细通信协议**: 定义完整的命令格式、数据格式、错误码等
**协议结构规范**:
所有命令必须严格遵循 6.1 节定义的协议结构:
**帧头**: 固定为 0xAA 0x552字节标识 BLE 通信数据包
**命令码**: 1字节范围 0x01-0xFF标识具体操作类型参考 6.2 节命令分类)
**读/写标识**: 1字节0x00=读操作0x01=写操作0x02=通知
**长度**: 1字节数据字段长度0-255 字节)
**数据**: N字节命令参数或响应数据可变长度
**校验**: 2字节CRC16 校验LSB + MSB校验范围帧头到数据字段的所有字节
**数据字段规范**:
**字节序**: 采用小端序Little-Endian与 STM32H7 处理器一致
多字节数据(如 16 位、32 位整数)的低字节在前,高字节在后
示例0x1234 存储为 0x34 0x120x12345678 存储为 0x78 0x56 0x34 0x12
**编码**方式:
**ASCII ****字符串**: 用于用户名、设备名称等文本数据,使用 ASCII 编码,不足长度用 0x00 填充
**二进制数据**: 用于传感器数据、状态值等,直接使用二进制表示
**枚举值**: 用于开关状态、模式选择等,使用单字节枚举值(如 0x00=关0x01=开)
**数据对齐**: 单字节数据无需对齐,多字节数据按自然边界对齐
**错误码规范**:
错误码定义参考 6.3.4 节,采用统一格式
错误码在响应数据的第一字节返回(状态码字段)
错误码分类:
0x00: 成功
0x01: 参数错误(参数无效或超出范围)
0x02: 权限错误(用户未登录或权限不足)
0x03: 设备忙(设备正在执行其他操作)
0x04: 命令不支持(命令码不存在或未实现)
0x05: 数据校验失败CRC 校验失败)
0x06: 超时(操作超时)
0x07: 设备错误(设备内部错误)
0x08-0xFF: 保留用于扩展错误码
**协议版本管理**:
协议版本号建议在设备信息查询命令0xA2中返回
版本号格式:主版本号(1字节) + 次版本号(1字节) + 修订号(1字节)
兼容性处理:新版本协议应向后兼容,新增命令使用新的命令码,不修改现有命令格式
**命令格式示例**:
读操作示例(查询设备注册状态,命令 0x01
写操作示例(设备注册绑定,命令 0x02
读操作响应示例(查询设备注册状态,命令 0x01成功响应
写操作响应示例(设备注册绑定,命令 0x02成功响应
错误响应示例(命令 0x02参数错误
**数据加密**: APP 与 BLE 通信不需要应用层加密
**数据完整性保护**:
通过 CRC16 校验确保数据包完整性(参考 6.1 节协议结构)
CRC16 校验范围:帧头到数据字段的所有字节
校验失败时,设备返回错误码 0x05数据校验失败参考 6.3.4 节错误码定义
校验失败时支持数据包重传(最多 3 次),参考 6.4 节安全机制
**敏感数据处理**:
**用户密码**: 在云端验证,不在 BLE 层传输,设备端不存储密码
**设备序列号**: 通过查询命令0xA2获取用于设备识别
**指纹数据**: 仅存储在设备端,不通过 BLE 传输,设备本地验证
**其他敏感数据**: 根据实际需求,可在设备端加密存储,但不在 BLE 通信层传输
**安全机制总结**:
BLE 链路层已提供加密保护
应用层通过 CRC16 校验保证数据完整性
敏感数据不在 BLE 层传输,降低安全风险
与 6.4 节安全机制保持一致:数据完整性通过 CRC16 保证,无需应用层加密
**连接状态检测**: BLE 连接状态检测机制
**APP ****端实现细节**:
**BLE SDK ****回调**: 通过 BLE SDK 提供的连接状态回调函数实时检测连接状态
连接建立onConnectionStateChange(connected)
连接断开onConnectionStateChange(disconnected)
连接失败onConnectionStateChange(failed)
**状态机设计**:
状态:未连接 → 连接中 → 已连接 → 断开中 → 未连接
状态转换触发BLE SDK 回调事件
状态持久化APP 端记录最后连接状态,用于 UI 显示
**参考**: 1.3 节通信特点中说明 BLE 模块提供 LINK 和 WORK 状态引脚
**设备端实现细节**:
**LINK ****引脚检测**: 通过硬件 LINK 引脚检测连接状态
高电平 = 已连接
低电平 = 未连接
**中断处理**: 使用 GPIO 中断检测 LINK 引脚状态变化
上升沿中断:连接建立
下降沿中断:连接断开
**状态上报**: 连接状态由APP端BLE SDK直接检测无需设备端主动通知
注意:仅在连接存在时才能发送通知,连接断开后无法通信
**内部逻辑处理**:
连接断开时,设备自动停止工作(如停止激光发射、停止灭虫任务等)
连接断开时,清理临时数据,保存必要状态
连接建立时,恢复设备状态,准备接收命令
**连接断开后的处理流程**:
**APP ****端**:
检测到连接断开后,更新 UI 显示(显示"设备已断开"
清理命令队列,取消未完成的命令请求
保存设备状态缓存,用于重连后状态同步
**设备端**:
立即停止所有工作(激光发射、灭虫任务等)
保存当前工作状态和参数设置
清理临时数据,准备下次连接
**状态恢复**: 重连后APP 可查询设备状态(命令 0xA0同步设备状态
**重连机制**:
**自动重连策略**: APP 端实现自动重连功能
检测到连接断开后,等待一定时间(建议 1-3 秒)
自动发起重连请求
重连失败后,增加等待时间(指数退避策略)
最多重试 3-5 次,超过次数后提示用户手动重连
**重连间隔**:
首次重连1 秒
第二次重连2 秒
第三次重连4 秒
后续重连8 秒(最大间隔)
**用户手动重连**: 提供手动重连按钮,用户可主动触发重连
**说明**:
连接状态通过硬件 LINK 引脚检测,无需应用层命令查询
如果 BLE 连接断开APP 和设备之间无法通信,因此无需应用层查询命令
与 4.9 节连接管理类保持一致:连接管理通过 BLE SDK 和硬件引脚实现
**多设备管理**(可选功能): 支持一个 APP 管理多个设备
**设备列表数据结构**:
**设备信息**(参考 3.1.1 节设备信息):
设备序列号唯一标识设备主要标识符16字节ASCII编码
设备名称:用户自定义的设备名称(可选,用于显示)
固件版本:设备固件版本号(用于版本管理)
硬件版本:设备硬件版本号
设备 MAC 地址通过查询设备信息命令0x61获取Android/iOS 无法直接获取)
**连接状态**:
连接状态:已连接/未连接/连接中
最后连接时间:记录最后成功连接的时间戳
连接质量信号强度RSSI值
**设备配置缓存**:
最后使用的参数设置(角度、距离等)
设备工作模式(待机/扫描/消杀)
设备硬件状态和错误状态(如有)
**设备切换流程**:
**断开当前设备**:
APP 发送断开连接命令(命令 0x70参考 6.2.7 节连接管理类)
设备收到命令后断开 BLE 连接
APP 端 BLE SDK 检测到连接断开,更新设备状态
**连接新设备**:
APP 扫描并发现目标设备(通过设备序列号或设备名称识别)
APP 发起 BLE 连接请求
连接建立后APP 查询设备注册状态(命令 0x01
如设备已注册APP 提示用户登录(密码或指纹)
登录成功后APP 同步设备状态(查询工作模式、参数设置等)
**状态同步**:
切换设备后APP 查询设备当前状态(命令 0xA0、0xA1等
APP 更新设备配置缓存
APP 显示设备当前状态和参数设置
**批量操作设计**:
**批量查询**: APP 端实现批量查询功能
遍历设备列表,逐个设备执行查询命令
使用操作队列管理批量操作,避免并发冲突
显示批量操作进度(已完成/总数)
操作超时处理:单个设备操作超时后,继续下一个设备
**批量设置**: APP 端实现批量设置功能
遍历设备列表,逐个设备执行设置命令
使用操作队列管理批量操作
显示批量操作进度和结果(成功/失败)
部分失败处理:记录失败设备,操作完成后提示用户
**操作队列**:
使用队列管理批量操作,确保操作顺序
支持取消批量操作(清空队列)
操作失败时,记录错误信息,继续执行后续操作
**设备标识方案**:
**主要标识符**: 设备序列号16字节ASCII编码
通过查询设备信息命令0xA2获取从返回数据中提取序列号
设备序列号唯一标识设备,用于设备识别和绑定
**辅助标识符**: 设备 MAC 地址(可选)
通过查询设备信息命令0xA2获取
注意Android 6.0+ 和 iOS 7+ 无法直接获取 BLE MAC 地址(参考 3.1.1 节说明)
设备识别主要使用设备序列号
用户**标识**: 设备名称(用户自定义)
用于 APP 界面显示,方便用户识别设备
设备名称可重复,不作为唯一标识
**设备分组和分类**:
**按房间分组**: 用户可将设备按房间分组(客厅、卧室、厨房等)
APP 端实现分组管理功能
分组信息仅存储在 APP 端,不传输到设备
**按**类型**分类**: 根据设备功能分类(灭虫设备、其他设备等)
APP 端实现分类管理功能
用于批量操作时的设备筛选
自定义**标签**: 用户可为设备添加自定义标签
APP 端实现标签管理功能
标签信息仅存储在 APP 端
**说明**:
多设备管理为可选功能APP 可根据实际需求实现
所有操作使用 6.1 节的通信帧结构(帧头 0xAA 0x55、命令码、读/写、长度、数据、CRC16
仅涉及 APP 端设备管理,不涉及云端
设备切换时,确保当前设备操作完成后再切换
批量操作时,注意 BLE 连接限制(同一时间只能连接一个设备)
**状态同步**: 设备状态变化时主动通知 APP
**状态变化检测**:
**状态机**设计(参考 3.6 节设备状态监控):
工作模式:待机 → 扫描 → 消杀 → 待机
硬件状态:正常 → 异常 → 正常(包含错误状态)
**变化**触发**条件**:
工作模式变化:用户操作、设备自动切换
硬件状态变化:硬件故障检测、硬件恢复检测、错误发生、错误恢复
参数变化:参数被修改(通过 APP 或设备本地操作)
**状态变化检测机制**:
设备端实时监测各状态值
状态值变化时,立即触发状态变化事件
状态变化事件触发主动通知(参考 6.3.3 节设备主动通知)
**通知优先级**:
紧急状态(最高优先级):
错误状态上报(通知类型 0x02硬件异常、系统错误等包含温度错误、加速度错误/振动、电机错误、激光器错误、视觉错误、毫米波雷达错误、激光雷达错误)
安全告警(通知类型 0x05人体检测、安全保护触发
处理:立即显示告警,中断当前操作(如需要)
**普通**状态(中等优先级):
设备状态变化(通知类型 0x01工作模式变化等
参数变化通知(通知类型 0x06参数被修改
处理:更新 UI 显示,记录状态变化
**统计**信息(低优先级):
统计数据更新(通知类型 0x03灭虫数量、工作时间等包含本次虫子的详细信息角度、距离、大小、时间
蓄能状态通知(通知类型 0x08电容充电开始/完成
补光灯连接状态通知(通知类型 0x09补光灯连接/断开
蚊虫数据通知(通知类型 0x0B查询蚊虫数据时发送每条数据间隔10ms
处理:后台更新统计数据,不中断用户操作
**通知可靠性**:
**确认**机制:
APP 收到通知后,可发送确认响应(可选)
设备端记录通知发送状态,用于重传判断
**重传**策略:
通知发送失败时(如连接断开),设备端记录未确认通知
连接恢复后,设备端重新发送未确认的通知
重传次数限制:最多重传 3 次
**通知去重**:
设备端记录最后发送的通知内容
相同内容的通知不重复发送(避免重复通知)
状态值变化时才发送通知(避免重复通知)
**状态缓存和同步**:
**APP ****端状态缓存**:
APP 端缓存设备状态(工作模式、硬件状态、参数设置等)
状态缓存用于 UI 显示,减少查询命令
状态缓存更新:收到通知时更新,查询命令返回时更新
状态缓存持久化APP 退出时保存,启动时恢复
**设备端**状态**持久化**:
设备端持久化关键状态(参数设置、工作模式等)
状态持久化到 Flash设备重启后恢复
状态变化时,立即更新持久化存储
**状态同步机制**:
连接建立后APP 查询设备当前状态(命令 0xA0、0xA1等
APP 比较缓存状态和设备状态,如有差异则更新缓存
设备端状态变化时主动发送通知APP 更新缓存
**状态冲突处理**:
**APP ****和设备**状态**不一致**:
场景APP 缓存状态与设备实际状态不一致
处理连接建立后APP 查询设备当前状态,同步状态缓存
**并发操作**冲突:
场景APP 发送设置命令,同时设备状态发生变化
处理:设备端优先处理设置命令,状态变化通知在命令处理完成后发送
**状态回滚**:
场景:设备状态变化后,用户需要恢复到之前状态
处理APP 发送恢复命令,设备执行状态恢复,发送状态变化通知
**通知格式**:
所有通知使用 6.1 节的通信帧结构:
帧头0xAA 0x55
通知码:与命令码区分(建议使用 0xF0-0xFF 范围)
读/写标识0x02表示通知
长度:通知数据长度
数据:通知类型(1字节) + 通知数据(参考 6.3.3 节设备主动通知)
校验CRC16 校验
与 6.3.3 节设备主动通知保持一致,参考通知类型 0x01-0x0B注意0x07和0x0A已合并到0x02
**通知格式示例**:
设备状态变化通知示例(通知类型 0x01工作状态变化
错误状态上报通知示例(通知类型 0x02振镜电机异常
**说明**:
状态同步机制确保 APP 和设备状态一致
通知优先级确保重要状态及时通知用户
状态缓存减少查询命令,提高通信效率
所有通知使用 6.1 节的通信帧结构(读/写标识为 0x02 表示通知)
7.2 协议文档规划
后续将添加以下详细协议文档,所有文档必须遵循 6.1 节的通信帧结构(帧头 0xAA 0x55、命令码、读/写标识、长度、数据、CRC16 校验)。
7.2.1 BLE 通信协议详细规范.md
**文档目的**: 定义完整的命令格式、数据格式、字节序和编码规范
**目录结构**:
**协议概述**
协议版本信息
协议结构说明(参考 6.1 节)
通信流程概述
**命令格式定义**(基于 6.2 节命令分类)
设备注册与认证类 (0x01-0x0F)
每个命令的详细格式
请求格式(帧头、命令码、读/写、长度、数据、校验)
响应格式(成功/失败)
数据字段详细说明
系统控制类 (0x10-0x1F)
外设控制类 (0x20-0x3F)
害虫消灭控制类 (0x40-0x4F)
安全设置类 (0x50-0x5F)
高级管理类 (0x60-0x6F)
连接管理类 (0x70-0x7F)
OTA 升级类 (0x80-0x9F)
状态查询类 (0xA0-0xBF)
**数据格式定义**
字节序规范(小端序,与 STM32H7 一致)
编码方式ASCII 字符串、二进制数据、枚举值)
数据结构定义
用户信息结构
设备状态结构
参数配置结构
传感器数据结构
**响应格式定义**(基于 6.3 节响应格式)
读操作响应(成功/失败)
写操作响应(成功/失败)
设备主动通知格式
**错误码定义**(基于 6.3.4 节错误码定义)
错误码列表
错误原因说明
错误处理建议
**编写优先级**: 高(基础协议文档)
7.2.2 OTA 升级协议详细规范.md
**文档目的**: 定义 OTA 升级的详细协议和流程
**目录结构**:
**升级概述**
OTA 功能说明(参考 5.1 节)
升级架构(参考 5.2 节)
**升级流程详细说明**(基于 5.3 节)
升级前准备
固件传输流程
固件烧录流程
升级后处理流程
**数据包格式**(基于 6.2.8 节 OTA 升级类)
查询OTA版本信息命令 0x80返回12字节固件版本4 + 硬件版本4 + OTA版本4
开始升级(命令 0x81接收版本号4 + 大小4擦除Flash写入文件头
传输固件数据(命令 0x82接收序号2 + 数据N写入Flash
结束传输(命令 0x83接收总大小4验证接收数据大小
结束传输(命令 0x83接收总大小4验证接收数据大小保存CRC16到文件头更新数据库OTA版本和force_boot标志
取消升级(命令 0x85清除OTA状态
所有命令使用 6.1 节的通信帧结构
**错误处理机制**
升级过程中的错误处理
错误恢复机制
回滚机制
**安全机制**(参考 5.4 节)
固件签名验证
版本验证
权限验证
**编写优先级**: 中(重要功能文档)
7.2.3 错误码定义.md
**文档目的**: 详细定义所有错误码及其处理方式
**目录结构**:
**错误码概述**
错误码格式说明(参考 6.3.4 节)
错误码分类
**标准错误码列表**(基于 6.3.4 节)
0x00: 成功
0x01: 参数错误
0x02: 权限错误
0x03: 设备忙
0x04: 命令不支持
0x05: 数据校验失败
0x06: 超时
0x07: 设备错误
每个错误码包含:
错误码值
错误含义
错误原因说明
错误处理建议
典型场景示例
**扩展错误码**0x08-0xFF
保留用于未来扩展
扩展错误码定义规范
**错误处理流程**
APP 端错误处理流程
设备端错误处理流程
错误恢复机制
**编写优先级**: 高(基础协议文档)
7.2.4 数据格式定义.md
**文档目的**: 定义所有数据结构的详细格式
**目录结构**:
**数据格式概述**
字节序规范(小端序)
编码方式ASCII、二进制、枚举
数据对齐规则
**基础数据类型**
单字节数据类型
多字节数据类型16位、32位
字符串类型
枚举类型
**数据结构定义**
**用户信息结构**
用户名16字节ASCII
指纹ID1字节uint8_t类型0-255
指纹ID有效标志1字节0=无效1=有效)
设备状态结构
工作模式(待机/扫描/消杀)
硬件状态(正常/异常,包含错误状态)
错误状态(错误码、错误描述,属于硬件状态)
**参数配置结构**
角度控制参数2字节
距离控制参数4字节
安全设置参数(开关、灵敏度、阈值等)
**命令数据格式**(按命令分类)
设备注册与认证类数据格式
系统控制类数据格式
外设控制类数据格式
害虫消灭控制类数据格式
安全设置类数据格式
状态查询类数据格式
**通知数据格式**(参考 6.3.3 节)
各通知类型的数据格式
通知数据示例
**编写优先级**: 高(基础协议文档)
7.2.5 文档关联关系
**BLE ****通信协议详细**规范**.md** 是核心文档,其他文档作为补充
错误码定义.md 和 数据格式定义.md 被 BLE 通信协议详细规范.md 引用
**OTA ****升级协议详细规范.md** 是独立的功能文档,但遵循相同的协议结构
7.2.6 文档维护和更新机制
版本管理: 每个文档包含版本号,与主方案文档版本号关联
兼容性: 新版本协议应向后兼容,文档中明确标注兼容性说明
文档审核: 协议文档编写完成后需与主方案文档6.1-6.3 节)进行一致性检查
**说明**:
所有协议文档必须遵循 6.1 节的通信帧结构
仅涉及 APP 与设备 BLE 通信协议,不涉及云端协议
所有命令、响应、通知格式必须与 6.2 节和 6.3 节保持一致
| 版本 | 日期 | 更改内容 | 更改人 |
|---|---|---|---|
| V2.2 | 20260226 | 主要更新内容:
补充补光灯控制指令;
添加0X56环境变化检测以及试射测试指令
补充0XA1硬件状态说明
部分0X80查询版本信息说明
优化0XA3、0XA4指令协议 | |
| v2.1 | 2025-12-25 | 主要更新内容:
- 数据格式优化:角度字段精度提升,年份格式优化,定时任务格式改进
- OTA升级流程完善版本信息扩展CRC校验优化Flash存储优化
- 通知机制优化错误状态扩展为7字节统计数据扩展为44字节删除重复通知
- 命令功能完善:合并重复命令,新增传感器数据查询命令,完善用户认证和指纹功能
- 外设控制完善LCD、RGB、WIFI等外设控制功能优化
- 安全设置完善:毫米波雷达、视觉检测、加速度传感器等安全功能完善
- 文档结构优化:修正工作状态定义,新增设备分享和多用户管理章节 | - |
| V1.1 | 2025-11-11 | 修正工作状态定义:
- 将"查询设备工作状态"改为"查询设备工作模式"
- 工作模式仅保留三种:待机、扫描、消杀(移除运行、蓄能、停止、错误)
- 将错误状态归类到硬件状态中
- 更新所有相关章节和命令说明
- 新增设备分享流程章节4.1.5
- 新增多用户连接管理章节4.9.2 | - |
| 命令码 | 指令名称 | 读/写 | 说明 | 备注 |
|---|---|---|---|---|
| 0x01 | 查询设备注册状态 | 读 | 返回设备是否已注册(1字节) | 设备首次连接时查询,判断是否需要注册 |
| 0x02 | 设备注册绑定 | 写 | 用户名(16) | 设备首次注册时使用APP将绑定关系存储到云端仅发送用户名到设备 |
| 0x03 | 用户登录(密码) | 写 | 用户名(16) + 解锁状态(1) | 已注册设备登录时使用密码方式APP云端验证通过后发送解锁状态 |
| 0x04 | 指纹登录使能设置 | 写 | 用户名(16) + 使能状态(1) | 设置指定用户的指纹登录使能状态0=禁用, 1=使能),需要设备已解锁 |
| 0x05 | 指纹录制请求 | 写 | 用户名(16) | 启动指纹注册流程,需要设备已解锁
功能验证用户名分配或使用已有的page_id启动指纹注册状态机
注册完成后自动更新数据库finger_id和finger_id_valid字段 |
| 0x06 | 保留 | - | - | 扩展用 |
| 0x07 | 查询用户列表 | 读 | 返回用户列表 | 管理员查询设备绑定的所有用户信息 |
| 0x08 | 注销用户 | 写 | 用户名(16) | 删除设备绑定的用户,需要设备已解锁
功能:验证用户名,删除指纹模板(如果存在),删除用户信息
如果删除后没有用户了,自动重置设备注册状态 |
| 命令码 | 指令名称 | 读/写 | 说明 | 备注 |
|---|---|---|---|---|
| 0x10 | 语言设置 | 读/写 | 0x00=英文, 0x01=中文 | 用户个性化设置,更改设备显示语言 |
| 0x11 | 时间设置 | 读/写 | 年(1) + 月(1) + 日(1) + 时(1) + 分(1) + 秒(1)
1字节相对于2000年的偏移0-255对应2000-2255年 | 设备时间同步,用于定时功能 |
| 0x12 | 定时任务设置 | 读/写 | 写任务ID(1) + 开关(1) + 开始小时(1) + 开始分钟(1) + 结束小时(1) + 结束分钟(1) + 模式(1) + 重复(1)
读:返回所有定时任务列表(最多5组每组7字节)
时间范围0-23小时0-59分钟
重复bit0周一,bit1周二,bit2周三,bit3周四,bit4周五,bit5周六,bit6周日 | 自动化控制在指定时间范围内运行指定模式支持按周重复最多设置5组定时任务 |
| 0x13-0x1F | 保留 | - | - | 扩展用 |
| 命令码 | 指令名称 | 读/写 | 说明 | 备注 |
|---|---|---|---|---|
| 0x20 | LCD 休眠设置 | 读/写 | 字节0休眠开关(0x00=关, 0x01=开)
字节1休眠时间(0x01=1分钟, 0x05=5分钟, 0x0A=10分钟, 0x1E=30分钟) | 节能管理设置LCD显示屏休眠开关和休眠时间 |
| 0x21 | LCD 亮度设置 | 读/写 | 字节0自适应开关(0x00=关闭自适应, 0x01=开启自适应)
字节1亮度值(10-100仅在自适应关闭时有效) | 显示优化设置LCD亮度自适应开关和亮度值 |
| 0x22 | RGB 指示灯控制 | 读/写 | 开关(1) + R(1) + G(1) + B(1) + 效果(1) | 状态指示,个性化设置指示灯颜色和效果
效果0x00=闪烁, 0x01=常亮, 0x02=警示 |
| 0x23 | WIFI 控制 | 读/写 | 读65字节
写:可变长度 | 网络配置控制WIFI开关和连接信息
读操作返回65字节开关1字节 + SSID 32字节 + 密码32字节
写操作字节0为开关(0x00=关, 0x01=开)字节1-N为SSID字符串(以\0结尾最多32字节可选)字节N+1-M为密码字符串(以\0结尾最多32字节可选) |
| 0x24 | BLE 控制 | 读/写 | 名称 | 蓝牙配置设置BLE广播名称BLE功能始终开启不支持关闭 |
| 0x25 | 多媒体控制 | 读/写 | 读5字节
写:可变长度 | 功能配置,控制视频录制和音效设置
读操作返回5字节视频录制开关1字节 + 录制时长1字节 + 音效开关1字节 + 音效类型1字节 + 音量1字节
写操作字节0为视频录制开关(0x00=关, 0x01=开)字节1为录制时长(1字节0x03=3秒, 0x05=5秒, 0x0A=10秒)字节2为音效开关(0x00=关, 0x01=开)字节3为音效类型(0x00=Hello, 0x01=Goodbye, 0x02=Test, 0x03=BIU, 0x04=Main)字节4为音量(0-15对应芯片E0-EF共16级) |
| 0x26 | 补光灯控制 | 读/写 | 开关(1) + 类型(1) + 光照强度(1) | 夜间补光,控制补光灯开关、类型和光照强度 |
| 0x27 | 查询补光灯连接状态 | 读 | 返回连接状态(0=未连接, 1=已连接) | 设备管理,查询补光灯外部设备连接状态 |
| 0x28 | 可见光激光器控制 | 读/写 | 0x00=关, 0x01=开 | 激光控制,控制可见光激光器开关 |
| 命令码 | 指令名称 | 读/写 | 说明 | 备注 |
|---|---|---|---|---|
| 0x40 | 角度控制 | 读/写 | 角度范围(2字节) | 扫描范围调整,设置激光扫描角度范围
读操作返回2字节角度范围小端序单位0.1度)
写操作接收2字节角度范围小端序单位0.1度)
角度范围1-900对应0.1度-90度(uint8_t)(angle_range & 0xFF); (uint8_t)((angle_range >> 8) & 0xFF); |
| 0x41 | 距离控制 | 读/写 | 检测距离(2) + 瞄准距离(2) | 检测范围优化,设置害虫检测和瞄准距离 |
| 0x42-0x4F | 保留 | - | - | 扩展用
0x42害虫类型、0x43启动/停止、0x44查询消灭状态已删除 |
| 命令码 | 指令名称 | 读/写 | 说明 | 备注 |
|---|---|---|---|---|
| 0x50 | 毫米波雷达设置 | 读/写 | 开关(1) + 灵敏度(1) + 距离(2) | 人体检测,配置毫米波雷达检测参数和安全距离
读操作返回4字节开关1字节 + 灵敏度1字节 + 安全距离2字节
写操作接收4字节开关1字节 + 灵敏度1字节 + 安全距离2字节
开关0x00=关闭, 0x01=开启
灵敏度0x00=低, 0x01=中, 0x02=高
安全距离2字节小端序单位0.1米范围1-1000.1米-10米 |
| 0x51 | 视觉检测设置 | 读/写 | 开关(1) + 灵敏度(1) | 安全检测,配置视觉检测开关和灵敏度
读操作返回2字节开关1字节 + 灵敏度1字节
写操作接收2字节开关1字节 + 灵敏度1字节
开关0x00=关闭, 0x01=开启
灵敏度0x00=低, 0x01=中, 0x02=高 |
| 0x52 | 加速度传感器设置 | 读/写 | 开关(1) + 灵敏度(1) + 阈值(1) | 稳定性检测,配置振动检测参数,确保设备稳定放置
读操作返回3字节开关1字节 + 灵敏度1字节 + 振动阈值1字节
写操作接收3字节开关1字节 + 灵敏度1字节 + 振动阈值1字节
开关0x00=关闭, 0x01=开启
灵敏度0x00=低, 0x01=中, 0x02=高
振动阈值1-255 |
| 0x53 | 查询加速度传感器数据 | 读 | 返回X(2) + Y(2) + Z(2)轴加速度值 | 数据监控查询3轴加速度传感器实时数据
读操作返回6字节X轴加速度2字节 + Y轴加速度2字节 + Z轴加速度2字节
数据格式每个轴2字节小端序有符号整数int16_t
单位mg毫重力加速度
数据范围:-32768到32767对应-32768mg到32767mg |
| 0x54 | 保留 | - | - | 扩展用
0x54查询振动状态、0x56查询当前温度、0x57查询温度状态的功能已合并到0xA5"查询设备传感器数据"中 |
| 0x55 | 温度监控设置 | 读/写 | 告警阈值(1) + 停止阈值(1) + 开关(1) | 超温保护,设置温度告警和停止阈值 |
| 0X56 | 环境变化检测和试射测试 | 读/写 | 1 | 读操作返回1字节环境变化状态0-没有变化1-发生变化)
写操作触发激光进行3次试射测试每次间隔1秒每次持续10ms.写操作0X01进行激光测试
说明,仅用于触发测试 |
| 命令码 | 指令名称 | 读/写 | 说明 | 备注 |
|---|---|---|---|---|
| 0x60 | 恢复出厂设置 | 写 | 需要管理员权限 | 设备管理,恢复设备到出厂默认状态(需管理员权限) |
| 0x61-0x63 | 保留 | - | - | 已删除功能已合并到0xA2命令中参考2.9节) |
| 命令码 | 指令名称 | 读/写 | 说明 | 备注 |
|---|---|---|---|---|
| 0x70 | 断开连接 | 写 | 主动断开连接 | 连接管理APP主动断开BLE连接 |
| 命令码 | 指令名称 | 读/写 | 说明 | 备注 |
|---|---|---|---|---|
| 0x80 | 查询OTA版本信息 | 读 | 返回12字节版本信息固件版本4 + 硬件版本4 + OTA版本4 | OTA升级查询设备当前固件版本、硬件版本和OTA版本信息用于升级前版本检查 |
| 0x81 | 开始升级 | 写 | 版本号(4) + 大小(4) + CRC16(2) | OTA升级启动固件升级流程
功能擦除1MB SPI Flash区域地址0x100000写入文件头版本号、固件大小、CRC16占位为0保存期望的CRC16
数据格式:版本号(4字节小端序) + 固件大小(4字节小端序) + CRC16校验和(2字节小端序)
Flash操作擦除256个扇区每个4KB写入文件头10字节
CRC16从0x81命令接收用于后续实时校验 |
| 0x82 | 传输固件数据 | 写 | 数据包序号(2) + 数据(N) | OTA升级分包传输固件数据包
功能将数据写入Flash实时计算并累积CRC16当所有数据接收完成时比较CRC16并设置force_boot标志
数据格式:数据包序号(2字节小端序) + 数据(N字节)
写入位置从文件体起始地址0x100000 + 10开始顺序写入
CRC16校验实时累积计算CRC16当所有数据接收完成时如果CRC16匹配则设置force_boot=1有效否则设置force_boot=0无效 |
| 0x83 | 结束传输 | 写 | 总大小(4) | OTA升级固件数据传输完成确认总大小
功能验证接收数据大小是否匹配保存CRC16到文件头并更新数据库
数据格式:总大小(4字节小端序)
验证:比较接收的总大小与已接收数据大小是否一致
注意CRC16校验已在0x82命令中完成这里只验证大小并保存CRC16到文件头 |
| 0x84 | 保留 | - | - | 已废弃CRC校验功能已合并到0x82传输固件数据命令中在数据接收时实时校验 |
| 0x85 | 取消升级 | 写 | 取消标志(1) | OTA升级取消正在进行的升级操作
功能清除OTA升级状态
数据格式:取消标志(1字节值任意) |
| 命令码 | 指令名称 | 读/写 | 说明 | 备注 |
|---|---|---|---|---|
| 0xA0 | 工作模式设置 | 读/写 | 读返回1字节工作模式0x00=待机, 0x01=扫描, 0x02=消杀)
接收1字节工作模式0x00=待机, 0x01=扫描, 0x02=消杀) | 状态监控和控制,查询或设置设备当前工作模式 |
| 0xA1 | 查询硬件状态 | 读 | 返回7字节硬件错误状态
数据格式:温度错误(1) + 电机错误(1) + 激光器错误(1) + 视觉错误(1) + 加速度错误(1) + 毫米波雷达错误(1) + 激光雷达错误(1)
数据来源meas_ctrl.error | 硬件监控,查询各硬件模块的错误状态 |
| 0xA2 | 查询设备信息 | 读/写 | 读返回76字节设备信息
接收56字节设备信息
读数据格式:设备序列号(16) + 设备型号(16) + 设备ID(16) + BLE MAC地址(6) + WiFi MAC地址(6) + 固件版本(4) + 硬件版本(4) + OTA版本(4)
写数据格式:设备序列号(16) + 设备型号(16) + 设备ID(16) + 固件版本(4) + 硬件版本(4)
数据来源/存储db_cfg.device_info | 设备信息查询和设置查询或设置设备基本信息序列号、型号、ID、版本信息等 |
| 0xA3 | 查询统计数据 | 读 | 返回32字节统计数据24字节 + datalog日志信息154字节
统计数据:灭虫数量(4) + 总工作时间(4) + 今日工作时间(4) + 扫描次数(4) + 激光发射次数(4) + 蚊虫数据数量(4)+本地记录4 | 数据统计,查询设备工作统计数据和历史日志索引 |
| 0xA4 | 查询蚊虫数据 | 读/写 | 写接收8字节start_index 4字节 + end_index 4字节小端序
如果start_index=0xFFFFFFFF表示读取全部数据
返回当前设置的索引范围start_index 4字节 + end_index 4字节
数据发送通过通知机制通知类型0x0B发送每条蚊虫数据22字节索引4字节 + 数据18字节每条数据间隔10ms
数据来源SPI Flash | 数据查询从SPI Flash读取指定索引范围的蚊虫数据 |
| 0xA5 | 查询设备传感器数据 | 读 | 返回10字节传感器数据
数据格式:温度(2字节单位0.1°C) + X轴加速度(2字节单位mg) + Y轴加速度(2字节单位mg) + Z轴加速度(2字节单位mg) + 电容电压(2字节单位0.01V)
数据来源meas_ctrl.temp、meas_ctrl.accel、capture_get_laser_gun_dev()->current_voltage | 传感器数据查询一次性获取设备温度、3D传感器数据和电容电压 |
| 0xA6-0xBF | 保留 | - | - | 扩展用 |
| 帧头 | 命令 | 读/写 | 长度 | 数据 | 校验 |
|---|---|---|---|---|---|
| 2字节 | 1字节 | 1字节 | 1字节 | N字节 | 2字节 |
| 固定标识 0xAA 0x55标识 BLE 通信数据包 | 命令码0x01-0xFF标识具体操作类型 | 操作类型标识0x00=读操作0x01=写操作0x02=通知 | 数据字段长度0-255 字节) | 命令参数或响应数据(可变长度) | CRC16 校验LSB + MSB校验范围帧头到数据字段的所有字节 |
| 命令码 | 命令名称 | 读/写 | 数据长度 | 说明 |
|---|---|---|---|---|
| 0x01 | 查询设备注册状态 | 读 | 1 | 返回设备是否已注册 |
| 0x02 | 设备注册绑定 | 写 | 16 | 用户名(16),绑定关系存储在云端 |
| 0x03 | 用户登录(密码) | 写 | 17 | 用户名(16) + 解锁状态(1)APP云端验证后发送 |
| 0x04 | 指纹登录使能设置 | 写 | 17 | 用户名(16) + 使能状态(1)使能状态0x00=禁用, 0x01=使能 |
| 0x05 | 指纹录制请求 | 写 | 16 | 用户名(16)
功能:启动指纹注册流程
- 验证用户名是否存在
- 确定page_id如果用户已有finger_id使用它重新注册否则分配新的page_id
- 检查指纹库是否已满
- 启动指纹注册状态机(异步处理)
- 注册成功后自动更新数据库finger_id和finger_id_valid字段
权限要求:需要设备已解锁,且不能有注册正在进行中
错误码:用户不存在(0x03)、权限拒绝(0x02)、设备错误(0x07)
说明注册状态可通过查询用户列表0x07查看finger_id_valid字段 |
| 0x06 | 保留 | - | - | 扩展用 |
| 0x07 | 查询用户列表 | 读 | 可变 | 返回用户列表
数据格式:用户数量(1字节) + 每个用户:用户名(16字节) + 指纹ID(1字节) + 指纹ID有效标志(1字节)
说明指纹ID为uint8_t类型0-255指纹ID有效标志0=无效1=有效 |
| 0x08 | 注销用户 | 写 | 16 | 用户名(16)
功能:删除设备绑定的用户
- 验证用户名是否存在
- 如果用户有有效的指纹IDfinger_id_valid == 1删除指纹库中对应的模板
- 删除用户信息用户名、指纹ID、登录时间等
- 检查是否还有用户存在如果没有用户了重置设备注册状态registered = 0
- 保存数据库
权限要求:需要设备已解锁
错误码:用户不存在(0x03)、权限拒绝(0x02)、设备错误(0x07) |
| 0x09-0x0F | 保留 | - | - | 扩展用 |
| 命令码 | 命令名称 | 读/写 | 数据长度 | 说明 |
|---|---|---|---|---|
| 0x10 | 语言设置 | 读/写 | 1 | 0x00=英文, 0x01=中文 |
| 0x11 | 时间设置 | 读/写 | 6 | 年(1) + 月(1) + 日(1) + 时(1) + 分(1) + 秒(1)
1字节相对于2000年的偏移0-255对应2000-2255年 |
| 0x12 | 定时任务设置 | 读/写 | 写8
读:可变(最多35) | 写任务ID(1) + 开关(1) + 开始小时(1) + 开始分钟(1) + 结束小时(1) + 结束分钟(1) + 模式(1) + 重复(1)
任务ID0-4对应数组索引
开关0x00=禁用, 0x01=启用
开始小时0-23
开始分钟0-59
结束小时0-23
结束分钟0-59
模式:待机(0x00用于定时关机)、扫描(0x01)、消杀(0x02)
重复1字节按位表示星期几重复执行
- bit0: 周一 (0x01)
- bit1: 周二 (0x02)
- bit2: 周三 (0x04)
- bit3: 周四 (0x08)
- bit4: 周五 (0x10)
- bit5: 周六 (0x20)
- bit6: 周日 (0x40)
读:返回所有定时任务列表(最多5组每组7字节=开关+开始小时+开始分钟+结束小时+结束分钟+模式+重复) |
| 0x13-0x1F | 保留 | - | - | 扩展用 |
| 命令码 | 命令名称 | 读/写 | 数据长度 | 说明 |
|---|---|---|---|---|
| 0x20 | LCD 休眠设置 | 读/写 | 2 | 字节0休眠开关(0x00=关, 0x01=开)
字节1休眠时间(0x01=1分钟, 0x05=5分钟, 0x0A=10分钟, 0x1E=30分钟) |
| 0x21 | LCD 亮度设置 | 读/写 | 2 | 字节0自适应开关(0x00=关闭自适应, 0x01=开启自适应)
字节1亮度值(10-100仅在自适应关闭时有效) |
| 0x22 | RGB 指示灯控制 | 读/写 | 5 | 开关(1) + R(1) + G(1) + B(1) + 效果(1)
效果0x00=闪烁, 0x01=常亮, 0x02=警示 |
| 0x23 | WIFI 控制 | 读/写 | 读65
写:可变 | 读操作返回65字节开关1字节 + SSID 32字节 + 密码32字节
写操作字节0为开关(0x00=关, 0x01=开)字节1-N为SSID字符串(以\0结尾最多32字节可选)字节N+1-M为密码字符串(以\0结尾最多32字节可选)
说明写操作至少需要1字节开关SSID和密码为可选字段 |
| 0x24 | BLE 控制 | 读/写 | 可变 | 名称BLE功能始终开启不支持关闭 |
| 0x25 | 多媒体控制 | 读/写 | 读5
写:可变 | 读操作返回5字节视频录制开关1字节 + 录制时长1字节 + 音效开关1字节 + 音效类型1字节 + 音量1字节
写操作字节0为视频录制开关(0x00=关, 0x01=开)字节1为录制时长(1字节0x03=3秒, 0x05=5秒, 0x0A=10秒)字节2为音效开关(0x00=关, 0x01=开)字节3为音效类型(0x00=Hello, 0x01=Goodbye, 0x02=Test, 0x03=BIU, 0x04=Main)字节4为音量(0-15)
说明写操作至少需要1字节视频录制开关其他字段为可选 |
| 0x26 | 补光灯控制 | 读/写 | 3 | 开关(1) + 类型(1) + 光照强度(1)
类型0-红外光1-白光;
光照强度0-低、1-中、2-高 |
| 0x27 | 查询补光灯连接状态 | 读 | 1 | 返回连接状态(0=未连接, 1=已连接) |
| 0x28 | 可见光激光器控制 | 读/写 | 1 | 0x00=关, 0x01=开 |
| 0x29-0x3F | 保留 | - | - | 扩展用 |
| 命令码 | 命令名称 | 读/写 | 数据长度 | 说明 |
|---|---|---|---|---|
| 0x40 | 角度控制 | 读/写 | 2 | 读操作返回2字节角度范围小端序单位0.1度)
写操作接收2字节角度范围小端序单位0.1度)
角度范围1-900对应0.1度-90度
说明:数据格式为小端序(低字节在前,高字节在后) |
| 0x41 | 距离控制 | 读/写 | 4 | 检测距离(2) + 瞄准距离(2) |
| 0x42-0x4F | 保留 | - | - | 扩展用
0x42害虫类型、0x43启动/停止、0x44查询消灭状态已删除 |
| 命令码 | 命令名称 | 读/写 | 数据长度 | 说明 |
|---|---|---|---|---|
| 0x50 | 毫米波雷达设置 | 读/写 | 4 | 读操作返回4字节开关1字节 + 灵敏度1字节 + 安全距离2字节
写操作接收4字节开关1字节 + 灵敏度1字节 + 安全距离2字节
开关0x00=关闭, 0x01=开启
灵敏度0x00=低, 0x01=中, 0x02=高
安全距离2字节小端序单位0.1米范围1-1000.1米-10米
说明:数据格式为小端序(低字节在前,高字节在后) |
| 0x51 | 视觉检测设置 | 读/写 | 2 | 读操作返回2字节开关1字节 + 灵敏度1字节
写操作接收2字节开关1字节 + 灵敏度1字节
开关0x00=关闭, 0x01=开启
灵敏度0x00=低, 0x01=中, 0x02=高 |
| 0x52 | 加速度传感器设置 | 读/写 | 3 | 读操作返回3字节开关1字节 + 灵敏度1字节 + 振动阈值1字节
写操作接收3字节开关1字节 + 灵敏度1字节 + 振动阈值1字节
开关0x00=关闭, 0x01=开启
灵敏度0x00=低, 0x01=中, 0x02=高
振动阈值1-255 |
| 0x53 | 查询加速度传感器数据 | 读 | 6 | 读操作返回6字节X轴加速度2字节 + Y轴加速度2字节 + Z轴加速度2字节
数据格式每个轴2字节小端序有符号整数int16_t
单位mg毫重力加速度
数据范围:-32768到32767对应-32768mg到32767mg
说明:数据格式为小端序(低字节在前,高字节在后),有符号整数 |
| 0x54 | 保留 | - | - | 扩展用
0x54查询振动状态、0x56查询当前温度、0x57查询温度状态的功能已合并到0xA5"查询设备传感器数据"中 |
| 0x55 | 温度监控设置 | 读/写 | 3 | 告警阈值(1) + 停止阈值(1) + 开关(1) |
| 0X56 | 环境变化检测和试射测试 | 读/写 | 1 | 读操作返回1字节环境变化状态0-没有变化1-发生变化)
写操作触发激光进行3次试射测试每次间隔1秒每次持续10ms.写操作0X01进行激光测试
说明,仅用于触发测试 |
| 0x57-0x5F | 保留 | - | - | 扩展用 |
| 命令码 | 命令名称 | 读/写 | 数据长度 | 说明 |
|---|---|---|---|---|
| 0x60 | 恢复出厂设置 | 写 | 1 | 需要管理员权限 |
| 0x61-0x63 | 保留 | - | - | 已删除功能已合并到0xA2命令中 |
| 0x64-0x6F | 保留 | - | - | 扩展用 |
| 命令码 | 命令名称 | 读/写 | 数据长度 | 说明 |
|---|---|---|---|---|
| 0x70 | 断开连接 | 写 | 1 | 主动断开连接 |
| 0x71-0x7F | 保留 | - | - | 扩展用 |
| 命令码 | 命令名称 | 读/写 | 数据长度 | 说明 |
|---|---|---|---|---|
| 0x80 | 查询OTA版本信息 | 读 | 12 | 读操作返回12字节版本信息
数据格式12字节小端序
字节0-3固件版本uint32_t4字节小端序
字节4-7硬件版本uint32_t4字节小端序
字节8-11OTA版本uint32_t4字节小端序
数据来源db_cfg.device_info
uint32_t:99999999表示版本号99.99.991表示版本号00.00.00.01
写操作:不支持
错误码:命令不支持(0x04) |
| 0x81 | 开始升级 | 写 | 10 | 写操作接收10字节版本号4 + 大小4 + CRC16 2
数据格式10字节小端序
字节0-3版本号uint32_t4字节小端序
字节4-7固件大小uint32_t4字节小端序单位字节
字节8-9CRC16校验和uint16_t2字节小端序
功能说明:
1. 验证参数检查固件大小是否有效0 < 大小 <= 1MB-10字节
2. 检查状态:如果已有升级在进行,返回设备错误
3. 擦除Flash擦除1MB SPI Flash区域地址0x100000256个扇区每个4KB
4. 写入文件头:版本号(4) + 固件大小(4) + CRC16(2占位为0) = 10字节
5. 初始化状态设置OTA升级状态跟踪保存期望的CRC16到状态结构
6. 初始化force_boot设置db_cfg.device_info.force_boot=0初始为无效
错误码:参数无效(0x01)、设备错误(0x07) |
| 0x82 | 传输固件数据 | 写 | 可变 | 写操作接收可变长度数据包序号2 + 数据N
数据格式(可变长度,小端序):
字节0-1数据包序号uint16_t2字节小端序
字节2-N固件数据N字节
功能说明:
1. 检查状态:如果升级未开始,返回设备错误
2. 验证数据:检查数据大小是否超出固件大小,检查写入地址是否超出范围
3. 写入Flash将数据写入Flash从文件体起始地址0x10000A开始顺序写入
4. 实时计算CRC16对接收的数据实时计算并累积CRC16CRC16-CCITT算法多项式0x1021初始值0xFFFF
5. 更新状态:更新已接收数据大小和当前写入地址
6. CRC16校验当所有数据接收完成时received_size >= firmware_size比较计算的CRC16与期望的CRC16
- 如果CRC16匹配设置db_cfg.device_info.force_boot=1固件有效
- 如果CRC16不匹配设置db_cfg.device_info.force_boot=0固件无效
7. 返回状态:返回成功响应,上位机继续发送下一帧数据
错误码:参数无效(0x01)、设备错误(0x07) |
| 0x83 | 结束传输 | 写 | 4 | 写操作接收4字节总大小4
数据格式4字节小端序
字节0-3总大小uint32_t4字节小端序单位字节
功能说明:
1. 检查状态:如果升级未开始,返回设备错误
2. 验证大小:比较接收的总大小与已接收数据大小是否一致
3. 保存CRC16保存计算的CRC16到文件头偏移8字节处
4. 更新数据库更新数据库OTA版本db_cfg.device_info.ota_version和force_boot标志db_cfg.device_info.force_boot
5. 保存数据库:保存数据库到非易失性存储
6. 清除状态清除OTA升级状态跟踪
7. 返回响应:返回成功响应
注意CRC16校验已在0x82命令中完成这里只验证大小并保存CRC16到文件头
错误码:参数无效(0x01)、设备错误(0x07) |
| 0x84 | 保留 | - | - | 已废弃此命令已废弃CRC校验功能已合并到0x82传输固件数据命令中在数据接收时实时校验 |
| 0x85 | 取消升级 | 写 | 1 | 写操作接收1字节取消标志
数据格式1字节
字节0取消标志uint8_t值任意
功能说明:
1. 清除状态清除OTA升级状态跟踪
2. 返回成功:即使没有升级在进行,也返回成功
错误码:参数无效(0x01) |
| 0x86-0x9F | 保留 | - | - | 扩展用 |
| 命令码 | 命令名称 | 读/写 | 数据长度 | 说明 |
|---|---|---|---|---|
| 0xA0 | 工作模式设置 | 读/写 | 1 | 读返回1字节工作模式0x00=待机, 0x01=扫描, 0x02=消杀)
接收1字节工作模式0x00=待机, 0x01=扫描, 0x02=消杀)
数据来源/存储db_cfg.system.work_mode |
| 0xA1 | 查询硬件状态 | 读 | 7 | 返回7字节硬件错误状态
字节0温度错误0x00=无错误, 0x01=温度过高, 0x02=温度过低)
字节1电机错误0x00=无错误, 0x01=温度错误, 0x02=反馈错误)
字节2激光器错误0x00=无错误, 0x01=温度过高, 0x02=电压过低, 0x03=电压过高)
字节3视觉错误0x00=无错误, 0x01=通信错误)
字节4加速度错误0x00=无错误, 0x01=通信错误0X02=设备不稳定)
字节5毫米波雷达错误0x00=无错误, 0x01=通信错误)
字节6激光雷达错误0x00=无错误, 0x01=通信错误)
数据来源meas_ctrl.error测量控制模块的错误状态 |
| 0xA2 | 查询设备信息 | 读/写 | 读76
56 | 读操作返回76字节设备信息
数据格式76字节小端序
字节0-15设备序列号16字节ASCII编码
字节16-31设备型号16字节ASCII编码
字节32-47设备ID16字节ASCII编码
字节48-53BLE MAC地址6字节
字节54-59WiFi MAC地址6字节
字节60-63固件版本uint32_t4字节小端序
字节64-67硬件版本uint32_t4字节小端序
字节68-71OTA版本uint32_t4字节小端序
数据来源db_cfg.device_info
写操作接收56字节设备信息
数据格式56字节小端序
字节0-15设备序列号16字节ASCII编码
字节16-31设备型号16字节ASCII编码
字节32-47设备ID16字节ASCII编码
字节48-51固件版本uint32_t4字节小端序
字节52-55硬件版本uint32_t4字节小端序
数据存储db_cfg.device_info |
| 0xA3 | 查询统计数据 | 读 | 32 | 返回32字节统计数据24字节 + datalog日志信息4字节
统计数据部分24字节小端序
字节0-3灭虫数量uint32_t
字节4-7总工作时间uint32_t单位
字节8-11今日工作时间uint32_t单位
字节12-15扫描次数uint32_t
字节16-19激光发射次数uint32_t
字节20-23蚊虫数据数量uint32_t扫描到、杀了的蚊子总数
datalog日志信息部分4字节
字节24-27设备本地数据条数。 |
| 0xA4 | 查询蚊虫数据 | 读/写 | 写4
4
通知22 | 写操作接收4字节读取的数量小端序
- 写操作成功后,设备通过通知机制发送数据,先发送成功响应,然后发送每条数据
读操作返回4字节设备本地数据条数小端序
数据发送(通知机制):
- 通知类型0x0B蚊虫数据通知
- 每条通知数据22字节 = 索引(4字节小端序) + 蚊虫数据(18字节)
- 蚊虫数据结构:角度(4字节*1000度int32_t支持负数例如90000表示90.000度,-22500表示-22.500度) + 距离(2字节毫米) + 大小(2字节毫米) + 时间(6字节year+month+day+hour+minute+second) + 保留(4字节)
- 每条数据间隔10ms
数据来源SPI Flash从SPI_FLASH_MOSQUITO_DATA_ADDR开始存储每条数据16字节其中角度字段为int32_t |
| 0xA5 | 查询设备传感器数据 | 读 | 10 | 读操作返回10字节传感器数据
数据格式10字节小端序
字节0-1温度uint16_t单位0.1°C例如250表示25.0°C
字节2-3X轴加速度int16_t单位mg有符号整数范围-32768到32767
字节4-5Y轴加速度int16_t单位mg有符号整数范围-32768到32767
字节6-7Z轴加速度int16_t单位mg有符号整数范围-32768到32767
字节8-9电容电压uint16_t单位0.01V例如1530表示15.30V
数据来源:
- 温度meas_ctrl.temp测量控制模块的温度值单位°C
- 3D传感器数据meas_ctrl.accel.x_mg、y_mg、z_mg测量控制模块的加速度数据单位mg
- 电容电压capture_get_laser_gun_dev()->current_voltage激光器设备的当前电容电压单位V
说明:
- 如果无法获取电容电压设备未初始化或读取失败电容电压字段返回0
- 数据格式为小端序(低字节在前,高字节在后)
- 写操作不支持,返回命令不支持错误 |
| 0xA6-0xBF | 保留 | - | - | 扩展用 |
| 帧头 | 命令 | 读/写 | 长度 | 数据 | 校验 |
|---|---|---|---|---|---|
| 2字节 | 1字节 | 1字节(0x00) | 1字节 | N字节 | 2字节 |
| 固定标识 0xAA 0x55 | 原命令码 | 读操作标识 | 数据长度 | 状态码(1字节, 0x00=成功) + 响应数据 | CRC16校验 |
| 帧头 | 命令 | 读/写 | 长度 | 数据 | 校验 |
|---|---|---|---|---|---|
| 2字节 | 1字节 | 1字节(0x00) | 1字节 | N字节 | 2字节 |
| 固定标识 0xAA 0x55 | 原命令码 | 读操作标识 | 数据长度 | 状态码(1字节, 非0=错误码) + 错误描述(可选) | CRC16校验 |
| 帧头 | 命令 | 读/写 | 长度 | 数据 | 校验 |
|---|---|---|---|---|---|
| 2字节 | 1字节 | 1字节(0x01) | 1字节 | N字节 | 2字节 |
| 固定标识 0xAA 0x55 | 原命令码 | 写操作标识 | 数据长度 | 状态码(1字节, 0x00=成功) + 确认信息(可选) | CRC16校验 |
| 帧头 | 命令 | 读/写 | 长度 | 数据 | 校验 |
|---|---|---|---|---|---|
| 2字节 | 1字节 | 1字节(0x01) | 1字节 | N字节 | 2字节 |
| 固定标识 0xAA 0x55 | 原命令码 | 写操作标识 | 数据长度 | 状态码(1字节, 非0=错误码) + 错误描述(可选) | CRC16校验 |
| 帧头 | 通知码 | 读/写 | 长度 | 数据 | 校验 |
|---|---|---|---|---|---|
| 2字节 | 1字节 | 1字节(0x02) | 1字节 | N字节 | 2字节 |
| 固定标识 0xAA 0x55 | 通知码(与命令码区分) | 通知标识 | 数据长度 | 通知类型(1字节) + 通知数据 | CRC16校验 |
| 错误码 | 含义 | 说明 |
|---|---|---|
| 0x00 | 成功 | 操作成功 |
| 0x01 | 参数错误 | 参数无效或超出范围 |
| 0x02 | 权限错误 | 用户未登录或权限不足 |
| 0x03 | 设备忙 | 设备正在执行其他操作 |
| 0x04 | 命令不支持 | 命令码不存在或未实现 |
| 0x05 | 数据校验失败 | CRC 校验失败 |
| 0x06 | 超时 | 操作超时 |
| 0x07 | 设备错误 | 设备内部错误 |
| 0x08-0xFF | 保留 | 扩展错误码 |
| 字节序号 | 字段名 | 字节数 | 值/说明 |
|---|---|---|---|
| 0-1 | 帧头 | 2 | 0xAA 0x55 |
| 2 | 命令 | 1 | 0x01 |
| 3 | 读/写 | 1 | 0x00读操作 |
| 4 | 长度 | 1 | 0x00无数据 |
| 5-6 | 校验 | 2 | CRC16(字节0-4) |
| 字节序号 | 字段名 | 字节数 | 值/说明 |
|---|---|---|---|
| 0-1 | 帧头 | 2 | 0xAA 0x55 |
| 2 | 命令 | 1 | 0x02 |
| 3 | 读/写 | 1 | 0x01写操作 |
| 4 | 长度 | 1 | 0x1016字节 |
| 5-20 | 数据 | 16 | 用户名(ASCII编码不足用0x00填充) |
| 21-22 | 校验 | 2 | CRC16(字节0-20) |
| 字节序号 | 字段名 | 字节数 | 值/说明 |
|---|---|---|---|
| 0-1 | 帧头 | 2 | 0xAA 0x55 |
| 2 | 命令 | 1 | 0x01原命令码 |
| 3 | 读/写 | 1 | 0x00读操作 |
| 4 | 长度 | 1 | 0x022字节数据 |
| 5 | 状态码 | 1 | 0x00成功 |
| 6 | 响应数据 | 1 | 0x01已注册 |
| 7-8 | 校验 | 2 | CRC16(字节0-6) |
| 字节序号 | 字段名 | 字节数 | 值/说明 |
|---|---|---|---|
| 0-1 | 帧头 | 2 | 0xAA 0x55 |
| 2 | 命令 | 1 | 0x02原命令码 |
| 3 | 读/写 | 1 | 0x01写操作 |
| 4 | 长度 | 1 | 0x011字节数据 |
| 5 | 状态码 | 1 | 0x00成功 |
| 6-7 | 校验 | 2 | CRC16(字节0-5) |
| 字节序号 | 字段名 | 字节数 | 值/说明 |
|---|---|---|---|
| 0-1 | 帧头 | 2 | 0xAA 0x55 |
| 2 | 命令 | 1 | 0x02原命令码 |
| 3 | 读/写 | 1 | 0x01写操作 |
| 4 | 长度 | 1 | 0x011字节数据 |
| 5 | 状态码 | 1 | 0x01参数错误 |
| 6-7 | 校验 | 2 | CRC16(字节0-5) |
| 字节序号 | 字段名 | 字节数 | 值/说明 |
|---|---|---|---|
| 0-1 | 帧头 | 2 | 0xAA 0x55 |
| 2 | 通知码 | 1 | 0xF0示例通知码 |
| 3 | 读/写 | 1 | 0x02通知 |
| 4 | 长度 | 1 | 0x022字节数据 |
| 5 | 通知类型 | 1 | 0x01设备状态变化 |
| 6 | 状态码 | 1 | 0x01扫描模式 |
| 7-8 | 校验 | 2 | CRC16(字节0-6) |
| 字节序号 | 字段名 | 字节数 | 值/说明 |
|---|---|---|---|
| 0-1 | 帧头 | 2 | 0xAA 0x55 |
| 2 | 通知码 | 1 | 0xF0示例通知码 |
| 3 | 读/写 | 1 | 0x02通知 |
| 4 | 长度 | 1 | 0x022字节数据 |
| 5 | 通知类型 | 1 | 0x02错误状态上报 |
| 6 | 错误码 | 1 | 0x07设备错误 |
| 7-8 | 校验 | 2 | CRC16(字节0-6) |