消费机UDP通讯协议介绍:
设备向服务器发送的指令格式,每个字段用半角逗号(,)分隔。 | ||||
序号 | 指令名称 | 指令格式 | 指令说明 | 示例 |
1 | 响应服务器的搜索 | 100,包序列号,终端IP,子网掩码,网关IP,远程电脑主机IP,端口号,终端硬件号 | 响应电脑发出的搜寻局域网内所有终端设备指令000,就是电脑软件用广播式向39190端口发送字符串“000” | 100,00009,192.168.1.218,255.255.255.0,192.168.1.1,192.168.1.3,39169,1234567890 |
2 | 开机信息 | 101,包序列号,终端IP,远程电脑主机IP,机号,时间 | 1、设备开机时向电脑发送的开机信息,电脑可以根据这条信息发送相应的开机提示信息。 2、电脑发送002查询设备时间时,也是响应这条信息。 | 101,00009,192.168.1.1,192.168.1.3,00002,2012-04-20 11:12:13 |
3 | 普通消费模式下刷卡 | 102,包序列号,终端IP,远程电脑主机IP,机号,卡号 | 当设备消费模式不是定额方式或计次方式时,刷卡后设备向电脑发送此信息。 | 102,00009,192.168.1.1,192.168.1.3,00002,8888888888 |
4 | 输入消费金额后刷卡、定额模式下刷卡 | 103,包序列号,终端IP,远程电脑主机IP,机号,卡号,消费额,时间,2 | 1、设备消费模式为普通模式、快捷键模式时,先按金额后刷卡; 2、设备消费模式为定额方式时刷卡; 3、服务器端此时应用008指令回应消费成功或006指令回应消费失败。 | 103,00009,192.168.1.1,192.168.1.3,00002, 8888888888,5.50, 2012-04-20 11:12:13,2 |
5 | 计次刷卡消费 | 104,包序列号,终端IP,远程电脑主机IP,机号,卡号,时间 | 在设备设定为计次消费模式下时,刷卡后直接发送至服务器 | 104,00009,192.168.1.1,192.168.1.3,00002,8888888888,2012-04-20 11:12:13 |
6 | 记帐信息 | 105,包序列号,终端IP,远程电脑主机IP,机号,卡号,消费额,消费时间,状态(0:金额消费 1:计次),记录地址标识,总记录数 | 电脑没回应的情况下,消费信息将先记账,在网络联通后,向服务器发送 | 105,00009,192.168.1.1,192.168.1.3,00002,8888888888,5.50,2012-04-20 11:12:13,1,12345678,18 |
7 | 键盘输入 | 106,包序列号,终端IP,远程电脑主机IP,机号,键盘输入信息 | 向服务器发送键盘指令,操作方法是先按设备【Func】进菜单,选【发送数字指令】,输入数字后,按回车发送 | 106,00009,192.168.1.1,192.168.1.3,00002,11 |
8 | 取餐模式下刷卡 | 108,包序列号,终端IP,远程电脑主机IP,机号,卡号,时间 | 设备设定为取餐模式下时,刷卡后直接发送至服务器 | 108,00009,192.168.1.1,192.168.1.3,00002,8888888888,2012-04-20 11:12:13 |
9 | 响应服务器发过来的显示指令 | 109,包序列号,终端IP,远程电脑主机IP,机号,接收到的指令 | 响应服务器发来的006、008、009、010、103指令,服务器端可通过此指令终止重发机制 | |
10 | 响应电脑 | 112,包序列号,终端IP,远程电脑主机IP,机号,返回值 | 返回值: 0表示成功; 1表示广播式发送成功 2表示接收器和读卡器无线通讯失败 | |
11 | 向应服务器查询信息 | 114,包序列号,终端IP,远程电脑主机IP,机号,卡号,查询指令,时间 | ||
12 | 响应服务器的015指令 | 115,包序列号,终端IP,远程电脑主机IP,机号,返回值 | ||
13 | 二维码扫描信息 | 125,包序列号,终端IP,远程电脑主机IP,机号,二维码格式标识,二维码信息(可以包含逗号) | 125,00004,192.168.1.228,192.168.1.168,00003,0, http://wwww.baidu.com,abc | |
14 | 输入金额后再扫二维码 | 128,包序列号,终端IP,远程电脑主机IP,机号,口令,消费额,时间,二维码格式标识,二维码信息(可以包含逗号) | 128,00004,192.168.1.228,192.168.1.168,00003,12345,5.50, 2012-04-20 11:12:13,0, http://wwww.baidu.com,abc | |
15 | 门禁机刷卡 | 150,包序列号,终端IP,远程电脑主机IP,机号,卡号,读头号,对应的门或继电器号,门磁未关秒数(0门已关),密码类别(0密码无效/1刷卡后按密码/2补签密码/3防迫胁密码/4开门密码),密码(最多10位数字),时间 | 150,00055,192.168.1.228,192.168.1.168,00001,0305912578,0,0,0,0,00000000,2020-01-01 08:18:18 | |
16 | 门禁机扫码 | 170,包序列号,终端IP,远程电脑主机IP,机号,扫描枪信息,对应门的扫描枪号,对应的门]或继电器号,门磁未关秒数(0门已关),扫码时间 | ||
服务器向设备发送的指令,每个字段用半角逗号(,)分隔。 | ||||
序号 | 指令名称 | 指令格式 | 指令说明 | 示例 |
1 | 搜寻设备 | 000 | 搜寻局域网内所有终端设备指令,终端会向主机回应100指令 | 000 |
2 | 确认信息已收到 | 001,包序列号 | 用于告诉终端,信息已收到,不需要重发3次相同信息了。 | 001,00009 |
3 | 读设备时间 | 002,机号 | 读取终端时间,终端收到这些指令后会回应101指令(请看表1),00000表示任意机号 | 002,00002 |
4 | 改设备时间 | 003,机号,时间 | 设定终端设备时间,终端收到这些指令后会回应101指令 | 003,00002,2012-04-20 11:12:13 |
5 | 更改机备IP地址 | 004,终端IP,子网掩码,网关IP,网送MAC,远程电脑主机IP,远程电脑主机MAC,是否自动搜出MAC,端口号,终端硬件号 | 设定指定的终端IP地址等参数。 是否自动搜出MAC取值说明: 1:为自动搜出远程主机MAC 2:为自动搜出网关的MAC 4:为当设备IP在局域网中有冲突时,自动获取可用的IP(也就是开启DHCP功能) 8:允许保存DHCP自动获取的IP | 004,192.168.1.228,255.255.255.0,192.168.1.1,AA-BB-CC-DD-EE-FF,255.255.255.255, AA-BB-CC-DD-EE-FF,0,39190,0138215662 |
6 | 扣款不成功 | 006,机号,卡号,信息,显示延时(秒),蜂鸣器发声(种类见表3),语音(种类见表4) | 扣款不成功时,服务器向终端发送的显示及声响信息,此信息仅在设备刷卡后显示“正在等待电脑回应..”时有效。 | 006,00002,1234567890,此卡尚未开户\,余额信息不存在,10,0,1 要让设备显示逗号用“\,”表示。 显示换行用“\n”表示。 |
7 | 扣款成功 | 008,机号,卡号,消费额,信息,显示延时(秒),蜂鸣器发声(种类见表3),语音(种类见表4) | 扣款成功时,服务器向终端发送的显示及声响信息,此信息仅在设备刷卡后显示“正在等待电脑回应..”时有效。 | 008,00002,1234567890,5.50,姓名 扣费成功\n余额12256.60元\n,10,1,1 要让设备显示逗号用“\,”表示。 显示换行用“\n”表示。 |
8 | 驱动显示及响声 | 009,机号,信息,显示延时(秒),蜂鸣器发声(种类见表3),语音(种类见表4) | 服务器发送,用于驱动终端设备显示信息及声响。 | 009,00002,显示信息,10,1,1 要让设备显示逗号用“\,”表示。 显示换行用“\n”表示。 |
9 | 清除记帐记录 | 011,机号,卡号,消费额,消费时间,记录地址标识 | 清除一条已经上传的记帐记录,使设备继续上传剩余的记账记录 | 011,00002,8888888888,5.50,2012-04-20 11:12:13,12345678 |
10 | 更改设备的管理员密码 | 012,机号,新密码(必须为6位数字),012-012::012-012(这个固定常量用于防止网络干扰误改) | 更改设备的管理员密码 | 012,00002,123456,012-012::012-012(这个固定常量用于防止网络干扰误改) |
11 | 门禁机开门成功指令 | 050,机号,卡号(号卡为0表示外接按钮),信息,显示延时(秒,为0时不驱动显示,保留门禁机原来的显示不动),蜂鸣器发声(种类见表3),语音(种类见表4),读头号或按钮号,对应的门或继电器号,继电器开关保续时间(20毫秒为一个单位),门磁未关报警秒数 | 开门成功时,电脑向终端发送的显示及声响信息,此信息仅在设备刷卡后显示“正在等待电脑回应..”时有效。 | 050,00002,1234567890,姓名:张三丰 开门成功,20,2,0,0,0,300,0 |
12 | 门禁机禁止开门提示 | 051,机号,卡号(号卡为0表示外接按钮),信息,显示延时(秒,为0时不驱动显示,保留门禁机原来的显示不动),蜂鸣器发声(种类见表3),语音(种类见表4) | 开门不成功时,电脑向终端发送的显示及声响信息,此信息仅在设备刷卡后显示“正在等待电脑回应..”时有效。 | 051,00002,1234567890,姓名:张三丰 禁止通行!,20,6,0 |
消费机介绍:
账户金额等所有持卡人信息存在电脑服务器上,在线刷卡消费时设备将IC卡的物理卡号和消费金额传到服务器,服务器脑处理保存后将消费结果返发到消费机上显示,内置高灵敏扫码模组,扫码信息即时上传到服务器,脱网时支持白名单记账消费。https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-21914722028.2.60cc6baaxEPiPw&id=17021194999https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-21914722028.2.60cc6baaxEPiPw&id=17021194999
实时门禁控制板:
考勤门禁控制板可外接刷卡读头、扫描枪、人脸识别器,将读取到的ID号即时发送到服务器,由服务器的软件判断后再返回开门信号或反馈信息。脱网时由控制板内的白名单控制刷卡是否可通行。
门禁板详细介绍:实时TCP网络双门双向门禁控制板大型小区网络开关可编程二次开发-淘宝网 (taobao.com)
服务器端Python源码
#python通过缩进来表示代码块,不可以随意更改每行前面的空白,否则程序会运行错误!!!如果缩进不一致,就会报错: IndentationError
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#python -m pdb xxx.py 调试程度 n命令单步执行,s命令单步执行 会进入函数内部 b xx ,c
#import pdb pdb.set_trace() 设断点
import socket
import time
import pdb
#接收到设备信息后,服务器向设备的反馈信息---------------------------------------------------------
def SendInfToIp(SendInfStr,addr):
sdata=bytes(SendInfStr, encoding='gbk') #将要发送的信息转为bytes
s.sendto(sdata,addr)
message = 'SendData To %s:%s' % (addr, sdata)
print(message+"\n")
#获取电脑系统日期时间---------------------------------------------------------------------------
def get_time():
st = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
st=st[0:16]
return st
#判断字符串是否为有效的日期时间-------------------------------------------------------------------
def isVaildDate(datestr):
try:
datetime.datetime.strptime(datestr,'%Y-%m-%d %H:%M:%S')
return 1
except:
return 0
#主程序-------------------------------------------------------------------------------------
addrs = socket.getaddrinfo(socket.gethostname(),None) #获取本电脑所有网卡IP
IpList=[]
for 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=39192
s = 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')
print('发送搜索在线设备的广播指令')
sdata=b'000'
s.sendto(sdata,('255.255.255.255',Bindprot)) #发送搜索同网段内所有在线设备的广播指令
print('Send To IP:255.255.255.255:'+str(Bindprot))
print('Send Data:000\n')
LastBuf='' #保存最后接收到的信息,用于比较是否重复接收的信息
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(LastBuf==GetInf and len(FieldsList)>1): #对比当前接收到的数据是否重发的数据包
SendInfStr="001,"+FieldsList[1] #是已解析过的相同数据,确定接收,不用再分析处理
SendInfToIp(SendInfStr,addr)
else:
LastBuf=GetInf #将接收到的信息可存,用做下次接收到数据后
if(FieldsList[0]=='100'): #设备接收到000搜索指令后返回的设备信息
if(len(FieldsList)<9):
DevBufferIpAddrStr= FieldsList[1] #终端IP
DevBufferMaskStr= FieldsList[2] #掩码
DevBufferGatewayStr= FieldsList[3] #网关
DevBufferRemoteAddrStr= FieldsList[4] #远程服务器IP
DevBufferPort= FieldsList[5] #端口
DevBufferNumberDecStr= FieldsList[6] #设备序号
else:
DevBufferIpAddrStr= FieldsList[1] #终端IP
DevBufferMaskStr= FieldsList[2] #掩码
DevBufferGatewayStr= FieldsList[3] #网关
DevBufferGatewayStrMAC= FieldsList[4] #网关MAC
DevBufferRemoteAddrStr= FieldsList[5] #远程服务器IP
DevBufferRemoteAddrMACStr= FieldsList[6] #远程服务器IPMAC
DevBufferMACSearchStr= FieldsList[7] #MAC搜索标识
DevBufferPort= FieldsList[8] #端口
DevBufferNumberDecStr= FieldsList[9] #设备模块序号
if(len(FieldsList)>10):
DevBufferSerialNumStr= FieldsList[10] #设备唯一硬件序号
elif(FieldsList[0]=='101'): #接收到设备的开机信号
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = 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)
elif(FieldsList[0]=='102'): #接收到消费机的刷卡信息
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = 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)
elif(FieldsList[0]=='103'): #接收到 输入消费金额后刷卡、消费机定额消费、消费机计次消费 的上传信息
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = 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)
elif(FieldsList[0]=='104'): #接收到 计次消费模式下,终端刷卡后设备向电脑发送此信息
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = 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)
elif(FieldsList[0]=='105'): #接收到脱网时 白名单卡 记账消费记录
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = 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)
elif(FieldsList[0]=='106'): #接收到设备的按键信息
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = FieldsList[4] #机号
DevBufferUseTimeStr= FieldsList[5] #按键信息
if(len(FieldsList)>6): #2018年以后的设备有唯一硬件序号
DevBufferSerialNumStr=FieldsList[6]
SendInfStr="001,"+DevRecFramesStr #确定接收到信息,否则设备会连续发送三次
SendInfToIp(SendInfStr,addr)
#可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息
elif(FieldsList[0]=='108'): #接收到设备在订取餐模式下刷卡取餐的信息
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = FieldsList[4] #机号
DevBufferCardidStr = FieldsList[5] #卡号
if(len(FieldsList)>6): #2018年以后的设备有唯一硬件序号
DevBufferSerialNumStr=FieldsList[6]
SendInfStr="001,"+DevRecFramesStr #确定接收到信息,否则设备会连续发送三次
SendInfToIp(SendInfStr,addr)
#可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息
#用013指令回复本次取餐结果,正式系统开发时要有重发机制
#设备如接收到了本次发送的信息,会以109指令回复,在正式项目中要根据此特性做重发机制
SendInfStr="013," + DevBufferMachinStr + ",卡号:" + DevBufferCardidStr + "\\n姓名:张三丰 \\n状态:水煮肉片套餐\\n份数:1 余额:{123.8}\\n,20,0,27"
SendInfToIp(SendInfStr,addr)
elif(FieldsList[0]=='109'): #设备接收到服务器发送信息的反馈信息,服务器端发送完006、008、009、103指令后,如立即接收到此信息表明设备已经接收到
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = FieldsList[4] #机号
DevBufferCommandStr = FieldsList[5] #指令码
elif(FieldsList[0]=='125'): #接收到消费机的扫码信息
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = FieldsList[4] #机号
DevBufferCommandStr = FieldsList[5] #指令号
DevBufferQrcodeInfStr=""
if(len(FieldsList)>6): #防止二维码信息中有分隔符,
for num in range(6,len(FieldsList)-1):
DevBufferQrcodeInfStr=DevBufferQrcodeInfStr+FieldsList[num]
DevBufferSerialNumStr=FieldsList[len(FieldsList)-1] #2018年以后的设备有唯一硬件序号
SendInfStr="001,"+DevRecFramesStr #确定接收到信息,否则设备会连续发送三次
SendInfToIp(SendInfStr,addr)
#可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息
#用009指令 将业务处理结果发送到设备
#设备如接收到了本次发送的信息,会以109指令回复,在正式项目中要根据此特性做重发机制
SendInfStr="009,"+ DevBufferMachinStr + ",扫码信息:" + DevBufferQrcodeInfStr + "\\n\\n\\n,20,1,0"
SendInfToIp(SendInfStr,addr)
elif(FieldsList[0]=='128'): #接收到消费金额、扫码信息
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = 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)
elif(FieldsList[0]=='150'): #接收到实时考勤门禁机的刷卡信息
DevRecFramesStr = FieldsList[1] #包序列号
DevBufferIpAddrStr = FieldsList[2] #终端IP
DevBufferRemoteAddrStr = FieldsList[3] #远程电脑指机IP
DevBufferMachinStr = 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)
#更多的字段说明及回复方式,请仔细查看设备的通讯协议说明...