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

news2024/12/25 9:00:08

本示例使用设备:实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (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)
                
        #更多的字段说明及回复方式,请仔细查看设备的通讯协议说明...

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这款IDEA插件真的爱了

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件&#xff1a;Api…

Taro编译警告解决方案:Error: chunk common [mini-css-extract-plugin]

文章目录 1. 背景2. 问题分析3. 解决方案3.1 更新 Taro 版本3.2 更新相关依赖3.3 调整 webpack 配置3.4 检查依赖版本 4. 拓展与分析4.1 拓展4.2 避免不必要的依赖4.3 查阅 Taro GitHub 仓库 5. 总结 &#x1f389;欢迎来到Java学习路线专栏~Taro编译警告解决方案&#xff1a;E…

golang学习笔记——斐波纳契数列

斐波纳契数列 编写一个程序来计算某个数字的斐波纳契数列。 斐波那契数列是一个数字列表&#xff0c;其中每个数字是前两个斐波那契数字之和。 例如&#xff0c;数字 6 的序列是 1,1,2,3,5,8&#xff0c;数字 7 的序列是 1,1,2,3,5,8,13&#xff0c;数字 8 的序列是 1,1,2,3,5…

[每周一更]-(第72期):Docker容器瘦身方式

Docker清理缓存操作 在构建测试的过程中&#xff0c;由于是自家小服务器&#xff0c;资源紧张&#xff0c;发现磁盘一直爆满&#xff0c;删除一些大镜像还是会占满的情况&#xff0c;就想到是不是也是缓存问题。 经过查询确实是build过程中的缓存启发的占用问题。 因此引出以下…

WPF创建自定义控件编译通过但是找不到资源

报错&#xff1a; 原因: 路径写错了&#xff1a; 不是这样&#xff1a; Source"pack://application:,,,/Controls/Styles/xTabControl.xaml" 而是这样&#xff1a; Source"pack://application:,,,/项目名;component/Controls/Styles/xTabControl.xaml …

Objectarx 使用libcurl请求WebApi

因为开发cad需要请求服务器的数据&#xff0c;再次之前我在服务器搭设了webapi用户传递数据&#xff0c;所以安装了libcurl在objectarx中使用数据。 Open VS2012 x64 Native Tools Command Prompt补充地址&#xff1a; 我在此将相关的引用配置图片&#xff0c;cad里面的应用和…

CI/CD --git版本控制系统

目录 一、git简介 二、git使用 三、github远程代码仓库 一、git简介 Git特点&#xff1a; 速度简单的设计对非线性开发模式的强力支持&#xff08;允许成千上万个并行开发的分支&#xff09;完全分布式有能力高效管理类似 Linux 内核一样的超大规模项目&#xff08;速度和数…

【Mysql】学习笔记

目录 基本操作登录指令&#xff1a;启动、关闭、重启mysql指令&#xff08;适用于centos7&#xff09;&#xff1a;查看mysql运行状态&#xff1a;删除和创建表 修改密码&#xff08;ubuntu18.04可行&#xff0c;其余版本行不行不知道&#xff09;3 使用MYSQL了解数据库和表 4 …

VR智慧景区:VR赋能文旅产业,激活消费潜能

随着国家数字化战略的不断深入实施&#xff0c;文旅产业数字化转型的步伐也在逐渐加快&#xff0c;以VR技术赋能文旅产业&#xff0c;让文旅景区线上线下双渠道融合&#xff0c;进一步呈现文化底蕴、激活消费潜能。 VR智慧景区以沉浸式、互动式、科技感的方式&#xff0c;将景区…

std::copy代替memcpy

在工作中&#xff0c;经常会有c/c的混合使用。但看到memcpy总是感觉不太安全&#xff0c;c中有一个替代品std::copy&#xff0c;用起来还不错&#xff0c;而且std::copy不会有效率上的损失&#xff0c;放心用吧。迭代器的方式还安全些。 将int数组转换为vector int inputArr[…

