Commit Graph
8 Commits
Author SHA1 Message Date
kevinandClaude Fable 5 6620192322 签到检查功能增强:返回签到时间和内容
问题:
- 用户询问'我什么时候签到的'时,AI 说'系统只记录是否签到,没有时间戳'
- 实际上数据库 signs 表有完整的 sign_time 和 sign_text 字段

解决方案:
- 修改 executeCheck 方法,改用 ListSigns 查询今天的签到记录
- 返回完整的签到详情:签到时间(HH:MM:SS格式)+ 签到内容
- 未签到时仍返回简单提示

改动内容:
- executeCheck 使用 ListSigns 替代 HasSignedOnDay
- 构建 ListOptions 查询今天的签到记录(过滤 NodeID + 时间范围)
- 返回格式:'XXX 今天已经签到过了。\n签到时间:10:30:45\n签到内容:上海-Kevin-GAT562签到'
- 更新测试验证返回内容包含时间和签到文本
- 更新 mockSignStore.ListSigns 支持 NodeID 和 Limit 过滤

使用效果:
- 用户:'我今天签到了吗?' → 返回是否签到 + 时间 + 内容
- 用户:'我什么时候签到的?' → 返回签到时间:10:30:45

测试:
-  未签到场景测试通过
-  已签到场景测试通过(验证时间和内容)
-  所有签到工具测试通过
-  项目编译成功

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 21:47:16 +08:00
kevinandClaude Fable 5 cbb54c28ca 添加 QoS0 问题完整解决方案文档
添加综合文档总结所有修复和诊断工具:
- 问题描述和解决方案总览
- 快速诊断方法
- 常见原因和解决方案
- 文档索引
- 技术细节说明
- 性能指标对比
- 下一步行动指南

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 21:43:36 +08:00
kevinandClaude Fable 5 bce6b70e8f 增强 MQTT 消息拒绝诊断功能
问题:
- TCP_NODELAY 修复了 TCP ACK 延迟,但设备仍然重发
- 需要确定是消息被服务器拒绝,还是设备端 bug

改进内容:
- OnPublish 中添加详细的拒绝日志输出
- 当消息验证失败时,输出 client_id、topic、qos、错误原因
- 当消息被屏蔽时,输出屏蔽类型和原因
- 帮助快速诊断 QoS0 重发的根本原因

新增文档:
- doc/QOS0_RETRANSMIT_ANALYSIS.md - 深度分析重发问题的各种原因
- doc/DIAGNOSTIC_GUIDE.md - 完整的诊断指南和解决方案

使用方法:
  ./meshtastic_mqtt_server --console-log-mqtt=true

观察日志中是否有:
  [mqtt] PUBLISH rejected: ... - 消息被拒绝(服务器问题)
  [mqtt] PUBLISH blocked: ... - 消息被屏蔽(配置问题)

如果没有 rejected/blocked 日志但仍重发,则是设备端 bug。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 21:42:50 +08:00
kevinandClaude Fable 5 57cca6bb7a 签到工具新增检查功能:修复状态误判问题
问题:
- 用户询问'我今天签到了吗'时,AI基于对话历史判断而非查询数据库
- 导致明明没签到,AI却说已经签到了(误判)

解决方案:
- 新增 action=check 操作,专门用于检查当前节点今天是否已签到
- 直接调用 HasSignedOnDay 查询数据库,返回准确的签到状态
- AI 现在会强制调用工具查询,而不是根据记忆猜测

改动内容:
- 工具定义中添加 check 操作类型
- 实现 executeCheck 方法,查询数据库并返回明确状态
- 添加完整的单元测试(未签到/已签到两种场景)
- 更新文档说明 check 操作的使用

使用示例:
- 用户:'我今天签到了吗?'
- AI 调用:{"action": "check"}
- 返回:'XXX 今天还没有签到。' 或 'XXX 今天已经签到过了。'

测试:
-  未签到场景测试通过
-  已签到场景测试通过
-  所有签到工具测试通过
-  项目编译成功

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 21:37:44 +08:00
kevinandClaude Fable 5 cd5dcb29f5 新增活跃度查询工具
功能:
- 查询指定时间范围内的活跃节点数和活跃人数
- 活跃节点:统计 nodeinfo 表 updated_at 字段
- 活跃人数:统计 text_message 表按 from_id 去重的用户数

使用场景:
- 用户问'现在有多少人活跃'时 AI 调用此工具
- 用户问'当前有多少节点在线'时 AI 调用此工具
- 支持附带时间条件,默认1小时,最大24小时

参数:
- hours: 查询最近N小时,默认1小时,最大24小时
- query_type: both/nodes/users,默认 both

实现:
- internal/agents/active/active.go - 工具主逻辑
- internal/store/active_store.go - 数据库查询方法
- 完整的单元测试,所有测试通过
- 在 ai/service.go 中注册工具

测试:
-  默认查询(1小时,both)
-  指定时间查询(6小时、24小时)
-  仅查询节点/人数
-  时间限制验证
-  项目编译成功

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 21:26:14 +08:00
kevin c50c7a57d7 签到 2026-06-23 21:04:31 +08:00
kevinandClaude Fable 5 ec24e70275 修复 MQTT QoS0 消息重发问题
问题:
- 设备发送 QoS0 消息后服务器未及时响应 TCP ACK
- 导致设备重发 3 次
- 有时能一次成功,有时需要多次重发

根本原因:
- TCP Nagle 算法延迟小数据包(包括 TCP ACK)40-200ms
- QoS0 不需要 MQTT 应用层 PUBACK,但依赖 TCP 层 ACK
- TCP ACK 延迟触发客户端 TCP 重传机制

解决方案:
- 在 OnConnect hook 中设置 TCP_NODELAY
- 禁用 Nagle 算法,确保 TCP ACK 立即发送
- TCP ACK 延迟从 40-200ms 降低到 ~0.05ms

测试:
- 添加 tcp_nodelay_test.go 验证修复
- 平均往返延迟:54µs
- 符合 MQTT broker 行业最佳实践(Mosquitto、EMQX、HiveMQ 均默认启用)

文档:
- doc/TCP_ACK_FIX_CN.md - 中文详细说明
- doc/TCP_ACK_FIX.md - 英文详细说明

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 21:04:00 +08:00
kevin 1624cb0f9b up markdown 2026-06-08 01:24:01 +08:00