广告公司的网站建设,公司法治企业建设,厦门网站建设公司名单,西安优秀的集团门户网站建设公司本示例使用设备介绍#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com)
#python通过缩进来表示代码块#xff0c;不可以随意更改每行前面的空白#xff0c;否则程序会运行错误#xff01;#xff01;#xff01;如果缩进不…
本示例使用设备介绍WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com)
#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 sys
import socketserver
import os
import socket
import time
import pdbclass Server(socketserver.BaseRequestHandler):def handle(self):print(conn is :, self.request) # connprint(client_address is :, self.client_address) # addrwhile True:if self.request:# 接收收消息data self.request.recv(1024).strip()if not data:print(no data break)breakprint(no data continue)continueGetData Received from %s:%s % (self.client_address) :for num in range(0, len(data)):GetData GetData %02X % (data[num])print(GetData)#解析接收到的数据if (data[0] eval(0xC1) or data[0] eval(0xCF)): # 接收IC读卡器上传的读卡号数据、IC卡离开读卡器的信息FunCode %02X % (data[0])DEvIp %d.%d.%d.%d % (data[1], data[2], data[3], data[4]) # 设备IPDevNo %05d % (data[5] data[6] * 256) # 机号FrameNo %d % (data[7] data[8] * 256) # 数据包序号Cardlendata[9]; #卡号长度Card16H #16进制卡号for num in range(10, 10Cardlen):Card16H Card16H %02X % (data[num])Cardno data[10] #转10进制卡号Cardno Cardno (data[11] * 256)Cardno Cardno (data[12] * 65536)Cardno Cardno (data[13] * 16777216)CardnoStr %010d % CardnoSerialNum # 设备硬件序列号for num in range(10Cardlen, len(data)):SerialNum SerialNum %02X % (data[num])if (data[0] eval(0xC1)):print(数据解析IC读卡器刷卡数据设备IP DEvIp 机号 DevNo 数据包号 FrameNo ,卡号长度%d %(Cardlen) 16进制卡号 Card16H 转10进制卡号 CardnoStr 硬件序列号 SerialNum\n)else:print(数据解析IC卡离开读卡器设备IP DEvIp 机号 DevNo 数据包号 FrameNo ,卡号长度%d %(Cardlen) 16进制卡号 Card16H 转10进制卡号 CardnoStr 硬件序列号 SerialNum \n)RespByteGetResponseData(2) #根据不同情况生成要回应指令码self.request.sendall(RespByte) #发送回应指令码SendData Send Data to %s:%s % (self.client_address) :for num in range(0, len(RespByte)):SendData SendData %02X % (RespByte[num])print(SendData\n)elif (data[0] eval(0xD1) or data[0] eval(0xDF)): # 接收ID读卡器上传的读卡号数据、ID卡离开读卡器数据FunCode %02X % (data[0])DEvIp %d.%d.%d.%d % (data[1], data[2], data[3], data[4]) # 设备IPDevNo %05d % (data[5] data[6] * 256) # 机号FrameNo %d % (data[7] data[8] * 256) # 数据包序号Card16H %02X%02X%02X%02X%02X % (data[9],data[10], data[11], data[12], data[13]) # 16进制卡号Cardno data[9] #转10进制卡事情Cardno Cardno (data[10] * 256)Cardno Cardno (data[11] * 65536)Cardno Cardno (data[12] * 16777216)CardnoStr %010d % CardnoSerialNum # 设备硬件序列号for num in range(14, len(data)):SerialNum SerialNum %02X % (data[num])if (data[0] eval(0xD1)):print(数据解析ID读卡器刷卡数据设备IP DEvIp 机号 DevNo 数据包号 FrameNo 16进制卡号 Card16H 转10进制卡号 CardnoStr 硬件序列号 SerialNum \n)else:print(数据解析ID卡离开读卡器设备IP DEvIp 机号 DevNo 数据包号 FrameNo 16进制卡号 Card16H 转10进制卡号 CardnoStr 硬件序列号 SerialNum \n)RespByte GetResponseData(2) # 根据不同情况生成要回应指令码self.request.sendall(RespByte) # 发送回应指令码SendData Send Data to %s:%s % (self.client_address) :for num in range(0, len(RespByte)):SendData SendData %02X % (RespByte[num])print(SendData \n)elif (data[0] eval(0xF3)): # 接收到设备的心跳数据包设备心跳间隔可根据协议自行设置FunCode %02X % (data[0])DEvIp %d.%d.%d.%d % (data[1], data[2], data[3], data[4]) # 设备IPDevNo %05d % (data[5] data[6] * 256) # 机号FrameNo %d % (data[7] data[8] * 256) # 数据包序号heartbeattype%02X % (data[9])outleng%d % (data[10])switchon%02X % (data[11])inputinf%02X % (data[12])rand%02X%02X%02X%02X % (data[13], data[14], data[15], data[16])SerialNum for num in range(17, len(data)):SerialNum SerialNum %02X % (data[num])print(接收数据解析设备心跳包设备IP DEvIp 机号 DevNo 数据包号 FrameNo 心跳类型 heartbeattype 长度 outleng 继电器状态 switchon 输入接口状态 inputinf 随机校验码 rand 硬件序列号 SerialNum \n)def GetResponseData(respcode): # 生成不同的回应数据sdatabytearray()if (respcode0): # 生成蜂鸣响声的回应数据sdata.append(eval(0x96)) # 蜂鸣响声的指令码sdata.append(eval(0x00)) # 机号低sdata.append(eval(0x00)) # 机号高0000表示任意机号sdata.append(eval(0x01)) # 蜂鸣响声代码取值范围0-12elif(respcode1): # 生成显示文字蜂鸣响声的 回应数据DispStr 本次刷卡成功感谢您的使用再见! DispByte bytes(DispStr, encodinggbk) # 将要显示的文字转bytesDispByte DispByte[0:34] # 两行屏可以显示34个字符CommBytebytes([eval(0x5A), 0, 0, 2, 30]) # 5A是指令码2字节机号1字节蜂鸣代码1字节显示时长sdata CommByte DispByte # 加入显示文字的ASC码elif (respcode 2): # 生成显示文字蜂鸣响声的继电器开关TTS中文语音的 回应数据DispStr 本次刷卡成功感谢您的使用再见! DispByte bytes(DispStr, encodinggbk) # 将要显示的文字转bytesDispByte DispByte[0:34] # 两行屏可以显示34个字符SpkStr [v1]欢迎您使用我们的网络读卡器谢谢 # 要播报的TTS语音[v10]表示音量取值0-16可放置字符串的任意地方一次最多126个字节Spkb bytes(SpkStr, encodinggbk) # 将要播报的TTS语音转bytesSpkl len(Spkb) # TTS语音长度sufb bytes([eval(0x55), eval(0xaa), eval(0x66), eval(0x99)]) # 固定的抗干扰后缀comb bytes([eval(0x5C), 0, 0, 1, eval(0xF0), 20, 0, 20, 0, 34,Spkl]) # 5C是指令码2字节机号1字节蜂鸣代码1字节继电器代码2字节继电器延时1字节显示时长1字节显示起始位1字节显示长度1语音长度sdata comb DispByte Spkb sufbelif (respcode 3): # 生成开启继电器开关的 回应数据sdata.append(eval(0x78)) # 蜂鸣响声的指令码sdata.append(eval(0x00)) # 机号低sdata.append(eval(0x00)) # 机号高0000表示任意机号sdata.append(eval(0xF0)) # 继电器代码 F0表示全部继电器、F1表示1号继电器 、F2表示2号继电器......sdata.append(eval(0x2c)) # 继电器开启延时低位sdata.append(eval(0x01)) # 继电器开启延时高位FFFF表示继电器一直开启return sdataif __name__ __main__:IpList []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])Bindip IpList[0] # 如有多张网卡可选择绑定不同的网卡address (, 39169) # 未指定绑定网卡可侦听本机所有网卡信息读卡器出厂默认39169通讯端口with socketserver.ThreadingTCPServer(address, Server) as server:try:server.serve_forever()except Exception as e:print(e)passpass