随着无人自助业态的快速发展,DIY手工类消费场景的智能化改造需求持续上升,无人自助拼豆系统正是针对拼豆手工体验店、商圈自助体验点推出的软硬件一体化解决方案,实现用户无需店员值守即可完成材料选取、费用结算、工位使用的全流程自助服务。本文将从架构设计、核心功能实现、技术难点解决、部署落地四个维度,完整分享无人自助拼豆系统的开发实战经验。
一、系统整体架构设计与技术栈选型
本系统采用分层架构设计,从下到上分为四层:感知层负责硬件数据采集与指令执行,包含拼豆材料柜、称重传感器、电子锁、自助工位终端、监控摄像头等设备;网络层依托4G/WiFi网络与MQTT
协议,实现硬件与云端的双向稳定通信;平台层承载核心业务逻辑,包含后端服务、缓存、消息队列、数据库等组件;应用层面向不同使用角色,分为用户端、管理后台、运维端三类入口。
技术栈选型参考成熟的无人自助系统落地经验,兼顾开发效率与稳定性:
- 后端采用Spring Boot 2.7.x + MyBatis Plus 3.5.x作为核心开发框架,降低CRUD开发成本,提升迭代效率;
- 数据存储层使用MySQL 8.0存储业务核心数据,Redis 6.x作为缓存组件实现热点数据、会话信息的高速读写,EMQX作为MQTT服务器承接硬件通信需求;
- 用户端采用U
niApp开发,基于Vue语法实现一套代码多端发布,支持小程序、H5、APP多平台适配,降低多端开发成本; - 管理后台基于Vue 2.x + Element UI搭建,符合常规运营人员的操作习惯,页面组件复用率高,可快速扩展功能模块。
二、核心功能模块实现思路
系统功能分为用户端、管理后台、物联网对接三个核心模块,各模块的实现逻辑如下:
2.1 用户端功能实现
用户端面向C端消费者,核心流程轻量化,无需复杂操作即可完成自助服务:
- 附近点位查询与导航:整合地图SDK,用户打开小程序即可查看周边自助拼豆设备点位,支持一键第三方
导航应用,匹配共享类业态的LBS服务需求; - 扫码开柜取料:用户扫描柜机,后端验证设备在线状态后生成预订单,向设备发送开柜指令,用户可取用对应柜格的拼豆材料,柜内称重传感器实时上报重量变化,系统自动计算消费金额;
- 订单与记录查询:用户可在个人中心查看所有取料、工位使用订单,支持订单详情、柜格使用情况查询,消费凭证可一键导出;
- 自助工位预约:针对带体验工位的点位,用户可提前预约使用时段,到点扫码即可解锁工位电源、配套工具,无需人工核验。
2.2 管理后台功能实现
管理后台面向运营人员,核心实现全链路数字化管
控:
- 设备管理:支持所有柜机、工位终端的状态实时监控,可远程发送开柜、重启、校准指令,查看设备在线状态、通信日志,异常状态自动高亮提示;
- 库存管理:实时同步每个柜格的拼豆剩余重量,低于阈值时自动触发补货提醒,支持出入库台账全记录,库存变动可追溯;
- 订单管理:全量订单查询、筛选、导出,支持异常订单人工校正,比如用户未正常关门导致的扣费异常、称重误差导致的金额错误等场景;
- 数据统计:多维度统计不同点位的消费频次、热门材料品类、运营趋势,为运营决策提供数据支撑。
2.3 物联网对接实现
硬件与云
端的双向通信是无人系统的核心,采用MQTT协议实现低延迟、高可靠的消息传输,核心消息处理逻辑示例如下:
@Component@Slf4jpublicclassMqttMessageHandler{@AutowiredprivateDeviceServicedeviceService;@AutowiredprivateMaterialStockServicestockService;@AutowiredprivateOrderServiceorderServi ce;// 监听设备上报的重量数据@MqttListener(topic="device/{deviceId}/weight/report")publicvoidhandleWeightReport(StringdeviceId,@PayloadWeightReportDTOreportDTO){// 验证设备合法性if(!deviceService.isValid(deviceId)){log.warn("非法设备上报数据,设备ID:{}",deviceId);return;}// 过滤传感器误差:小于0.1g的重量波动视为环境干扰if(Math.abs(reportDTO.getLastWeight()-reportDTO.getCurrentWeight())<0.1){return;}// 更新对应柜格库存stockService.updateStock(deviceId,reportDTO.getCabinetId(),reportDTO.getCurrentWeight());// 开柜状态下的重量变化关联订单计算费用if(orderService.hasActiveOrder(deviceId,reportDTO.getCabinetId())){orderService.updateOrderAmount(deviceId,reportDTO.getCabinetId(),reportDTO.getWeightDiff());}}}三、关键技术难点与解决方案
在实际开发测试过程中,针对无人场景的特有问题,我们总结了三类核心难点的解决方案:
- 高并发下设备消息丢失问题:早期测试中当10台以上设备同时上报数据时,出现偶发的消息丢失情况,解决方案是采用EMQX持久化会话+Redis消息缓冲队列,后端用线程池异步处理消息,保证每条消息至少被消费一次,同时增加消息重试机制,消费失败的消息进入死信队列,人工排查后可重新消费,消息送达率稳定在99.99%以上。
- 称重数据精度问题:拼豆单颗重量仅0.05g左右,传感器的环境干扰、震动容易导致数据误差,解决方案是采用滑动窗
口滤波算法,连续采集10次重量数据,去掉值和小值后取平均值作为终上报值,同时每次补货后支持后台一键校准传感器零点,误差可控制在±0.2g以内,完全满足业务需求。 - 异常场景的容错处理:常见异常包括用户开柜后长时间未关门、设备突然断网、用户支付失败等,解决方案是:设备端内置本地计时逻辑,开柜超过3分钟未关门自动触发声光告警,同时上报后台通知运维;设备断网时本地缓存所有操作数据,网络恢复后自动同步到云端,保证数据不丢失;支付失败的订单进入待支付列表,用户可在24小时内完成支付,超时系统自动触发资源回收逻辑。
四、系统部署与运维落地指南
本
系统的部署流程标准化,开发者可参考以下步骤快速落地:
4.1 基础环境准备
生产环境建议配置4核8G云服务器2台(一主一从实现高可用),带宽5M以上,提前安装JDK 1.8、MySQL 8.0、Redis 6.x、EMQX 4.4.x、Nginx 1.20.x等基础组件,开放1883(MQTT TCP端口)、8083(MQTT WS端口)、8080(后端服务端口)、80/443(前端端口)等必要端口。
4.2 后端服务部署
- 拉取后端代码,修改
application-prod.yml配置文件,填写数据库、Redis、EMQX的连接
信息; - 执行Maven打包命令:
mvn clean package -DskipTests,生成可执行Jar包; - 上传Jar包到服务器,执行启动命令:
nohup java -jar pindou-admin.jar --spring.profiles.active=prod > app.log 2>&1 &; - 访问Swagger接口文档地址
http://服务器IP:8080/doc.html,验证接口服务是否正常。
4.3 前端部署
- 用户端:打开UniApp项目,修改
config.js中的后端接口地址,选择对
应的发行平台(小程序/H5/APP)打包,按照对应平台的要求上传发布即可; - 管理后台:修改Vue项目的
.env.prod配置文件中的接口地址,执行npm run build打包生成dist文件夹,上传到服务器Nginx的html目录下,配置反向代理即可:
server { listen 80; server_name 管理后台域名; root /usr/share/nginx/html/dist; index index.html; location /api/ { proxy_pass http://后端服务IP:8080/; proxy_set_header Host $host; } }4.4 硬件对接
将每台设备的MQTT连接信息配置为已部署的EMQX服务器地址,设备ID与管理后台录入的设备ID一一对应,配置完成后重启设备,在管理后台查看设备在线状态即可完成对接。
无人自助拼豆系统的架构设计和技术实现逻辑具备较强的通用性,仅需修改硬件对接协议、业务计费规则,即可快速适配无人手工材料柜、无人文具售卖柜、共享玩具柜等多种无人自助场景,为线下消费场景的智能化改造提供可复用
的技术方案。