Python TCP服务端多线程接收RFID网络读卡器上传数据

本示例使用设备介绍: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)  # 数据包序号Cardlen=data[9];    #卡号长度Card16H=""          #16进制卡号for num in range(10, 10+Cardlen):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(10+Cardlen, 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")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('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):      # 生成不同的回应数据sdata=bytearray()if (respcode==0):               # 生成蜂鸣响声的回应数据sdata.append(eval('0x96'))  # 蜂鸣响声的指令码sdata.append(eval('0x00'))  # 机号低sdata.append(eval('0x00'))  # 机号高,0000表示任意机号sdata.append(eval('0x01'))  # 蜂鸣响声代码,取值范围0-12elif(respcode==1):              # 生成显示文字+蜂鸣响声的 回应数据DispStr = "本次刷卡成功,感谢您的使用,再见!            "DispByte = bytes(DispStr, encoding='gbk')    # 将要显示的文字转bytesDispByte = DispByte[0:34]                    # 两行屏可以显示34个字符CommByte=bytes([eval('0x5A'), 0, 0, 2, 30])  # 5A是指令码+2字节机号+1字节蜂鸣代码+1字节显示时长sdata = CommByte + DispByte                  # 加入显示文字的ASC码elif (respcode == 2):           # 生成显示文字+蜂鸣响声的+继电器开关+TTS中文语音的 回应数据DispStr = "本次刷卡成功,感谢您的使用,再见!            "DispByte = bytes(DispStr, encoding='gbk')   # 将要显示的文字转bytesDispByte = DispByte[0:34]                   # 两行屏可以显示34个字符SpkStr = '[v1]欢迎您使用我们的网络读卡器,谢谢!'     # 要播报的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, 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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/164270.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue2基础-Vue对象介绍

文章目录 一、概念特点举例 二、模板语法插值语法指令语法v-bind数据绑定 三、组件el和data的两种写法 四、MVVM模型五、数据代理六、事件处理基本使用事件修饰符键盘按键 七、计算属性八、监听属性普通监视深度监视监视简写 九、监听与计算总结 一、概念 一套用于构建用户界面…

VMware17安装教程

1、双击安装包 2、等待进度条走满 3、点击下一步 4、点击我接受 下一步 5、修改安装目录 添加path路径 下一步 6、取消用户体验设置 下一步 7、点击下一步 8、 点击安装 9、等待进度条走满 10、点击许可证 输入秘钥 11、 点击输入秘钥 12、 点击完成 完成安装 此时已经完成了安…

CUDA学习笔记7——CUDA内存组织

CUDA内存组织 CUDA设备内存的分类与特征 内存类型物理位置访问权限可见范围生命周期1全局内存芯片外可读写所有线程和主机端由主机分配与释放2常量内存芯片外只读所有线程和主机端由主机分配与释放3纹理和表面内存芯片外一般只读所有线程和主机端由主机分配与释放4寄存器内存…

技术分享 | app自动化测试(Android)-- 特殊控件 Toast 识别

Toast 是 Android 系统中的一种消息框类型,它属于一种轻量级的消息提示,常常以小弹框的形式出现,一般出现 1 到 2 秒会自动消失,可以出现在屏幕上中下任意位置。它不同于 Dialog,它没有焦点。Toast 的设计思想是尽可能…

Java进击框架:Spring-数据存取(七)

Java进击框架:Spring-数据存取(七) 前言事务管理声明式事务管理 DAO支持JDBC的数据访问使用JdbcTemplate控制数据库连接JDBC批处理操作封装 SQL 语句中的参数 使用R2DBC进行数据访问对象关系映射(ORM)数据访问HibernateJPA XML模式 前言 参考…

渗透测试学习day2

文章目录 连接靶机靶机:Fawn 解题过程Task 1Task 2Task 3Task 4Task 5Task 6Task 7Task 8Task 9Task 10Task 11Task 12 总结 连接靶机 详细过程可参考day1 靶机:Fawn 难度:very easy (ftp服务的靶机) 解题过程 T…

23个优秀开源免费BI仪表盘

BI也称为商业智能,是收集、分析和展示数据以支持决策者做出明智的业务决策的过程。BI帮助组织将其原始的生产数据转化为有意义的见解或者知识,以推动其业务战略。BI能够为组织改善决策、提高效率和提升资源利用率。 BI仪表盘是BI系统的重要组成部分&…

工程(十二)Ubuntu20.04LSD_SLAM运行

博主创建了一个科研互助群Q:772356582,欢迎大家加入讨论。这是一个科研互助群,主要围绕机器人,无人驾驶,无人机方面的感知定位,决策规划,以及论文发表经验,以方便大家很好很快的科研…

(待完善)python学习参考手册

这里写目录标题 观前浅谈:学习路线 :学习心得笔记:Step1:简单但一问不知怎么的组织语言去回答的小问题:什么是提示符?python解释器是什么?请正在阅读本文的朋友,安装一下PyCharm以及如何进行科学的省钱:Python中的命令行模式和交互模式的区别是什么?请正在阅读本文的朋友安装…

支持存档的书签服务LinkWarden

什么是 LinkWarden ? Linkwarden 是一个自托管、开源协作书签管理器,用于收集、组织和存档网页。目标是将您在网络上找到的有用网页和文章组织到一个地方,并且由于有用的网页可能会消失(参见链接失效的必然性)&#xf…

基于单片机的甲醛检测器设计

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、设计的主要内容二、系统硬件设计三、软件设计4.1 程序结构流程图原理图 四、结论五、 文章目录 概要 本文将要提…

把wpf的窗体保存为png图片

昨晚在stack overflow刷问题时看到有这个问题,今天早上刚好来尝试学习一下 stack overflow的链接如下: c# - How to render a WPF UserControl to a bitmap without creating a window - Stack Overflow 测试步骤如下: 1 新建.net frame…