本示例使用的设备:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.1d292c1bk8Qc9r&ft=t&id=17021194999 

 一、服务端绑定IP开启UDP端口接收消费机提交的请求

import sys
import os
import socket
import time
import datetimeIpList=[]
if sys.platform == 'linux' or sys.platform=='mac':     # linux、mac系统获取电脑所有网卡IPips = [ip.split('/')[0] for ip in os.popen("ip addr | grep 'inet '|awk '{print $2}'").readlines()]for i in ips:IpList.append(i)print('%d   '%(len(IpList)) + i)
else:addrs = socket.getaddrinfo(socket.gethostname(),None)   #windows获取电脑所有网卡IPfor item in addrs:if ':' not in item[4][0]:IpList.append(item[4][0])print('%d   '%(len(IpList)) + item[4][0])BUFSIZE = 1024
Bindip=IpList[0]  #如果电脑有多个网卡IP,可以选择绑定不同的IP
Bindprot=39192s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((Bindip, Bindprot))
print('\n系统绑定IP:'+Bindip+':%d'% (Bindprot)+'\n')while True:data, addr = s.recvfrom(BUFSIZE)message = 'Received from %s:%s \n' % (addr, data)print(message)GetInf = str(data, encoding="gbk")FieldsList = GetInf.split(',')    #分割接收到的数据后解析、处理、返回指令 */

 二、接收到消费机上传的刷卡数据

if(FieldsList[0]=='102'):                      #接收到消费机的刷卡信息DevRecFramesStr = FieldsList[1]            #包序列号DevBufferIpAddrStr = FieldsList[2]         #终端IPDevBufferRemoteAddrStr = FieldsList[3]     #远程电脑指机IPDevBufferMachinStr = FieldsList[4]         #机号DevBufferCardidStr = FieldsList[5]         #卡号if(len(FieldsList)>6):                     #2018年以后的设备有唯一硬件序号DevBufferSerialNumStr=FieldsList[6]SendInfStr="001,"+DevRecFramesStr          #确定接收到信息,否则设备会连续发送三次SendInfToIp(SendInfStr,addr)          #可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息#用009指令 将业务处理结果发送到设备#设备如接收到了本次发送的信息,会以109指令回复,在正式项目中要根据此特性做重发机制SendInfStr="009,"+ DevBufferMachinStr + ",卡号:" + DevBufferCardidStr  + "\\nn姓名:张三丰\\n余额:888.88\\n状态:卡可正常使用\\n,20,1,0" SendInfToIp(SendInfStr,addr)

三、接收到消费机上传的现金支付请求

if(FieldsList[0]=='103'):                      #接收到 输入消费金额后刷卡、消费机定额消费、消费机计次消费 的上传信息DevRecFramesStr = FieldsList[1]            #包序列号DevBufferIpAddrStr = FieldsList[2]         #终端IPDevBufferRemoteAddrStr = FieldsList[3]     #远程电脑指机IPDevBufferMachinStr = FieldsList[4]         #机号DevBufferCardidStr = FieldsList[5]         #卡号DevBufferUseMoneryStr= FieldsList[6]       #消费金额DevBufferUseTimeStr= FieldsList[7]         #消费时间if(len(FieldsList)>8):                     #2018年以后的设备有唯一硬件序号DevBufferSerialNumStr=FieldsList[8]SendInfStr="001,"+DevRecFramesStr          #确定接收到信息,否则设备会连续发送三次SendInfToIp(SendInfStr,addr)          #可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息#用006指令返回本次消费失败#用008指令返回本次消费成功#设备如接收到了本次发送的信息,会以109指令回复,在正式项目中要根据此特性做重发机制#SendInfStr="006," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + "姓名:张三丰  \\n余额:168.88 \\n状态:此卡已挂失 \\n ,20,0,6" SendInfStr="008," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + DevBufferUseMoneryStr + "," + "姓名:张三丰 {123.45}\\n,20,0,1"SendInfToIp(SendInfStr,addr)

 四、接收到消费机上传的计次消费请求

