优化的解决方案:树莓派工控机定时自动采集数据方案
优采云 发布时间: 2020-10-24 10:04Raspberry Pi工业计算机的定时自动采集数据计划
概述:
Raspberry Pi(xxxxx,以下称为工业计算机)上的采集数据,将其传输到本地sqlserver数据库,并使用Python编写数据采集脚本。
这涉及几个问题:当发生网络中断,电源故障,工业计算机重新启动和其他异常时,为了确保这些异常情况发生,仍然可以自动采集数据,并且需要以下两种解决方案
在启动时自动启动;当脚本未运行时,它将自动运行。
首选第二个选项,因为python程序崩溃或网络异常并且程序被中断。需要一种机制来使其自动运行。
参考网址:
常用命令:
自动运行脚本:vim / etc / crontab
查看过程:ps -ef | grep tcpclient.py
自动运行脚本
启动TCP服务器监视功能:
输入vim / etc / crontab,然后输入* * * * * root python3 /home/pi/tcpclient.py
tcpclient.py代码:
import socket
import time
import random
def main():
# 1 创建tcp套接字
while 1:
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2 创建连接
tcp_socket.connect(('192.168.1.35', 6666))
# 3 发送数据
tcp_input = str(random.randint(2,15))
tcp_socket.send(tcp_input.encode('gbk')) # utf-8 中文会乱码
time.sleep(5)
# 4.关闭套接字
tcp_socket.close()
if __name__ == '__main__':
main()
输入ps -ef | grep tcpclient.py,您可以看到还有更多的进程(带有问号的进程),tcpclient.py有while循环,不会自动退出,因此,tcpclient.py每分钟都会自动运行。
优化计划
当然不可能以无线方式增加编程过程,因此这里有两个选项可供选择:
每次执行tcpclient.py时,它将自动关闭,程序将结束,而没有while循环;编写另一个程序test1.py,脚本每分钟运行一次test1.py,test1.py确定tcpclient.py进程是否存在,如果不存在,则运行它;如果存在,它将无法运行。
这次采用第二个选项,这可以防止tcp每次都断开连接并重新连接(除非像本例中那样在while循环中关闭套接字)。
测试1.py代码:
import time
import os
import re
# execute command, and return the infomation. 执行命令并返回命令输出信息
def execCmd(cmd):
r = os.popen(cmd)
text = r.read()
r.close()
return text
def doSomething():
os.system('python3 /home/pi/tcpclient.py')
time.sleep(10)
if __name__ == '__main__':
#ps -ef是linux查看进程信息指令,|是管道符号导向到grep去查找特定的进程,最后一个|是导向grep过滤掉grep进程:因为grep查看程序名也是进程,会混到查询信息里
programIsRunningCmd="ps -ef|grep tcpclient.py"
programIsRunningCmdAns = execCmd(programIsRunningCmd) #调用函数执行指令,并返回指令查询出的信息
print(programIsRunningCmdAns)
ansLine = programIsRunningCmdAns.split('\n') #将查出的信息用换行符‘\b’分开
print(len(ansLine))
#判断如果返回行数>3则说明python脚本程序已经在运行,打印提示信息结束程序,否则运行脚本代码doSomething()
if len(ansLine) > 3:
print("programName have been Running")
else:
doSomething()
结果
可以看出,test1.py和tcpclient.py进程在任何时候都是相同的,并且不会无限期地增加。重新启动工业计算机后,该过程保持不变,表明已达到预期的效果。