局域网内批量检测IP设备在线、导出掉线日志,弹出报警功能开发

​    ​最近公司做了一个FMCS(厂务自控管理系统)项目,在建设运维期间经常有设备通讯不上,但是又没有好的方式检测设备是否是人为故障还是网线物理故障。在wincc上好像也不容易做设备的掉线检测,于是答应同事自己给他们做一个设备是否在局域网内在线存活的工具。可以当做一个小工具,也可以作为Wincc开发调用的外部插件来使用。当时有400多台设备,检测一遍用了不到20s。下面具体介绍一下这个软件,也把它分享出来,希望做工控方面的朋友有机会用到。

下载压缩文件解压后如下:

里面有说明文件“使用说明.txt”

具体操作步骤:

检测功能

一、先从其它地方复制\输入要检测的IP到文档“待检测IP.txt”然后保存。

二、双击AliveIP_V1.0.exe可执行软件,运行软件。会有控制台弹出检测IP的过程,然后在当前文件夹下生成一个"掉线IP.txt"文档。目前我测试的只有192.168.1.2是在线的,其它的都不在这个局域网内。

报警功能

三、如果想在电脑或者Wincc上循环启动报警,可参考结合另外一个软件弹窗报警插件。(思路一:用电脑计划任务程序周期运行这两个软件。思路2:在Wincc中用全局脚本周期调用这两个软件)​

四、通过双击ReadLinesCountAndNotice.exe软件,运行报警弹窗程序,可手动报警查看效果。

最后奉上源码,python3开发
AliveIP_V1.0.exe 如下==》
import threading
import subprocess
import time
import os
from queue import Queue
start_time=time.time()

删除指定文件

if os.path.exists('掉线IP.txt'):
os.remove('掉线IP.txt')

定义工作线程

WORD_THREAD=50

定义IP列表

IPs=[]

将需要ping 的ip加入队列

IP_QUEUE = Queue()

for i in range(1,5):

IP_QUEUE.put('192.168.1.'+str(i))

for j in range(1,255):

IP_QUEUE.put('192.168.2.'+str(j))

file1= open('待检测IP.txt','r',encoding='utf-8') #打开要去掉空行的文件

file2 =open('待检测IP2.txt','w',encoding='utf-8') #生成没有空行的文件

for line in file1.readlines():

if line == '\n':

line=line.strip('\n')

file2.write(line)

file1.close()

file2.close()

f=open('待检测IP.txt',encoding='utf-8')
lines=f.readlines()
for line in lines:
if line.isspace():
continue
else:
line=line.replace("\n","")
#line=line.replace("\t","")
IPs.append(line)
for x in IPs:
#print(x)
IP_QUEUE.put(x)

with open ('待检测IP.txt') as file:

for myline in file.readlines():

if myline.isspace:

continue

else:

print(myline)

    #print(myline,end='') #end=""

定义一个执行ping 的函数

def ping_ip():
while not IP_QUEUE.empty():
ip=IP_QUEUE.get()
res =subprocess.call('ping -n 1 -w 5 %s'%ip,stdout=subprocess.PIPE) #linux系统将'gn'替换成'-c'
#运行结果
print(ip,True if res ==0 else False)
if res !=0 :
with open('掉线IP.txt','a') as f:
f.write(ip+'\n')#进行换行输入f.write(ip+'\n')
if name == 'main':
threads=[]
for i in range(WORD_THREAD):
thread=threading.Thread(target=ping_ip)#绑定方法
thread.start()
#time.sleep(0.1)
threads.append(thread)
for thread in threads:
thread.join()
print('程序运行耗时:%s'%(time.time()-start_time))

ReadLinesCountAndNotice.exe 如下==》
import win32api,win32con
count = len(open('掉线IP.txt','rU').readlines())
print(count)
if count>=1:
win32api.MessageBox(0,'现已发现掉线设备总数:%s(台),请注意结合"掉线IP.txt"文本信息,安排检查现场!' %count,"提醒",win32con.MB_YESNOCANCEL)

总结:小伙伴们可以自己结合实际情况选用了!{:1_919:}2022/5/12

补充:在windows计划任务中执行弹窗,因为我这个弹窗要确认,所以不能在这里面启动。建议做自控的话在WinCC(其它上位机软件)中当作插件来使用。

posted @   匠心灵域  阅读(1201)  评论(2编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
历史上的今天:
2019-05-12 EPLAN中的edz文件的用法
2019-05-12 Windows Embedded CE 6.0开发环境的搭建
点击右上角即可分享
微信分享提示