拍报机需求分析

RK3568

Posted by LXG on January 23, 2026

产品需求

广告页

  1. 支持视频循环播放(视频从服务器下载)
  2. 支持图片轮播放
  3. 悬浮一个按钮-按钮文字为”点一下开始拍照”

相机预览界面

  1. 点击相机进入相机预览界面
  2. 预览界面悬浮一个立即开拍按钮
  3. 点击按钮后倒计时3-2-1, 然后拍照

拍照结束后进入照片预览界面

  1. 选择照片背景模板(模板从服务器下载)
  2. 重新拍照
  3. 点击确认按钮

对预览照片不满意下一步可以选择进入手机上传, 满意则进入打印界面

手机上传界面

此界面用户用手机扫一扫即可上传手机中的照片,上传完成后,进入预览效果界面(预览界面显示从服务器下载的手机上传的照片)

微信支付界面

确认预览效果后进入微信支付页面,显示支付二维码,用户支付后进入打印界面

打印界面

打印界面显示二维码,用户可以用手机扫描后下载电子照片

补充需求点

  1. 设备是RK3568 21寸屏幕, 1080 x 1920 分辨率
  2. 设备通过MQTT和服务器保持连接
  3. 广告视频或者轮播图从服务器下发
  4. 预览界面的模板也从服务器下发
  5. 手机上传照片成功后服务器通知app调转到预览界面显示通过手机上传的照片

需求分析

广告引流 → 拍照 → 预览 & 模板 → 上传 / 支付 → 打印 & 下载

六个模块


AdModule        // 广告播放
CameraModule    // 相机预览 & 拍照
PreviewModule   // 照片预览 & 模板
UploadModule    // 手机上传
PaymentModule   // 微信支付
PrintModule     // 打印 & 下载二维码

核心是状态机


AD
CAMERA_PREVIEW
COUNTDOWN
PHOTO_TAKEN
PHOTO_PREVIEW
WAIT_UPLOAD
WAIT_PAYMENT
PRINTING
DONE

所有页面只是状态的“视图”, 页面不要互相跳转,只监听状态变化。

广告页(Ad Page)

工程实现建议:

  • AdPlayer
    • VideoPlayer(ExoPlayer)
    • ImageSlideshow
  • 定时器 + 生命周期绑定
  • 必须支持“被打断立刻释放资源”

Claude Code 指令示例:


Design an Ad module for Android that supports:
- looping video playback
- looping image slideshow
- floating start button
- fast resource release when exiting

相机预览界面(Camera Preview)

工程实现

  • Camera2 / CameraX
  • 单次拍照(非录像)
  • 倒计时不能卡 UI
  • 拍完 立刻 stop preview

Claude Code 指令示例:


Design a camera preview and single-shot capture module
for an embedded Android device.
Requirements:
- 3-second countdown
- no UI dependency
- stable long-running behavior

照片预览界面(Preview + 模板)

工程实现

  • 模板 = 图像渲染规则
  • 一定要和 Camera 解耦
  • 预览图 ≠ 打印图
  • 打印图可以更高清,预览图可以低分

Claude Code 指令:


Design a photo template system that supports:
- background switching
- preview rendering
- final print rendering

手机上传界面(扫码上传)

工程重点

  • 这是一个 异步、不可控流程
  • 不能阻塞主流程

Claude Code 指令:


Design a QR-based photo upload flow
that supports async upload, timeout, and retry.

微信支付界面(Payment)

工程重点

  • 支付 = 状态机的一部分
  • 不能“靠回调跳页面”

Claude Code 指令:


Design a WeChat QR payment flow suitable for a kiosk device.
Focus on reliability and state recovery.

打印 & 下载界面(Print)

  • 打印是 不可逆动作
  • 一定要有失败兜底
  • 本地 HTTP或云端短链接二维码

Claude Code 指令:


Design a printing flow with QR code download support.
Printing must be transactional and recoverable.

工作量评估

基础架构 & 状态机

模块 工作量 说明
State Machine 设计 1.5 天  
App 框架 / 包结构 0.5 天  
全局异常兜底 1 天 防死机、防断网
小计 3 天

UI & 流程实现(21 寸 1080×1920)

页面 工作量
广告页(视频/轮播) 1.5 天
相机预览 + 倒计时 2 天
拍照预览 + 模板 2 天
手机上传引导页 1 天
支付二维码页 1 天
打印完成页 0.5 天
小计 8 天

Camera & 图片处理(大坑)

