1. 引言
我国在线外卖行业正迅速发展,用户规模急剧增长。据统计,截至2023年底,外卖市场交易额达到1.2万亿元,外卖用户达5亿[1]。目前,传统的外卖配送方式主要依赖于配送员将餐品送达指定地点,再通过电话通知用户取餐[2]。然而,这种方式会在某些情况下给骑手和用户带来不便。为满足实际用户需求,本文设计了一套基于STM32 + 百度云人脸识别的智能外卖背包系统,旨在为用户和配送员提供更便捷、安全的外卖领取与存放方案,从而优化整个外卖行业的服务体验。
智能外卖背包系统的应用领域包括以下几个方面:
1) 小区社区:为居民提供安全、便捷的外卖领取服务。
2) 餐饮行业:为外卖用户提供便捷的领取和存放外卖食品的方式。
3) 商业区域:为顾客提供外卖领取和存放服务,增加顾客体验和便利性。
4) 教育机构:为师生提供便利的外卖领取方式,满足他们在繁忙学习生活中的需求。
5) 办公场所:放置在办公楼、写字楼等场所,方便员工在工作时间领取外卖,提高工作效率。
2. 系统设计
本文的智能外卖背包系统包含智能外卖背包硬件终端、用户端手机APP、Spring Boot服务端、MySql数据库和华为云IOT服务器。智能外卖背包终端利用MQTT协议将背包内手机号、取件码、温湿度等数据上报至华为云IOT服务器。当华为云IOT服务器接收到智能外卖背包上报的数据后,会触发数据转发规则,将数据转发至Spring Boot服务端进行处理。当用户在摄像头前点击屏幕上的人脸识别按钮时,系统会拍摄一张人脸图片,并通过TCP协议将照片发送至Spring Boot服务端。Spring Boot服务端收到人脸图片后,调用百度智能云人脸识别API对照片进行人脸识别,并对识别到的结果进行相应的处理,最后通过TCP协议向智能外卖背包终端发送对应的指令,实现了人脸识别的外卖存取功能。系统总体设计方案如图1所示。
Figure 1. Overall design architecture of intelligent backpack system
图1. 智能背包系统总体设计架构
3. 外卖背包终端设计
3.1. 硬件框架设计
本文的智能外卖背包硬件终端选用了STM32MP157作为其主控芯片。STM32MP157是一款卓越的多核处理器,内含两个独立核心:Cortex-A7和Cortex-M4。在本系统中,Cortex-A7核心负责运行Linux操作系统,以处理包括人脸识别和用户界面等任务;而Cortex-M4核心则专门用于执行实时任务,例如温湿度检测、背包门开关控制等。智能外卖背包硬件系统框架如图2所示。
Figure 2. Hardware system framework diagram of intelligent takeaway backpack
图2. 智能外卖背包硬件系统框架图
Cortex-A7和Cortex-M4这两个核心基于OpenAMP库中的跨处理器通信的协议和框架RPMsg通过虚拟串口进行异核通信[3]。这样的设计使得智能外卖背包在高性能计算与实时控制之间取得了优秀的平衡,从而确保了其快速响应和可靠性。基于虚拟串口实现异核通信框架如图3所示。
Figure 3. Framework diagram of heterogeneous communication based on virtual serial port implementation
图3. 基于虚拟串口实现的异核通信框架图
3.2. Cortex-M4内核的功能设计
Cortex-M4内核启动后首先对Tcrt5000红外反射传感器、温湿度传感器DHT11、紫外灯、排风扇、定时器和串口等外设进行初始化。ESP8266模块连接在串口3上,当串口初始化成功后,首先通过串口向ESP8266模块发送AT指令将ESP8266连接至一个提前设定好的、可以访问外网的WIFI [4]。连接WIFI成功后先发送AT + MQTTUSERCFG和AT + MQTTCLIENTID命令配置MQTT连接所使用的账号、密码和设备号,配置成功后通过AT + MQTTCONN = 0,“1 17.78.5.125”,1883,1命令连接至对应的华为云IOT服务器。华为云IOT服务器连接成功后,再通过AT指令将每个背包子状态清空,以防止设备非正常关闭时所带来的干扰。设备数据清空代码片段如图4所示。
Figure 4. Code snippet diagram for clearing device data
图4. 设备数据清空代码片段图
由于本文所使用的ESP8266模块的MQTT传输协议一次最多只能传输255个字节,所以我们将JSON数据中的各属性集成在一个no属性中,再以特殊符号隔开,以节省传输空间(no后面的数字表示背包号)。设备属性上报格式如图5所示。
Figure 5. Format diagram for device attribute reporting
图5. 设备属性上报格式图
Figure 6. Partial code diagram of virtual serial port callback function
图6. 虚拟串口回调函数部分代码图
在设备初始化属性成功后,在主循环中使用OPENAMP_check_for_message ()函数进行轮询,以检查Cortex-A7内核是否有发送数据过来。当Cortex-M4内核的虚拟串口检测到有Cortex-A7内核发送来的数据后,回调函数void VIRT_UART0_RxCpltCallback (VIRT_UART_Handle TypeDef * huart)会将对应的标志位flag置为SET,并且通过一个二维数组t [5] [20]提取并存储其中的有效数据。其中t [0]对应的是背包号,t [1]对应的是手机号,t [2]对应的是取件码。虚拟串口回调函数部分代码如图6所示。
一旦一次数据提取完成,将打开对应背包号t [0]的背包门,并通过串口向ESP8266发送AT指令,以上报存储在背包号t [0]中的手机号t [1]、取件码t [2]和温湿度信息。最后,根据背包内是否已存在物品,翻转该背包的紫外线杀菌灯状态。当背包内存在物品时,紫外线杀菌灯点亮;不存在物品时,紫外线杀菌灯关闭。
此外,通过背包门顶部的红外反射传感器实时监测背包门的开关状态。当背包门打开时,对应背包门的红外传感器的输出由低电平转换为高电平。背包门状态检测的任务函数会根据红外反射传感器的电平输出实时控制对应排风扇的运行。当背包门打开时,排风扇会自动开启,以实现除尘和散味的作用。
3.3. Cortex-A7内核的功能设计
Cortex-A7内核运行了Linux操作系统,系统启动完成后首先通过SDIO接口的WIFI芯片RTL8723DS连接至事先设定好的WIFI。
为了提高骑手的送餐效率并使操作更加简单快速,本文采用QT设计了一个统一的人机交互界面,将所有功能都整合在一个界面中。在这个界面上,骑手和食客可以通过数字键盘轻松进行外卖的存取操作[5]。同时,该界面还提供了一个便捷且快速的人脸识别存取功能,只需点击右侧的识别按钮即可完成操作。人脸识别界面实物如图7所示。
Figure 7. Physical image of facial recognition interface
图7. 人脸识别界面实物图
用户可通过点击界面中的【当前模式:存放】按钮切换模式,并且根据模式不同,输入的数字位数限制也会不同:存放模式时是骑手输入食客的手机号,限制为11位;取出模式时是食客输入自己的取件码,限制为6位。
当骑手或用户将脸对准摄像头时点击识别按钮,系统会拍摄一张图片,然后通过TCP Socket上传该图片至Spring Boot服务端,并且接收并解析处理Spring Boot服务端传输回来的人脸识别结果数据,然后给Cortex-M4内核下发相应的命令以完成对应的操作。
4. 外卖背包系统软件设计
服务端作为本系统中的数据处理中心,其向硬件端提供端到端的可靠数据传输(TCP)端口,TCP端口向硬件端提供人脸图片上下行数据传输服务,并接入百度人脸识别API服务以实现对人脸的识别功能[6];其向APP客户端提供订单数据处理,用户数据处理,外卖背包状态数据处理HTTP请求接口;向华为云IOT服务器提供数据推送接口,实现硬件端状态数据录入更新。
其基于Java语言开发;使用Spring Boot框架,MyBatis持久层框架为基础,采用MVC架构构建;以MySql数据库为用户所有数据的载体。服务端框架图如图8所示。
Figure 8. Server framework diagram
图8. 服务端框架图
4.1. 客户端APP设计
Android APP客户端作为系统中用户交互的接口,其向用户提供可视化的界面,并为用户提供订单,外卖背包控制,账户控制的功能入口;通过与服务端之间的HTTP连接通道请求相应的功能服务,以实现用户对外卖背包控制,外卖背包状态监测,订单信息查询控制,个人账户信息录入更改功能[7]。
其同样基于JAVA语言开发;使用MVP框架构建客户端,使用SQLITE轻量型数据库作为用户数据的临时缓存载体;采用GOOGLE的ROOM框架简便高效的访问SQLITE数据库数据,向APP提供用户数据写入读取入口;采用Retrofit + RxJava + OkHttp网络请求框架向服务端发起HTTP请求,向APP提供服务端数据请求入口;客户端框架图如下图9所示。
Figure 9. APP client system framework diagram
图9. APP客户端系统框架图
4.2. 数据库设计
在设计数据时,考虑到客户端频繁请求服务端数据的情况,因此对重复请求数据暂存于Android系统中支持的SQLITE轻量型数据库中,一定量地减少了客户端对服务端的数据请求次数;在客户端的SQLITE数据库中存放用户账户信息,亦可实现用户账户自动登录功能;在服务端采用MySql关系型数据库存储用户账户信息,订单信息,外卖背包信息数据,其中用户信息表(User)、订单信息表(Orders)之间存在一对多关系,外卖背包状态信息表(BoxData)、订单信息表(Orders)之间存在一对一关系。系统实体关系图如下图10所示。
Figure 10. APP client system framework diagram
图10. APP客户端系统框架图
账户表用于记录用户账户基本信息,包括用户唯一标识,账户密码,用户权限(骑手mv,食客user)。账户表如下表1所示。
Table 1. Account table
表1. 账户表
字段名 |
字段类型 |
主键 |
是否为空 |
描述 |
username |
varchar |
√ |
FALSE |
用户标识 |
password |
varchar |
|
TRUE |
账户密码 |
privileges |
varchar |
|
TRUE |
用户权限 |
订单表用于记录用户订单基本信息,包括订单ID,下单用户名,配送用户名,菜品名称,存放背包号,订单状态。订单表如下表2所示。
Table 2. Orders table
表2. 订单表
字段名 |
字段类型 |
主键 |
是否为空 |
描述 |
id |
int |
√ |
FALSE |
订单id |
Orderphone |
varchar |
|
FALSE |
下单用户 |
Mvphone |
varchar |
|
TRUE |
配送用户 |
No |
varchar |
|
TRUE |
存放背包号 |
Orderstatus |
varchar |
|
TRUE |
订单状态 |
dishname |
varchar |
|
FALSE |
菜品名称 |
外卖背包状态表用于记录外卖背包基本信息,包括背包号,取件码,物品所属用户名,湿度,温度。外卖背包状态表如下表3所示。
Table 3. Delivery backpack status table
表3. 外卖背包状态表
字段名 |
字段类型 |
主键 |
是否为空 |
描述 |
No |
varchar |
√ |
FALSE |
背包号 |
code |
varchar |
|
TRUE |
取件码 |
phone |
varchar |
|
TRUE |
背包格占用手机号 |
temp |
varchar |
|
TRUE |
温度 |
humi |
varchar |
|
TRUE |
湿度 |
5. 结语
虽然本文成功地完成了该系统的设计,但在后续实际使用的过程中发现了一些可以改进的地方。下面是我们认为需要改进的几个方面:
1) 网络功能优化:系统用于连接网络的ESP8266模块和RTL8723DS可升级为4G网络模块,这样即使是在没有WIFI覆盖的区域,智能外卖背包也可以正常使用。
2) 性能优化:通过优化算法和代码,可以减少系统的资源占用和运行时间,以提高其响应速度和运行效率。从而提升整体性能。
3) 安全性加强:需要进一步加强系统的安全性,确保用户数据的保密性和完整性。通过加密传输、权限控制和漏洞修复等措施,提升系统对潜在风险和威胁的防范能力。
4) 功能扩展:计划后续在系统中添加一些新的功能,以满足用户不断变化的需求。
基金项目
武汉商学院大学生创新创业项目——平安包护智能背包202311654066。
NOTES
*通讯作者。