目录
前言
这是一个涉及挺多技术栈的项目,含金量也是很不错的,不仅包含了单片机的知识点还包含了LInux和QT上位机开发,设涉及了很多方面的,大家可以一起学习起来,以后还会继续分享更多的项目一起学习!可以点个关注留个眼!
针对传统超市购物车结账排队时间长、付款效率低的问题,提出了一种更符合现代购物方式的解决方案------基于RFID技术的自助收银系统。随着人们逐渐适应快节奏的生活方式,自助收银机因其高效便捷而备受青睐,理由也很明确:自助收银不仅减少了排队时间,还避免了与收银员近距离接触,尤其在防疫期间让人更安心。此外,消费者可以清晰地核对每件商品的价格,最终的支付金额也更加透明和明确。近年来,智能设备在各个生活领域的广泛应用为我们的生活带来了更多的便利和效率。自助收银机自几年前开始陆续进入商场、超市和便利店,尤其在疫情发生后,自助收银需求呈现出急剧上升的趋势。自助收银机的普及,不仅有效降低了超市的人力成本,还显著提升了支付效率,在这个快节奏的社会中,智能自助收银系统极大地推动了超市等零售业的服务水平提升。
基于Linux C++多线程服务器无人智慧超市
一、使用的技术栈
可以看看下面的其他博客,都是博主在学习过程中总结出来的,希望对大家有帮助!
- Linux多线程、进程间通信(本项目用于线程通信)进程间通信
- QT上位机开发
- Linux-Socket编程手把手Linux-socket编程
- mysql数据库储存 手把手菜鸟入门mysql数据库
- stm32单片机下位机开发 8266-TCP
二、设计流程
本项目一共有4个程序,一个Linux服务器、一个QT客户端,一个QT服务端、一个单片机,运行全部程序后,QT客户端和QT服务端都会通过Socket编程连接Linux服务器,单片机则是通过esp8266-01s连接上服务器,QT服务端和客户端都会通过定时器自动连接或重连Linux服务器!

2.1、Linux服务器
基于Socket编写server服务端程序,监听8889端口,然后连接创建的数据库使用,然后等待客户端的连接,每有一个客户端连接后就会创建线程跟它对接,创建线程也不是一连接就必须创建,而是需要连接后向服务器发送特定的数据才可以创建,创建之后,线程的参数就是连接上服务器的客户端的数据(socket值,ip地址等等)。
main.c主循环如下:
cpp
while(1)
{
/* 等待客户连接 */
ret = socket_accept(serve_fd);
char* data = inet_ntoa(ret.s_addr.sin_addr);
printf("%s\n",data);
/* wait mess to create thread */
char read_data[100] = {0};
int red = read(ret.client_fd, read_data, sizeof(read_data));
if(red <= 0)
{
//printf("read error\n");
}
int connect_flag = atoi(read_data);
//printf("%d\n",connect_flag);
switch(connect_flag)
{
case 100101://adim connect
Adim_thread_create(ret);
break;
case 100111://custom connect
cus_thread_create(ret);
break;
case 101001://MCU connect
mcu_thread_create(ret);
break;
}
}
负责对接MCU的线程最主要就是将刷进来的卡的卡号发送到指定的线程(对接QT服务端的线程或对接QT客户端的线程),那要怎么实现这个可以知道卡号要发给谁的功能呢?因为刷卡器只有一个,需要用来添加商品、添加会员、选购商品和买单,所以资源只有一个,那么要怎么让对接MCU的线程可以准确的决定和发送卡号给需要卡号的进程呢?这里我定义了一个全局变量RES,RES一共有4种状态,分别对应4种刷卡的用途,需要达到这个效果同时还使用到了进程间通信的函数,这个函数同样可以实现线程间的通信!
RES的状态:
- 34-选购商品
- 35-添加会员
- 36-添加新商品
- 37-结账买单
具体实现思路:RES变量默认为34,我们添加商品、添加会员和买单都需要提前申请刷卡器资源,将RES变成对应的状态,然后申请成功后就可以使用刷卡器去实现对应的功能了!实现的功能后都需要释放刷卡器资源,让RES回归34。
2.2、QT客管理员端
Qt管理员端:
Qt管理员端具有的功能,注册商品,注册会员,充值,查看销售记录,日志。
首先连接服务器成功,自动发指令给服务器,服务器从数据库取出数据发给客户端,初始化,商品,会员,服务器上有一个文本文件记录销售记录,我给服务器文本大小做了一个限制,如果大小大于1M清空文件,清除销售记录,客户端可以通过点击按钮发送一个指令,获取文本内容显示销售记录,日志的话就是从服务器运行阶段开始,对会员充值,会员销毁,商品添加,商品删除,都会直接记录,服务器退出自动销毁。
2.3、QT客户端
Qt客户结算端:
Qt客户结算端具有的功能:添加商品入购物车,结算,显示从服务器端获取的温湿度数据。
商品入库取出价格,然后相加,点击结算按钮将总价格发给服务器,然后服务器判断标志位,如果读卡器被占用则取消结账,反之。此时标志位改变,下次刷的卡将充当会员卡进行数据比对,余额不足则返回数据给客户端,反之。执行完毕释放资源置为34。
2.4、MCU
这个是8266配置可以参考一下那个大佬的,我的模块还没有到:
cpp
void Wifi_TCP_Init(void)
{
Serial_Init();
Serial_SendString("AT+RST\r\n");
Delay_s(1);
Serial_SendString("AT+CWMODE=3\r\n");
Delay_s(1);
Serial_SendString("AT+CWJAP=\"Yy\",\"20021209\"\r\n"); //连接热点
Delay_s(5);
//10.142.68.120,110.42.228.65
// 192.168.188.138
Serial_SendString("AT+CIPSTART=\"TCP\",\"110.42.228.65\",8888\r\n");
Delay_s(4);
Serial_SendString("AT+CIPMODE=1\r\n");
Delay_s(1);
Serial_SendString("AT+CIPSEND\r\n");
Delay_s(1);
Serial_SendString("101001");
Delay_s(1);
}
三、总结
这就是mysql语句!关于mysql数据库的学习我不是很熟悉,都是去某站速成的,上面也有我学习过程中的总结,应该对你们有很大的帮助,因为我也是零基础学习mysql数据库的!
cpp
CREATE DATABASE shopping;
CREATE TABLE users(
id VARCHAR(20) unique key,
name VARCHAR(50),
phone VARCHAR(15) unique key,
balance VARCHAR(25),
text VARCHAR(1000)
)
CREATE TABLE me(
pid VARCHAR(20) unique key,
pname VARCHAR(50),
price VARCHAR(15),
brand VARCHAR(25)
)
想要源码的大佬可以三连,留下邮箱,我发送到你邮箱里面!