1) 【一句话结论】
采用BLE GATT协议,定义控制与状态服务,通过LE Secure Connections配对生成共享密钥,结合AES-CCM加密,支持分包传输(解决20字节限制),实现人体工学椅与手机App的远程控制及状态同步,并设计连接建立、数据传输、断开流程及安全机制。
2) 【原理/概念讲解】
BLE通信基于通用属性配置文件(GATT),设备通过服务(Service)和特征(Characteristic)暴露功能。数据包结构为:固定头(2字节,标识包类型、长度)、命令ID(1字节,区分控制/状态,如0x01=调整角度)、数据域(可变,存储参数)、CRC校验(2字节,校验错误)。
- 服务特征定义:
控制服务包含“调整椅背角度”(UUID,数据类型int16,值0-180°)、“启动压力传感”(UUID,bool类型);状态服务包含“当前椅背角度”(UUID,int16)、“压力值”(UUID,int32)。
- 连接建立流程:
App扫描设备(过滤名称“LeesgoChair”或服务UUID 0x180D),建立连接,服务发现(读取服务列表),读取特征值(控制或状态)。
- 分包传输机制:
BLE最大包长度20字节,长数据拆分为多个分包,每个分包含序列号(1字节)和部分数据(≤18字节),接收端按序号重组,若分包丢失则重传(ARQ机制,确保数据完整性)。
- 状态同步策略:
周期性上报(每500ms发送状态,减少App请求,降低功耗,适合数据变化慢的场景);主动读取(App请求后立即返回,适合实时性高的场景,如控制命令执行后即时反馈)。
- 安全机制:
采用LE Secure Connections,配对生成共享密钥,使用AES-CCM加密(128位密钥,CCM模式,支持认证和加密,计算资源可控,适合低功耗设备,防止窃听和篡改)。
3) 【对比与适用场景】
| 状态同步方式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|
| 周期性上报 | 设备定时发送状态数据(如500ms) | 减少App请求,降低设备功耗 | 传感器数据变化慢(角度、压力) | 可能存在延迟,需平衡频率与功耗 |
| 主动读取 | App请求后设备立即返回状态 | 实时性高,即时反馈 | 控制命令执行后需快速获取结果 | 增加App交互频率,可能影响用户体验 |
| 分包传输 | 长数据拆分为多个BLE分包 | 解决20字节限制,确保数据完整性 | 控制命令或状态数据较长(如多参数调整) | 需处理序列号和重传,增加协议复杂度 |
4) 【示例】
伪代码(连接建立与分包传输示例):
- 连接建立:
App扫描设备(名称“LeesgoChair”),配对生成密钥,建立连接,服务发现读取控制服务UUID(0x180F),读取“调整角度”特征值。
- 分包传输:
发送长控制命令“调整椅背角度+20°,启动压力传感”,拆分为两个分包:
包1:序列号1,数据“adjust_back_angle 20”
包2:序列号2,数据“start_pressure_sensor true”
接收端按序列号重组,若包1丢失,重传包1。
5) 【面试口播版答案】
(约90秒)
“面试官您好,针对人体工学椅与手机App的BLE通信,我设计了一个基于GATT的通信协议。首先,定义了控制服务和状态服务:控制服务包含“调整角度”(特征ID,int16类型,0-180°)和“启动压力传感”(特征ID,bool类型);状态服务包含“当前角度”(特征ID,int16)和“压力值”(特征ID,int32)。数据包结构为固定头(2字节,标识类型、长度)、命令ID(1字节,区分控制/状态,如0x01=调整角度)、数据域(可变,存储参数)、CRC(2字节,校验)。由于BLE最大包长度20字节,长数据采用分包传输,每个分包包含序列号确保顺序。状态同步采用周期性上报(每500ms发送状态),减少App请求次数,降低功耗。设备发现时,App通过过滤设备名称(如“LeesgoChair”)或特定服务UUID(如0x180D)识别目标设备。安全方面,采用LE Secure Connections,配对生成共享密钥,使用AES-CCM加密传输数据,防止窃听和篡改。这样既保证了通信的实时性和状态同步,又确保了数据安全。”
6) 【追问清单】
- 问:如何处理BLE传输的最大包长度(20字节),长数据如何传输?
回答要点:将长数据拆分为多个BLE分包,每个分包包含序列号(确保顺序),接收端按序号重组,若分包丢失则重传(ARQ机制),避免数据丢失。
- 问:为什么选择周期性上报而非主动读取作为状态同步机制?
回答要点:周期性上报减少App请求次数,降低设备功耗,适合传感器数据变化较慢的场景;主动读取适合实时性要求高的场景,但会增加交互频率,可能影响用户体验。
- 问:设备发现时如何过滤无关设备?
回答要点:通过设备名称(如“LeesgoChair”)或特定服务UUID(如0x180D)过滤,避免扫描到其他蓝牙设备,提高扫描效率,减少用户选择设备的麻烦。
- 问:加密算法选择AES-CCM的理由?
回答要点:AES-CCM支持认证和加密,适合BLE的低功耗场景,计算资源消耗可控(低功耗设备可处理),安全性高(128位密钥,CCM模式提供完整性保护),比明文传输更安全,保护用户隐私数据。
- 问:如果连接中断,如何处理?
回答要点:实现重连机制(超时后自动重试,如5秒后重试),数据校验(CRC校验确保数据正确),状态反馈(App提示连接错误,用户可手动重连)。
7) 【常见坑/雷区】
- 坑1:忽略分包传输,导致长数据传输失败(如未处理20字节限制,数据丢失,影响控制命令执行)。
- 坑2:状态同步频率设置过高,导致设备功耗过大(如每秒上报状态,缩短电池续航时间,影响用户体验)。
- 坑3:设备发现过滤策略不当,导致App扫描到无关设备,影响用户体验(如办公室多台设备,扫描时间过长,或误识别设备)。
- 坑4:加密算法选择不当,如仅用明文传输,导致用户隐私数据(如压力值、角度)泄露,违反隐私政策。
- 坑5:协议复杂度过高,影响设备响应速度(如加密解密时间过长,导致控制延迟,用户感觉操作不流畅)。