if(FieldsList[0]=='104'):                      #接收到 计次消费模式下,终端刷卡后设备向电脑发送此信息DevRecFramesStr = FieldsList[1]            #包序列号DevBufferIpAddrStr = FieldsList[2]         #终端IPDevBufferRemoteAddrStr = FieldsList[3]     #远程电脑指机IPDevBufferMachinStr = FieldsList[4]         #机号DevBufferCardidStr = FieldsList[5]         #卡号DevBufferUseTimeStr= FieldsList[6]         #消费时间if(len(FieldsList)>7):                     #2018年以后的设备有唯一硬件序号DevBufferSerialNumStr=FieldsList[7]SendInfStr="001,"+DevRecFramesStr          #确定接收到信息,否则设备会连续发送三次SendInfToIp(SendInfStr,addr)          #可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息#用006指令返回本次消费失败#用008指令返回本次消费成功#设备如接收到了本次发送的信息,会以109指令回复,在正式项目中要根据此特性做重发机制SendInfStr="006," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + "姓名:张三丰  \\n余额:168.88 \\n状态:此卡已挂失\\n ,20,0,6" #SendInfStr="008," + DevBufferMachinStr + "," + DevBufferCardidStr + ",0.00," + "姓名:张三丰 {123.45}\\n,20,0,1"SendInfToIp(SendInfStr,addr)   

 五、接收到消费机上传的记账消费记录

if(FieldsList[0]=='105'):                      #接收到脱网时 白名单卡 记账消费记录DevRecFramesStr = FieldsList[1]            #包序列号DevBufferIpAddrStr = FieldsList[2]         #终端IPDevBufferRemoteAddrStr = FieldsList[3]     #远程电脑指机IPDevBufferMachinStr = FieldsList[4]         #机号DevBufferCardidStr = FieldsList[5]         #卡号DevBufferUseMoneryStr= FieldsList[6]       #消费金额DevBufferUseTimeStr= FieldsList[7]         #消费时间DevBufferStaryStr= FieldsList[8]           #消费方式  0扣费 1计次DevBufferRecordAddStr= FieldsList[9]       #记录地址标识DevBufferAllNoStr= FieldsList[10]          #总计录数if(len(FieldsList)>11):                    #2018年以后的设备有唯一硬件序号DevBufferSerialNumStr=FieldsList[11]SendInfStr="001,"+DevRecFramesStr          #确定接收到信息,否则设备会连续发送三次SendInfToIp(SendInfStr,addr)if(isVaildDate(DevBufferUseTimeStr)==0):   #判断消费时间是否正确DevBufferUseTimeStr="9999-99-99 99:99:99"   #如果消费时间不正确,需更为 9999-99-99 99:99:99 才能将此条非法记录删除#时间正确说明是条有效记录,可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息  #清除设备内当前这条已上传的记录,驱动设备继续上传剩下的记录SendInfStr="011," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + DevBufferUseMoneryStr + "," + DevBufferUseTimeStr + "," + DevBufferRecordAddStr SendInfToIp(SendInfStr,addr)

  六、接收到消费机上传的按键信息

if(FieldsList[0]=='106'):                      #接收到设备的按键信息DevRecFramesStr = FieldsList[1]            #包序列号DevBufferIpAddrStr = FieldsList[2]         #终端IPDevBufferRemoteAddrStr = FieldsList[3]     #远程电脑指机IPDevBufferMachinStr = FieldsList[4]         #机号DevBufferUseTimeStr= FieldsList[5]         #按键信息if(len(FieldsList)>6):                     #2018年以后的设备有唯一硬件序号DevBufferSerialNumStr=FieldsList[6]SendInfStr="001,"+DevRecFramesStr          #确定接收到信息,否则设备会连续发送三次SendInfToIp(SendInfStr,addr)          #可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息

 七、接收到消费机上传的扫码支付请求 

