实时在线云消费机、考勤门禁控制器、网络读卡器服务器Python Socket源代码

 消费机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,机号,卡号,消费额,时间,21、设备消费模式为普通模式、快捷键模式时,先按金额后刷卡;
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)
                
        #更多的字段说明及回复方式,请仔细查看设备的通讯协议说明...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vx_13822155058

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值