首页 > 系统相关 >Linux C实现在线检测

Linux C实现在线检测

时间:2024-01-29 16:38:15浏览次数:22  
标签:LED 在线 snprintf 检测 cmd system Linux GPIO sizeof

通过ping某个服务器,检测设备是否internet是联通的。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
#include <fcntl.h>

#define dbg(fmt, args...) printf("\033[1m[ %s ] %03d: "fmt"\033[0m\n\r", __FUNCTION__, __LINE__, ##args)

static unsigned int check_interval = 1;

#define INTERVAL_MAX    (1024)
#define INTERVAL_MIN    (2)

#define MAX(a, b)     ((a) > (b) ? (a) : (b))
#define MIN(a, b)     ((a) < (b) ? (a) : (b))

#define LED_RED "/sys/class/leds/red:system/trigger"
#define LED_GREEN "/sys/class/leds/green:system/trigger"
#define LED_BLUE "/sys/class/leds/blue:system/trigger"

#define GPIO_RED "/sys/class/leds/red:system/brightness"
#define GPIO_GREEN "/sys/class/leds/green:system/brightness"
#define GPIO_BLUE "/sys/class/leds/blue:system/brightness"

#define ROOT_SVR "A.root-servers.net"

static void set_led(int online)
{
    static int last_state = 2;
    char cmd[128] = {0};

    int cur_state = online ? 1 : 0;
    if (last_state == cur_state) {
        return;
    }

    if (online) {
        /*set green/white*/
        last_state = 1;
        if (0 == access(LED_RED, F_OK) &&
            0 == access(LED_GREEN, F_OK) &&
            0 == access(LED_BLUE, F_OK)) {
            snprintf(cmd, sizeof(cmd), "echo none > %s", LED_RED);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo default-on > %s", LED_GREEN);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo none > %s", LED_BLUE);
            system(cmd);
        } else if (0 == access(GPIO_RED, F_OK) &&
            0 == access(GPIO_GREEN, F_OK) &&
            0 == access(GPIO_BLUE, F_OK)) {
            snprintf(cmd, sizeof(cmd), "echo 0 > %s", GPIO_RED);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo 1 > %s", GPIO_GREEN);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo 0 > %s", GPIO_BLUE);
            system(cmd);
        }
    } else {
        last_state = 0;
        /*set red*/
        if (0 == access(LED_RED, F_OK) &&
            0 == access(LED_GREEN, F_OK) &&
            0 == access(LED_BLUE, F_OK)) {
            snprintf(cmd, sizeof(cmd), "echo default-on > %s", LED_RED);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo none > %s", LED_GREEN);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo none > %s", LED_BLUE);
            system(cmd);
        } else if (0 == access(GPIO_RED, F_OK) &&
            0 == access(GPIO_GREEN, F_OK) &&
            0 == access(GPIO_BLUE, F_OK)) {
            snprintf(cmd, sizeof(cmd), "echo 1 > %s", GPIO_RED);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo 0 > %s", GPIO_GREEN);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo 0 > %s", GPIO_BLUE);
            system(cmd);
        }
    }

    return;
}

static int led_check(void)
{
    int ret = 1;
    char cmd[128] = {0};
    snprintf(cmd, sizeof(cmd), "ping %s -c 1 -w 1 -4", ROOT_SVR);
    ret = system(cmd);
    set_led(0 == ret);

    return ret;
}

int main(int argc, char const *argv[])
{
    while (1) {
        check_interval = MAX(INTERVAL_MIN, check_interval);
        check_interval = MIN(INTERVAL_MAX, check_interval);

        /*do the mission at once*/
        if (led_check() != 0) {
            /*to check quickly if fail*/
            check_interval = INTERVAL_MIN;
        }

        sleep(check_interval);
        dbg("sleep %us", check_interval);
        check_interval = check_interval << 1;
    }

	return 0;
}

标签:LED,在线,snprintf,检测,cmd,system,Linux,GPIO,sizeof
From: https://www.cnblogs.com/adam-ma/p/17994793

