随着线下DIY娱乐场景的快速发展,拼豆手工项目因低门槛、高趣味性受到年轻群体的欢迎,但传统拼豆店存在高峰时段人力不足、营业时间受限、耗材结算效率低等痛点,无人自助拼豆系统通过物联网+云端服务的架构,实现了24小时无人值守、自助取豆、自动结算的全流程闭环。本文将从架构设计、核心功能实现、部署上线等维度,完整分享无人自助拼豆系统的开发实战经验。
系统需求与整体架构设计
核心需求梳理
无人自助拼豆系统需要覆盖三类使用场景的需求:
- C端用户需求:支持查看附近门店、一键导航、扫码授权开柜、拼豆耗材取用自动结算、订单记录查询、拼豆模板参考等功能;
- 门店管理员需求:支持拼豆耗材库存管理、自助柜设备状态监控、订单数据统计、异常订单处理、库存预警通知等功能;
- 平台运维需求:支持多门店统一管理、权限分配、系统配置升级、设备远程调试等功能。
技术架构选型
参考成熟的无人共享类系统架构,本系统采用分层设计,各模块解耦支持快速扩展,具体技术栈如下:
| 层级 | 技术选型 | 作用说明 |
|---|---|---|
| 物联网设备层 | 电磁锁、重量传感器、ESP32主控模块、MQTT通信协议 | 负责柜门锁控、拼豆重量采集、设备状态上报与指令接收 |
| 后端服务层 | Spring Boot + MyBatis Plus + MySQL + Redis + EMQX | 核心业务逻辑处理、数据持久化、设备通信对接、缓存加速 |
| 前端应用层 | UniApp(用户端)、Vue + Element UI(管理后台) | 用户端支持小程序、H5、APP多端适配,管理后台满足PC端运维需求 |
架构设计时重点考虑了软硬件一体化的兼容性,所有设备通信协议统一采用MQTT,保证弱网环境下的指令送达率,同时业务层与设备层完全解耦,后续更换硬件型号无需修改核心业务代码。
核心功能模块的技术实现
物联网设备对接模块
该模块是无人自助场景的核心,主要实现用户扫码授权开柜、重量自动核算的逻辑。拼豆柜每个格子对应一种色系的拼豆,内置高精度重量传感器,用户取豆完成后通过重量差值计算耗材使用量,自动生成结算订单。
核心开锁指令下发的代码示例如下:
// MQTT消息发送工具类核心方法@ResourceprivateMqttClientmqttClient;@ResourceprivateStringRedisTemplateredisTemplate;publicvoidsendUnlockCommand(StringdeviceSn,IntegergridId,StringuserId){MqttMessagemessage=newMqttMessage();Map<String,Object>payload=newHashMap<>();payload.put("cmd","unlock");payload.put("gridId",gridId);payload.put("userId",userId);payload.put("timestamp",System.currentTimeMillis());message.setPayload(JSON.toJSONString(payload).getBytes(StandardCharsets.UTF_8));message.setQos(1);// 重要指令采用QoS1级别,确保至少送达一次try{mqttClient.publish("device/"+deviceSn+"/cmd",message);// 临时授权存入Redis,有效期5分钟,防止重复开锁redisTemplate.opsForValue().set("auth:"+deviceSn+":"+gridId,userId,5,TimeUnit.MINUTES);// 记录操作日志log.info("设备{}格子{}开锁指令已发送,授权用户:{}",deviceSn,gridId,userId);}catch(MqttExceptione){log.error("设备{}格子{}开锁指令发送失败",deviceSn,gridId,e);thrownewBusinessException("设备通信失败,请稍后重试");}}设备端接收到开锁指令后触发电磁锁打开,用户取豆关闭柜门后,传感器将重量差值上报到服务端,服务端根据预设的拼豆单位重量换算使用量,自动计算费用生成待支付订单。
多端业务功能实现
用户端核心流程
用户端基于UniApp开发,一套代码可编译为小程序、H5、APP三个版本,核心流程如下:用户授权登录后,基于LBS定位展示附近的自助拼豆门店,支持一键导航;到店后扫描设备,选择需要取用的拼豆色系,服务端验证用户状态后下发开锁指令;取豆关柜后自动生成结算订单,用户完成支付后可查看本次取用的拼豆数量、参考制作教程等内容。
管理后台核心功能
管理后台基于Vue+Element UI开发,核心能力包括:
- 设备实时监控:通过WebSocket推送设备在线状态、格子剩余耗材量,离线设备自动标红预警;
- 订单统计分析:基于MyBatis Plus的条件构造器实现多维度数据统计,支持按日/周/月维度统计门店营收、耗材消耗量、用户活跃度等数据;
- 库存管理:设置耗材剩余阈值,当某类拼豆重量低于阈值时自动生成待补货任务,推送给对应门店管理员。
系统部署与上线调优
部署环境准备
服务器基础配置推荐2核4G云服务器,操作系统采用CentOS7.9,需要预先安装的环境包括:JDK1.8、MySQL8.0、Redis6.x、EMQX4.4(MQTT消息 broker)、Nginx1.20。
分步部署流程
- 后端服务部署:通过
mvn package命令将Spring Boot项目打包为jar包,采用systemd托管服务运行,配置开机自启动,服务端口默认设置为8080; - MQTT服务部署:安装EMQX后开启WebSocket监听端口,配置ACL权限控制,只允许合法设备接入,防止恶意设备攻击;
- 前端项目部署:用户端UniApp项目编译为H5版本后,将静态资源上传到Nginx指定目录;小程序版本直接上传代码提交平台审核即可;管理后台Vue项目执行
npm run build打包后同样部署到Nginx静态目录,配置反向代理规则,将/api前缀的请求转发到后端服务,/mqtt前缀的请求转发到EMQX的WebSocket端口; - 数据库初始化:执行SQL脚本初始化表结构,配置数据库定期备份策略,每日凌晨自动备份数据到对象存储服务。
上线前调优要点
- 数据库优化:给订单表的
user_id、device_sn、create_time字段添加联合索引,给设备表的device_sn字段添加索引,查询性能可提升70%以上; - 缓存优化:将设备基础信息、用户常用地址等热点数据存入Redis,降低数据库查询压力,接口平均响应时间可控制在200ms以内;
- 通信优化:设备状态上报类非重要消息采用QoS0级别,降低带宽消耗,开锁、结算类核心消息采用QoS1级别,配置消息重发机制,保证指令到达率达到99.9%以上。
常见问题与后续迭代方向
开发落地常见问题
- 重量传感器误差问题:可通过设备启动自动校准、取豆时采集3次重量取平均值的方案解决,误差可控制在5%以内;
- 设备离线问题:服务端配置心跳检测机制,设备每30秒上报一次心跳,超过3次未上报判定为离线,用户扫码时自动提示设备维护,同时通知管理员排查故障;
- 异常订单处理:支持管理员后台手动调整订单金额,针对重量无变化的开锁操作自动取消订单,不产生费用。
后续迭代方向
当前系统已经满足基础的无人自助拼豆运营需求,后续可扩展的功能包括:接入AI图像识别能力,用户上传拼豆成品照片后自动识别完成度,发放积分奖励;增加拼团预约功能,支持多名用户预约同一时段到店DIY,共享耗材使用额度;对接周边自动售卖机,实现拼豆工具、配件的自助购买,进一步完善无人场景的服务闭环。
本系统采用的技术栈均为当前Java生态的成熟方案,模块化设计支持快速二次开发,配套完善的接口文档、部署文档,可快速适配其他无人自助DIY场景的需求。