#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):
#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语音