openhardwarelab · 智能硬件开放实验室 · 面向普通用户 / 开发者。约 20–40 分钟。
用一台吃灰的安卓机顶盒 + 一台 USB 打印机,做成一台局域网共享打印服务器:
手机扫码传文件打印、电脑用 IPP/网络打印机、盒子屏幕显示二维码、可打印二维码贴纸。
本项目在 烽火 HG680-J(海思 Hi3798MV100 / Android 4.4.2 / armv7)实测通过。
总思路:盒子里跑一个 Linux 子系统(chroot),里面装 CUPS(打印服务)+ 一个网页打印门户 printd(:8080);
盒子屏幕装一个 打印服务器桌面 App(开机即进,内嵌网页打印界面 + 二维码);开机自动拉起全部服务。
getprop ro.product.cpu.abi # armv7 / arm64 getprop ro.build.version.release; getprop ro.build.version.sdk cat /proc/meminfo; df -k
记下:架构 / 安卓版本 / 内存 / 分区。/data 常常很小,后面要注意空间。
盒子开「ADB 调试」→ 电脑:
adb connect 192.168.1.100:5555 # 换成你的盒子 IP adb devices
连不上按你盒子的说明(有的在「运维调试」里,可能弹随机码)。串口(TTL)是备用生命线(万一网络挂了还能救)。
打印服务(CUPS + printd)跑在盒子的 Linux chroot 里。若你已按
「机顶盒改电脑主机」教程建好了子系统 /data/linux,可直接进入第 4 步。
还没建?在盒子(root)里大致这样做:
# 1) 准备一个 armhf 的 Ubuntu 根文件系统镜像 -> /sdcard/linux.img # (也可用现成的 linux20.img;ARMv7 盒子要 armhf 版) # 2) 挂载 busybox losetup /dev/block/loop0 /storage/emulated/0/linux.img mkdir -p /data/linux busybox mount -t ext4 /dev/block/loop0 /data/linux busybox mount -t proc proc /data/linux/proc busybox mount -o bind /dev /data/linux/dev
子系统里装依赖(关键,见第 5 步)。> 详细见 开发者资料/系统改造手册.md。
在电脑上(盒子已连 adb),进子系统装打印相关的包:
adb shell "busybox chroot /data/linux /usr/bin/env \
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
/bin/bash -c 'apt-get update && apt-get install -y \
cups cups-filters avahi-daemon avahi-utils \
printer-driver-gutenprint printer-driver-brlaser printer-driver-cups-pdf \
python3-pil fonts-droid-fallback qrencode'"
cups 打印服务;avahi 让 Mac/iPhone 自动发现;printer-driver-gutenprint 通用驱动(几千个 PPD);printer-driver-brlaser 主机型 Brother/联想激光;python3-pil + fonts-droid-fallback 用于生成「二维码贴纸」(也顺带让中文文档能正常打印);qrencode 生成二维码。盒子一般只有 HTTP(80) 能出网(HTTPS 不通),apt 走 http 镜像没问题;若要用某品牌驱动,可 apt-get install printer-driver-<品牌>。
一键(电脑上,切到 安装文件 目录):
./一键安装.sh 192.168.1.100
它会:把 打印服务.py/二维码贴纸.py 推进子系统 /root/;装桌面 App;并提示后续步骤。
手动:
adb push 打印服务.py /data/linux/root/printd.py adb push 二维码贴纸.py /data/linux/root/qrsheet.py
配置 CUPS(子系统里):
# 允许局域网访问(cupsd.conf 里 Listen 0.0.0.0:631,各 <Location> 加 Allow all) # 启动 dbus-daemon --system --fork /usr/sbin/cupsd avahi-daemon -D --no-chroot --no-drop-root python3 /root/printd.py # 网页打印门户 :8080
http://<盒子IP>:8080/:br1600)。装完打一张测试页验证出纸(管理页/首页菜单都有)。
把桌面 App 装成盒子 HOME:
adb push 桌面.apk /sdcard/printsrv.apk adb shell 'pm install -r /sdcard/printsrv.apk' # 让它成为默认桌面(若还有别的 HOME 应用,禁用/卸载旧的)
装好后盒子屏幕就是打印服务器界面:
ipp://<IP>:631/printers/<名>)让子系统开机自动挂载并拉起服务。参照「机顶盒改电脑主机」的做法:
/root/startbox.sh 里依次拉起:dbus / cupsd / avahi / printd;chroot 执行 startbox,并在末尾 am start ... HOME。http://<盒子IP>:8080/ 能开、桌面显示打印界面。3-开机自启.sh/4-开机兜底.sh是本项目用到的启动脚本,可按你 ROM 调整路径。
http://<盒子IP>:8080/,选/拖文件 → 打印。 ipp://<盒子IP>:631/printers/<打印机名>(首页可一键复制)。
python3-pil + 中文字体。—— openhardwarelab · 智能硬件开放实验室