啊我又在写脚本…
这次是为了在不同网段下的设备查询帧率和GPIO是否挂起
记录一些tips吧
1.要在不同的网段下面找到所有在线的摄像机设备
这个问题我想了几种解决方式,比如ping所有的ip然后抓取所有可以ping通的,然后检查是否能打开telnet协议,如果不行就认为它不是摄像机设备。但是在实践中这个方法的问题在于并不是每个设备的telnet协议都是可以通过外部的脚本打开的。所有误判率非常高。还有一种方式就是用内网udp进行广播并且发送报文里加上开启telnet的命令,得到回应的报文里获取ip。这个方法就比较靠谱,奈何我计网天天逃课…这个方式实现了以后再写一篇博文记录吧…
最后我用了公司内部的测试软件拉取所有在线摄像机的所有信息内容存成txt,然后用split把ip裁剪出来的本方法。非常快捷但是如果出现了新的ip或者ip变动可能无法及时发现…暂且这样
2.telnetlib库里面的命令执行返回值
如果要读取指令执行之后的返回值,最先想到的是self.session.read_very_eager().decode(‘ascii’)这个函数,不过为了抓取返回值,可以将执行和返回结果直接封装成一个方法。然后得到返回值。如果执行一次程序而read_very_eager()了两次,第二次就只能抓到None。
def execute_command(self, command, time_wait):
# 执行命令并且等待
self.session.write(command + b'\n')
time.sleep(time_wait)
# 获取命令结果
command_result = self.session.read_very_eager().decode('ascii')
return command_result
3.grep和awk
对命令返回值处理和检索的时候要用的,两个可以连起来用,grep定位行,awk定位列,可以精确到某一个字符的抓取。
并且在多个索引字检索的时候grep可以连用。
在vpss这个文件里面先寻找行里面又RGB_888_PLANNAR和# 6的,再在检索到底的这一行里面把第11列的值定位出来,就是我需要的帧率的值。检查GPIO的状态也同理。
"grep 'RGB_888_PLANAR ' vpss | grep '# 6' | awk '{print $11}'"
"grep 'gpio-433' gpio|awk '{print $6}'"
4.console里的执行结果写到文件里面
这个就很简单了就直接在print里面加一个file=f,f为打开的规定了名字的文件。不过这样的话是直接写到文件里面的,不在console里面显示了,为了更方便看到结果我就写了两边。这样不是很优雅。
with open(nowTime + ' logger.txt', 'w') as f:
print("********************** PROGRAM CONTINUE ***********************", file=f)
代码记录
# 一些全局要用的变量
port = 23
USER = 'root'
PSW_1 = "*****"
PSW_2 = "168****"
nowTime = time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime(time.time()))
ip_list = []
def pingHost(host):
# for i in range(1, 256):
status1 = 'PING SUCCESS'
status2 = 'PING FAILED'
nowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
p = os.popen("ping " + host + " -n 2")
line = p.read()
if "无法访问目标主机" in line:
print("***********" + nowTime, host, status2 + "**********", file=f)
return False
else:
print("***********" + nowTime, host, status1 + "**********", file=f)
return True
Telnet类,里面放最常用的几个方法
class TelnetClient:
def __init__(self):
self.session