抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >
ED Sentry: 给Elite Dangerous挂机用的监控工具

ED Sentry是一个给Elite Dangerous[1]挂机用的监控工具。它会读取游戏在本地写的日志,统计挂机时的击杀、扫描和任务进度,出问题的时候通过Matrix提醒自己,也可以用一个仪表盘在电脑或者手机上查看。代码发布在GitHub上,项目地址。

背景

最近在玩Elite Dangerous的AFK Massacre,也就是挂机打清剿任务。具体的玩法是先接一堆清剿海盗的任务,然后开着Type-10停在资源采集点,让炮塔和舰载机自动去打来抢劫的海盗,人可以离开电脑去做别的事情。挂机的时候最担心的是中途出问题,比如舰载机被打掉了、护盾掉了,或者海盗一直不来,人不在电脑前面是不知道的。

已经有一个类似的工具叫ED-AFK-Monitor[2],它会读取游戏的日志,然后把挂机的状态推送到Discord。但是它是一个Python的单文件,Discord的推送逻辑和主流程耦合得比较紧,自己想要的是推送到Matrix[3],在它上面改的话代码只会更复杂。所以就决定用Rust重新实现一个独立的工具。

因为这个游戏基本上只能在Windows上玩,所以整个项目都是以Windows为主要目标来开发的,最终的产物是一个不需要Python环境的轻量Windows程序。

挂机之前: 检查清单

挂机之前需要确认船的状态是对的,不然走开之后挂一晚上可能什么都没打到。ED Sentry的仪表盘上有一个检查清单,只有三项:

  • 武器展开: 武器没有展开的话,炮塔是不会开火的。
  • 引擎能量为零: 能量都留给护盾和武器。
  • 货舱有货: 海盗会先扫描货舱,再决定要不要攻击。

dashboard
Fig. 1. ED Sentry的仪表盘,左上第二个面板是检查清单。截图里是示例数据

这三项是从游戏写的Status.json和Cargo.json里读出来的,文件一变化就会更新。每一项有通过、不通过和未知三种状态,因为游戏有时候不会写某些字段,比如Status.json里有时候没有引擎能量的数据,这时候就显示未知,不去猜。

这个位置原来是一个船体完整度的面板,但是这部分数据常年缺失,显示出来也不可靠,所以就换成了现在的检查清单。agent第一次做出来的检查清单,每一项下面都写了一大段说明,比如STATUS FLAGS BIT 0X40 IS SET STATUS.JSON这样的文字,后来全部删掉了,只留下三个简单的名字,挂机的时候谁会去看这些东西。

挂机的时候: 提醒和远程查看

提醒

ED Sentry会一直读取游戏最新的Journal日志,游戏每写一行新的事件,它就会更新统计,并且根据事件生成通知。比如击杀、被扫描、舰载机受损或者被摧毁、护盾掉了、货物丢失、燃料不足、死亡、任务进度变化等等。

除了这些事件,它还会在挂机效率出问题的时候报警。默认是开始挂机5分钟之后还没有击杀,或者之后20分钟没有新的击杀,就会报警。击杀的速度低于每小时20个,也会报警。

通知会同时输出到两个地方:

  • 终端: 带emoji的事件日志,最下面有一行实时的状态,显示击杀速度、扫描次数、挂机时间和任务进度。
  • Matrix: 发到一个Matrix房间里,手机上装一个Matrix客户端就能收到。

下面是终端输出的一段节选,来自自己的一次挂机记录,是用回放模式把当时的Journal重新跑了一遍得到的。从进入资源采集点开始,每一次击杀、货舱被扫描、燃料剩余都会记一行,击杀后面括号里是距离上一次击杀的时间,完成一个任务的击杀数也会提示出来,每隔一段时间还会输出一次统计:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
===========================================
ed-sentry 0.1.1-20260706 by CMDR ControlNet
===========================================