内容 工作量
CameraX / Camera2 适配 2 天
倒计时拍照稳定性 1 天
图片裁剪 / 旋转 1 天
模板合成(Bitmap) 2 天
小计 6 天

MQTT & 服务器联动(核心)

内容 工作量
MQTT 长连接 1 天
心跳 & 重连 1 天
广告下发 1 天
模板下发 1 天
上传完成回调 1 天
小计 5 天

手机上传(扫码 + 通知)

内容 工作量
二维码生成 0.5 天
上传状态轮询 / MQTT 1 天
异常兜底 0.5 天
小计 2 天

微信支付

内容 工作量
支付二维码展示 0.5 天
支付结果回调 1 天
支付异常处理 1 天
小计 2.5 天

打印 & 硬件对接

内容 工作量
打印 SDK 接入 1.5 天
状态回调 1 天
出错兜底 0.5 天
小计 3 天

稳定性 / 运维

内容 工作量
异常回广告 1 天
无人操作超时 0.5 天
日志 & 崩溃恢复 1 天
小计 2.5 天

总体估计

模块 主要内容 预估工期
启动 & 广告页 视频/图片轮播、资源缓存、异常兜底 2–3 天
相机预览 Camera2 / USB 相机 / 全屏适配 4–6 天
倒计时 & 拍照 定时、闪屏、快门控制 1–2 天
照片预览 模板叠加、背景切换 4–5 天
手机扫码上传 二维码、HTTP/MQTT 通知 3–4 天
MQTT 通信 设备在线、状态同步、事件推送 2–3 天
微信支付 二维码、回调、异常 2–3 天
网口打印 TCP/IP 打印、状态确认 3–5 天
打印完成展示 二维码下载电子照 1 天
UI 适配 21 寸竖屏、全屏沉浸 2 天
异常 & 稳定性 断网、相机失败、重试 3–4 天

合计:约 32–40 个工作日(6–8 周)

打印机选型

HP OfficeJet 5225n 网口激光打印机

  • 耗材: 使用 HP 307A 碳粉盒。黑色寿命约 7,000 页,彩色约 7,300 页。这意味着你从“几天换一次墨盒”变成了“几个月换一次碳粉”,维护成本暴降。
  • 负载: 月打印负荷高达 75,000 页,非常适合自助机这种高频率场景。
  • 纸张: 支持 A3/A4 甚至更大尺寸(SRA3),如果你要做大幅面海报打印,这台机器非常强悍。

打印协议

CP5225n 支持标准协议:HP PCL 6, HP PCL 5c, HP Postscript level 3 emulation。

RAW Socket (Port 9100) 激光机对 PCL 指令的支持非常完美。可以直接将处理好的 PCL 数据流通过网络端口推给打印机, 真正的静默打印,无需安装任何 Android 打印插件,完全掌控打印过程。

打印流程


+---------------------------+
|   用户确认打印/下载二维码  |
+-----------+---------------+
            |
            v
+---------------------------+
| 渲染高分打印图(照片+模板) |
+-----------+---------------+
            |
            v
+---------------------------+
|   生成 PCL/PostScript 数据  |
+-----------+---------------+
            |
            v
+---------------------------+
|  建立 TCP Socket 连接打印机 |
|      (Port 9100)          |
+-----------+---------------+
            |
            v
+---------------------------+
|  异步发送 PCL 数据流       |
|  (分包 / 缓冲处理)        |
+-----------+---------------+
            |
            v
+---------------------------+
| 等待打印机 ACK 或状态响应  |
+-----------+---------------+
            |
      +-----+-----+
      |           |
      v           v
+-----------+   +----------------+
| 打印完成  |   | 打印失败/重试 |
+-----------+   +----------------+
      |                 |
      v                 v
+-----------+   +----------------+
| 状态机更新 |   | 异常处理/回退 |
| DONE/打印完成 |  | 返回广告页或重试 |
+-----------+   +----------------+

工程风险点

  • 相机:硬件适配 + 倒计时 + 高分拍照 + 异常恢复
  • 模板合成:高分渲染 + 异步处理 + 缓存管理
  • 打印:网络打印协议 + 状态确认 + 异常回退

Claude Code

第一阶段:定义“灵魂”(架构与状态机)


目标: 建立全局唯一状态源,确保无人值守逻辑不乱。

给 Claude Code 的指令:

我们要基于 RK3568 (4+32G) 开发拍报机。请先构建项目基础骨架:

