茂民网站建设,wordpress推荐商品主题,wordpress 菜单 标签,视频付费点播网站怎么做前言
针对传统超市购物车结账排队时间长、付款效率低的问题#xff0c;提出了一种更符合现代社会人们购物方式-基于RFID的自助收银系统。习惯了快节奏生活的人们都会选择自助收银机结账#xff0c;理由显而易见#xff1a;自助收银机结账很方便#xff0c;几乎不用排队提出了一种更符合现代社会人们购物方式-基于RFID的自助收银系统。习惯了快节奏生活的人们都会选择自助收银机结账理由显而易见自助收银机结账很方便几乎不用排队也不用近距离和收银员接触在防疫时期特别感觉安心。而且自助结账对每件物品的售价更是一次清晰地核对最终需支付合计购物支出自己也更加清晰明了这两年来越来越多的智能设备应用在我们的生活领域里为我们的生活提供了很多智能和便利。自助收银机从几年前就陆续涌入到各地商场、超市、便利店自去年疫情发生后自助收银的需求比例更是呈直线上升趋势。自助收银机的启用不仅节约了超市的人力开支成本也从根本上提升了超市的购物支付效率在这个快节奏的社会里智能自助收银机也从根本上提升了超市等 基于Linux C多线程服务器 Qt上位机开发 STM32 8266WIFI的智慧无人超市项目 技术栈硬件选型
Linux c应用编程;
Linux socket编程,多线程编程,实时信号(线程通信)
Qt/C 客户端开发
qml(QtLocation)与c交互 安卓开发;
Mysql 数据存储
C语言下位机开发
stm32c8t6 下位机(便宜,够用,市面价格10r);
RC522RFID模块 SPI协议) 与白卡通信 获取卡号;
DTH11 温湿度采集模块(单总线协议市面价格 4r)
sg90 舵机模块(PWM协议 市面价9r );
8226 01-s WIFI模块(uart协议 市面价格5r) 连接 C 服务器;
蜂鸣器 是为了有白卡与RFID交互声音
GY-NEO6MV2 GPS模块(uart协议 市面价18) 总设计流程
本次设计的-基于RFID的自助收银系统-设计主要支持的功能和程序如下 本项目一共有五个程序Linux C服务器,Qt管理员端Qt客户结算端qml安卓端单片机下位机端客户端程序都有服务器断开自动重连(单片机没有有佬会的话我想请教一下)
Linux C服务器: 基于 socket 接口编写server服务端程序监听8888端口然后创建Mysql数据库连接开始监听。 面向对象程序设计中最重要的一个概念是继承所以我编写了一个基类mythread他有一个纯虚函数参数为一个定义的一个参数类包含了数据库封装好的对象需要服务的客户端套接字还有连接的客户端网络的信息结构体当socket客户端成功接入时取出该客户端套字和网络信息结构体和主函数的数据库对象来填充参数类然后服务器端根据客户端发过来的第一个消息判断该客户端是上述哪个客户端然后创建相应的派生类填入该参数类然后让mythread指针去指向这个子类对象发生动多态此时运行阶段时才确定函数的入口地址执行派生类中的继承父类的已经实现的纯虚函数此时派生类创建一个线程绑定线程处理函数去服务处理该socket套接字传过来的消息。绑定不同的线程处理函数服务不同的客户端程序。一共有四种线程处理函数服务上述四种客户端程序由四个不同的基类去绑定。 本项目的一个最大的特点难点单片机只负责发送卡号给服务器本项目单片机传过来的卡号有以下走向注册商品注册会员结账商品入购物车那么我该怎么知道该卡号是用来做什么呢当时困扰了几天然后想到Qt的信号与槽机制联想到Linux 也有实时信号还可携带参数该信号是事件发生时对进程的通知机制也可以把它称为软件中断Linux 内核定义了 31 个不同的实时信号信号编号范围为 34~64我直接拿来做线程通信所以现在怎样把他们联系起来呢当时我想到互斥啥的想法感觉不好实现然后我就想到了一个方法就是设置标志位我设立了一个全局变量 int RES34让RES的默认值为3434很熟悉吧信号编号范围为 34~64当单片机收到卡号发给服务器时服务器直接调用信号发送函数此时全局变量标志位为34所以直接发送34这个实时信号然后触发中断执行这个信号绑定处理函数。我们一共有四个地方需要用到卡号资源只有一个所以当需要执行某个用到卡号的操作时我先判断该RES的值如果该值等于34代表该读卡器为空闲我就更改RES为 35 然后下次单片机发过来卡号我还是直接调用发送信号此时标志位为35 所以此时执行 35 的信号处理函数执行完函数需要将RES 置为默认值 34释放资源如果当请求资源时RES不等于 34 代表 读卡器正在被占用此时回复客户端一个读卡器正忙以此类推绑定四个信号处理函数处理这四个操作请求一定要释放改为34。我们添加商品到购物车如果一直点击按钮获取来获取资源就会显得很笨拙所以默认的 34 信号处理函数为添加商品入购物车在没有人改变标志位的情况下就是执行商品入购物车。 本项目因为多个线程对数据进行增删改查存在竞争冒险所以在执行数据库增删改操作时我加入条 Mysql 事务操作语句事务是一个原子操作执行增删改操作前 开始事务执行结束提交事务。 总结 : 单片机的所有数据全部转发给服务器服务器跟据消息的种类标志位进行处理后分发给指定客户端完成一系列操作。
主循环如下 while (1){myretserver.client_socket();myret.my_sqlsql_typ;std::coutnew connect !!endl;std::string strserver.readbuf();int num; istringstream a(str);a num;switch (num){{case 100001: Mythread *android_threadnew androidthread; android_thread-thread_start(myret);std::cout安卓客户端连接成功std::endl; }break;case 100101:{Mythread *admin_threadnew adminthread; admin_thread-thread_start(myret);std::coutPC客户端连接成功std::endl;}break;case 100111:{Mythread *cust_threadnew custthread; cust_thread-thread_start(myret);std::coutARM客户端连接成功std::endl;} break;case 101001:{Mythread *mcu_threadnew mcuthread; mcu_thread-thread_start(myret);std::coutSTM32客户端连接成功std::endl;} break;default:std::cout未知的错误std::endl; break;}} Qt管理员端
Qt管理员端具有的功能注册商品注册会员充值查看销售记录日志。
首先连接服务器成功自动发指令给服务器服务器从数据库取出数据发给客户端初始化商品会员服务器上有一个文本文件记录销售记录我给服务器文本大小做了一个限制如果大小大于1M清空文件清除销售记录客户端可以通过点击按钮发送一个指令获取文本内容显示销售记录日志的话就是从服务器运行阶段开始对会员充值会员销毁商品添加商品删除都会直接记录服务器退出自动销毁。
Qt客户结算端
Qt客户结算端具有的功能添加商品入购物车结算显示从服务器端获取的温湿度数据。
商品入库取出价格然后相加点击结算按钮将总价格发给服务器然后服务器判断标志位如果读卡器被占用则取消结账反之。此时标志位改变下次刷的卡将充当会员卡进行数据比对余额不足则返回数据给客户端反之。执行完毕释放资源置为34。
qml安卓端
qml安卓端具有的功能地图显示当前手机与MCU的位置和距离在售商品查询购买记录查询姓名号码登录。
这个安卓端其实有点画蛇添足的意思我就是想炫耀一下我的GPS模块然后地图显示当前手机GPS数据与MCU的GPS模块的距离和位置功能太单调了我就加了一个在售商品查看功能然后给Mysql添加了1000大小的varcahr字段存储当前用户购买记录加了一个登录界面。 qml的教程挺少之前学过一遍没有及时巩固当时写这个qml真的炸裂很多坑。想入门qml也简单学一下qml与C交互信号与槽函数互调。qml界面的话让gpt去写百度CV。
STM32单片机开发
stm32具体的功能stm32c8t6主控芯片DTH11温湿度采集发送给服务器客户端显示sg90舵机模拟开门GY-NEO6MV2 GPS 获取GPS8226 01-s 与tcp 服务器数据交互RC522与白卡交互蜂鸣器提示刷卡成功。
32这调试是最恶心的一般调试是直接通过串口打印到电脑但是串口用来初始化8266了问题就是这个8266当时连接服务器一直连接不上我就去找原因有供电原因还有at指令的原因供电最好直接从32vcc上引出来因为我是根据客户端程序连接成功后根据发过来的第一条数据来创建对应线程服务不知道为啥这个32程序按复位键的话8266没有从第一条指令开始运行然后就创建不了对应线程服务只能断电然后在重新烧录一次调试巨麻烦。
GPS的话也是串口通信重新初始化一个串口资源就好了这个信号很差必须在阳台上有条件的还是买好一点的吧我采集数据还有抱着一大堆线接个充电宝在阳台调试。gps数据有个NMEA协议需要对数据解析出经纬度有很多类型数据最重要的一条就是包含经纬度的 $GPGLL,2547.35222,N,11306.12283,E,111129.00,A,A*6D;
这是当时当时在阳台调试出来的这里我偷了个小懒因为c语言字符串处理很鸡肋所以我直接在32这里过滤出这条消息一整条发给服务器然后服务器发给Qt客户端让Qt的QString去解分割分析处理分分钟的事情封装好的库就是简单 很简单吧
8266的话我初始化很随意快准狠直接配置tcp连接WiFi然连接服务器哈哈。 温湿度舵机什么的没什么好讲一个单总线写按时序拉低拉高电平就行了一个设置指定占空比。RC522的话驱动很复杂我水平不太行写不出来直接调厂家的库了。
主循环就这样了 最后留言
本项目一共写了半个月遇到很多坑当时地图传的坐标经纬度传犯了调试了一下午才发现了这个问题还有Linux 实时信号 是一个软件中断嘛然后当时server的while循环的accept直接导通解除阻塞了程序直接崩溃。查了很多资料才知道了最后加一个goto语句哈哈就解决了。
ret_client Myserver::client_socket()
{
reboot:ret_client ret;m_client_socket accept(m_socket,(struct sockaddr *)ret.client_struct,len);if(m_client_socket-1){goto reboot;}ret.client_socketm_client_socket;return ret;}
这是sql语句啊本人挺懒的全用varchar了。
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)
)
需要源码的哥们三连加评论邮箱直接发邮箱