[17:38:39]🔄 CMDR ControlNet (Type-10 Defender / Solo / Master +88%)
[17:39:08]🎯 Missions loaded (active massacres: 20)
[17:41:44]🚀 Supercruise entry in Anana
[17:42:06]⚔️ Dropped at Resource Extraction Site [Low]
[17:43:22]🚪 Exited to main menu
[17:43:31]🔄 CMDR ControlNet (Type-10 Defender / Solo / Master +88%)
[17:44:07]⛽ Fuel: 96% remaining (~3h4m)
[17:44:54]📦 Cargo scan
[17:45:15]🔎 Scan: Federal Dropship (Competent)
[17:45:59]💥 Kill: Federal Dropship
[17:46:30]📦 Cargo scan
[17:47:26]📦 Cargo scan
[17:49:25]💥 Kill: Diamondback Explorer (+3m26s)
[17:49:25]📦 Cargo scan
[17:49:51]💥 Kill: Asp Scout (+26s)
[17:50:14]📦 Cargo scan
[17:50:20]💥 Kill: Eagle (+29s)
[17:51:26]🔎 Scan: Diamondback Scout (Mostly Harmless)
[17:51:35]💥 Kill: Diamondback Explorer (+1m15s)
[17:51:51]💥 Kill: Diamondback Scout (+16s)
[17:52:35]📦 Cargo scan
[17:52:43]📦 Cargo scan
[17:53:18]💥 Kill: Sidewinder (+1m27s)
[17:53:47]💥 Kill: Imperial Courier (+29s)
[17:53:48]✅ Completed kills for a mission (1/20)
[17:54:10]📦 Cargo scan
[17:56:05]📦 Cargo scan
[17:56:58]⛽ Fuel: 95% remaining (~16h56m)
[17:57:20]💥 Kill: Cobra Mk IV (+3m33s)
[17:57:54]📦 Cargo scan
[17:59:03]💥 Kill: Asp Explorer (+1m43s)
[17:59:03]📝 Session Stats (13m4s) [1/20]
-> Kills: 10 (41.3/h | 1m27s)
-> Bounties: 1.2m (5.6m/h | 122k/kill)

每一种事件都可以单独设置等级,0是不通知,1是通知,2是通知并且在Matrix里@自己,这样舰载机被摧毁、死亡这种需要马上处理的事件就会响铃。Matrix里还有一条状态消息,它不会一直刷屏,而是每隔一段时间编辑同一条消息,更新当前的统计。Matrix的房间需要是不加密的,因为支持端到端加密会增加太多的复杂度。

远程查看

除了提醒,有时候也想直接看一下现在的状态,所以ED Sentry还有一个仪表盘,就是上面Fig. 1的界面。在Windows上,它是一个用Tauri[4]做的桌面程序。同时它也可以作为一个网页服务运行,在同一个局域网里,用手机的浏览器就能打开同一个仪表盘。

一开始agent给网页服务加了很多安全限制,比如只有本机才能修改配置。自己觉得设计得太保守了,这个服务本来就是给内网用的,所以就把这些限制去掉了,只保留了基本的Host和CORS检查。

如果人不在家,局域网就访问不到了。所以又加了一个隧道的功能,点一下START,就会用Cloudflare的Quick Tunnel[5]生成一个公开的链接,鼠标放上去还会显示一个二维码,手机扫一下就能打开。Quick Tunnel不需要注册账号,也不需要额外装什么,程序里已经带了cloudflared。公开链接可以设置一个密码,设置了之后,远程访问的人需要先登录才能修改配置。没有设置密码的话,就是谁拿到链接都能访问,风险由用户自己承担。

回来之后: 任务进度

挂机回来,最关心的是任务打到哪里了。MISSIONS页面会列出所有正在进行的任务,点进去可以看到每个任务的发布阵营、目标阵营、报酬和击杀进度。

missions
Fig. 2. MISSIONS页面,左边是任务列表,右边是任务的详细信息。截图里是示例数据

清剿任务可以叠很多个,但是同一个阵营发布的多个任务,一次击杀只会算给其中一个,不同阵营发布的任务才能同时推进。这部分的规则参考了ODEliteTracker[6]的做法,仪表盘上会按这个规则算出总的击杀进度,再根据现在的击杀速度估算还要多久才能打完。

使用方法

Windows可以在GitHub的Releases里下载ed-sentry-<版本>-windows-x64.zip,解压之后双击ed-sentry.exe就可以了。解压出来的文件需要放在一起,因为程序运行的时候会用到里面的webui/和tools/。Journal的文件夹默认就是游戏的存档位置,一般不需要改。

如果只想用终端,可以直接运行核心程序:

1
.\ed-sentry-core.exe --config config.toml

Linux的版本只有核心程序和网页,没有桌面窗口,需要在配置里写上Journal的路径。

配置都在config.toml里,Matrix和隧道的部分大概是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[web]
enabled = true
host = "127.0.0.1"
port = 8765

[matrix]
enabled = true
homeserver = "https://matrix.example.org"
room_id = "#alerts:example.org"
access_token = "<token>"

[tunnel]
provider = "cloudflare_quick"
auto_start = false
config_password = ""

config.toml里有Matrix的token和隧道的密码,不要把自己的配置文件分享出去。

实现

整体架构

architecturearchitecture

Fig. 3. ED Sentry的整体架构

