GET请求Movesense日志条目数据丢失11000字节及相关问题咨询
问题背景
创建了一个224160字节的Movesense传感器日志条目,通过Showcase App的广播命令确认条目大小:
am broadcast -a android.intent.action.MOVESENSE --es type get --es path Mem/Logbook/Entries
返回结果:
ID:null Mem/Logbook/Entries OUTPUT: {"Content": {"elements": [{"Id": 1, "ModificationTimestamp": 1734712802, "Size": 224160}]}}
但执行GET请求获取日志内容时,仅返回283963字节的Base64数据,对应原始字节约212972,缺失约11000字节;较小日志条目可正常获取:
am broadcast -a android.intent.action.MOVESENSE --es type get --es path Mem/Logbook/byId/1/Data
返回结果:
ID:null Mem/Logbook/byId/1/Data Status: 200 OUTPUT (283963): {"Content": "U0JFTTAx...
同时遇到以下异常:
- 订阅
Logbook/byId/1/Data返回404错误 - 订阅
Mem/Logbook/byId/1/Data返回501错误 - 带
offset参数的GET请求导致传感器与Showcase App断开连接 - 尝试直接读取EEPROM但仓库无
ExtflashChunkStorage.h文件
核心问题解答
1. GET请求丢失数据的原因及大小限制
Movesense的Logbook通过单次GET请求获取数据时,存在传输层面的默认大小限制,该限制由MDS(Movesense Device Service)的消息帧大小、蓝牙MTU(最大传输单元)共同决定,默认单次能传输的Base64编码数据上限约对应21KB原始数据,实际值会因固件版本、设备配置略有差异。
你的日志条目224160字节远超过单次传输上限,因此MDS自动截断数据,导致末尾约11000字节丢失。Logbook单条目本身的大小上限由传感器存储容量决定(通常为几MB),并非导致丢失的直接原因。
2. 订阅Logbook数据失败的原因
- 订阅
Logbook/byId/1/Data返回404:路径错误,正确路径需包含Mem/前缀,但该资源本身不支持订阅操作。 - 订阅
Mem/Logbook/byId/1/Data返回501:Logbook的Data端点仅支持单次GET读取,属于历史数据资源;Movesense的订阅功能仅面向实时测量类端点(如Meas/Acc/13),历史日志不支持订阅模式,因此返回501(未实现)错误。
3. 带offset参数的GET请求导致断开连接的原因
根据logbook.yaml定义,Mem/Logbook/byId/{id}/Data支持offset和length分段读取,但断开连接通常因以下原因:
- 参数格式错误:你使用的
--es value '''{"offset":65536}'''存在多余单引号,Android广播的value参数需要严格JSON格式,应改为--es value '{"offset":65536}'。 - 固件兼容性bug:部分旧版本Movesense固件对
offset参数的处理存在问题,会触发蓝牙连接崩溃,建议升级到最新稳定固件重试。
解决建议
分段读取日志数据:使用
offset和length参数拆分请求,例如每次读取64KB原始数据(对应Base64约87381字节):# 读取第一块(offset=0) am broadcast -a android.intent.action.MOVESENSE --es type get --es path Mem/Logbook/byId/1/Data --es value '{"offset":0,"length":65536}' # 读取第二块(offset=65536) am broadcast -a android.intent.action.MOVESENSE --es type get --es path Mem/Logbook/byId/1/Data --es value '{"offset":65536,"length":65536}' # 读取剩余数据 am broadcast -a android.intent.action.MOVESENSE --es type get --es path Mem/Logbook/byId/1/Data --es value '{"offset":131072,"length":93088}'拼接多段Base64数据后解码即可得到完整日志。
升级固件:将传感器固件更新至最新稳定版本,修复已知的
offset参数处理bug。避免无效操作:不要尝试订阅Logbook历史数据,该功能不被支持;官方已废弃直接读取EEPROM的相关API,无需寻找
ExtflashChunkStorage.h文件。
内容的提问来源于stack exchange,提问作者imbens

