1. 项目概述:物联网时代的智能零售解决方案
这套基于Java开发的无人共享售卖机系统,本质上是一个融合了物联网技术与移动支付能力的智能零售终端解决方案。我在实际部署中发现,它完美解决了传统自动售货机存在的三大痛点:设备状态不可见、补货效率低下、支付方式单一。系统通过物联网模块实时采集库存数据、设备状态和交易记录,配合微信小程序实现扫码开门-自取商品-自动扣款的完整闭环。
关键优势:相比市面常见方案,这套系统采用了"先使用后付费"的信用模式,用户扫码开门后可直接取货,关门瞬间通过AI视觉识别+重量传感器双重校验自动结算,将单次交易时间压缩到3秒内。
2. 系统架构与技术栈解析
2.1 分层架构设计
系统采用典型的物联网三层架构:
- 设备层:STM32主控+4G通信模组(移远EC20)
- 网络层:MQTT协议+阿里云IoT平台
- 应用层:SpringBoot微服务集群
java复制// 设备状态上报示例代码
public class DeviceReport {
@MQTTTopic("/device/{sn}/status")
public void handleStatus(@Payload String json) {
DeviceStatus status = JSON.parseObject(json, DeviceStatus.class);
redisTemplate.opsForValue().set(
"device:status:"+status.getSn(),
status,
5, TimeUnit.MINUTES);
}
}
2.2 核心技术选型
- 通信协议:MQTT 3.1.1(QoS1)+ TLS1.2加密
- 数据库:MySQL 8.0(交易记录)+ Redis 7(实时状态)
- 小程序框架:Uniapp+uView UI
- 视觉识别:OpenCV 4.5 + YOLOv5s量化模型
3. 核心业务流程实现
3.1 用户取货流程
- 小程序扫码获取设备SN
- 调用
/api/lock/open接口发送开锁指令 - 门磁传感器触发状态变更事件
- 重量传感器建立商品重量基线
- 关门时触发AI视觉识别比对
- 双重校验通过后发起微信免密扣款
java复制// 重量差值计算核心逻辑
public BigDecimal calculateDiff(String sn) {
BigDecimal base = weightCache.get(sn);
BigDecimal current = iotService.getRealTimeWeight(sn);
return current.subtract(base)
.divide(new BigDecimal("1000"), 2, RoundingMode.HALF_UP);
}
3.2 设备监控模块
采用Netty实现的TCP长连接服务,关键参数:
- 心跳间隔:30秒
- 超时阈值:3次心跳丢失
- 数据上报频率:库存变化时立即上报
4. 物联网安全实践
4.1 通信安全方案
- 设备双向认证:每个设备烧录唯一X.509证书
- 数据加密:AES-256-GCM模式
- 防重放攻击:序列号+时间戳校验
踩坑提醒:早期版本使用HTTP长轮询时,遭遇过中间人攻击导致设备被劫持。后来改用MQTT+TLS后,CPU负载上升约15%,但安全性显著提升。
4.2 交易风控策略
- 金额阈值:单笔>200元需人脸验证
- 频次限制:同一用户5分钟内最多3次交易
- 异常检测:重量变化与视觉识别结果差异>15%时触发人工审核
5. 小程序端关键技术
5.1 性能优化实践
- 分包加载:将设备地图模块独立为子包
- 缓存策略:商品目录本地缓存24小时
- 预加载:用户扫码时提前下载AI模型
javascript复制// 微信支付封装示例
const pay = (orderNo) => {
return new Promise((resolve, reject) => {
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: `prepay_id=${orderNo}`,
signType: 'RSA',
paySign: '',
success: resolve,
fail: reject
})
})
}
5.2 常见问题排查
- 扫码无响应:检查设备SN是否绑定到正确MQTT Topic
- 扣款失败:确认微信商户平台证书有效期
- 重量误差大:重新校准传感器并检查减震脚垫
6. 部署与运维要点
6.1 服务器配置建议
- 最低配置:4核8G(日均1万交易量)
- JDK版本:Amazon Corretto 17
- 启动参数:-Xms4g -Xmx4g -XX:MaxMetaspaceSize=512m
6.2 设备端烧录流程
- 使用ST-LINK烧录Bootloader
- 通过OTA工具推送固件包
- 执行
/api/device/activate激活接口 - 验证MQTT连接状态
7. 二次开发指南
7.1 接口扩展示例
新增温度监控功能:
java复制@PostMapping("/device/{sn}/temp")
public Result<?> reportTemp(
@PathVariable String sn,
@RequestParam BigDecimal temp) {
iotService.handleTempAlert(sn, temp);
return Result.success();
}
7.2 数据库扩展建议
添加设备维护记录表:
sql复制CREATE TABLE `device_maintenance` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`sn` VARCHAR(32) NOT NULL,
`type` TINYINT COMMENT '1-补货 2-维修',
`operator` VARCHAR(64),
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
INDEX `idx_sn` (`sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
这套系统在实际运营中表现稳定,单台设备日均处理交易量可达300+次。有个细节值得注意:在低温环境下(<5℃),建议将重量传感器采样间隔从1秒调整为3秒,可有效避免因金属收缩导致的测量漂移问题。