if(FieldsList[0]=='128'):                      #接收到消费金额、扫码信息DevRecFramesStr = FieldsList[1]            #包序列号DevBufferIpAddrStr = FieldsList[2]         #终端IPDevBufferRemoteAddrStr = FieldsList[3]     #远程电脑指机IPDevBufferMachinStr = FieldsList[4]         #机号DevBufferCommandStr = FieldsList[5]        #指令号DevBufferUseMoneryStr= FieldsList[6]       #消费金额DevBufferUseTimeStr= FieldsList[7]         #消费时间DevBufferQrcodeInfStr=""if(len(FieldsList)>9):                     #防止二维码信息中有分隔符,for num in range(9,len(FieldsList)-1):DevBufferQrcodeInfStr=DevBufferQrcodeInfStr+FieldsList[num]DevBufferSerialNumStr=FieldsList[len(FieldsList)-1]    #2018年以后的设备有唯一硬件序号SendInfStr="001,"+DevRecFramesStr          #确定接收到信息,否则设备会连续发送三次SendInfToIp(SendInfStr,addr)          #可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息#用006指令返回本次消费失败#用008指令返回本次消费成功#设备如接收到了本次发送的信息,会以109指令回复,在正式项目中要根据此特性做重发机制#SendInfStr="006," + DevBufferMachinStr + "," + DevBufferCommandStr + "," + "姓名:张三丰  \\n余额:168.88 \\n状态:此卡已挂失 \\n ,20,0,6" SendInfStr="008," + DevBufferMachinStr + "," + DevBufferCommandStr + "," + DevBufferUseMoneryStr + ",正在进行扫码支付..{请不要按动键盘!    \\n},5,0,1"SendInfToIp(SendInfStr,addr)

 八、接收到消费机开机信号

if(FieldsList[0]=='101'):                      #接收到设备的开机信号DevRecFramesStr = FieldsList[1]            #包序列号DevBufferIpAddrStr = FieldsList[2]         #终端IPDevBufferRemoteAddrStr = FieldsList[3]     #远程电脑指机IPDevBufferMachinStr = FieldsList[4]         #机号DevBufferDatetimeStr = FieldsList[5]       #设备日期时间if(len(FieldsList)>6):                     #2018年以后的设备有唯一硬件序号DevBufferSerialNumStr=FieldsList[6]SendInfStr="001,"+DevRecFramesStr          #确定接收到信息,否则设备会连续发送三次SendInfToIp(SendInfStr,addr)          GetDT=DevBufferDatetimeStr[0:16]SysDT= get_time()if (GetDT!=SysDT):                        #设备时钟与系统不符,更新设备时间SendInfStr="003," + DevBufferMachinStr +"," + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())    SendInfToIp(SendInfStr,addr)

门禁控制板介绍:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.52de2c1bIqEgQP&ft=t&id=599136536796 

九、接收到门禁控制板提交的刷卡开门请求 

if(FieldsList[0]=='150'):                      #接收到实时考勤门禁机的刷卡信息DevRecFramesStr = FieldsList[1]            #包序列号DevBufferIpAddrStr = FieldsList[2]         #终端IPDevBufferRemoteAddrStr = FieldsList[3]     #远程电脑指机IPDevBufferMachinStr = FieldsList[4]         #机号DevBufferCardidStr = FieldsList[5]         #卡号DevBufferReaderStr= FieldsList[6]          #读头号DevBufferDoorNoStr= FieldsList[7]          #门或继电器号DevBufferDelayStr= FieldsList[8]           #门磁未关秒数,0表示已关DevBufferPasswPropStr= FieldsList[9]       #密码属性(0密码无效,1刷卡后按密码,2补签密码,3开门密码,4防迫胁密码)DevBufferPassWStr= FieldsList[10]          #密码(最多8位数字)DevBufferUseTimeStr= FieldsList[11]        #刷卡时间if(len(FieldsList)>12):                    #2018年以后的设备有唯一硬件序号DevBufferSerialNumStr=FieldsList[12]SendInfStr="001,"+DevRecFramesStr          #确定接收到信息,否则设备会连续发送三次SendInfToIp(SendInfStr,addr)          #可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息#用050指令返回开门成功#用051指令返回开门失败,正式系统开发时要有重发机制#SendInfStr="051," + DevBufferMachinStr + "," + DevBufferCardidStr + ",卡号:" + DevBufferCardidStr + "\\n姓名:张三丰  \\n状态:无效卡\\n,20,1,3" SendInfStr="050," + DevBufferMachinStr + "," + DevBufferCardidStr + ",卡号:" + DevBufferCardidStr + "\\n姓名:张三丰  \\n状态:欢迎关临\\n,20,1,0," + DevBufferReaderStr + "," + DevBufferDoorNoStr + ",5,20" SendInfToIp(SendInfStr,addr)

 十、服务端回应消费机的指令 

