概述:
在树莓派(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循环里面把套接字给close了)。
test1.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进程都是一样的,不会无限增加,工控机重启后,依然一样,表示已经达到了我们要的效果。