相关文章

  • Linux C语言 检测IP冲突
    分析一个基于C语言实现的IP冲突检测工具。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdbool.h>#include<getopt.h>#include<arpa/inet.h>#definedbg(fmt,args...)printf("\033[1m[%s]%03d:"fmt&quo......
  • Linux如何从命令行卡死的进程中退出?
    Linux如何从命令行卡死的进程中退出?不知道大家在使用Linux的时候,会不会遇到一些命令,有可能卡顿,有可能执行时间过长(比如使用find查找某个文件),这个时候我不想继续执行这个命令了,说来惭愧,我之前一直使用Ctrl+Z去终止这个命令,今天才知道,这样有很大的问题!信号简介一个进程在运行的......
  • linux 学习总结
      ├──usr(UnixSystemResources)等同于C:/Windows├──src系统级的源码目录├──bin用于存放用户可执行的二进制文件├──lib存放共享库文件和一些系统级别的函数库等同于C:/Windows/System32├──local用于......
  • Fortify Static Code Analyzer 23.2 for macOS, Linux & Windows - 静态应用安全测试
    FortifyStaticCodeAnalyzer23.2formacOS,Linux&Windows-静态应用安全测试FortifySCA-代码漏洞扫描工具|静态代码测试|代码安全分析请访问原文链接:https://sysin.org/blog/fortify-static-code-analyzer/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.o......
  • 通过LINUX驱动控制FPGA端PWM外设(LED) 通过应用程序命令传参随意修改寄存器的值(PWM波频
    用法:先下发下面的命令让kernel信息打印到串口:echo7417>/proc/sys/kernel/printk然后增加程序可执行性:chmod777pwmdriver_app  先执行./pwmdriver_app/dev/pwm400000200然后执行./pwm_driver_app/dev/pwm400000200,可以发现LED[1]......
  • Linux grep命令有何作用?如何使用?
    进行Linux系统维护的时候,想要在文本中快速搜索到你需要的东西,grep命令是非常不错的选择,它主要用于查找文件里符合条件的字符串,从而节省时间、提高工作效率。那么Linux系统中grep命令如何使用?我们一起来看看详细的内容介绍。Linuxgrep命令用于查找文件里符合条件的字符串......
  • Linux磁盘管理常用的三个命令!
    在Linux系统中,如何有效地对存储空间加以使用和管理,是一项非常重要且关键的技术。而且Linux磁盘管理好坏直接关系到整个系统的性能问题,那么你知道Linux磁盘管理有哪些常用命令吗?这篇文章为大家介绍一下Linux磁盘管理常用的三个命令。Linux磁盘管理常用三个命令为df、du、fd......
  • 闪测影像|智能影像测量仪高精度快速批量检测
    在现代工业制造领域,快速批量测量零部件尺寸能确保产品质量、提升生产效率、优化生产过程、降低成本以及增强市场竞争力等。通过快速批量测量,迅速检测出不合格的零部件,避免生产过程中的浪费和延误,优化生产过程并提高生产效率。如在自动化生产线上,快速批量测量能够实时监测零部件尺......
  • SqlServer性能检测之Sql语句排查
    很多时候,我们在用SQL语句查询数据时,难免会漏掉对SQL语句性能的考虑,所以有时就会造成SqlServer服务占用过高的问题,为了大致排查是哪些SQL语句造成的问题,我们可以通过如下SQL查询出最近所有耗时最大的SQL语句,具体查询SQL语句如下所示:SELECTs2.dbid,s1.sql_handle,......
  • 创建linux桌面快捷方式
    第一步在linux桌面上创建一个xx.desktop文件,如下图第二步在desktop文件中输入启动命令和参数,保存文件[DesktopEntry] Encoding=UTF-8 Name=SQLDeveloper Comment=OracleSQLDeveloper Icon=/opt/sqldeveloper/icon.png Exec=/opt/sqldeveloper/sqldeveloper.sh Term......