def SendInfToIp(SendInfStr,addr):sdata=bytes(SendInfStr, encoding='gbk')  #将要发送的信息转为bytess.sendto(sdata,addr)   message = 'SendData To %s:%s' % (addr, sdata)print(message+"\n")        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911678.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911678.shtml
英文地址,请注明出处:http://en.pswp.cn/news/911678.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于高考边界的理解以及未来就业层级的学习与思考

目录 一、2024年高考全国多少考生,文化课,文科理科,分别总分多少分?清北得多少分能上?二、1342万人里面,有多少人能上清北,多少能上985,多少能上211,多少能上二本&#x…

JVM调优实战 Day 4:JVM类加载机制

【JVM调优实战 Day 4】JVM类加载机制 文章内容 在Java虚拟机(JVM)的运行过程中,类加载机制是整个程序启动和运行的基础。它决定了Java类是如何被动态加载到JVM中,并为后续的字节码执行做好准备。理解JVM类加载机制不仅有助于我们…

R 语言中的判断语句

R 语言中的判断语句 在R语言编程中,判断语句是执行条件逻辑的基础。它们允许程序根据特定的条件执行不同的代码块。本文将深入探讨R语言中的几种常见判断语句,包括if语句、if-else语句和switch语句,并探讨它们的用法和场景。 1. if语句 if…

从设备自动化到智能管控:MES如何赋能牛奶饮料行业高效生产?

万界星空科技全新推出的:新一代智能化MES系统,深度融合AI大数据技术,实现生产全流程可视化、智能排产、实时质量追溯与设备互联,助力企业降本增效30%。 现开放免费试用名额,体验智能化生产管理的高效与便捷&#xff01…

TDengine 技术参数配置大全

1. 背景 TDengine 的 taos.cfg 中配置项及使用 SQL 命令 alter 修改的系统变量之间的关系如何,哪些是持久存储项,哪些设置是临时项,这章将详细说明。 本文是技术参考资料,请收藏。 2.定义 1. 全局配置参数 全局配置参数&#…

无人机神经网络模块运行与技术难点

一、神经网络模块的运行方式 1. 分层处理架构 感知层 多模态数据融合:通过八元数卷积网络(OCNN)统一处理LiDAR、摄像头、IMU等异构传感器数据,将点云坐标(x/y/z)、图像RGB与光流信息编码至8维虚部&#…

前端react框架实现打包时间动态加入配置展示在指定页面

注意: 当前方法特定为 create-react-app 构建框架,其他的构建流程不同,不能直接照搬 react-scripts 的方式。 ✅ 目标: 在 React 打包(build)时,自动将当前时间写入代码中某个变量或 console…

原子操作(CAS)

原子操作 原子操作原理什么是原子操作?原子性原子变量相关接口内存序 shared_ptr的实现 原子操作原理 什么是原子操作? 原子操作其实就是指在多线程的环境下,确保对共享变量的操作不会被干扰,从而避免了竞态条件。 我们都知道&…

马克思主义基本原理期末复习下