springboot+vue+element简单实现教学课程申报管理系统

目录 一、项目预览 二、项目效果图及说明 1.项目说明 1.登录 2.欢迎页 3.教师管理 4.课程申报 ​5.管理员管理 三、代码实现 1.后端项目结构图 2.数据库表脚本 3.路由配置 四、总结 一、项目预览 在线预览&#xff1a;点击访问其他项目访问&#xff1a;点击访问后端实…

恐怖地牢资产来袭!

我们将为您带来 VoxEdit 短片大赛的首场比赛&#xff01;在 6 天内创建可用资产。 主题&#xff1a;设计与恐怖和地牢相关的资产。这些资产必须非常实用&#xff0c;不需要动画。(如果你愿意&#xff0c;你也可以制作动画&#xff09;。 发挥你恐怖的一面&#xff0c;创造出适…

鸿蒙APP外包开发需要注意的问题

在进行鸿蒙&#xff08;HarmonyOS&#xff09;应用开发时&#xff0c;开发者需要注意一些重要的问题&#xff0c;以确保应用的质量、性能和用户体验。以下是一些鸿蒙APP开发中需要特别关注的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软…

【智能家居】4、智能家居框架设计和代码文件工程建立

目录 一、智能家居项目框架 二、智能家居工厂模式示意 三、代码文件工程建立 SourceInsight创建新工程步骤 一、智能家居项目框架 二、智能家居工厂模式示意 三、代码文件工程建立 创建一个名为si的文件夹用于保存SourceInsight生成的文件信息&#xff0c;然后在SourceInsig…

卡码网语言基础课 | 13. 链表的基础操作Ⅰ

目录 一、 回顾 二、 指针 2.1 声明指针 2.2 指针获取地址 2.3 解引用 2.4 指针与数组的关系 2.5 指针的算术操作及访问 2.6 空指针值 三、 链表 3.1 概念 3.2 虚拟头节点 3.3 定义链表节点 3.4 结构体的成员变量 3.5 初始化结构体 3.6 完整结构体代码 四、 链…

TikTok与媒体素养:如何辨别虚假信息?

在当今数字时代&#xff0c;社交媒体平台如TikTok已经成为信息传播和社交互动的主要渠道之一。然而&#xff0c;随之而来的是虚假信息的泛滥&#xff0c;这对用户的媒体素养提出了严峻的挑战。本文将探讨TikTok平台上虚假信息的现象&#xff0c;以及如何提高媒体素养&#xff0…

Servlet---常见错误汇总+解决

文章目录 404错误路径错误toncat没有正确加载webapp里的内容 405错误500错误出现“空白页面”出现“无法访问此网站” 我们在开始学习Servlet后&#xff0c;进入了前后端交互的阶段。在这个过程中&#xff0c;往往会发生许多的错误让我们摸不着头脑&#xff0c;今天小编就汇总了…

Pixhawk+PX4+VRPN +NOKOV无人机飞控平台动捕数据传输

NOKOV度量动作捕捉系统可以很好的适配PX4无人机飞控平台。进行数据通信的时候&#xff0c;使用SDK或者VRPN的方式都是可以的。本文演示NOKOV度量动作捕捉系统通过VRPN与PX4平台进行数据传输的方法。 一、硬件准备 1、准备无人机 这里准备的无人机&#xff0c;飞控版是Pixhaw…

O2OA(翱途)开发平台 V8.2即将发布,更安全、更高效、更开放

尊敬的O2OA(翱途)平台合作伙伴、用户以及亲爱的开发小伙伴们&#xff0c;平台新的版本就要发布啦&#xff01; 上次8.1的发布是在9月1日&#xff0c;又过去两个多月&#xff0c;O2OA研发团队始终踏踏实实地做好产品的研发及优化工作&#xff0c;只为给客户带去更好的服务和产品…