使用 MVI (Model-View-Intent) 架构。定义 MachineState 密封类,涵盖:IdleAd(广告)、CameraCapture(拍照)、PhotoEdit(合成预览)、Payment(支付)、Printing(打印中)、Finish(完成)。

创建一个全局 AppStateManager,使用 StateFlow 驱动 UI 切换。

配置 build.gradle,引入 CameraX、ExoPlayer、MQTT-Paho、Glide 和 Zxing 依赖。

针对 1080x1920 竖屏,生成基础布局资源文件

攻克“硬件双壁”(相机与打印)


目标: 解决风险最高的两个环节。

给 Claude Code 的指令: “现在处理核心硬件对接,请分步完成:

相机: 实现 CameraModule。针对 1080P 预览,确保不拉伸,并提供一个 takePhoto() 方法,拍照后返回 Bitmap。

打印: 编写 HPPrintService。使用 IPP 协议 封装,通过 TCP 631 端口向指定 IP 的 HP 5255 发送打印任务。

状态反馈: 打印类必须能异步返回:CONNECTING, PRINTING, SUCCESS, ERROR_PAPER_OUT(缺纸)。

由于有 4G 内存,拍照和预览时不需要强制销毁视频插件,保持切换流畅。”

打通“云端大脑”(MQTT 与 手机上传)


目标: 实现远程控制和手机扫码交互。

给 Claude Code 的指令: “现在实现通讯模块:

MQTT: 编写一个长连接服务。监听 ad/update(更新素材)和 cmd/reboot 指令。

异步通知: 当用户在‘手机上传界面’扫描二维码后,服务器会发送 MQTT 消息告知 App 上传成功。请写好监听逻辑,收到信号后自动跳转到 PhotoEdit 状态。

资源下载: 编写一个 DownloadManager,支持断点续传下载服务器下发的视频素材到 32G 存储空间。”

图像处理与“面子工程”(模板合成)


目标: 利用 4G 内存优势,实现高质量合成。

给 Claude Code 的指令: “请实现图片合成逻辑:

用户拍照后,需要将照片叠加在服务器下载的 PNG 模板之上。

使用 Canvas 进行离屏渲染。因为内存充足,请使用 Config.ARGB_8888 保证最高画质,并支持双指缩放和位移微调照片。

生成一个用于打印的 300 DPI 高清图和用于显示的低分缩略图。”

第五阶段:稳定性运维(无人值守逻辑)


目标: 确保机器死不了。

给 Claude Code 的指令: “最后,增加鲁棒性逻辑:

无操作超时: 在非广告状态下,若 60 秒无交互,自动回退到 IdleAd 状态。

异常保护: 如果打印机断开或 MQTT 掉线,在屏幕右上角显示一个微小的 UI 提示,但不阻碍用户基本浏览。

定时任务: 每天凌晨 3 点,检查是否有新广告素材,并清理 7 天前的缓存图片。”

Claude Code 本身不会像网页版那样保留一个“对话列表”,但它通过“本地状态”和“上下文分析”实现了一种更高级的“记忆”。

即便系统重启,只要你在同一个项目目录下再次运行 claude,它依然能接上之前的活。

.claude/ 隐藏文件夹在项目中会记录

增加AI后工期对比

模块 / 内容 人工开发 Claude Code 协助开发 工期差异 说明 / 风险
状态机 & App 框架 3 天 2 天 -1 天 Claude Code 可生成状态机骨架,减少重复手写
广告页(视频/图片轮播) 1.5 天 1 天 -0.5 天 AI 可生成布局与播放示例代码
相机预览 + 倒计时 2 天 1.5 天 -0.5 天 AI 可生成 CameraX/Camera2 拍照 + 倒计时示例,但 USB 调试仍需人工
拍照预览 + 模板 2 天 1.5 天 -0.5 天 AI 可生成 Bitmap 合成示例,异步渲染代码模板
手机上传 2 天 1.5 天 -0.5 天 AI 可生成二维码 + MQTT 轮询示例
微信支付 2.5 天 2 天 -0.5 天 AI 可生成二维码展示与回调模板
打印 & 硬件对接 2.5 天 2 天 -0.5 天 打印机换成 CP5225n,RAW Socket 直连,AI可生成发送示例
异常 & 稳定性 2.5 天 2 天 -0.5 天 AI 可生成 try/catch + 异步回调示例,但网络/USB 异常仍需人工处理
UI 适配 2 天 1.5 天 -0.5 天 AI 可生成布局和约束,节省手写时间
总计 32–33 天 25–27 天 节省 5–6 天 高分模板渲染、USB 摄像头调试仍需人工