Python 双门双向门禁控制板实时监控源码

本示例使用设备:实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (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 os
import socket
import time
import datetime
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.strptime(datestr,'%Y-%m-%d %H:%M:%S')
        return 1
    except:
        return 0

#主程序-------------------------------------------------------------------------------------
IpList=[]
if sys.platform == 'linux' or sys.platform=='mac':     # linux、mac系统获取电脑所有网卡IP
    ips = [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获取电脑所有网卡IP
    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]=='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)
                
        #更多的字段说明及回复方式,请仔细查看设备的通讯协议说明...

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python---函数练习:编写一个打招呼程序

函数的定义-------相关链接&#xff1a;Python---函数的作用&#xff0c;定义&#xff0c;使用步骤&#xff08;调用步骤&#xff09;-CSDN博客基本语法&#xff1a; def 函数名称([参数1, 参数2, ...]):函数体...[return 返回值] 函数的调用 Python中&#xff0c;函数和变量一…

2023年【危险化学品经营单位安全管理人员】考试题及危险化学品经营单位安全管理人员模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试题是安全生产模拟考试一点通总题库中生成的一套危险化学品经营单位安全管理人员模拟试题&#xff0c;安全生产模拟考试一点通上危险化学品经营单位安全管理人员作业手机同步练习。…

MSYS2介绍及工具安装

0 Preface/Foreword 1 MSYS2 官网&#xff1a;MSYS2

服务容错之限流之 Tomcat 限流 Tomcat 线程池的拒绝策略

在文章开头&#xff0c;先和大家抛出两个问题&#xff1a; 每次提到服务限流为什么都不考虑基于 Tomcat 来做呢&#xff1f;大家有遇到过 Tomcat 线程池触发了拒绝策略吗&#xff1f; JUC 线程池 在谈 Tomcat 的线程池前&#xff0c;先看一下 JUC 中线程池的执行流程&#x…

[acwing周赛复盘] 第 94 场周赛20230311

[acwing周赛复盘] 第 94 场周赛20231118 总结5295. 三元组1. 题目描述2. 思路分析3. 代码实现 5296. 边的定向1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 好久没做acw了&#xff0c;挺难的。T1 模拟T2 前缀和以及优化。T3 贪心 5295. 三元组 链接: 5295. 三元组…

操作系统(存储管理进程管理设备管理)

文章目录 存储管理页式存储管理概念优点缺点页面置换算法快表&#xff08;很快速的页表&#xff09; 段式存储管理概念优点缺点 段页式存储管理概念优点缺点 进程管理概述作用特征功能分类计算机启动基本流程 进程管理进程的组成进程的基础状态前趋图进程资源图同步和互斥信号量…

os.path.join函数用法

os.path.join()是Python中用于拼接文件路径的函数&#xff0c;它可以将多个字符串拼接成一个路径&#xff0c;并且会根据操作系统的规则自动使用合适的路径分隔符。 注&#xff1a;Linux用的是/分隔符&#xff0c;而Windows才用的是\。 该函数属于os.path模块&#xff0c;因此在…

解决Redis分布式锁宕机出现不可靠问题-zookeeper分布式锁

核心思想&#xff1a;当客户端要获取锁&#xff0c;则创建节点&#xff0c;使用完锁&#xff0c;则删除该节点。 客户端获取锁时&#xff0c;在 lock 节点下创建临时顺序节点。然后获取 lock下面的所有子节点&#xff0c;客户端获取到所有的子节点之后&#xff0c;如果发现自己…

DEEP-FRI: Sampling Outside the Box Improves Soundness论文学习笔记

1. 引言 前序博客有&#xff1a; DEEP FRI协议A summary on the FRI low degree test前2页导读RISC Zero的手撕STARKReed-Solomon Codes——RS纠错码Reed-Solomon Codes及其与RISC Zero zkVM的关系 Eli Ben-Sasson等人2019年论文《DEEP-FRI: Sampling Outside the Box Impro…

解决:微软在登录时总是弹出需要家长或监护人同意才能使用该账户并且不断循环?

目录 问题来源&#xff1a; 解决办法&#xff1a; 问题来源&#xff1a; 我的edge浏览器账号登录&#xff0c;一直弹出来需要家长或监护人同意才能使用&#xff0c;然后按照提示操作&#xff0c;会一直循环&#xff0c;是个无穷循环。 解决办法&#xff1a; 参考&#xff1…

【Java 进阶篇】唤醒好运:JQuery 抽奖案例详解

在现代社交网络和电商平台中&#xff0c;抽奖活动成为吸引用户、提升用户参与度的一种常见手段。通过精心设计的抽奖页面&#xff0c;不仅可以增加用户的互动体验&#xff0c;还能在一定程度上提高品牌的知名度。本篇博客将通过详细解析 JQuery 抽奖案例&#xff0c;带领你走进…

Linux:firewalled服务常规操作汇总

一、firewalled防火墙工作原理 firewalled的内部结构&#xff0c;可以简单的看做下图&#xff0c;有两个集合&#xff0c;一个集合管理关闭的端口&#xff0c;另一个集合管理放开的端口。 二、常用操作 1、开启和关闭防火墙 临时性配置&#xff1a; systemctl [start | stop …

【Java 进阶篇】插上翅膀:JQuery 插件机制详解

在前端开发中&#xff0c;JQuery 作为一个广泛应用的 JavaScript 库&#xff0c;为开发者提供了丰富的工具和方法&#xff0c;简化了 DOM 操作、事件处理等繁琐的任务。而在这个庞大的生态系统中&#xff0c;插件机制是 JQuery 的一项重要特性&#xff0c;使得开发者能够轻松地…

电磁场与电磁波part4--时变电磁场

1、采用洛伦兹条件使得矢量位 与标量位 分离在两个独立的方程中&#xff0c;且矢量位 仅与电流密度 有关&#xff0c;而标量位 仅与电荷密度 有关。 2、电磁能量守恒定理&#xff08;坡印廷定理&#xff09; 即减少的电磁能量电磁场所做的功流出的电磁能量 3、设u(r,t)是…

【双指针】复写0

复写0 1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上…

Git命令总结-常用-后续使用频繁的再添加~

Git命令总结-常用 久了不用&#xff0c;有些时候老是会忘记一些命令&#xff0c;多的都记录一下&#xff0c;方便查找 git init 初始化一个Git仓库&#xff0c;执行完git init命令后&#xff0c;会生成一个**.git**目录&#xff0c;该目录包含了资源数据&#xff0c;且只会在…

新增文章分类

pojo.Category package com.lin.springboot01.pojo;import jakarta.validation.constraints.NotEmpty; import lombok.Data;import java.time.LocalDateTime;Data public class Category {private Integer id;//主键NotEmptyprivate String categoryName;//分类名称NotEmptypr…

redis cluster搭建

k8s部署 Redis Insight k8s部署redis集群_mob6454cc6c6291的技术博客_51CTO博客 占用的内存竟然这么小&#xff0c;才200M左右 随便选个节点进去&#xff0c;看能否连接上其他节点 redis-cli -h redis-cluster-v1-0.redis-cluster.project-gulimall.svc.cluster.local 再创建个…

【总结】I/O接口中的数据线,地址线,控制线,状态线传输什么信息?

数据线 方向&#xff1a;双向功能&#xff1a;在内存、寄存器和数据缓冲寄存器进行数据交换&#xff1b;接口和设备的状态信息也通过数据线传给CPU&#xff08;这里的状态指的是设备独有的&#xff0c;和状态线中的忙碌、空闲相区别&#xff09;&#xff1b;CPU对外设的控制命…

tomcat8.5处理get请求时,控制台输出中文乱码问题的解决

问题描述 控制台输出中文乱码 版本信息 我使用的是tomcat8.5 问题解决 配置web.xml 注&#xff1a;SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前&#xff0c;否则无效 <!--配置springMVC的编码过滤器--> <filter><filter-name>CharacterEn…