基于ESP32的Minecraft服务器状态查询摆件
为免去频繁查看 MC 服务器状态的繁琐,我用一块 ESP32 加 0.96 英寸 OLED 屏(SSD1306)做了个桌面状态摆件,约 20~25 元成本即可实时显示服务器离线状态与在线玩家数,本文附完整 MicroPython 代码。
作为MC服务器的开发者和管理员,我时常需要获取服务器的某些状态信息,比如服务器的离线状况、在线玩家数量等。然而,目前查询这些信息的方式,无论是通过登录MC的多人游戏界面查看,还是利用插件进行远程查看(例如通过网页或QQ机器人),都让我觉得颇为繁琐。之前我在B站上看到有人使用开发板和屏幕自主制作了一个显示B站用户状态(如粉丝数、播放量等)的项目,这给了我很大的启发。因此,我萌生了制作一个能置于桌面的MC服务器状态显示屏的想法。
于是乎,我又拿起了我的ESP32鼓捣了起来。在折腾了半个星期后终于弄出来了第一个版本,下面是效果图:

如图所示(图片所示版本为该项目的第一个测试版本),你需要一块ESP32开发板,同时还需要一块0.96英寸的OLED屏幕,屏幕驱动为SSD1306,最后别忘记准备好杜邦线,成本总计在20~25元范围内。不过使用0.96英寸屏幕的弊端就是,屏幕空间太有限了,无法显示更多内容。于是在后续版本中,我添加了自动翻页的功能,这样就能在有限的空间内显示更多内容了。不过毕竟是0.96英寸的屏幕,即使加入了翻页功能在有些情况也会显得不尽人意。好了好了,废话不多说,接下来就是代码展示环节(编译环境选择MicroPython):
屏幕驱动(ssd1306.py):
1 | #MicroPython SSD1306 OLED driver, I2C and SPI interfaces created by Adafruit |
主程序(main.py):
1 | import network |
把上面两个代码分别上传至ESP32中(如何上传可以参考:开发板研究笔记—ESP32篇),然后根据代码里的指示正确连接好屏幕就行了(SCK-4,SDA-5;其实市面上也有一些将屏幕直接焊在了ESP32开发板上的板子,直接使用都行)。如何使用呢,首先你需要在设置WiFi网络参数部分设置好你网络的ssid和密码,然后在设置要查询的MC服务器IP部分把你想要查询的服务器地址填上去就行,同时别忘记填写好MCSManager的管理员账户开放的APIkey(后面会细讲)与你面板的网址(xx.xxxx.xx)。在确保网络连接成功和服务器地址存在的情况下,屏幕会正常显示服务器状态信息(未知表示未查询到服务器或服务器(地址)不存在;错误表示网络连接失败);间隔5秒后,将会显示第二页有关MCSManager的信息,第二页包含CPU、内存占用情况,以及实例运行情况。
Server:Online|Offline|Unknown|Error ----> 服务器在线情况:在线|离线|未知|错误 Player:x/x ----> 当前玩家人数/服务器玩家最大人数
CPU:xx.xx%——表示为MCSManager面板占用的CPU情况 Mem:xx.xx%——表示为MCSManager面板占用的内存情况 Instance:x/x——表示为MCSManager面板运行的实例与总实例的情况
[新]Arduino版本:
在后续的更新中,我还开发出了Arduino版本,与MicroPython版本不同的是,我加入了动态配置参数(wifi的ssid、密码、服务器地址等)的功能,以下就是Arduino源代码(你需要额外安装ArduinoJson库与Adafruit_SSD1306库(同时会自动安装Adafruit_GFX库)):
mc_server_status.ino
1 | // --- 库 --- |
使用方法:
| 指令 | 功能 |
|---|---|
help |
显示所有可用命令 |
print_config |
打印当前所有配置 |
set_ssid <ssid> |
设置 WiFi 名称 |
set_password <password> |
设置 WiFi 密码 |
set_apikey <apikey> |
设置 MCSManager 的 API Key |
set_serverip <serverip> |
设置 Minecraft 服务器地址 |
set_remote_base_url <url> |
设置 MCSManager 面板 URL(格式:http://xxx.xxxx.xx) |
reconnect_wifi |
手动断开并重连 WiFi |
bin文件与烧录流程:
下载:MC_Server_Status.ino.merged.bin
以windows为例,你需要准备以下工具:计算机(带有python环境,且有esptool工具(pip install esptool))、ESP32+SSD1306屏幕+数据线、UartAssist.exe(串口通信调试工具)
烧录示例指令:
python -m esptool --port COM5 --baud 460800 write_flash -z 0x0 MC_Server_Status.ino.merged.bin
原理讲解:
其实原理很简单,其实就是一个利用python代码爬取API内容的过程:
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
API就像是一道桥梁,让不同的软件能够互相沟通。比如,你手机上的某个应用想知道今天的天气,它就可以通过一个天气API,去向专门提供天气信息的软件询问。这样,你的应用就能轻松地显示天气情况,而不需要自己费劲去查找和处理这些数据。简单来说,API帮助软件之间方便、快捷地交换信息和功能。
因此,为了实现这个功能,我专门在GitHub上找了一个MC服务器状态信息查询API源码:PHP-Minecraft-Query,然后将其部署妥当,可以直接使用。如何使用呢,首先你得记住它的网址: http://mcstatus.goldenapplepie.xyz/api/ ,接着,你在这个网址后面加上参数:?ip=
对于MCSManager,其实你可以直接在该项目的使用文档中找到有关API使用的教程,这边简单说两句。首先,你需要根据文档自行部署一个MCSManager控制面板来,接下来在面板内登录账号点击个人资料打开用户信息页面,然后你可以在这里面找到APIKEY,点击生成就可以获取APIkey了。对于其它更多细节,请仔细查阅使用文档。
有了API做基础,接下来,我们返回到ESP32上。
(以micropython为例)首先,由于ESP32无法自主的访问某个url,我们必须将其联网,不过这个对我们来说小菜一碟,函数connect_to_wifi()就是用来联网的。接着通过urequests.get(url)向指定的API接口发送GET请求,获取MC服务器的状态信息。然后,我们将返回的JSON格式数据解析成Python字典,从中提取出我们关心的信息,比如服务器的在线状态、在线玩家数量以及最大玩家数量等。
在主程序中,我们首先调用connect_to_wifi()函数连接到WiFi网络。这个函数会尝试多次连接,直到连接成功或者达到最大尝试次数。连接成功后,程序会进入一个无限循环,在这个循环中不断地调用check_mc_server_status()函数来查询MC服务器的状态,并将查询结果显示在OLED屏幕上。
check_mc_server_status()函数是核心部分,它负责向API接口发送请求并处理返回的响应。如果服务器在线,我们会从响应中提取出在线玩家数量和最大玩家数量;如果服务器离线或者出现其他错误,我们会返回相应的错误信息。整个程序运行起来后,就可以在OLED屏幕上实时看到MC服务器的状态信息了。
Todo:把屏幕升级成彩色大屏,同时给界面也美化一下,以及增加更多功能(比如自动联网、自动警报啥的x)。
PCB文件:暂时没有(x)