树莓派工控机定时自动采集数据方案

概述:
在树莓派(xxxxx,以下简称工控机)上采集数据,将其传递到本地sqlserver数据库,用Python编写数据采集脚本。
这就涉及几个问题:网络中断、断电、工控机重启等异常出现时,为保证出现这几个异常情况,依然可以自动采集数据,需要做到以下两个方案。

  1. 开机自动启动;
  2. 脚本未运行时,自动运行。
    优先采用第二个方案,因为python程序奔溃或网络异常造成程序中断,需要有一个机制,让其可以自动运行。
    参考网址:
    https://blog.csdn.net/www_helloworld_com/article/details/102971857
    https://blog.csdn.net/qq_34201858/article/details/100621011
    https://blog.csdn.net/qq_39131177/article/details/79051711
    常用命令:
    自动运行脚本: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。
在这里插入图片描述

优化方案
当然不可能无线增加程序进程,所以这里有两个方案可供选择:

  1. 每次tcpclient.py执行后,自动关闭,结束程序运行,既不用while循环;
  2. 另外编写一个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进程都是一样的,不会无限增加,工控机重启后,依然一样,表示已经达到了我们要的效果。
在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值