二十、资本的原始积累 所谓资本原始积累,就是以暴力手段使生产者与生产资料分离资本快速集中于少数人手中,资本主义得以快速发展的历史过程。具体过程其一,用暴力手段夺取农民的土地,如英国圈地运动在国外建立殖民地,…

体育数据api接口,足球api篮球api电竞api,比赛赛事数据api

在体育行业,数据驱动一切,从内容分发到竞猜预测,从用户互动到商业变现,背后少不了一个关键词:数据接口(API)。无论是实时比分、比赛事件、历史统计,还是球员详情、战绩排名&#xff…

Harmony 状态监听 @Monitor和@Computed

Monitor与Computed装饰器在ArkUI状态管理中的协同应用 一、装饰器概述 1. Monitor装饰器 Monitor是ArkUI状态管理V2中的核心装饰器,用于深度监听状态变量的修改: 支持监听嵌套类属性、多维数组项和对象数组中的指定项变化能够获取变化前后的值进行比…

同济大学多模态感知具身导航全面综述

作者: I-Tak Ieong, Hao Tang 单位:同济大学计算机学院,北京大学计算机学院 论文标题: Multimodal Perception for Goal-oriented Navigation: A Survey 论文链接:https://arxiv.org/pdf/2504.15643 主要贡献 基于…

2025年CCF先进音频技术竞赛

由中国计算机学会主办、CCF语音对话与听觉专委会承办、语音之家协办、华为终端有限公司赞助的CCF先进音频技术大赛正式启动。大赛旨在推动国内高等院校及科研院所在音频技术领域的专业人才培养,支持学生科技创新,选拔优秀人才。 赛事官网:ht…

手撕线程池

线程池的目的: 1.复用线程,减少频繁创建和销毁的开销 创建和销毁线程是昂贵的系统操作,涉及内核调度、内存分配; 使用线程池预先创建一批线程,在多个任务间循环复用,避免资源浪费,提高性能。 …

3DTiles三维模型

1. 3DTiles 介绍​ 2016 年,Cesium 团队借鉴传统 2DGIS 的地图规范:WMTS,借鉴图形学中的层次细节模型,打造出大规模的三维数据标准:3d-Tiles,中文译名:三维瓦片。 它在模型上利用了 gltf 渲染…

Golang Kratos 系列:业务分层的若干思考(一)

在使用 Kratos 框架开发云服务的过程中,渐渐理解和感受到“领域层”这个概念和抽象的强大之处,它可以将业务和存储细节解耦、将业务和开发初期频繁变更的API结构,让Mock单元测试变得更加容易、对细节的变化更鲁棒。让业务代码摆脱技术细节依赖…

深度优化OSS上传性能:多线程分片上传 vs 断点续传实战对比

1 卸载开头 对象存储服务(OSS)已成为现代应用架构的核心组件,但随着业务规模扩大,文件上传性能问题日益凸显。本文将深入探讨两种核心优化技术:多线程分片上传和断点续传,通过理论分析、代码实现和性能测试…

doris_工作使用整理

文章目录 前言一、doris整体情况二、doris的存储过程情况1.分类2. 同步物化视图3. 异步物化视图三,分区相关1.分区建的过多前言 提示:doris使用版本3.x 提示:以下是本篇文章正文内容,下面案例可供参考 一、doris整体情况 细节放大 二、doris的存储过程情况 1.分类 按…

左神算法之单辅助栈排序算法

目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 请编写一个程序,对一个栈里的整型数据,按升序进行排序(即排序前栈里的数据是无序的,排序后最大元素位于栈顶)。要求最多只能使用一个额外的栈存放临时数据&#xf…

使用Trae编辑器与MCP协议构建高德地图定制化服务

目录 一、使用Trae编辑器配置高德MCP Server 1.1 Trae介绍 1.2 从mcp.so中获取配置高德地图mcp server配置信息 1.3 高德地图开发者配置 1.4 添加Filesystem 到Trae 1.5 使用结果展示 1.6 MCP常见命令行工具和包管理说明 1.7 Function Call工具和MCP技术对比 二、本地…