Python Socket UDP协议网络读卡器示例源码

#QQ:954486673

#微信:13822155058

#淘宝:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.a70b5b43vR8ieG&id=17029933847

#!/usr/bin/env python

# -*- coding: utf-8 -*-

 

import socket

import time

 

#接收到数据包后向设备发确认信息,否则设备会重发三次--------------------------------------------

def DisableSendAge(data,addr):

扫描二维码关注公众号,回复: 13609623 查看本文章

   #105是指令码+接收到的信息前8个字节    

   sdata=bytes([105,data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8]])           

   s.sendto(sdata,addr)  

   message = 'SendData To %s:%s' % (addr, sdata)

   print(message+"\n")        

 

#向读卡器发送显示及蜂鸣响声----------------------------------------------------------------

def SendDispBeep(DispStr,addr):

   DispStr=DispStr[0:34]

   disb=bytes(DispStr, encoding='gbk')  #将要显示的文字转bytes

  

   comb=bytes([eval('0x5A'),0,0,2,30])    #5A是指令码+2字节机号+1字节蜂鸣代码+1字节显示时长

  

   sdata=comb+disb

         

   s.sendto(sdata,addr)  

   message = 'SendData To %s:%s' % (addr, sdata)

   print(message+"\n")      

  

#向读卡器发送显示+继电器+固定组合语音-------------------------------------------------------

def SendDispSpk(DispStr,addr):

   DispStr=DispStr[0:34]

   disb=bytes(DispStr, encoding='gbk')  #将要显示的文字转bytes

 

   Spkb=bytes([55,41,53])               #固定组合语音代码,取值请查看通讯协议说明,一次最大取值21条

   Spkl=len(Spkb)                       #语音代码条数

 

   sufb=bytes([eval('0x55'),eval('0xaa'),eval('0x66'),eval('0x99')])  #固定的抗干扰后缀

  

   comb=bytes([eval('0x5B'),0,0,2,eval('0xF0'),30,0,20,0,36,Spkl])    #5B是指令码+2字节机号+1字节蜂鸣代码+1字节继电器代码+2字节继电器延时+1字节显示时长+1字节显示起始位+1字节显示长度+1语音长度

  

   sdata=comb+disb+Spkb+sufb

         

   s.sendto(sdata,addr)  

   message = 'SendData To %s:%s' % (addr, sdata)

   print(message+"\n")      

 

#向读卡器发送显示+继电器+TTS语音-------------------------------------------------------

def SendDispTTS(DispStr,addr):

   DispStr=DispStr[0:34]

   disb=bytes(DispStr, encoding='gbk')  #将要显示的文字转bytes

  

   SpkStr='[v10]感谢您的使用,再见!'       #要播报的TTS语音,[v10]表示音量,取值0-16,可放置字符串的任意地方,一次最多126个字节

   Spkb=bytes(SpkStr, encoding='gbk')   #将要播报的TTS语音转bytes,

   Spkl=len(Spkb)                       #TTS语音长度

  

   sufb=bytes([eval('0x55'),eval('0xaa'),eval('0x66'),eval('0x99')])  #固定的抗干扰后缀

  

   comb=bytes([eval('0x5C'),0,0,2,eval('0xF0'),20,0,20,0,36,Spkl])    #5C是指令码+2字节机号+1字节蜂鸣代码+1字节继电器代码+2字节继电器延时+1字节显示时长+1字节显示起始位+1字节显示长度+1语音长度

 

   sdata=comb+disb+Spkb+sufb

               

   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

 

#主程序---------------------------------------------------------------------------------

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]  #如有多张网卡,可选择绑定不同的网卡

Bindprot=39169

 

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))

 

sdata=bytes([166])              

s.sendto(sdata,('255.255.255.255',Bindprot))   #发送搜索同网段内所有在线设备的广播指令

 

