当前位置: 首页 > news >正文

Python UDP Socket 实时在线刷卡扫码POS消费机服务端示例源码

本示例使用的设备: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)

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

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.lryc.cn/news/573338.html

相关文章:

  • 自动化立体仓库堆垛机控制系统STEP7 FC3功能块 I/O映射
  • `provide` 和 `inject` 组件通讯:实现跨组件层级通讯
  • 机器学习15-XGBoost
  • 微服务拆分——nacos/Feign
  • 华为云Flexus+DeepSeek征文 | 基于Flexus X实例的金融AI Agent开发:智能风控与交易决策系统
  • 李宏毅2025《机器学习》第三讲-AI的脑科学
  • 蓝牙数据通讯,实现内网电脑访问外网电脑
  • WPF调试三种工具介绍:Live Visual Tree、Live Property Explorer与Snoop
  • SylixOS 下的消息队列
  • Jupyter notebook调试:设置断点运行
  • Redis后端的简单了解与使用(项目搭建前置)
  • DeepEP开源MoE模型分布式通信库
  • 洛谷P3953 [NOIP 2017 提高组] 逛公园
  • 【DCS开源项目】—— Lua 如何调用 DLL、DLL 与 DCS World 的交互
  • day44-硬件学习之arm启动代码
  • 【Datawhale组队学习202506】零基础学爬虫 02 数据解析与提取
  • 【simulink】IEEE5节点系统潮流仿真模型(2机5节点全功能基础模型)
  • 【智能体】dify部署本地步骤
  • LeetCode第279题_完全平方数
  • 湖北理元理律师事务所企业债务纾困路径:司法重整中的再生之道
  • 蓝桥杯备赛篇(上) - 参加蓝桥杯所需要的基础能力 1(C++)
  • 华为OD机试_2025 B卷_判断一组不等式是否满足约束并输出最大差(Python,100分)(附详细解题思路)
  • 车载电子电器架构 --- 电子电气架构设计方案
  • QC -io 服务器排查报错方式/报错: Failed to convert string to integer of varId variable!“
  • 2.7 Python方法调用机制解析:从描述符到字节码执行
  • 学习C++、QT---03(C++的输入输出、C++的基本数据类型介绍)
  • 【无标题】使用 Chocolatey 安装 WSL 管理工具 LxRunOffline
  • 贪心算法思路详解
  • Mac电脑-Markdown编辑器-Typora
  • 利用nRF54L15-DK的DEBUG OUT接口调试用户设计的ARM处理器系统