Matrix 首页推荐
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
在之前的文章中,我介绍了自己花费近两年时间制作了一个电子墨水屏的经历。
针对没有阅读过上一篇文章的读者,我再来介绍一下整个项目的软硬件构成,并且公开本项目的开源地址(GitHub|Gitee)。
整个方案的硬件部分由四部分构成,分别是:
第一篇文章发出后,很多读者反馈是否可以开源,后续我也发现这个项目有很多可以改进的地方,所以近期又花时间做了一轮升级迭代。
升级之后,这个墨水屏可以使用多种方式来进行更新,比如:
1、自动更新模式:每天早上 8 点,自动更新今天的万年历信息;
2、被动更新模式:收到短信后,通过 iPhone 快捷指令自动同步信息到墨水屏;
3、手动更新模式:在一个网页上,输入文字或上传图片进行更新。
接下来,我就依次介绍这三种模式:

前一天,服务端(现在其实就是在我的电脑上)会自动根据当前日期请求相关接口,获取次日的万年历信息,并进一步绘制在一个图片上。如下图:

服务端会继续处理这张图片为墨水屏可读取的数据,并上传到一个公开的 OSS 地址上,每个客户端(也就是墨水屏设备)会在每天早上八点,根据当前日期请求对应的 OSS 地址,获取图片数据后,渲染显示在墨水屏上。
在此模式下,生成图片的过程是在服务端进行(不论有多少客户端服务端只生成一次),客户端只需要联网后,定时请求对应地址即可实现墨水屏的更新。


电子墨水屏的 esp32 主控启动服务器模式,准备接收和处理 HTTP 或 Websocket 请求。然后在 iPhone 上创建一个快捷指令,用于将传入快捷指令的信息发送到 esp32 主控服务器上。

然后我们在 iPhone 上继续创建一个快捷指令的自动化:收到短信之后,自动通过上一步的快捷指令发送到 esp32 主控服务器上。
由于 esp32 的性能很差并不具备图片处理能力,所以 esp32 会将收到的数据发给一个云端的「函数计算」服务,该服务会将收到的数据处理为图片数据返回给 esp32,最终显示在墨水屏上。
此模式还有更广的使用场景,比如把 iPhone 上的待办自动同步到墨水屏、把收到的邮件信息同步等,凡是快捷指令可以获取到的信息,都可以进行同步。
但此模式也有不足之处:由于在手机端发送的不是图片数据,esp32 主控也没有图片处理能力,所以需要一个实时在线的服务端来做这个事情,虽然这个服务端的函数计算成本还算低廉,但是毕竟还是多了额外的成本。


在思考如何更好解决「服务端生成图片数据」问题时,有一天灵光闪现:其实现在手机的性能都很强了,为什么不在手机端生成图片数据后再发送呢?
同样的,在电子墨水屏的 esp32 主控上启动服务器模式,准备接收和处理 HTTP 或 Websocket 请求。客户端这边打开一个网页(也可以叫单页应用),在这个网页上可以通过局域网连接墨水屏系统,输入文字生成图片并投屏,或者上传图片进行合适截取后并投屏。

在这个投屏的过程中,前端网页已经使用 JS 的能力对文字和图片做了处理,将图片数据通过 Websocket 的方式传递给 esp32 主控。esp32 主控在收到图片数据之后,会将其保存为本地目录的一个文件,然后系统重新加载本地目录里的图片数据进行显示。
此模式不需要额外的云端服务,但也有不足之处:因为我没有解决 HTTPS 环境下,请求 HTTP 本地资源的问题,所以没有办法将这个单页应用发布为一个在线服务。使用者需要下载一个 HTML 文件打开使用,安卓设备在文件系统里直接打开,iPhone 用户还需要另外安装一个软件(如:HTML Viewer),才能打开本地 HTML 文件。
这个墨水屏项目前前后后延续了很长时间,每当把这个项目放下,在其他方面学习到一些新东西之后,又会回来反哺这个项目并继续迭代改进。在这个过程中,我也体验到了非常强的成就感。
目前整个项目还有很多可以优化的点,但是由于我并不会把他做成一个真正的「产品」,所以可能会以目前的进度结束这个项目了。
当下可以优化的点包括:
感兴趣的朋友欢迎在此基础上继续探索。
> 关注 少数派小红书,感受精彩数字生活 🍃
> 实用、好用的 正版软件,少数派为你呈现 🚀