如上图所示,ED Sentry的核心是一个Rust写的程序ed-sentry-core。它找到最新的Journal日志之后,用文件监听加上轮询的方式,只读取新追加的行。每一种Journal事件都会解析成具体的类型,再更新战斗统计、任务追踪和检查清单这几部分的状态。监控的部分根据这些状态生成通知和报警,最后按每种事件的等级分发到终端和Matrix。

仪表盘的数据走的是另一条路。核心程序会把当前的状态做成快照,桌面版通过Tauri的事件推给窗口,网页版通过Axum[7]的HTTP API和WebSocket推给浏览器,两边用的是同一套React界面。桌面版的ed-sentry.exe只是一个很小的启动器,它会去启动同一个文件夹里的ed-sentry-core.exe --gui,这样用户解压之后一眼就能找到应该点哪个程序。

从命令行到仪表盘

这个项目一开始只打算做命令行,计划里写的是不做网页界面。后来想到可以有四种使用方式,桌面版、网页、Matrix机器人和命令行,前两种可以共用同一套网页界面,于是就开始做仪表盘。

界面的做法和之前的Media Poster Space差不多。GPT的模型做界面设计不太行,所以先用Gemini[8]的网页版设计了一版自己喜欢的界面,保存成一个React的文件放进仓库,再让agent照着这个设计重做前端,并且不允许它修改这个设计文件。

design
Fig. 4. 用Gemini设计的界面,里面是设计时用的示例数据

对比上面Fig. 1可以看到,最终的界面基本上是照着这个设计做的,只是左上第二个面板从船体完整度换成了检查清单。

以Windows为主

既然主要是给Windows用的,Windows上的问题就特别多。Windows的版本是在Linux上交叉编译出来的,中间踩了不少坑:

  • Matrix的库默认会带上端到端加密和SQLite,SQLite在交叉编译Windows的时候会出错,所以关掉了它的默认功能。
  • Tauri默认开启的一个功能,会让程序在比较旧的Windows上直接打不开,连main函数都进不去。
  • 桌面窗口启动的时候会先连接Matrix,如果Matrix连接超时,窗口就会卡住10秒。后来把连接放到了后台,窗口先显示出来。
  • 隧道启动之后,cloudflared还会一直输出日志,如果程序不继续读取这些输出,管道满了之后cloudflared就会卡死,隧道也就断了。

在发布第一个版本之前,CI在Windows上又失败了很多次,前后修了20个左右的提交,大部分都是只有Windows才有的问题,比如配置文件里路径的反斜杠被当成了转义字符,测试里用来模拟cloudflared的脚本在Windows上跑不起来。发布的流程也要求agent真实地验收,需要真的把代码推到GitHub上、触发CI、看到发布出来的结果,并且README里的下载链接能下载到对应的文件,才算是完成。

和agent一起开发

这个项目的代码基本上都是agent写的,用的是OpenCode加上oh-my-opencode,以及Codex,模型都是GPT。整个过程中印象比较深的一件事,是agent会写出看起来能用、实际上什么都没做的功能。最早的时候发现watch模式其实什么都没做,命令行参数和配置都能解析,但是根本没有接到实际的逻辑上。于是就让agent检查一遍还有没有类似的空壳功能,结果又找出了好几个。之后就定了一个规则,每一个配置项要么真的实现,要么在文档里写明是以后再做的。

总结

本文介绍了ED Sentry,一个给Elite Dangerous挂机用的监控工具。它读取游戏的本地日志,挂机之前用检查清单确认船的状态,挂机的时候通过终端和Matrix提醒,也可以通过局域网或者Cloudflare的隧道在手机上查看仪表盘,回来之后再看任务的进度。整个项目以Windows为主,大部分的时间其实都花在了Windows的打包和CI上。

参考文献

  • [1] "Elite Dangerous", Frontier Developments, 2026. https://www.elitedangerous.com/
  • [2] "PsiPab/ED-AFK-Monitor", GitHub, 2026. https://github.com/PsiPab/ED-AFK-Monitor
  • [3] "Matrix", Matrix.org Foundation, 2026. https://matrix.org/
  • [4] "tauri-apps/tauri", GitHub, 2026. https://github.com/tauri-apps/tauri
  • [5] "Quick Tunnels", Cloudflare, 2026. https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/do-more-with-tunnels/trycloudflare/
  • [6] "WarmedxMints/ODEliteTracker", GitHub, 2026. https://github.com/WarmedxMints/ODEliteTracker
  • [7] "tokio-rs/axum", GitHub, 2026. https://github.com/tokio-rs/axum
  • [8] "Gemini", Google, 2026. https://gemini.google.com/

评论