ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

旧机顶盒改造成3D打印服务器:Armbian+Docker部署Octoprint实战

旧机顶盒改造成3D打印服务器:Armbian+Docker部署Octoprint实战 家里那台吃灰的运营商机顶盒去年收拾房间翻出来本来是打算扔的。后来改好一台3D打印机发现每次打印都得守着电脑传GCode、盯状态实在麻烦。于是这台五十块钱都没人要的盒子被我刷成了专用的3D打印服务器。跑了有大半年除了偶尔断电没出过幺蛾子。这套方案的核心就三样Armbian当系统、Docker做隔离、Octoprint跑服务。整体成本就是一台旧机顶盒的价钱加一个U盘或者一张TF卡。适合手里有吃灰盒子的人也适合想低成本给打印机配个“大脑”、但不想花大几百买树莓派的人。下面我把整个折腾过程从选盒子到长期运行的细节都写清楚照着走基本不会卡壳。1. 为什么偏偏是机顶盒3D打印服务器的另一种活法1.1 打印机自带的SD卡和USB口限制到底在哪市面上一大票3D打印机基于Marlin固件方案出厂给的玩法基本就两种插SD/TF卡脱机打印或者USB线连电脑用上位机软件控制。SD卡打印的痛点用过的人都懂切片得先开电脑改个参数得拔卡插卡打印过程完全看不到状态打着打着发现料断了或者第一层没粘牢只能跑过去硬等。连电脑倒是能看状态但电脑不能关长时间开机又费电又占地方。Octoprint解决的就是这个事。它本质上是一个跑在Linux小主机上的Web服务能把打印机变成“网络设备”浏览器里传GCode、在线改打印速度、看摄像头实时画面、手机上随时查进度还能挂切片插件直接云端切完让机器开打。打印结束、出错都能推送通知。这套东西对使用体验的提升属于用过就回不去的那种。1.2 机顶盒做服务器要同时扛住的几件事很多人的第一反应是一个机顶盒性能够吗实际上Octoprint本身是个Python写的Web服务一个人用的话负载很低512MB内存都能跑但加上视频流、切片任务就吃紧了。我的建议是内存2GB起步这样Octoprint主服务、MJPG-Streamer摄像头推流、偶尔开个切片任务同时跑内存占用大概在1GB上下系统不会卡。再说CPU。常见的老电视盒子用的是晶晨S905系列、瑞芯微RK3328这类ARM架构芯片四核A53起步性能比树莓派Zero要强不少跑Octoprint的日常操作完全够。真正吃性能的切片工作一般也是几百克的小模型哪怕在盒子上用CuraEngine切也就几分钟的事。整个服务的并发量就一两个人不追求服务器级别的吞吐机顶盒这个性能定位正好合适。1.3 和树莓派比这笔账怎么算树莓派4B现在的价格大家都清楚加上电源、TF卡、外壳轻松破500。而一台S905系列、2GB内存的二手运营商机顶盒小黄鱼上普遍三五十块加个U盘几块钱总成本不到一张树莓派价格的零头。性能上S905X的CPU跑分不输树莓派3B对3D打印服务器这种场景绰绰有余。树莓派的优势在于GPIO可玩性强、社区资料多但3D打印服务器这个用途根本用不到GPIO纯粹是性能和成本的错配。我用下面这张表给当时的自己算过账也分享给纠结的朋友方案大致成本功耗体积/噪音折腾难度旧机顶盒Armbian50元左右3-5W小、无噪音中等要刷机树莓派4B400-600元5-8W小、可加风扇低资料多旧笔记本几百上千元30-60W大、有风扇声低但费电云服务器跑Octoprint按年续费0W本地无低但延迟高、串口难办表里最后一行是提醒有人想租云服务器跑Octoprint但这玩意需要直连打印机的串口和摄像头走云上方案得额外搞USB网关设备成本和复杂度反而上去了。机顶盒放在打印机旁边一根USB线直连是最直接、最省心的拓扑。2. 挑盒子先看芯片哪些能刷、哪些别碰2.1 Armbian对芯片的适配决定了你的省心程度刷机这件事最怕的不是操作难而是芯片没适配系统起不来。Armbian社区对电视盒子的支持是按芯片SoC走的不是按品牌走的。同一个牌子不同批次可能用完全不同的芯片所以挑盒子的铁律是先查芯片再谈其他。目前Armbian社区适配最成熟的是晶晨Amlogic系列尤其是S905系列S905X、S905X2、S905X3很多第三方固件作者也是基于这些芯片做的。瑞芯微的RK3328、RK3399也有不错的支持全志的H3/H5也能跑但资料相对少一些。至于高通的、联发科的电视盒子芯片基本不用考虑不是不能启动是驱动和第三方固件少折腾成本会指数级上升没必要为难自己。芯片厂商常见型号Armbian支持程度备注晶晨AmlogicS905X / S905X2 / S905X3高最省心dtb好找瑞芯微RockchipRK3328 / RK3399较高性能不错教程少一点全志AllwinnerH3 / H5中可玩但外设支持一般海思HisiliconHi3798系列等低主要刷安卓Armbian资料少高通/联发科各种电视盒芯片极低别碰2.2 内存、网口、USB口哪个都不能省芯片确定能刷之后再看硬件规格。内存这条我前面说了2GB起步是硬性标准。1GB内存的盒子不是不能跑但Octoprint加上摄像头推流再挂个浏览器页面很容易把内存吃满触发OOM杀进程。我自己一开始拿1GB的盒子试过打印途中系统把Octoprint杀了打印机直接失去控制这种体验最好别来第二次。网口能选千兆就选千兆。虽然打印数据传输量不大但局域网里往服务器传大模型文件、加载插件市场、看摄像头高清流千兆的体验会舒服很多。百兆口也不是不能用只是传大文件会慢一些。USB口至少要有两个一个接打印机一个接摄像头不够就上USB HUB。有USB 3.0更好但不是必须因为Octoprint的数据读写瓶颈一般不在USB口。盒子最好是网线插着用虽然很多盒子有WiFi但ARM Linux下的WiFi驱动良莠不齐有时候信号看着满格延迟和丢包很影响体验打印中途掉线得不偿失。2.3 动手前先收集的三样东西固件、线材、资料确定盒子能刷之后开工前至少准备好三样东西。固件这一块去Armbian官方社区看有没有对应芯片的镜像或者找该机型第三方固件作者发布的刷机包。这里要特别注意下载固件时看清是“直接写入EMMC的img”还是“U盘引导的img”两者用法不同。如果你对dtb设备树文件不熟优先选别人已经整合好、说明里写清楚“即刷即用”的固件能省大量时间。线材方面一条USB转TTL串口线CH340或者CP2102方案的最常见是救砖神器虽然正常操作不一定用得上但万一刷挂了这是唯一能把盒子从砖头里拉出来的路径。另外备一个USB Hub、一张质量还行的U盘8GB以上或者TF卡用来做启动介质。原装电源必须留着用功率不足是后面各种莫名其妙的死机的头号元凶。最后是资料。搜机顶盒刷Armbian教程时把该机型的“进入刷机模式方法”“原厂系统备份方法”“短接点位置”这些关键词都存下来。不同盒子进刷机模式的方式完全不一样有的用遥控器组合键进Recovery有的要短接主板上的两个触点有的开ADB后直接网络刷。这一步没法统一说但每个机型的信息在当前各个数码论坛上都很全动手之前先花半小时把资料备齐。3. 刷Armbian的全过程把安卓底层换成Linux3.1 写盘之前先给原厂系统留条退路拿到盒子别急着刷先开机进安卓系统把原厂固件备份出来。机顶盒的原厂固件一般都能在对应机型的论坛里找到线刷包或卡刷包实在找不到至少把自己盒子的芯片型号、内存大小、WiFi芯片型号、当前安卓版本记下来。这些信息在刷Armbian选dtb的时候要用到也是你将来刷回安卓的唯一依据。接下来用balenaEtcher或者Rufus把下载好的Armbian镜像写进U盘。这个操作会清空U盘所有数据U盘里有东西先拷出来。写盘完成后Windows下会提示U盘分区无法识别这是正常的不用管它。然后需要找到U盘根目录下的启动配置文件。不同固件位置不一样常见的两个路径是extlinux/extlinux.conf和uEnv.ini。用文本编辑器打开里面会有一行类似FDT/dtb/amlogic/meson-gxl-s905x-p212.dtb的配置这里就是你选dtb的地方。把路径改成你那颗芯片对应的dtb文件名保存退出。dtb文件一般都在同一个固件包的/dtb目录下按芯片厂商和型号分成子目录找到跟你盒子芯片完全对应的那个就行。这个名字不一定完全精准但选错了一定会启动失败多试几个也没关系。3.2 U盘启动和首次配置看到SSH登录就算成功一半把写好的U盘插到机顶盒上。优先插靠近网口的那个USB口很多盒子只有这一个口支持从U盘引导。接上网线给盒子上电。第一次启动可能要在黑屏界面等好几分钟这期间不要断电不要手贱拔U盘。开机后去路由器后台看设备列表找有没有一个叫“armbian”的新设备记下它的IP。然后用SSH工具连接ssh root盒子IP。Armbian首次登录默认密码是1234登录后系统会强制让你改root密码然后提示创建一个普通用户。这里注意普通用户建议直接建一个后面Docker和日常操作都用这个用户别天天拿root跑业务。进系统后第一步跑一下armbian-config把时区改成Asia/Shanghai更新软件源设置主机名和固定IP。固定IP这一步最好在路由器DHCP里绑定MAC而不是在系统里手动改静态IP这样万一系统重装IP分配逻辑不会乱。3.3 写入EMMC与分区安排长期运行的归宿U盘上的Armbian跑起来只是第一步长期用建议把系统写入板载EMMC。原因很简单U盘长时间持续读写容易过热、掉盘速度也比不上EMMC。在Armbian终端执行armbian-install部分固件叫nand-sata-install回车后选择写入EMMC按提示选文件系统默认ext4就行不用搞特殊。写入完成后会提示关机这时拔掉U盘再上电盒子就直接从EMMC启动Armbian了。进入系统后先更新一遍软件源apt update apt upgrade -y。这里有个经验升级的时候建议挑网络不忙的时候做盒子板载EMMC写入速度和网络下载速度都会影响耗时别以为是死机了就强制断电。一旦升级到一半断电EMMC里的系统可能会损坏又得从U盘重来。4. Docker环境搭建与Octoprint容器化部署4.1 为什么会有这么多踩坑直接在系统里装 vs 容器化很多人刷好Armbian后第一反应是直接apt install octoprint或者按官方脚本装Python环境。这个路线不是不行但Octoprint是Python应用依赖一堆系统库加上插件市场里各种插件对库版本要求不一装多了以后很容易出现“装A插件把B插件的依赖顶掉”这种混乱局面。再加上以后你想在这台盒子上跑别的服务比如智能家居网关、下载机Python环境冲突会变成日常。Docker的思路是把Octoprint连同它的全家桶依赖装进一个独立容器里。容器坏了重装就行系统本体永远是干净的镜像升级、回滚只要改个tag重拉一次以后再跑其他服务也不会互相污染。对于一台只有几个GB存储、性能不高的机顶盒来说Docker带来的运维便利性非常明显。4.2 容器配置要盯住的三个挂载点串口、摄像头、数据卷在Armbian上装Docker很简单。用发行版仓库安装或官方脚本都行装完后记得把当前用户加进docker组免去每次敲sudosudo apt update sudo apt install docker.io docker-compose-plugin docker-compose sudo usermod -aG docker $USER退出SSH重新登录让组权限生效。然后配置一下国内镜像源新建/etc/docker/daemon.json写入{ registry-mirrors: [https://docker.m.daocloud.io] }重启Docker服务后docker info能确认镜像源生效。这一步主要是为了拉镜像和插件时不至于卡到怀疑人生。接下来是最关键的部分写docker-compose.yml。Octoprint的官方容器镜像把主服务和MJPG-Streamer摄像头推流都打包好了我用的是下面这份配置version: 3 services: octoprint: image: octoprint/octoprint:latest restart: unless-stopped ports: - 80:80 devices: - /dev/ttyUSB0:/dev/ttyUSB0 - /dev/video0:/dev/video0 volumes: - octoprint_data:/home/octoprint - /etc/localtime:/etc/localtime:ro environment: - ENABLE_MJPG_STREAMERtrue - MJPG_STREAMER_INPUT-n -r 1280x720docker compose up -d这份配置里三个映射是整个方案的核心。第一devices把宿主机上的打印机串口设备/dev/ttyUSB0直接映射进容器第二摄像头设备/dev/video0也映射进去交给容器内的MJPG-Streamer处理第三命名卷octoprint_data存放Octoprint的配置、上传的模型和打印历史容器升级数据不丢。/etc/localtime映射进去是为了让容器时区和宿主机一致日志时间就不会错乱。4.3 首次启动后要做的三件事容器起来后浏览器访问http://盒子IP第一次进入Octoprint会要求创建管理员账号。这个账号就是以后的控制台登录凭证密码别设太简单因为只要在局域网内任何设备都能访问这个页面。登录进去后三件事按顺序做。第一右上角设置里找到“Serial Connection”把串口波特率改成打印机固件实际的波特率。Marlin固件常见的是115200或250000具体看固件配置。填完后点“Connect”看左下角状态是不是从“Offline”变成“Operational”。第二在Feature选项里把“自动连接打印机”打开这样容器重启后Octoprint会自动重连打印机不用你每次手动点。第三去插件管理器里搜安装“CuraEngine”或者“PrusaSlicer”插件这样上传STL后可以直接在浏览器端切片把切好的GCode直接发给打印机真正实现“手机也能开打”。5. 接打印机和摄像头串口、权限和流媒体那些坑5.1 串口权限问题容器里看不到打印机的根源第一次启动后最常见的现象是Octoprint页面上看不到串口设备下拉列表是空的。先别急着在容器里折腾回宿主机执行ls /dev/ttyUSB* ls -l /dev/ttyUSB* lsusblsusb能确认USB转串口芯片有没有被识别出来。常见的CH340会出现“QinHeng Electronics”CP2102会出现“Silicon Labs”。如果看不到设备先检查USB线是不是插好了换一个USB口试试。有些盒子只有特定USB口能识别USB转串口设备这个得实测。如果ls -l看到设备权限是crw-rw----所属组是dialout而你启动Docker的用户不在这个组里容器自然拿不到设备权限。解决办法sudo usermod -aG dialout $USER sudo chmod 666 /dev/ttyUSB0第一条把用户加进dialout组第二条临时把设备权限放开。改完重新登录、重新docker compose up -d这时候Octoprint页面应该就能看到/dev/ttyUSB0了。如果还是不行大概率是docker-compose.yml里devices没写好或者容器没重建改完配置后要跑docker compose down docker compose up -d重新拉起容器。5.2 摄像头掉线和mjpg-streamer的配置USB摄像头的接入比串口简单插上后一般是/dev/video0。容器里已经启用了MJPG-StreamerOctoprint设置页里把“Webcam Timelapse”的URL填成http://localhost:8080/?actionstream刷新页面就能看到摄像头画面。这个URL指向的是容器内部端口所以用localhost没问题。摄像头最容易出问题的点是掉线。打印打着打着画面卡住去宿主机看dmesg全是USB disconnect的报错。原因是机顶盒的USB口供电弱摄像头功耗稍高就把它拉挂了。解决办法最省心的是买一个带独立供电的USB HUB把摄像头插在HUB上HUB再插到盒子。HUB的电源适配器最好选5V 2A以上的这就彻底绕开了盒子USB口供电不足的问题。另外建议把视频分辨率设低一点比如我的配置里MJPG_STREAMER_INPUT-n -r 1280x720720P的帧率稳定在15到20帧手机上查看时不会有明显延迟。1080P在盒子上编码压力大容易把CPU跑满反而影响打印响应。5.3 切片插件和延时摄影装上就能少折腾Octoprint的插件生态是这套方案最值得玩的地方。我实际装下来最有用的是三个CuraEngine或PrusaSlicer插件负责服务端切片Octolapse负责延时摄影Telegram通知负责告诉你“打完了”或者“出事了”。切片插件装上后在Octoprint界面里可以直接上传STL选打印机配置和切片参数点一下就能生成GCode然后排队打印。我用手机浏览器远程传个模型切完直接打整个流程已经离不开了。不过要注意盒子的CPU性能和电脑没法比切片速度不如电脑切片时Octoprint界面会卡一阵属正常现象别以为死机了。Octolapse的玩法是控制摄像头在每一层打印开始前的固定位置拍一张照片打印结束后自动合成延时视频。想在盒子上合成视频分辨率别设太高720P合成一个几百层的视频大概要跑十几分钟盒子会满载能接受就行。Telegram通知相对简单填个Bot Token和Chat ID就能用打印开始、完成、失败都会推消息。外出的时候不需要盯着Octoprint页面也能知道打印机状态这点非常实用。6. 连续打印一周不重启稳定性加固的经验6.1 供电机顶盒死机最隐蔽的原因盒子刷好、Octoprint跑通你以为就完了真正让人头疼的是稳定性问题。最典型的特征是打印过程中盒子突然重启或者串口丢字节导致打印机收到乱码指令。查来查去软件配置没问题最后发现是电源不行。运营商机顶盒的原装电源适配器一般只有12V 1A或1.5A经过了这么多年电容老化后纹波变大、带载能力下降。而机顶盒刷Armbian后加上摄像头、打印机、USB HUB这些外设功耗明显比安卓系统待机时高老电源就扛不住了。我的建议是直接换个新的12V电源电流买大一个档位比如原来1A的换2A成本也就二三十块。这一步对稳定性的改善立竿见影。6.2 散热与长期运行的EMMC保护机顶盒的设计本来就只是放客厅看视频散热需求不高。刷成Armbian后跑Octoprint、切片、视频推流连续几天满载塑料壳盒子的散热就成了问题。我在盒子上贴了几个散热片再配一个5V的小风扇对着吹温度和稳定性立刻改善。室温30度的时候没加散热措施之前CPU能飙到80多度加了之后稳定在60度以下。只要温度不失控盒子基本不会死机。EMMC的寿命也得考虑。机顶盒板载EMMC用的是廉价颗粒频繁写入会有磨损。长期运行的策略是把Docker容器和Octoprint的数据卷正常放EMMC但把系统日志、临时文件放到内存临时文件系统里减少不必要的磁盘写入。可以在Armbian里改/etc/fstab把/var/log挂载为tmpfs。打印机的GCode传到盒子后会在数据卷里留一份打完不需要的定期清理也能减少EMMC占用和磨损。6.3 掉线恢复与断点续打的兜底策略就算供电和散热都弄好了打印机或者盒子还是可能出现偶发的串口假死。Octoprint里有一个“自动重连”的功能在设置里把它打开串口断开后会自动尝试重连。另外我见过很多人在打印中途盒子和打印机都正常但是网络断了用手机看不到进度。这种情况可以在Octoprint插件里装一个“PrintJobHistory”或者“OctoApp”它们会在本地缓存打印状态网络恢复后自动同步。断电的问题没法完全靠软件解决除非打印机固件支持断电续打很多马林固件新版本已经有了并且机器上装了UPS或者至少是继电模块。我这边因为家里偶尔跳闸后来给打印机配了一个小型的断电续打模块这个属于打印机硬件层面的改造跟盒子关系不大但值得提一嘴服务器这端能做的就是把掉线恢复配置好打印不出垃圾料、不撞喷嘴剩下的交给硬件兜底。这套系统跑了大半年我最初担心的“盒子性能不够”“不稳定”基本都没发生。现在这台盒子平时就安安静静放在打印机旁边插着网线、顶着个小风扇也不需要显示器远程传个模型就能开打。如果你手头正好有一台吃灰的机顶盒与其让它躺在抽屉里不如按这个思路让它重新上岗。真要说有什么门槛也就是刷机那一步需要耐心找对固件和dtb过了这关后面Docker和Octoprint都只是顺手的事。
返回列表