while True:

    data, addr = s.recvfrom(BUFSIZE)

    message = 'Received from %s:%s' % (addr, data)

    print(message)

   

    if(len(data)>8):

        if(data[0]==242):  #接收到设备开机、搜索在线设备的返回信息,对信息解析

            print('指令码 :%x' % (data[0]))          

            print('设备IP :%d.%d.%d.%d' % (data[1],data[2],data[3],data[4]))   

            print('掩  码 :%d.%d.%d.%d' % (data[5],data[6],data[7],data[8]))            

            print('通讯端口:%d' % (data[9]+data[10]*256))

            print('机  号 :%d' % (data[11]+data[12]*256))

            print('网  关 :%d.%d.%d.%d' % (data[13],data[14],data[15],data[16]))           

            MacStr=''

            for num in range(17,23):

                MacStr=MacStr+'%x' % (data[num])

                if(num<22):

                   MacStr=MacStr+'-'

            print('网关MAC:'+ MacStr)

            print('远程服务器IP:%d.%d.%d.%d' % (data[23],data[24],data[25],data[26]))

            MacStr=''

            for num in range(27,33):

                MacStr=MacStr+'%x' % (data[num])

                if(num<32):

                   MacStr=MacStr+'-'

            print('服务器MAC:'+ MacStr) 

            print('网络标识:%x' % (data[33]))

            print('响声标识:%x' % (data[34]))

            MacStr='16-88-'

            for num in range(35,39):

                MacStr=MacStr+'%x' % (data[num])

                if(num<38):

                   MacStr=MacStr+'-'

            print('读卡器MAC:'+ MacStr)

            if(len(data)>39):

                SerialNum=''

                for num in range(39,len(data)):

                    SerialNum=SerialNum+'%x' % (data[num]) 

                print('设备唯一序号:'+ SerialNum)  

                                       

            print('\n')

                  

        elif(data[0]==192):  #接收到读取ID卡信息的数据包,对信息解析

            print('指令码 :%x' % (data[0]))          

            print('设备IP :%d.%d.%d.%d' % (data[1],data[2],data[3],data[4]))            

            print('机  号 :%d' % (data[5]+data[6]*256))

            print('包序号 :%d' % (data[7]+data[8]*256))

            print('16进制卡号:%x%x%x%x' % (data[10],data[11],data[12],data[13]))

            Cardno=data[10]

            Cardno=Cardno+(data[11]*256)

            Cardno=Cardno+(data[12]*65536)

            Cardno=Cardno+(data[13]*16777216)

            CardnoStr='%010d' % Cardno

            print('10进制卡号:'+CardnoStr)

            SerialNum=''

            for num in range(14,len(data)):

                SerialNum=SerialNum+'%x' % (data[num])

            print('设备序列号:'+ SerialNum+'\n')

           

            DisableSendAge(data, addr)    #向设备发送确认包,否则相同的信息设备会重复发送三次

           

            #在这里加入业务对数据库的查、增、删、改操作

            #将业务处理结果发送到设备

           

            DispStr='卡号:'+CardnoStr+'  '+get_time()+'                              '#满屏显示,补足后面空格

           

            SendDispBeep(DispStr,addr)     #向读卡器发送显示及蜂鸣响声 

            #SendDispSpk(DispStr,addr)     #向读卡器发送显示+继电器+固定组合语音      

            #SendDispTTS(DispStr,addr)     #向读卡器发送显示+继电器+TTS语音

                                   

        elif(data[0]==193):  #接收到读取IC卡信息的数据包,对信息解析

            print('指令码 :%x' % (data[0]))          

            print('设备IP :%d.%d.%d.%d' % (data[1],data[2],data[3],data[4]))            

            print('机  号 :%d' % (data[5]+data[6]*256))

            print('包序号 :%d' % (data[7]+data[8]*256))

            print('16进制卡号:%x%x%x%x' % (data[10],data[11],data[12],data[13]))

            Cardno=data[10]

            Cardno=Cardno+(data[11]*256)

            Cardno=Cardno+(data[12]*65536)

            Cardno=Cardno+(data[13]*16777216)

            CardnoStr='%010d' % Cardno

            print('10进制卡号:'+CardnoStr)

            SerialNum=''

            for num in range(14,len(data)):

                SerialNum=SerialNum+'%x' % (data[num])

            print('设备序列号:'+ SerialNum+'\n')

           

            DisableSendAge(data, addr)    #向设备发送确认包,否则相同的信息设备会重复发送三次

           

            #在这里加入业务对数据库的查、增、删、改操作

            #将业务处理结果发送到设备

           

            DispStr='卡号:'+CardnoStr+'  '+get_time()+'                              '#满屏显示,补足后面空格

           

            #SendDispBeep(DispStr,addr)     #向读卡器发送显示及蜂鸣响声 

            #SendDispSpk(DispStr,addr)     #向读卡器发送显示+继电器+固定组合语音      

            SendDispTTS(DispStr,addr)     #向读卡器发送显示+继电器+TTS语音

猜你喜欢

转载自blog.csdn.net/zhangjin7422/article/details/112861195